diff --git a/vnt-core/src/nat/mod.rs b/vnt-core/src/nat/mod.rs index cf8d69e..09a7a53 100644 --- a/vnt-core/src/nat/mod.rs +++ b/vnt-core/src/nat/mod.rs @@ -8,7 +8,7 @@ use std::sync::Arc; pub(crate) mod internal_nat; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct NetInput { pub net: Ipv4Net, pub target_ip: Ipv4Addr, diff --git a/vnt-web/src/service_http.rs b/vnt-web/src/service_http.rs index 28486b1..a6824a0 100644 --- a/vnt-web/src/service_http.rs +++ b/vnt-web/src/service_http.rs @@ -242,7 +242,7 @@ impl ApiResponse { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct StartConfig { pub config_name: Option, pub server: Vec, @@ -322,6 +322,8 @@ struct HttpAppInfo { compress: Option, encrypt: Option, rtx: Option, + /// 启动后配置文件是否发生过变化(与启动时的配置快照对比) + config_changed: bool, } #[derive(Serialize)] @@ -1023,12 +1025,27 @@ async fn get_info( State(state): State, Query(req): Query, ) -> Json> { + // 先读当前配置文件(异步),避免持锁跨 await + let current_config: Option = + match fs::read_to_string(Path::new(CONFIG_DIR).join(&req.file_name)).await { + Ok(content) => toml::from_str(&content).ok(), + Err(_) => None, + }; + let lock = state.inner.lock(); let Some(inst) = lock.instances.get(&req.file_name) else { return Json(ApiResponse::error("实例不存在")); }; let status = inst.status; + // 与启动时的配置快照对比:文件缺失或解析失败也视为已变化 + let config_changed = status != VntStatus::Stopped + && match (&inst.start_config, ¤t_config) { + (Some(base), Some(current)) => base != current, + (Some(_), None) => true, + (None, _) => false, + }; + let info = if let Some(handler) = inst.vnt.as_ref() { let api = &handler.api; let config = api.get_config(); @@ -1077,11 +1094,13 @@ async fn get_info( compress: config.as_ref().map(|v| v.compress), encrypt: config.as_ref().map(|v| v.password.is_some()), rtx: config.as_ref().map(|v| v.rtx), + config_changed, } } else { HttpAppInfo { version: env!("CARGO_PKG_VERSION").to_string(), status, + config_changed, ..Default::default() } }; diff --git a/vnt-web/static/assets/index-CvlopnF8.js b/vnt-web/static/assets/index-CvlopnF8.js new file mode 100644 index 0000000..49c5250 --- /dev/null +++ b/vnt-web/static/assets/index-CvlopnF8.js @@ -0,0 +1,168 @@ +(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 r of o)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function s(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function n(o){if(o.ep)return;o.ep=!0;const r=s(o);fetch(o.href,r)}})();function Lo(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const ye={},gs=[],bt=()=>{},gl=()=>!1,An=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),In=e=>e.startsWith("onUpdate:"),Re=Object.assign,No=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},ua=Object.prototype.hasOwnProperty,me=(e,t)=>ua.call(e,t),J=Array.isArray,vs=e=>sn(e)==="[object Map]",Es=e=>sn(e)==="[object Set]",ur=e=>sn(e)==="[object Date]",ne=e=>typeof e=="function",we=e=>typeof e=="string",Ze=e=>typeof e=="symbol",ge=e=>e!==null&&typeof e=="object",vl=e=>(ge(e)||ne(e))&&ne(e.then)&&ne(e.catch),_l=Object.prototype.toString,sn=e=>_l.call(e),fa=e=>sn(e).slice(8,-1),bl=e=>sn(e)==="[object Object]",Rn=e=>we(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,js=Lo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),$n=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},da=/-\w/g,Ke=$n(e=>e.replace(da,t=>t.slice(1).toUpperCase())),pa=/\B([A-Z])/g,os=$n(e=>e.replace(pa,"-$1").toLowerCase()),Pn=$n(e=>e.charAt(0).toUpperCase()+e.slice(1)),qn=$n(e=>e?`on${Pn(e)}`:""),vt=(e,t)=>!Object.is(e,t),pn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Mn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ha=e=>{const t=we(e)?Number(e):NaN;return isNaN(t)?e:t};let fr;const On=()=>fr||(fr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(J(e)){const t={};for(let s=0;s{if(s){const n=s.split(ga);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function q(e){let t="";if(we(e))t=e;else if(J(e))for(let s=0;sTs(s,t))}const kl=e=>!!(e&&e.__v_isRef===!0),F=e=>we(e)?e:e==null?"":J(e)||ge(e)&&(e.toString===_l||!ne(e.toString))?kl(e)?F(e.value):JSON.stringify(e,wl,2):String(e),wl=(e,t)=>kl(t)?wl(e,t.value):vs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,o],r)=>(s[zn(n,r)+" =>"]=o,s),{})}:Es(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>zn(s))}:Ze(t)?zn(t):ge(t)&&!J(t)&&!bl(t)?String(t):t,zn=(e,t="")=>{var s;return Ze(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let Pe;class Cl{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&&Pe&&(Pe.active?(this.parent=Pe,this.index=(Pe.scopes||(Pe.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(Pe===this)Pe=this.prevScope;else{let t=Pe;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 Rl(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function $l(e){let t,s=e.depsTail,n=s;for(;n;){const o=n.prevDep;n.version===-1?(n===s&&(s=o),Bo(n),wa(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=o}e.deps=t,e.depsTail=s}function ho(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Pl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Pl(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||!ho(e))))return;e.flags|=2;const t=e.dep,s=ke,n=nt;ke=e,nt=!0;try{Rl(e);const o=e.fn(e._value);(t.version===0||vt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{ke=s,nt=n,$l(e),e.flags&=-3}}function Bo(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 r=s.computed.deps;r;r=r.nextDep)Bo(r,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function wa(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let nt=!0;const Ml=[];function At(){Ml.push(nt),nt=!1}function It(){const e=Ml.pop();nt=e===void 0?!0:e}function dr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=ke;ke=void 0;try{t()}finally{ke=s}}}let Gs=0;class Ca{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 Fo{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(!ke||!nt||ke===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==ke)s=this.activeLink=new Ca(ke,this),ke.deps?(s.prevDep=ke.depsTail,ke.depsTail.nextDep=s,ke.depsTail=s):ke.deps=ke.depsTail=s,Ol(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=ke.depsTail,s.nextDep=void 0,ke.depsTail.nextDep=s,ke.depsTail=s,ke.deps===s&&(ke.deps=n)}return s}trigger(t){this.version++,Gs++,this.notify(t)}notify(t){jo();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Do()}}}function Ol(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)Ol(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const mn=new WeakMap,ts=Symbol(""),mo=Symbol(""),qs=Symbol("");function Ve(e,t,s){if(nt&&ke){let n=mn.get(e);n||mn.set(e,n=new Map);let o=n.get(s);o||(n.set(s,o=new Fo),o.map=n,o.key=s),o.track()}}function Ct(e,t,s,n,o,r){const l=mn.get(e);if(!l){Gs++;return}const i=a=>{a&&a.trigger()};if(jo(),t==="clear")l.forEach(i);else{const a=J(e),f=a&&Rn(s);if(a&&s==="length"){const u=Number(n);l.forEach((d,g)=>{(g==="length"||g===qs||!Ze(g)&&g>=u)&&i(d)})}else switch((s!==void 0||l.has(void 0))&&i(l.get(s)),f&&i(l.get(qs)),t){case"add":a?f&&i(l.get("length")):(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"delete":a||(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"set":vs(e)&&i(l.get(ts));break}}Do()}function Sa(e,t){const s=mn.get(e);return s&&s.get(t)}function us(e){const t=de(e);return t===e?t:(Ve(t,"iterate",qs),Qe(e)?t:t.map(rt))}function Nn(e){return Ve(e=de(e),"iterate",qs),e}function mt(e,t){return Rt(e)?ys(Et(e)?rt(t):t):rt(t)}const Ea={__proto__:null,[Symbol.iterator](){return Yn(this,Symbol.iterator,e=>mt(this,e))},concat(...e){return us(this).concat(...e.map(t=>J(t)?us(t):t))},entries(){return Yn(this,"entries",e=>(e[1]=mt(this,e[1]),e))},every(e,t){return xt(this,"every",e,t,void 0,arguments)},filter(e,t){return xt(this,"filter",e,t,s=>s.map(n=>mt(this,n)),arguments)},find(e,t){return xt(this,"find",e,t,s=>mt(this,s),arguments)},findIndex(e,t){return xt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return xt(this,"findLast",e,t,s=>mt(this,s),arguments)},findLastIndex(e,t){return xt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return xt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qn(this,"includes",e)},indexOf(...e){return Qn(this,"indexOf",e)},join(e){return us(this).join(e)},lastIndexOf(...e){return Qn(this,"lastIndexOf",e)},map(e,t){return xt(this,"map",e,t,void 0,arguments)},pop(){return Rs(this,"pop")},push(...e){return Rs(this,"push",e)},reduce(e,...t){return pr(this,"reduce",e,t)},reduceRight(e,...t){return pr(this,"reduceRight",e,t)},shift(){return Rs(this,"shift")},some(e,t){return xt(this,"some",e,t,void 0,arguments)},splice(...e){return Rs(this,"splice",e)},toReversed(){return us(this).toReversed()},toSorted(e){return us(this).toSorted(e)},toSpliced(...e){return us(this).toSpliced(...e)},unshift(...e){return Rs(this,"unshift",e)},values(){return Yn(this,"values",e=>mt(this,e))}};function Yn(e,t,s){const n=Nn(e),o=n[t]();return n!==e&&!Qe(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=s(r.value)),r}),o}const Ta=Array.prototype;function xt(e,t,s,n,o,r){const l=Nn(e),i=l!==e&&!Qe(e),a=l[t];if(a!==Ta[t]){const d=a.apply(e,r);return i?rt(d):d}let f=s;l!==e&&(i?f=function(d,g){return s.call(this,mt(e,d),g,e)}:s.length>2&&(f=function(d,g){return s.call(this,d,g,e)}));const u=a.call(l,f,n);return i&&o?o(u):u}function pr(e,t,s,n){const o=Nn(e),r=o!==e&&!Qe(e);let l=s,i=!1;o!==e&&(r?(i=n.length===0,l=function(f,u,d){return i&&(i=!1,f=mt(e,f)),s.call(this,f,mt(e,u),d,e)}):s.length>3&&(l=function(f,u,d){return s.call(this,f,u,d,e)}));const a=o[t](l,...n);return i?mt(e,a):a}function Qn(e,t,s){const n=de(e);Ve(n,"iterate",qs);const o=n[t](...s);return(o===-1||o===!1)&&Vn(s[0])?(s[0]=de(s[0]),n[t](...s)):o}function Rs(e,t,s=[]){At(),jo();const n=de(e)[t].apply(e,s);return Do(),It(),n}const Aa=Lo("__proto__,__v_isRef,__isVue"),Ll=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ze));function Ia(e){Ze(e)||(e=String(e));const t=de(this);return Ve(t,"has",e),t.hasOwnProperty(e)}class Nl{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,r=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return r;if(s==="__v_raw")return n===(o?r?Da:Bl:r?Dl:jl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const l=J(t);if(!o){let a;if(l&&(a=Ea[s]))return a;if(s==="hasOwnProperty")return Ia}const i=Reflect.get(t,s,Ae(t)?t:n);if((Ze(s)?Ll.has(s):Aa(s))||(o||Ve(t,"get",s),r))return i;if(Ae(i)){const a=l&&Rn(s)?i:i.value;return o&&ge(a)?vo(a):a}return ge(i)?o?vo(i):rs(i):i}}class Vl extends Nl{constructor(t=!1){super(!1,t)}set(t,s,n,o){let r=t[s];const l=J(t)&&Rn(s);if(!this._isShallow){const f=Rt(r);if(!Qe(n)&&!Rt(n)&&(r=de(r),n=de(n)),!l&&Ae(r)&&!Ae(n))return f||(r.value=n),!0}const i=l?Number(s)e,an=e=>Reflect.getPrototypeOf(e);function Oa(e,t,s){return function(...n){const o=this.__v_raw,r=de(o),l=vs(r),i=e==="entries"||e===Symbol.iterator&&l,a=e==="keys"&&l,f=o[e](...n),u=s?go:t?ys:rt;return!t&&Ve(r,"iterate",a?mo:ts),Re(Object.create(f),{next(){const{value:d,done:g}=f.next();return g?{value:d,done:g}:{value:i?[u(d[0]),u(d[1])]:u(d),done:g}}})}}function cn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function La(e,t){const s={get(o){const r=this.__v_raw,l=de(r),i=de(o);e||(vt(o,i)&&Ve(l,"get",o),Ve(l,"get",i));const{has:a}=an(l),f=t?go:e?ys:rt;if(a.call(l,o))return f(r.get(o));if(a.call(l,i))return f(r.get(i));r!==l&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Ve(de(o),"iterate",ts),o.size},has(o){const r=this.__v_raw,l=de(r),i=de(o);return e||(vt(o,i)&&Ve(l,"has",o),Ve(l,"has",i)),o===i?r.has(o):r.has(o)||r.has(i)},forEach(o,r){const l=this,i=l.__v_raw,a=de(i),f=t?go:e?ys:rt;return!e&&Ve(a,"iterate",ts),i.forEach((u,d)=>o.call(r,f(u),f(d),l))}};return Re(s,e?{add:cn("add"),set:cn("set"),delete:cn("delete"),clear:cn("clear")}:{add(o){const r=de(this),l=an(r),i=de(o),a=!t&&!Qe(o)&&!Rt(o)?i:o;return l.has.call(r,a)||vt(o,a)&&l.has.call(r,o)||vt(i,a)&&l.has.call(r,i)||(r.add(a),Ct(r,"add",a,a)),this},set(o,r){!t&&!Qe(r)&&!Rt(r)&&(r=de(r));const l=de(this),{has:i,get:a}=an(l);let f=i.call(l,o);f||(o=de(o),f=i.call(l,o));const u=a.call(l,o);return l.set(o,r),f?vt(r,u)&&Ct(l,"set",o,r):Ct(l,"add",o,r),this},delete(o){const r=de(this),{has:l,get:i}=an(r);let a=l.call(r,o);a||(o=de(o),a=l.call(r,o)),i&&i.call(r,o);const f=r.delete(o);return a&&Ct(r,"delete",o,void 0),f},clear(){const o=de(this),r=o.size!==0,l=o.clear();return r&&Ct(o,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=Oa(o,e,t)}),s}function Uo(e,t){const s=La(e,t);return(n,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(me(s,o)&&o in n?s:n,o,r)}const Na={get:Uo(!1,!1)},Va={get:Uo(!1,!0)},ja={get:Uo(!0,!1)};const jl=new WeakMap,Dl=new WeakMap,Bl=new WeakMap,Da=new WeakMap;function Ba(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function rs(e){return Rt(e)?e:Ho(e,!1,$a,Na,jl)}function Fl(e){return Ho(e,!1,Ma,Va,Dl)}function vo(e){return Ho(e,!0,Pa,ja,Bl)}function Ho(e,t,s,n,o){if(!ge(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const r=o.get(e);if(r)return r;const l=Ba(fa(e));if(l===0)return e;const i=new Proxy(e,l===2?n:s);return o.set(e,i),i}function Et(e){return Rt(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function Rt(e){return!!(e&&e.__v_isReadonly)}function Qe(e){return!!(e&&e.__v_isShallow)}function Vn(e){return e?!!e.__v_raw:!1}function de(e){const t=e&&e.__v_raw;return t?de(t):e}function Wo(e){return!me(e,"__v_skip")&&Object.isExtensible(e)&&xl(e,"__v_skip",!0),e}const rt=e=>ge(e)?rs(e):e,ys=e=>ge(e)?vo(e):e;function Ae(e){return e?e.__v_isRef===!0:!1}function ae(e){return Ul(e,!1)}function Fa(e){return Ul(e,!0)}function Ul(e,t){return Ae(e)?e:new Ua(e,t)}class Ua{constructor(t,s){this.dep=new Fo,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:de(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||Qe(t)||Rt(t);t=n?t:de(t),vt(t,s)&&(this._rawValue=t,this._value=n?t:rt(t),this.dep.trigger())}}function O(e){return Ae(e)?e.value:e}const Ha={get:(e,t,s)=>t==="__v_raw"?e:O(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const o=e[t];return Ae(o)&&!Ae(s)?(o.value=s,!0):Reflect.set(e,t,s,n)}};function Hl(e){return Et(e)?e:new Proxy(e,Ha)}function Wa(e){const t=J(e)?new Array(e.length):{};for(const s in e)t[s]=Ga(e,s);return t}class Ka{constructor(t,s,n){this._object=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=Ze(s)?s:String(s),this._raw=de(t);let o=!0,r=t;if(!J(t)||Ze(this._key)||!Rn(this._key))do o=!Vn(r)||Qe(r);while(o&&(r=r.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=O(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Ae(this._raw[this._key])){const s=this._object[this._key];if(Ae(s)){s.value=t;return}}this._object[this._key]=t}get dep(){return Sa(this._raw,this._key)}}function Ga(e,t,s){return new Ka(e,t,s)}class qa{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Fo(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)&&ke!==this)return Il(this,!0),!0}get value(){const t=this.dep.track();return Pl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function za(e,t,s=!1){let n,o;return ne(e)?n=e:(n=e.get,o=e.set),new qa(n,o,s)}const un={},gn=new WeakMap;let Qt;function Ja(e,t=!1,s=Qt){if(s){let n=gn.get(s);n||gn.set(s,n=[]),n.push(e)}}function Ya(e,t,s=ye){const{immediate:n,deep:o,once:r,scheduler:l,augmentJob:i,call:a}=s,f=x=>o?x:Qe(x)||o===!1||o===0?St(x,1):St(x);let u,d,g,p,w=!1,S=!1;if(Ae(e)?(d=()=>e.value,w=Qe(e)):Et(e)?(d=()=>f(e),w=!0):J(e)?(S=!0,w=e.some(x=>Et(x)||Qe(x)),d=()=>e.map(x=>{if(Ae(x))return x.value;if(Et(x))return f(x);if(ne(x))return a?a(x,2):x()})):ne(e)?t?d=a?()=>a(e,2):e:d=()=>{if(g){At();try{g()}finally{It()}}const x=Qt;Qt=u;try{return a?a(e,3,[p]):e(p)}finally{Qt=x}}:d=bt,t&&o){const x=d,y=o===!0?1/0:o;d=()=>St(x(),y)}const L=El(),$=()=>{u.stop(),L&&L.active&&No(L.effects,u)};if(r&&t){const x=t;t=(...y)=>{const Z=x(...y);return $(),Z}}let m=S?new Array(e.length).fill(un):un;const _=x=>{if(!(!(u.flags&1)||!u.dirty&&!x))if(t){const y=u.run();if(x||o||w||(S?y.some((Z,D)=>vt(Z,m[D])):vt(y,m))){g&&g();const Z=Qt;Qt=u;try{const D=[y,m===un?void 0:S&&m[0]===un?[]:m,p];m=y,a?a(t,3,D):t(...D)}finally{Qt=Z}}}else u.run()};return i&&i(_),u=new Tl(d),u.scheduler=l?()=>l(_,!1):_,p=x=>Ja(x,!1,u),g=u.onStop=()=>{const x=gn.get(u);if(x){if(a)a(x,4);else for(const y of x)y();gn.delete(u)}},t?n?_(!0):m=u.run():l?l(_.bind(null,!0),!0):u.run(),$.pause=u.pause.bind(u),$.resume=u.resume.bind(u),$.stop=$,$}function St(e,t=1/0,s){if(t<=0||!ge(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ae(e))St(e.value,t,s);else if(J(e))for(let n=0;n{St(n,t,s)});else if(bl(e)){for(const n in e)St(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&St(e[n],t,s)}return e}function nn(e,t,s,n){try{return n?e(...n):e()}catch(o){jn(o,t,s)}}function st(e,t,s,n){if(ne(e)){const o=nn(e,t,s,n);return o&&vl(o)&&o.catch(r=>{jn(r,t,s)}),o}if(J(e)){const o=[];for(let r=0;r>>1,o=We[n],r=zs(o);r=zs(s)?We.push(e):We.splice(Za(t),0,e),e.flags|=1,Kl()}}function Kl(){vn||(vn=Wl.then(ql))}function Xa(e){if(!J(e))Dt&&e.id===-1?Dt.splice(hs+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,Dt){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function ql(e){try{for(ht=0;ht{n._d&&wn(-1);const r=_n(t),l=Tt.length;let i;try{i=e(...o)}finally{for(let a=Tt.length;a>l;a--)Qo();_n(r),n._d&&wn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function be(e,t){if(Ne===null)return e;const s=Wn(Ne),n=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&ne(t)?t.call(n&&n.proxy):t}}function ec(){return!!(on()||ss)}const tc=Symbol.for("v-scx"),sc=()=>ot(tc);function Ge(e,t,s){return Jl(e,t,s)}function Jl(e,t,s=ye){const{immediate:n,deep:o,flush:r,once:l}=s,i=Re({},s),a=t&&n||!t&&r!=="post";let f;if(Xs){if(r==="sync"){const p=sc();f=p.__watcherHandles||(p.__watcherHandles=[])}else if(!a){const p=()=>{};return p.stop=bt,p.resume=bt,p.pause=bt,p}}const u=De;i.call=(p,w,S)=>st(p,u,w,S);let d=!1;r==="post"?i.scheduler=p=>{Ue(p,u&&u.suspense)}:r!=="sync"&&(d=!0,i.scheduler=(p,w)=>{w?p():Ko(p)}),i.augmentJob=p=>{t&&(p.flags|=4),d&&(p.flags|=2,u&&(p.id=u.uid,p.i=u))};const g=Ya(e,t,i);return Xs&&(f?f.push(g):a&&g()),g}function nc(e,t,s){const n=this.proxy,o=we(e)?e.includes(".")?Yl(n,e):()=>n[e]:e.bind(n,n);let r;ne(t)?r=t:(r=t.handler,s=t);const l=rn(this),i=Jl(o,r.bind(n),s);return l(),i}function Yl(e,t){const s=t.split(".");return()=>{let n=e;for(let o=0;oe.__isTeleport,Zt=e=>e&&(e.disabled||e.disabled===""),oc=e=>e&&(e.defer||e.defer===""),mr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_o=(e,t)=>{const s=e&&e.to;return we(s)?t?t(s):null:s},rc={name:"Teleport",__isTeleport:!0,process(e,t,s,n,o,r,l,i,a,f){const{mc:u,pc:d,pbc:g,o:{insert:p,querySelector:w,createText:S,createComment:L,parentNode:$}}=f,m=Zt(t.props);let{dynamicChildren:_}=t;const x=(D,U,M)=>{D.shapeFlag&16&&u(D.children,U,M,o,r,l,i,a)},y=(D=t)=>{const U=Zt(D.props),M=D.target=_o(D.props,w),z=bo(M,D,S,p);M&&(l!=="svg"&&mr(M)?l="svg":l!=="mathml"&&gr(M)&&(l="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),U||(x(D,M,z),Ls(D,!1)))},Z=D=>{const U=()=>{if(Nt.get(D)===U){if(Nt.delete(D),Zt(D.props)){const M=$(D.el)||s;x(D,M,D.anchor),Ls(D,!0)}y(D)}};Nt.set(D,U),Ue(U,r)};if(e==null){const D=t.el=S(""),U=t.anchor=S("");if(p(D,s,n),p(U,s,n),oc(t.props)||r&&r.pendingBranch){Z(t);return}m&&(x(t,s,U),Ls(t,!0)),y()}else{t.el=e.el;const D=t.anchor=e.anchor,U=Nt.get(e);if(U){U.flags|=8,Nt.delete(e),Z(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,z=t.targetAnchor=e.targetAnchor,se=Zt(e.props),j=se?s:M,C=se?D:z;if(l==="svg"||mr(M)?l="svg":(l==="mathml"||gr(M))&&(l="mathml"),_?(g(e.dynamicChildren,_,j,o,r,l,i),Yo(e,t,!0)):a||d(e,t,j,C,o,r,l,i,!1),m)se?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):fn(t,s,D,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const K=_o(t.props,w);K&&(t.target=K,fn(t,K,null,f,0))}else se&&fn(t,M,z,f,1);Ls(t,m)}},remove(e,t,s,{um:n,o:{remove:o}},r){const{shapeFlag:l,children:i,anchor:a,targetStart:f,targetAnchor:u,target:d,props:g}=e,p=Zt(g),w=r||!p,S=Nt.get(e);if(S&&(S.flags|=8,Nt.delete(e)),d&&(o(f),o(u)),r&&o(a),!S&&(p||d)&&l&16)for(let L=0;L{e.isMounted=!0}),ii(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],Xl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},ei=e=>{const t=e.subTree;return t.component?ei(t.component):t},ic={name:"BaseTransition",props:Xl,setup(e,{slots:t}){const s=on(),n=Zl();return()=>{const o=t.default&&qo(t.default(),!0),r=o&&o.length?ti(o):s.subTree?ce():void 0;if(!r)return;const l=de(e),{mode:i}=l;if(n.isLeaving)return Zn(r);const a=bn(r);if(!a)return Zn(r);let f=Js(a,l,n,s,d=>f=d);a.type!==je&&ns(a,f);let u=s.subTree&&bn(s.subTree);if(u&&u.type!==je&&!Xt(u,a)&&ei(s).type!==je){let d=Js(u,l,n,s);if(ns(u,d),i==="out-in"&&a.type!==je)return n.isLeaving=!0,d.afterLeave=()=>{n.isLeaving=!1,s.job.flags&8||s.update(),delete d.afterLeave,u=void 0},Zn(r);i==="in-out"&&a.type!==je?d.delayLeave=(g,p,w)=>{const S=si(n,u);S[String(u.key)]=u,g[tt]=()=>{p(),g[tt]=void 0,delete f.delayedLeave,u=void 0},f.delayedLeave=()=>{w(),delete f.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return r}}};function ti(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==je){t=s;break}}return t}const ac=ic;function si(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 Js(e,t,s,n,o){const{appear:r,mode:l,persisted:i=!1,onBeforeEnter:a,onEnter:f,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:g,onLeave:p,onAfterLeave:w,onLeaveCancelled:S,onBeforeAppear:L,onAppear:$,onAfterAppear:m,onAppearCancelled:_}=t,x=String(e.key),y=si(s,e),Z=(M,z)=>{M&&st(M,n,9,z)},D=(M,z)=>{const se=z[1];Z(M,z),J(M)?M.every(j=>j.length<=1)&&se():M.length<=1&&se()},U={mode:l,persisted:i,beforeEnter(M){let z=a;if(!s.isMounted)if(r)z=L||a;else return;M[tt]&&M[tt](!0);const se=y[x];se&&Xt(e,se)&&se.el[tt]&&se.el[tt](),Z(z,[M])},enter(M){if(y[x]===e)return;let z=f,se=u,j=d;if(!s.isMounted)if(r)z=$||f,se=m||u,j=_||d;else return;let C=!1;M[$s]=Ce=>{C||(C=!0,Ce?Z(j,[M]):Z(se,[M]),U.delayedLeave&&U.delayedLeave(),M[$s]=void 0)};const K=M[$s].bind(null,!1);z?D(z,[M,K]):K()},leave(M,z){const se=String(e.key);if(M[$s]&&M[$s](!0),s.isUnmounting)return z();Z(g,[M]);let j=!1;M[tt]=K=>{j||(j=!0,z(),K?Z(S,[M]):Z(w,[M]),M[tt]=void 0,y[se]===e&&delete y[se])};const C=M[tt].bind(null,!1);y[se]=e,p?D(p,[M,C]):C()},clone(M){const z=Js(M,t,s,n,o);return o&&o(z),z}};return U}function Zn(e){if(Bn(e))return e=Ut(e),e.children=null,e}function bn(e){if(!Bn(e))return Dn(e.type)&&e.children?ti(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&&ne(s.default))return s.default()}}function ns(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;ns(Dn(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 qo(e,t=!1,s){let n=[],o=0;for(let r=0;r1)for(let r=0;rUs(S,t&&(J(t)?t[L]:t),s,n,o));return}if(bs(n)&&!o){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Us(e,t,s,n.component.subTree);return}const r=n.shapeFlag&4?Wn(n.component):n.el,l=o?null:r,{i,r:a}=e,f=t&&t.r,u=i.refs===ye?i.refs={}:i.refs,d=i.setupState,g=de(d),p=d===ye?gl:S=>vr(u,S)?!1:me(g,S),w=(S,L)=>!(L&&vr(u,L));if(f!=null&&f!==a){if(_r(t),we(f))u[f]=null,p(f)&&(d[f]=null);else if(Ae(f)){const S=t;w(f,S.k)&&(f.value=null),S.k&&(u[S.k]=null)}}if(ne(a))nn(a,i,12,[l,u]);else{const S=we(a),L=Ae(a);if(S||L){const $=()=>{if(e.f){const m=S?p(a)?d[a]:u[a]:w()||!e.k?a.value:u[e.k];if(o)J(m)&&No(m,r);else if(J(m))m.includes(r)||m.push(r);else if(S)u[a]=[r],p(a)&&(d[a]=u[a]);else{const _=[r];w(a,e.k)&&(a.value=_),e.k&&(u[e.k]=_)}}else S?(u[a]=l,p(a)&&(d[a]=l)):L&&(w(a,e.k)&&(a.value=l),e.k&&(u[e.k]=l))};if(l){const m=()=>{$(),xn.delete(e)};m.id=-1,xn.set(e,m),Ue(m,s)}else _r(e),$()}}}function _r(e){const t=xn.get(e);t&&(t.flags|=8,xn.delete(e))}On().requestIdleCallback;On().cancelIdleCallback;const bs=e=>!!e.type.__asyncLoader,Bn=e=>e.type.__isKeepAlive;function cc(e,t){ri(e,"a",t)}function uc(e,t){ri(e,"da",t)}function ri(e,t,s=De){const n=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Fn(t,n,s),s){let o=s.parent;for(;o&&o.parent;)Bn(o.parent.vnode)&&fc(n,t,s,o),o=o.parent}}function fc(e,t,s,n){const o=Fn(t,e,n,!0);As(()=>{No(n[t],o)},s)}function Fn(e,t,s=De,n=!1){if(s){const o=s[e]||(s[e]=[]),r=t.__weh||(t.__weh=(...l)=>{At();const i=rn(s),a=st(t,s,e,l);return i(),It(),a});return n?o.unshift(r):o.push(r),r}}const Pt=e=>(t,s=De)=>{(!Xs||e==="sp")&&Fn(e,(...n)=>t(...n),s)},dc=Pt("bm"),ls=Pt("m"),pc=Pt("bu"),li=Pt("u"),ii=Pt("bum"),As=Pt("um"),hc=Pt("sp"),mc=Pt("rtg"),gc=Pt("rtc");function vc(e,t=De){Fn("ec",e,t)}const ai="components";function yn(e,t){return ui(ai,e,!0,t)||e}const ci=Symbol.for("v-ndc");function _c(e){return we(e)?ui(ai,e,!1)||e:e||ci}function ui(e,t,s=!0,n=!1){const o=Ne||De;if(o){const r=o.type;{const i=tu(r,!1);if(i&&(i===t||i===Ke(t)||i===Pn(Ke(t))))return r}const l=br(o[e]||r[e],t)||br(o.appContext[e],t);return!l&&n?r:l}}function br(e,t){return e&&(e[t]||e[Ke(t)]||e[Pn(Ke(t))])}function Ee(e,t,s,n){let o;const r=s,l=J(e);if(l||we(e)){const i=l&&Et(e);let a=!1,f=!1;i&&(a=!Qe(e),f=Rt(e),e=Nn(e)),o=new Array(e.length);for(let u=0,d=e.length;ut(i,a,void 0,r));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,f=i.length;a0;return t!=="default"&&(f.name=t),k(),Me(le,null,[ie("slot",f,n)],u?-2:64)}let l=e[t];l&&l._c&&(l._d=!1);const i=Tt.length;k();let a;try{const f=l&&fi(l(s)),u=s.key||r||f&&f.key;a=Me(le,{key:(u&&!Ze(u)?u:`_${t}`)+(!f&&n?"_fb":"")},f||(n?n():[]),f&&e._===1?64:-2)}catch(f){for(let u=Tt.length;u>i;u--)Qo();throw f}finally{l&&l._c&&(l._d=!0)}return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),a}function fi(e){return e.some(t=>Qs(t)?!(t.type===je||t.type===le&&!fi(t.children)):!0)?e:null}const xo=e=>e?Ri(e)?Wn(e):xo(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=>xo(e.parent),$root:e=>xo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>pi(e),$forceUpdate:e=>e.f||(e.f=()=>{Ko(e.update)}),$nextTick:e=>e.n||(e.n=$t.bind(e.proxy)),$watch:e=>nc.bind(e)}),eo=(e,t)=>e!==ye&&!e.__isScriptSetup&&me(e,t),bc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:o,props:r,accessCache:l,type:i,appContext:a}=e;if(t[0]!=="$"){const g=l[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 r[t]}else{if(eo(n,t))return l[t]=1,n[t];if(o!==ye&&me(o,t))return l[t]=2,o[t];if(me(r,t))return l[t]=3,r[t];if(s!==ye&&me(s,t))return l[t]=4,s[t];yo&&(l[t]=0)}}const f=Hs[t];let u,d;if(f)return t==="$attrs"&&Ve(e.attrs,"get",""),f(e);if((u=i.__cssModules)&&(u=u[t]))return u;if(s!==ye&&me(s,t))return l[t]=4,s[t];if(d=a.config.globalProperties,me(d,t))return d[t]},set({_:e},t,s){const{data:n,setupState:o,ctx:r}=e;return eo(o,t)?(o[t]=s,!0):n!==ye&&me(n,t)?(n[t]=s,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:o,props:r,type:l}},i){let a;return!!(s[i]||e!==ye&&i[0]!=="$"&&me(e,i)||eo(t,i)||me(r,i)||me(n,i)||me(Hs,i)||me(o.config.globalProperties,i)||(a=l.__cssModules)&&a[i])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:me(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function xr(e){return J(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let yo=!0;function xc(e){const t=pi(e),s=e.proxy,n=e.ctx;yo=!1,t.beforeCreate&&yr(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:l,watch:i,provide:a,inject:f,created:u,beforeMount:d,mounted:g,beforeUpdate:p,updated:w,activated:S,deactivated:L,beforeDestroy:$,beforeUnmount:m,destroyed:_,unmounted:x,render:y,renderTracked:Z,renderTriggered:D,errorCaptured:U,serverPrefetch:M,expose:z,inheritAttrs:se,components:j,directives:C,filters:K}=t;if(f&&yc(f,n,null),l)for(const ee in l){const re=l[ee];ne(re)&&(n[ee]=re.bind(s))}if(o){const ee=o.call(s,s);ge(ee)&&(e.data=rs(ee))}if(yo=!0,r)for(const ee in r){const re=r[ee],Be=ne(re)?re.bind(s,s):ne(re.get)?re.get.bind(s,s):bt,qe=!ne(re)&&ne(re.set)?re.set.bind(s):bt,at=ve({get:Be,set:qe});Object.defineProperty(n,ee,{enumerable:!0,configurable:!0,get:()=>at.value,set:ze=>at.value=ze})}if(i)for(const ee in i)di(i[ee],n,s,ee);if(a){const ee=ne(a)?a.call(s):a;Reflect.ownKeys(ee).forEach(re=>{Fs(re,ee[re])})}u&&yr(u,e,"c");function ue(ee,re){J(re)?re.forEach(Be=>ee(Be.bind(s))):re&&ee(re.bind(s))}if(ue(dc,d),ue(ls,g),ue(pc,p),ue(li,w),ue(cc,S),ue(uc,L),ue(vc,U),ue(gc,Z),ue(mc,D),ue(ii,m),ue(As,x),ue(hc,M),J(z))if(z.length){const ee=e.exposed||(e.exposed={});z.forEach(re=>{Object.defineProperty(ee,re,{get:()=>s[re],set:Be=>s[re]=Be,enumerable:!0})})}else e.exposed||(e.exposed={});y&&e.render===bt&&(e.render=y),se!=null&&(e.inheritAttrs=se),j&&(e.components=j),C&&(e.directives=C),M&&oi(e)}function yc(e,t,s=bt){J(e)&&(e=ko(e));for(const n in e){const o=e[n];let r;ge(o)?"default"in o?r=ot(o.from||n,o.default,!0):r=ot(o.from||n):r=ot(o),Ae(r)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[n]=r}}function yr(e,t,s){st(J(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function di(e,t,s,n){let o=n.includes(".")?Yl(s,n):()=>s[n];if(we(e)){const r=t[e];ne(r)&&Ge(o,r)}else if(ne(e))Ge(o,e.bind(s));else if(ge(e))if(J(e))e.forEach(r=>di(r,t,s,n));else{const r=ne(e.handler)?e.handler.bind(s):t[e.handler];ne(r)&&Ge(o,r,e)}}function pi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:l}}=e.appContext,i=r.get(t);let a;return i?a=i:!o.length&&!s&&!n?a=t:(a={},o.length&&o.forEach(f=>kn(a,f,l,!0)),kn(a,t,l)),ge(t)&&r.set(t,a),a}function kn(e,t,s,n=!1){const{mixins:o,extends:r}=t;r&&kn(e,r,s,!0),o&&o.forEach(l=>kn(e,l,s,!0));for(const l in t)if(!(n&&l==="expose")){const i=kc[l]||s&&s[l];e[l]=i?i(e[l],t[l]):t[l]}return e}const kc={data:kr,props:wr,emits:wr,methods:Ns,computed:Ns,beforeCreate:Fe,created:Fe,beforeMount:Fe,mounted:Fe,beforeUpdate:Fe,updated:Fe,beforeDestroy:Fe,beforeUnmount:Fe,destroyed:Fe,unmounted:Fe,activated:Fe,deactivated:Fe,errorCaptured:Fe,serverPrefetch:Fe,components:Ns,directives:Ns,watch:Cc,provide:kr,inject:wc};function kr(e,t){return t?e?function(){return Re(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function wc(e,t){return Ns(ko(e),ko(t))}function ko(e){if(J(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ke(t)}Modifiers`]||e[`${os(t)}Modifiers`];function Ac(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||ye;let o=s;const r=t.startsWith("update:"),l=r&&Tc(n,t.slice(7));l&&(l.trim&&(o=s.map(u=>we(u)?u.trim():u)),l.number&&(o=s.map(Mn)));let i,a=n[i=qn(t)]||n[i=qn(Ke(t))];!a&&r&&(a=n[i=qn(os(t))]),a&&st(a,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,st(f,e,6,o)}}const Ic=new WeakMap;function mi(e,t,s=!1){const n=s?Ic:t.emitsCache,o=n.get(e);if(o!==void 0)return o;const r=e.emits;let l={},i=!1;if(!ne(e)){const a=f=>{const u=mi(f,t,!0);u&&(i=!0,Re(l,u))};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!i?(ge(e)&&n.set(e,null),null):(J(r)?r.forEach(a=>l[a]=null):Re(l,r),ge(e)&&n.set(e,l),l)}function Un(e,t){return!e||!An(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,os(t))||me(e,t))}function Cr(e){const{type:t,vnode:s,proxy:n,withProxy:o,propsOptions:[r],slots:l,attrs:i,emit:a,render:f,renderCache:u,props:d,data:g,setupState:p,ctx:w,inheritAttrs:S}=e,L=_n(e);let $,m;try{if(s.shapeFlag&4){const x=o||n,y=x;$=gt(f.call(y,x,u,d,p,g,w)),m=i}else{const x=t;$=gt(x.length>1?x(d,{attrs:i,slots:l,emit:a}):x(d,null)),m=t.props?i:Rc(i)}}catch(x){Tt.length=0,jn(x,e,1),$=ie(je)}let _=$;if(m&&S!==!1){const x=Object.keys(m),{shapeFlag:y}=_;x.length&&y&7&&(r&&x.some(In)&&(m=$c(m,r)),_=Ut(_,m,!1,!0))}if(s.dirs&&(_=Ut(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(s.dirs):s.dirs),s.transition){const x=Dn(_.type)&&bn(_)||_;ns(x,s.transition)}return $=_,_n(L),$}const Rc=e=>{let t;for(const s in e)(s==="class"||s==="style"||An(s))&&((t||(t={}))[s]=e[s]);return t},$c=(e,t)=>{const s={};for(const n in e)(!In(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Pc(e,t,s){const{props:n,children:o,component:r}=e,{props:l,children:i,patchFlag:a}=t,f=r.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&a>=0){if(a&1024)return!0;if(a&16)return n?Sr(n,l,f):!!l;if(a&8){const u=t.dynamicProps;for(let d=0;dObject.create(vi),bi=e=>Object.getPrototypeOf(e)===vi;function Oc(e,t,s,n=!1){const o={},r=_i();e.propsDefaults=Object.create(null),xi(e,t,o,r);for(const l in e.propsOptions[0])l in o||(o[l]=void 0);s?e.props=n?o:Fl(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function Lc(e,t,s,n){const{props:o,attrs:r,vnode:{patchFlag:l}}=e,i=de(o),[a]=e.propsOptions;let f=!1;if((n||l>0)&&!(l&16)){if(l&8){const u=e.vnode.dynamicProps;for(let d=0;d{a=!0;const[g,p]=yi(d,t,!0);Re(l,g),p&&i.push(...p)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!r&&!a)return ge(e)&&n.set(e,gs),gs;if(J(r))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Jo=e=>J(e)?e.map(gt):[gt(e)],Vc=(e,t,s)=>{if(t._n)return t;const n=Se((...o)=>Jo(t(...o)),s);return n._c=!1,n},ki=(e,t,s)=>{const n=e._ctx;for(const o in e){if(zo(o))continue;const r=e[o];if(ne(r))t[o]=Vc(o,r,n);else if(r!=null){const l=Jo(r);t[o]=()=>l}}},wi=(e,t)=>{const s=Jo(t);e.slots.default=()=>s},Ci=(e,t,s)=>{for(const n in t)(s||!zo(n))&&(e[n]=t[n])},jc=(e,t,s)=>{const n=e.slots=_i();if(e.vnode.shapeFlag&32){const o=t._;o?(Ci(n,t,s),s&&xl(n,"_",o,!0)):ki(t,n)}else t&&wi(e,t)},Dc=(e,t,s)=>{const{vnode:n,slots:o}=e;let r=!0,l=ye;if(n.shapeFlag&32){const i=t._;i?s&&i===1?r=!1:Ci(o,t,s):(r=!t.$stable,ki(t,o)),l=t}else t&&(wi(e,t),l={default:1});if(r)for(const i in o)!zo(i)&&l[i]==null&&delete o[i]},Ue=Wc;function Bc(e){return Fc(e)}function Fc(e,t){const s=On();s.__VUE__=!0;const{insert:n,remove:o,patchProp:r,createElement:l,createText:i,createComment:a,setText:f,setElementText:u,parentNode:d,nextSibling:g,setScopeId:p=bt,insertStaticContent:w}=e,S=(h,v,b,A=null,R=null,E=null,B=void 0,V=null,N=!!v.dynamicChildren)=>{if(h===v)return;h&&!Xt(h,v)&&(A=I(h),ze(h,R,E,!0),h=null),v.patchFlag===-2&&(N=!1,v.dynamicChildren=null);const{type:P,ref:X,shapeFlag:W}=v;switch(P){case Hn:L(h,v,b,A);break;case je:$(h,v,b,A);break;case so:h==null&&m(v,b,A,B);break;case le:j(h,v,b,A,R,E,B,V,N);break;default:W&1?y(h,v,b,A,R,E,B,V,N):W&6?C(h,v,b,A,R,E,B,V,N):(W&64||W&128)&&P.process(h,v,b,A,R,E,B,V,N,Y)}X!=null&&R?Us(X,h&&h.ref,E,v||h,!v):X==null&&h&&h.ref!=null&&Us(h.ref,null,E,h,!0)},L=(h,v,b,A)=>{if(h==null)n(v.el=i(v.children),b,A);else{const R=v.el=h.el;v.children!==h.children&&f(R,v.children)}},$=(h,v,b,A)=>{h==null?n(v.el=a(v.children||""),b,A):v.el=h.el},m=(h,v,b,A)=>{[h.el,h.anchor]=w(h.children,v,b,A,h.el,h.anchor)},_=({el:h,anchor:v},b,A)=>{let R;for(;h&&h!==v;)R=g(h),n(h,b,A),h=R;n(v,b,A)},x=({el:h,anchor:v})=>{let b;for(;h&&h!==v;)b=g(h),o(h),h=b;o(v)},y=(h,v,b,A,R,E,B,V,N)=>{if(v.type==="svg"?B="svg":v.type==="math"&&(B="mathml"),h==null)Z(v,b,A,R,E,B,V,N);else{const P=h.el&&h.el._isVueCE?h.el:null;try{P&&P._beginPatch(),M(h,v,R,E,B,V,N)}finally{P&&P._endPatch()}}},Z=(h,v,b,A,R,E,B,V)=>{let N,P;const{props:X,shapeFlag:W,transition:Q,dirs:te}=h;if(N=h.el=l(h.type,E,X&&X.is,X),W&8?u(N,h.children):W&16&&U(h.children,N,null,A,R,to(h,E),B,V),te&&Kt(h,null,A,"created"),D(N,h,h.scopeId,B,A),X){for(const xe in X)xe!=="value"&&!js(xe)&&r(N,xe,null,X[xe],E,A);"value"in X&&r(N,"value",null,X.value,E),(P=X.onVnodeBeforeMount)&&dt(P,A,h)}te&&Kt(h,null,A,"beforeMount");const pe=Uc(R,Q);pe&&Q.beforeEnter(N),n(N,v,b),((P=X&&X.onVnodeMounted)||pe||te)&&Ue(()=>{P&&dt(P,A,h),pe&&Q.enter(N),te&&Kt(h,null,A,"mounted")},R)},D=(h,v,b,A,R)=>{if(b&&p(h,b),A)for(let E=0;E{for(let P=N;P{const V=v.el=h.el;let{patchFlag:N,dynamicChildren:P,dirs:X}=v;N|=h.patchFlag&16;const W=h.props||ye,Q=v.props||ye;let te;if(b&&Gt(b,!1),(te=Q.onVnodeBeforeUpdate)&&dt(te,b,v,h),X&&Kt(v,h,b,"beforeUpdate"),b&&Gt(b,!0),P&&(!h.dynamicChildren||h.dynamicChildren.length!==P.length)&&(N=0,B=!1,P=null),(W.innerHTML&&Q.innerHTML==null||W.textContent&&Q.textContent==null)&&u(V,""),P?z(h.dynamicChildren,P,V,b,A,to(v,R),E):B||re(h,v,V,null,b,A,to(v,R),E,!1),N>0){if(N&16)se(V,W,Q,b,R);else if(N&2&&W.class!==Q.class&&r(V,"class",null,Q.class,R),N&4&&r(V,"style",W.style,Q.style,R),N&8){const pe=v.dynamicProps;for(let xe=0;xe{te&&dt(te,b,v,h),X&&Kt(v,h,b,"updated")},A)},z=(h,v,b,A,R,E,B)=>{for(let V=0;V{if(v!==b){if(v!==ye)for(const E in v)!js(E)&&!(E in b)&&r(h,E,v[E],null,R,A);for(const E in b){if(js(E))continue;const B=b[E],V=v[E];B!==V&&E!=="value"&&r(h,E,V,B,R,A)}"value"in b&&r(h,"value",v.value,b.value,R)}},j=(h,v,b,A,R,E,B,V,N)=>{const P=v.el=h?h.el:i(""),X=v.anchor=h?h.anchor:i("");let{patchFlag:W,dynamicChildren:Q,slotScopeIds:te}=v;te&&(V=V?V.concat(te):te),h==null?(n(P,b,A),n(X,b,A),U(v.children||[],b,X,R,E,B,V,N)):W>0&&W&64&&Q&&h.dynamicChildren&&h.dynamicChildren.length===Q.length?(z(h.dynamicChildren,Q,b,R,E,B,V),(v.key!=null||R&&v===R.subTree)&&Yo(h,v,!0)):re(h,v,b,X,R,E,B,V,N)},C=(h,v,b,A,R,E,B,V,N)=>{v.slotScopeIds=V,h==null?v.shapeFlag&512?R.ctx.activate(v,b,A,B,N):K(v,b,A,R,E,B,N):Ce(h,v,N)},K=(h,v,b,A,R,E,B)=>{const V=h.component=Yc(h,A,R);if(Bn(h)&&(V.ctx.renderer=Y),Qc(V,!1,B),V.asyncDep){if(R&&R.registerDep(V,ue,B),!h.el){const N=V.subTree=ie(je);$(null,N,v,b),h.placeholder=N.el}}else ue(V,h,v,b,R,E,B)},Ce=(h,v,b)=>{const A=v.component=h.component;if(Pc(h,v,b))if(A.asyncDep&&!A.asyncResolved){ee(A,v,b);return}else A.next=v,A.update();else v.el=h.el,A.vnode=v},ue=(h,v,b,A,R,E,B)=>{const V=()=>{if(h.isMounted){let{next:W,bu:Q,u:te,parent:pe,vnode:xe}=h;{const ut=Si(h);if(ut){W&&(W.el=xe.el,ee(h,W,B)),ut.asyncDep.then(()=>{Ue(()=>{h.isUnmounted||P()},R)});return}}let _e=W,Ie;Gt(h,!1),W?(W.el=xe.el,ee(h,W,B)):W=xe,Q&&pn(Q),(Ie=W.props&&W.props.onVnodeBeforeUpdate)&&dt(Ie,pe,W,xe),Gt(h,!0);const Oe=Cr(h),ct=h.subTree;h.subTree=Oe,S(ct,Oe,d(ct.el),I(ct),h,R,E),W.el=Oe.el,_e===null&&Mc(h,Oe.el),te&&Ue(te,R),(Ie=W.props&&W.props.onVnodeUpdated)&&Ue(()=>dt(Ie,pe,W,xe),R)}else{let W;const{el:Q,props:te}=v,{bm:pe,m:xe,parent:_e,root:Ie,type:Oe}=h,ct=bs(v);Gt(h,!1),pe&&pn(pe),!ct&&(W=te&&te.onVnodeBeforeMount)&&dt(W,_e,v),Gt(h,!0);{Ie.ce&&Ie.ce._hasShadowRoot()&&Ie.ce._injectChildStyle(Oe,h.parent?h.parent.type:void 0);const ut=h.subTree=Cr(h);S(null,ut,b,A,h,R,E),v.el=ut.el}if(xe&&Ue(xe,R),!ct&&(W=te&&te.onVnodeMounted)){const ut=v;Ue(()=>dt(W,_e,ut),R)}(v.shapeFlag&256||_e&&bs(_e.vnode)&&_e.vnode.shapeFlag&256)&&h.a&&Ue(h.a,R),h.isMounted=!0,v=b=A=null}};h.scope.on();const N=h.effect=new Tl(V);h.scope.off();const P=h.update=N.run.bind(N),X=h.job=N.runIfDirty.bind(N);X.i=h,X.id=h.uid,N.scheduler=()=>Ko(X),Gt(h,!0),P()},ee=(h,v,b)=>{v.component=h;const A=h.vnode.props;h.vnode=v,h.next=null,Lc(h,v.props,A,b),Dc(h,v.children,b),At(),hr(h),It()},re=(h,v,b,A,R,E,B,V,N=!1)=>{const P=h&&h.children,X=h?h.shapeFlag:0,W=v.children,{patchFlag:Q,shapeFlag:te}=v;if(Q>0){if(Q&128){qe(P,W,b,A,R,E,B,V,N);return}else if(Q&256){Be(P,W,b,A,R,E,B,V,N);return}}te&8?(X&16&&Xe(P,R,E),W!==P&&u(b,W)):X&16?te&16?qe(P,W,b,A,R,E,B,V,N):Xe(P,R,E,!0):(X&8&&u(b,""),te&16&&U(W,b,A,R,E,B,V,N))},Be=(h,v,b,A,R,E,B,V,N)=>{h=h||gs,v=v||gs;const P=h.length,X=v.length,W=Math.min(P,X);let Q;for(Q=0;QX?Xe(h,R,E,!0,!1,W):U(v,b,A,R,E,B,V,N,W)},qe=(h,v,b,A,R,E,B,V,N)=>{let P=0;const X=v.length;let W=h.length-1,Q=X-1;for(;P<=W&&P<=Q;){const te=h[P],pe=v[P]=N?wt(v[P]):gt(v[P]);if(Xt(te,pe))S(te,pe,b,null,R,E,B,V,N);else break;P++}for(;P<=W&&P<=Q;){const te=h[W],pe=v[Q]=N?wt(v[Q]):gt(v[Q]);if(Xt(te,pe))S(te,pe,b,null,R,E,B,V,N);else break;W--,Q--}if(P>W){if(P<=Q){const te=Q+1,pe=teQ)for(;P<=W;)ze(h[P],R,E,!0),P++;else{const te=P,pe=P,xe=new Map;for(P=pe;P<=Q;P++){const Je=v[P]=N?wt(v[P]):gt(v[P]);Je.key!=null&&xe.set(Je.key,P)}let _e,Ie=0;const Oe=Q-pe+1;let ct=!1,ut=0;const Is=new Array(Oe);for(P=0;P=Oe){ze(Je,R,E,!0);continue}let ft;if(Je.key!=null)ft=xe.get(Je.key);else for(_e=pe;_e<=Q;_e++)if(Is[_e-pe]===0&&Xt(Je,v[_e])){ft=_e;break}ft===void 0?ze(Je,R,E,!0):(Is[ft-pe]=P+1,ft>=ut?ut=ft:ct=!0,S(Je,v[ft],b,null,R,E,B,V,N),Ie++)}const ir=ct?Hc(Is):gs;for(_e=ir.length-1,P=Oe-1;P>=0;P--){const Je=pe+P,ft=v[Je],ar=v[Je+1],cr=Je+1{const{el:E,type:B,transition:V,children:N,shapeFlag:P}=h;if(P&6){at(h.component.subTree,v,b,A);return}if(P&128){h.suspense.move(v,b,A);return}if(P&64){B.move(h,v,b,Y);return}if(B===le){n(E,v,b);for(let W=0;WV.enter(E),R));else{const{leave:W,delayLeave:Q,afterLeave:te}=V,pe=()=>{h.ctx.isUnmounted?o(E):n(E,v,b)},xe=()=>{const _e=E._isLeaving||!!E[tt];E._isLeaving&&E[tt](!0),V.persisted&&!_e?pe():W(E,()=>{pe(),te&&te()})};Q?Q(E,pe,xe):xe()}else n(E,v,b)},ze=(h,v,b,A=!1,R=!1)=>{const{type:E,props:B,ref:V,children:N,dynamicChildren:P,shapeFlag:X,patchFlag:W,dirs:Q,cacheIndex:te,memo:pe}=h;if(W===-2&&(R=!1),V!=null&&(At(),Us(V,null,b,h,!0),It()),te!=null&&(v.renderCache[te]=void 0),X&256){v.ctx.deactivate(h);return}const xe=X&1&&Q,_e=!bs(h);let Ie;if(_e&&(Ie=B&&B.onVnodeBeforeUnmount)&&dt(Ie,v,h),X&6)Wt(h.component,b,A);else{if(X&128){h.suspense.unmount(b,A);return}xe&&Kt(h,null,v,"beforeUnmount"),X&64?h.type.remove(h,v,b,Y,A):P&&!P.hasOnce&&(E!==le||W>0&&W&64)?Xe(P,v,b,!1,!0):(E===le&&W&384||!R&&X&16)&&Xe(N,v,b),A&&as(h)}const Oe=pe!=null&&te==null;(_e&&(Ie=B&&B.onVnodeUnmounted)||xe||Oe)&&Ue(()=>{Ie&&dt(Ie,v,h),xe&&Kt(h,null,v,"unmounted"),Oe&&(h.el=null)},b)},as=h=>{const{type:v,el:b,anchor:A,transition:R}=h;if(v===le){cs(b,A);return}if(v===so){x(h);return}const E=()=>{o(b),R&&!R.persisted&&R.afterLeave&&R.afterLeave()};if(h.shapeFlag&1&&R&&!R.persisted){const{leave:B,delayLeave:V}=R,N=()=>B(b,E);V?V(h.el,E,N):N()}else E()},cs=(h,v)=>{let b;for(;h!==v;)b=g(h),o(h),h=b;o(v)},Wt=(h,v,b)=>{const{bum:A,scope:R,job:E,subTree:B,um:V,m:N,a:P}=h;Tr(N),Tr(P),A&&pn(A),R.stop(),E&&(E.flags|=8,ze(B,h,v,b)),V&&Ue(V,v),Ue(()=>{h.isUnmounted=!0},v)},Xe=(h,v,b,A=!1,R=!1,E=0)=>{for(let B=E;B{if(h.shapeFlag&6)return I(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();const v=g(h.anchor||h.el),b=v&&v[Ql];return b?g(b):v};let G=!1;const H=(h,v,b)=>{let A;h==null?v._vnode&&(ze(v._vnode,null,null,!0),A=v._vnode.component):S(v._vnode||null,h,v,null,null,null,b),v._vnode=h,G||(G=!0,hr(A),Gl(),G=!1)},Y={p:S,um:ze,m:at,r:as,mt:K,mc:U,pc:re,pbc:z,n:I,o:e};return{render:H,hydrate:void 0,createApp:Ec(H)}}function to({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 Gt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Uc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Yo(e,t,s=!1){const n=e.children,o=t.children;if(J(n)&&J(o))for(let r=0;r>1,e[s[i]]0&&(t[n]=s[r-1]),s[r]=n)}}for(r=s.length,l=s[r-1];r-- >0;)s[r]=l,l=t[l];return s}function Si(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Si(t)}function Tr(e){if(e)for(let t=0;te.__isSuspense;function Wc(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):Xa(e)}const le=Symbol.for("v-fgt"),Hn=Symbol.for("v-txt"),je=Symbol.for("v-cmt"),so=Symbol.for("v-stc"),Tt=[];let Ye=null;function k(e=!1){Tt.push(Ye=e?null:[])}function Qo(){Tt.pop(),Ye=Tt[Tt.length-1]||null}let Ys=1;function wn(e,t=!1){Ys+=e,e<0&&Ye&&t&&(Ye.hasOnce=!0)}function Ai(e){return e.dynamicChildren=Ys>0?Ye||gs:null,Qo(),Ys>0&&Ye&&Ye.push(e),e}function T(e,t,s,n,o,r){return Ai(c(e,t,s,n,o,r,!0))}function Me(e,t,s,n,o){return Ai(ie(e,t,s,n,o,!0))}function Qs(e){return e?e.__v_isVNode===!0:!1}function Xt(e,t){return e.type===t.type&&e.key===t.key}const Ii=({key:e})=>e??null,hn=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?we(e)||Ae(e)||ne(e)?{i:Ne,r:e,k:t,f:!!s}:e:null);function c(e,t=null,s=null,n=0,o=null,r=e===le?0:1,l=!1,i=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ii(t),ref:t&&hn(t),scopeId:zl,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:r,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ne};return i?(Cn(a,s),r&128&&e.normalize(a)):s&&(a.shapeFlag|=we(s)?8:16),Ys>0&&!l&&Ye&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&Ye.push(a),a}const ie=Kc;function Kc(e,t=null,s=null,n=0,o=null,r=!1){if((!e||e===ci)&&(e=je),Qs(e)){const i=Ut(e,t,!0);return s&&Cn(i,s),Ys>0&&!r&&Ye&&(i.shapeFlag&6?Ye[Ye.indexOf(e)]=i:Ye.push(i)),i.patchFlag=-2,i}if(su(e)&&(e=e.__vccOpts),t){t=Gc(t);let{class:i,style:a}=t;i&&!we(i)&&(t.class=q(i)),ge(a)&&(Vn(a)&&!J(a)&&(a=Re({},a)),t.style=Ln(a))}const l=we(e)?1:Ti(e)?128:Dn(e)?64:ge(e)?4:ne(e)?2:0;return c(e,t,s,n,o,l,r,!0)}function Gc(e){return e?Vn(e)||bi(e)?Re({},e):e:null}function Ut(e,t,s=!1,n=!1){const{props:o,ref:r,patchFlag:l,children:i,transition:a}=e,f=t?qc(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&Ii(f),ref:t&&t.ref?s&&r?J(r)?r.concat(hn(t)):[r,hn(t)]:hn(t):r,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!==le?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ut(e.ssContent),ssFallback:e.ssFallback&&Ut(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&n&&ns(u,a.clone(u)),u}function oe(e=" ",t=0){return ie(Hn,null,e,t)}function ce(e="",t=!1){return t?(k(),Me(je,null,e)):ie(je,null,e)}function gt(e){return e==null||typeof e=="boolean"?ie(je):J(e)?ie(le,null,e.slice()):Qs(e)?wt(e):ie(Hn,null,String(e))}function wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ut(e)}function Cn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(J(t))s=16;else if(typeof t=="object")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),Cn(e,o()),o._c&&(o._d=!0));return}else{s=32;const o=t._;!o&&!bi(t)?t._ctx=Ne:o===3&&Ne&&(Ne.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(ne(t)){if(n&65){Cn(e,{default:t});return}t={default:t,_ctx:Ne},s=32}else t=String(t),n&64?(s=16,t=[oe(t)]):s=8;e.children=t,e.shapeFlag|=s}function qc(...e){const t={};for(let s=0;sDe||Ne;let Sn,Zs;{const e=On(),t=(s,n)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(n),r=>{o.length>1?o.forEach(l=>l(r)):o[0](r)}};Sn=t("__VUE_INSTANCE_SETTERS__",s=>De=s),Zs=t("__VUE_SSR_SETTERS__",s=>Xs=s)}const rn=e=>{const t=De;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},Ar=()=>{De&&De.scope.off(),Sn(null)};function Ri(e){return e.vnode.shapeFlag&4}let Xs=!1;function Qc(e,t=!1,s=!1){t&&Zs(t);const{props:n,children:o}=e.vnode,r=Ri(e);Oc(e,n,r,t),jc(e,o,s||t);const l=r?Zc(e,t):void 0;return t&&Zs(!1),l}function Zc(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,bc);const{setup:n}=s;if(n){At();const o=e.setupContext=n.length>1?eu(e):null,r=rn(e),l=nn(n,e,0,[e.props,o]),i=vl(l);if(It(),r(),(i||e.sp)&&!bs(e)&&oi(e),i){if(l.then(Ar,Ar),t)return l.then(a=>{Zs(!0);try{Ir(e,a,t)}finally{Zs(!1)}}).catch(a=>{jn(a,e,0)});e.asyncDep=l}else Ir(e,l)}else $i(e)}function Ir(e,t,s){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Hl(t)),$i(e)}function $i(e,t,s){const n=e.type;e.render||(e.render=n.render||bt);{const o=rn(e);At();try{xc(e)}finally{It(),o()}}}const Xc={get(e,t){return Ve(e,"get",""),e[t]}};function eu(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Xc),slots:e.slots,emit:e.emit,expose:t}}function Wn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Hl(Wo(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 tu(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function su(e){return ne(e)&&"__vccOpts"in e}const ve=(e,t)=>za(e,t,Xs);function Zo(e,t,s){try{wn(-1);const n=arguments.length;return n===2?ge(t)&&!J(t)?Qs(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Qs(s)&&(s=[s]),ie(e,t,s))}finally{wn(1)}}const nu="3.5.41";let Co;const Rr=typeof window<"u"&&window.trustedTypes;if(Rr)try{Co=Rr.createPolicy("vue",{createHTML:e=>e})}catch{}const Pi=Co?e=>Co.createHTML(e):e=>e,ou="http://www.w3.org/2000/svg",ru="http://www.w3.org/1998/Math/MathML",kt=typeof document<"u"?document:null,$r=kt&&kt.createElement("template"),lu={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"?kt.createElementNS(ou,e):t==="mathml"?kt.createElementNS(ru,e):s?kt.createElement(e,{is:s}):kt.createElement(e);return e==="select"&&n&&n.multiple!=null&&o.setAttribute("multiple",n.multiple),o},createText:e=>kt.createTextNode(e),createComment:e=>kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,o,r){const l=s?s.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===r||!(o=o.nextSibling)););else{$r.innerHTML=Pi(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const i=$r.content;if(n==="svg"||n==="mathml"){const a=i.firstChild;for(;a.firstChild;)i.appendChild(a.firstChild);i.removeChild(a)}t.insertBefore(i,s)}return[l?l.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Mt="transition",Ps="animation",ks=Symbol("_vtc"),Mi={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},Oi=Re({},Xl,Mi),iu=e=>(e.displayName="Transition",e.props=Oi,e),So=iu((e,{slots:t})=>Zo(ac,Li(e),t)),qt=(e,t=[])=>{J(e)?e.forEach(s=>s(...t)):e&&e(...t)},Pr=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function Li(e){const t={};for(const j in e)j in Mi||(t[j]=e[j]);if(e.css===!1)return t;const{name:s="v",type:n,duration:o,enterFromClass:r=`${s}-enter-from`,enterActiveClass:l=`${s}-enter-active`,enterToClass:i=`${s}-enter-to`,appearFromClass:a=r,appearActiveClass:f=l,appearToClass:u=i,leaveFromClass:d=`${s}-leave-from`,leaveActiveClass:g=`${s}-leave-active`,leaveToClass:p=`${s}-leave-to`}=e,w=au(o),S=w&&w[0],L=w&&w[1],{onBeforeEnter:$,onEnter:m,onEnterCancelled:_,onLeave:x,onLeaveCancelled:y,onBeforeAppear:Z=$,onAppear:D=m,onAppearCancelled:U=_}=t,M=(j,C,K,Ce)=>{j._enterCancelled=Ce,Vt(j,C?u:i),Vt(j,C?f:l),K&&K()},z=(j,C)=>{j._isLeaving=!1,Vt(j,d),Vt(j,p),Vt(j,g),C&&C()},se=j=>(C,K)=>{const Ce=j?D:m,ue=()=>M(C,j,K);qt(Ce,[C,ue]),Mr(()=>{Vt(C,j?a:r),pt(C,j?u:i),Pr(Ce)||Or(C,n,S,ue)})};return Re(t,{onBeforeEnter(j){qt($,[j]),pt(j,r),pt(j,l)},onBeforeAppear(j){qt(Z,[j]),pt(j,a),pt(j,f)},onEnter:se(!1),onAppear:se(!0),onLeave(j,C){j._isLeaving=!0;const K=()=>z(j,C);pt(j,d),j._enterCancelled?(pt(j,g),Eo(j)):(Eo(j),pt(j,g)),Mr(()=>{j._isLeaving&&(Vt(j,d),pt(j,p),Pr(x)||Or(j,n,L,K))}),qt(x,[j,K])},onEnterCancelled(j){M(j,!1,void 0,!0),qt(_,[j])},onAppearCancelled(j){M(j,!0,void 0,!0),qt(U,[j])},onLeaveCancelled(j){z(j),qt(y,[j])}})}function au(e){if(e==null)return null;if(ge(e))return[no(e.enter),no(e.leave)];{const t=no(e);return[t,t]}}function no(e){return ha(e)}function pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[ks]||(e[ks]=new Set)).add(t)}function Vt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[ks];s&&(s.delete(t),s.size||(e[ks]=void 0))}function Mr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let cu=0;function Or(e,t,s,n){const o=e._endId=++cu,r=()=>{o===e._endId&&n()};if(s!=null)return setTimeout(r,s);const{type:l,timeout:i,propCount:a}=Ni(e,t);if(!l)return n();const f=l+"end";let u=0;const d=()=>{e.removeEventListener(f,g),r()},g=p=>{p.target===e&&++u>=a&&d()};setTimeout(()=>{u(s[w]||"").split(", "),o=n(`${Mt}Delay`),r=n(`${Mt}Duration`),l=Lr(o,r),i=n(`${Ps}Delay`),a=n(`${Ps}Duration`),f=Lr(i,a);let u=null,d=0,g=0;t===Mt?l>0&&(u=Mt,d=l,g=r.length):t===Ps?f>0&&(u=Ps,d=f,g=a.length):(d=Math.max(l,f),u=d>0?l>f?Mt:Ps:null,g=u?u===Mt?r.length:a.length:0);const p=u===Mt&&/\b(?:transform|all)(?:,|$)/.test(n(`${Mt}Property`).toString());return{type:u,timeout:d,propCount:g,hasTransform:p}}function Lr(e,t){for(;e.lengthNr(s)+Nr(e[n])))}function Nr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Eo(e){return(e?e.ownerDocument:document).body.offsetHeight}function uu(e,t,s){const n=e[ks];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const En=Symbol("_vod"),Xo=Symbol("_vsh"),Vr={name:"show",beforeMount(e,{value:t},{transition:s}){e[En]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Ms(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),Ms(e,!0),n.enter(e)):n.leave(e,()=>{Ms(e,!1)}):Ms(e,t))},beforeUnmount(e,{value:t}){Ms(e,t)}};function Ms(e,t){e.style.display=t?e[En]:"none",e[Xo]=!t}const fu=Symbol(""),du=/(?:^|;)\s*display\s*:/;function pu(e,t,s){const n=e.style,o=we(s);let r=!1;if(s&&!o){if(t)if(we(t))for(const l of t.split(";")){const i=l.slice(0,l.indexOf(":")).trim();s[i]==null&&Vs(n,i,"")}else for(const l in t)s[l]==null&&Vs(n,l,"");for(const l in s){l==="display"&&(r=!0);const i=s[l];i!=null?mu(e,l,!we(t)&&t?t[l]:void 0,i)||Vs(n,l,i):Vs(n,l,"")}}else if(o){if(t!==s){const l=n[fu];l&&(s+=";"+l),n.cssText=s,r=du.test(s)}}else t&&e.removeAttribute("style");En in e&&(e[En]=r?n.display:"",e[Xo]&&(n.display="none"))}const jr=/\s*!important$/;function Vs(e,t,s){if(J(s))s.forEach(n=>Vs(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=hu(e,t);jr.test(s)?e.setProperty(os(n),s.replace(jr,""),"important"):e[n]=s}}const Dr=["Webkit","Moz","ms"],oo={};function hu(e,t){const s=oo[t];if(s)return s;let n=Ke(t);if(n!=="filter"&&n in e)return oo[t]=n;n=Pn(n);for(let o=0;oro||(yu.then(()=>ro=0),ro=Date.now());function wu(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const o=s.value;if(J(o)){const r=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{r.call(n),n._stopped=!0};const l=o.slice(),i=[n];for(let a=0;ae.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Cu=(e,t,s,n,o,r)=>{const l=o==="svg";t==="class"?uu(e,n,l):t==="style"?pu(e,s,n):An(t)?In(t)||vu(e,t,s,n,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Su(e,t,n,l))?(Ur(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Fr(e,t,n,l,r,t!=="value")):e._isVueCE&&(Eu(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!we(n)))?Ur(e,Ke(t),n,r,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Fr(e,t,n,l))};function Su(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&Wr(t)&&ne(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 Wr(t)&&we(s)?!1:t in e}function Eu(e,t){const s=e._def.props;if(!s)return!1;const n=Ke(t);return Array.isArray(s)?s.some(o=>Ke(o)===n):Object.keys(s).some(o=>Ke(o)===n)}const Vi=new WeakMap,ji=new WeakMap,Tn=Symbol("_moveCb"),Kr=Symbol("_enterCb"),Tu=e=>(delete e.props.mode,e),Au=Tu({name:"TransitionGroup",props:Re({},Oi,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=on(),n=Zl();let o,r;return li(()=>{if(!o.length)return;const l=e.moveClass||`${e.name||"v"}-move`;if(!Pu(o[0].el,s.vnode.el,l)){o=[];return}o.forEach(Iu),o.forEach(Ru);const i=o.filter($u);Eo(s.vnode.el),i.forEach(a=>{const f=a.el,u=f.style;pt(f,l),u.transform=u.webkitTransform=u.transitionDuration="";const d=f[Tn]=g=>{g&&g.target!==f||(!g||g.propertyName.endsWith("transform"))&&(f.removeEventListener("transitionend",d),f[Tn]=null,Vt(f,l))};f.addEventListener("transitionend",d)}),o=[]}),()=>{const l=de(e),i=Li(l);let a=l.tag||le;if(o=[],r)for(let f=0;f{i.split(/\s+/).forEach(a=>a&&n.classList.remove(a))}),s.split(/\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(n);const{hasTransform:l}=Ni(n);return r.removeChild(n),l}const ws=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?s=>pn(t,s):t};function Mu(e){e.target.composing=!0}function Gr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _t=Symbol("_assign"),dn=Symbol("_initialValue");function lo(e,t,s){return t&&(e=e.trim()),s&&(e=Mn(e)),e}const Le={created(e,{modifiers:{lazy:t,trim:s,number:n}},o){e.parentNode&&(e.type==="text"?e[dn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[dn]=e.defaultValue.replace(/\r\n?/g,` +`))),e[_t]=ws(o);const r=n||o.props&&o.props.type==="number";Ft(e,t?"change":"input",l=>{l.target.composing||e[_t](lo(e.value,s,r))}),(s||r)&&Ft(e,"change",()=>{e.value=lo(e.value,s,r)}),t||(Ft(e,"compositionstart",Mu),Ft(e,"compositionend",Gr),Ft(e,"change",Gr))},mounted(e,{value:t,modifiers:{trim:s,number:n}}){const o=t??"",r=e[dn];delete e[dn],r!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==r?e[_t](lo(e.value,s,n)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:o,number:r}},l){if(e[_t]=ws(l),e.composing)return;const i=(r||e.type==="number")&&!/^0\d/.test(e.value)?Mn(e.value):e.value,a=t??"";if(i===a)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(n&&t===s||o&&e.value.trim()===a)||(e.value=a)}},zt={deep:!0,created(e,t,s){e[_t]=ws(s),Ft(e,"change",()=>{const n=e._modelValue,o=en(e),r=e.checked,l=e[_t];if(J(n)){const i=Vo(n,o),a=i!==-1;if(r&&!a)l(n.concat(o));else if(!r&&a){const f=[...n];f.splice(i,1),l(f)}}else if(Es(n)){const i=new Set(n);r?i.add(o):i.delete(o),l(i)}else l(Fi(e,r))})},mounted:qr,beforeUpdate(e,t,s){e[_t]=ws(s),qr(e,t,s)}};function qr(e,{value:t,oldValue:s},n){e._modelValue=t;let o;if(J(t))o=Vo(t,n.props.value)>-1;else if(Es(t))o=t.has(n.props.value);else{if(t===s)return;o=Ts(t,Fi(e,!0))}e.checked!==o&&(e.checked=o)}const Bi={deep:!0,created(e,{value:t,modifiers:{number:s}},n){e._modelValue=t,Ft(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Mn(en(r)):en(r));e[_t](e.multiple?Es(e._modelValue)?new Set(o):o:o[0]),e._assigning=!0,$t(()=>{e._assigning=!1})}),e[_t]=ws(n)},mounted(e,{value:t}){zr(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[_t]=ws(s)},updated(e,{value:t}){e._assigning||zr(e,t)}};function zr(e,t){const s=e.multiple,n=J(t);if(!(s&&!n&&!Es(t))){for(let o=0,r=e.options.length;oString(f)===String(i)):l.selected=Vo(t,i)>-1}else l.selected=t.has(i);else if(Ts(en(l),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function en(e){return"_value"in e?e._value:e.value}function Fi(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Ou=["ctrl","shift","alt","meta"],Lu={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)=>Ou.some(s=>e[`${s}Key`]&&!t.includes(s))},xs=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((o,...r)=>{for(let l=0;l{const t=Vu().createApp(...e),{mount:s}=t;return t.mount=n=>{const o=Bu(n);if(!o)return;const r=t._component;!ne(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const l=s(o,!1,Du(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),l},t});function Du(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Bu(e){return we(e)?document.querySelector(e):e}let Ui;const Kn=e=>Ui=e,Hi=Symbol();function To(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 Fu(){const e=Sl(!0),t=e.run(()=>ae({}));let s=[],n=[];const o=Wo({install(r){Kn(o),o._a=r,r.provide(Hi,o),r.config.globalProperties.$pinia=o,n.forEach(l=>s.push(l)),n=[]},use(r){return this._a?s.push(r):n.push(r),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return o}const Wi=()=>{};function Yr(e,t,s,n=Wi){e.add(t);const o=()=>{e.delete(t)&&n()};return!s&&El()&&ka(o),o}function fs(e,...t){e.forEach(s=>{s(...t)})}const Uu=e=>e(),Qr=Symbol(),io=Symbol();function Ao(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];To(o)&&To(n)&&e.hasOwnProperty(s)&&!Ae(n)&&!Et(n)?e[s]=Ao(o,n):e[s]=n}return e}const Hu=Symbol();function Wu(e){return!To(e)||!Object.prototype.hasOwnProperty.call(e,Hu)}const{assign:jt}=Object;function Ku(e){return!!(Ae(e)&&e.effect)}function Gu(e,t,s,n){const{state:o,actions:r,getters:l}=t,i=s.state.value[e];let a;function f(){i||(s.state.value[e]=o?o():{});const u=Wa(s.state.value[e]);return jt(u,r,Object.keys(l||{}).reduce((d,g)=>(d[g]=Wo(ve(()=>{Kn(s);const p=s._s.get(e);return l[g].call(p,p)})),d),{}))}return a=Ki(e,f,t,s,n,!0),a}function Ki(e,t,s={},n,o,r){let l;const i=jt({actions:{}},s),a={deep:!0};let f,u,d=new Set,g=new Set,p;const w=n.state.value[e];!r&&!w&&(n.state.value[e]={});let S;function L(U){let M;f=u=!1,typeof U=="function"?(U(n.state.value[e]),M={type:Ws.patchFunction,storeId:e,events:p}):(Ao(n.state.value[e],U),M={type:Ws.patchObject,payload:U,storeId:e,events:p});const z=S=Symbol();$t().then(()=>{S===z&&(f=!0)}),u=!0,fs(d,M,n.state.value[e])}const $=r?function(){const{state:M}=s,z=M?M():{};this.$patch(se=>{jt(se,z)})}:Wi;function m(){l.stop(),d.clear(),g.clear(),n._s.delete(e)}const _=(U,M="")=>{if(Qr in U)return U[io]=M,U;const z=function(){Kn(n);const se=Array.from(arguments),j=new Set,C=new Set;function K(ee){j.add(ee)}function Ce(ee){C.add(ee)}fs(g,{args:se,name:z[io],store:y,after:K,onError:Ce});let ue;try{ue=U.apply(this&&this.$id===e?this:y,se)}catch(ee){throw fs(C,ee),ee}return ue instanceof Promise?ue.then(ee=>(fs(j,ee),ee)).catch(ee=>(fs(C,ee),Promise.reject(ee))):(fs(j,ue),ue)};return z[Qr]=!0,z[io]=M,z},x={_p:n,$id:e,$onAction:Yr.bind(null,g),$patch:L,$reset:$,$subscribe(U,M={}){const z=Yr(d,U,M.detached,()=>se()),se=l.run(()=>Ge(()=>n.state.value[e],j=>{(M.flush==="sync"?u:f)&&U({storeId:e,type:Ws.direct,events:p},j)},jt({},a,M)));return z},$dispose:m},y=rs(x);n._s.set(e,y);const D=(n._a&&n._a.runWithContext||Uu)(()=>n._e.run(()=>(l=Sl()).run(()=>t({action:_}))));for(const U in D){const M=D[U];if(Ae(M)&&!Ku(M)||Et(M))r||(w&&Wu(M)&&(Ae(M)?M.value=w[U]:Ao(M,w[U])),n.state.value[e][U]=M);else if(typeof M=="function"){const z=_(M,U);D[U]=z,i.actions[U]=M}}return jt(y,D),jt(de(y),D),Object.defineProperty(y,"$state",{get:()=>n.state.value[e],set:U=>{L(M=>{jt(M,U)})}}),n._p.forEach(U=>{jt(y,l.run(()=>U({store:y,app:n._a,pinia:n,options:i})))}),w&&r&&s.hydrate&&s.hydrate(y.$state,w),f=!0,u=!0,y}function tr(e,t,s){let n;const o=typeof t=="function";n=o?s:t;function r(l,i){const a=ec();return l=l||(a?ot(Hi,null):null),l&&Kn(l),l=Ui,l._s.has(e)||(o?Ki(e,t,n,l):Gu(e,n,l)),l._s.get(e)}return r.$id=e,r}const it=async(e,t)=>{const n=await(await fetch(e,t)).json();if(n.code!==0)throw new Error(n.msg||"请求失败");return n.data},Gi={"Content-Type":"application/json"},qu=e=>it(`/api/info?file_name=${encodeURIComponent(e)}`),zu=e=>it(`/api/peers?file_name=${encodeURIComponent(e)}`),Ju=e=>it(`/api/routes?file_name=${encodeURIComponent(e)}`),Yu=e=>it(`/api/start/status?file_name=${encodeURIComponent(e)}`),Qu=()=>it("/api/instances"),Zu=e=>it(`/api/instance?file_name=${encodeURIComponent(e)}`,{method:"DELETE"}),sr=(e,t)=>it(e,{method:"POST",headers:Gi,body:JSON.stringify({file_name:t})}),Xu=e=>sr("/api/start",e),qi=e=>sr("/api/stop",e),ef=e=>sr("/api/restart",e),tf=()=>it("/api/config/list"),sf=e=>it(`/api/config?file_name=${encodeURIComponent(e)}`),nf=(e,t)=>it("/api/config",{method:"POST",headers:Gi,body:JSON.stringify({file_name:e||null,config:t})}),of=e=>it(`/api/config?file_name=${encodeURIComponent(e)}`,{method:"DELETE"});let rf=0;const is=tr("ui",()=>{const e=ae([]),t=(i,a,f=3e3)=>{const u=++rf;e.value.push({id:u,type:i,message:a}),setTimeout(()=>{e.value=e.value.filter(d=>d.id!==u)},f)},s={success:i=>t("success",i),error:i=>t("error",i,4500),info:i=>t("info",i)},n=rs({show:!1,title:"",message:"",danger:!1,confirmText:"确定",resolve:null});return{toasts:e,toast:s,confirmState:n,confirm:({title:i="确认操作",message:a="",danger:f=!1,confirmText:u="确定"}={})=>new Promise(d=>{n.show=!0,n.title=i,n.message=a,n.danger=f,n.confirmText=u,n.resolve=d}),confirmOk:()=>{n.show=!1,n.resolve&&n.resolve(!0),n.resolve=null},confirmCancel:()=>{n.show=!1,n.resolve&&n.resolve(!1),n.resolve=null}}}),zi=tr("startLog",()=>{const e=ae(!1),t=ae([]),s=ae("stopped"),n=ae(null),o=ae(null);let r=null,l=null,i=null,a=null;const f=({fetchInstances:$,instanceList:m,configList:_})=>{l=$,i=m,a=_},u=ve(()=>{if(!n.value)return"";const $=(i?.value||[]).find(_=>_.file_name===n.value);if($)return $.config_name||$.file_name;const m=(a?.value||[]).find(_=>_.file_name===n.value);return m?m.config_name||m.file_name:n.value}),d=async()=>{if(n.value)try{const $=await Yu(n.value);t.value=$.logs||[],s.value=$.status,$t(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)}),s.value==="running"?(g(),l&&l(),e.value=!1):s.value==="stopped"&&t.value.length>0&&(g(),l&&l())}catch($){console.error($)}},g=()=>{r&&(clearInterval(r),r=null)},p=()=>{g(),r=setInterval(d,1e3),d()};return{showStartLog:e,startLogs:t,startStatus:s,logFileName:n,logContainer:o,logConfigName:u,bindApp:f,openStartLog:$=>{n.value=$,t.value=[],s.value="starting",e.value=!0,p()},pollStartStatus:d,startPolling:p,stopPolling:g,cancelStart:async()=>{g();const $=n.value;if($)try{await qi($),t.value.push("启动已手动取消")}catch{}s.value="stopped",l&&l()},close:()=>{e.value=!1}}}),Ht=tr("app",()=>{const e=is(),t=zi(),s=ae({}),n=ae([]),o=ae(null),r=ae([]),l=ae({}),i=ae({}),a=ae(!document.hidden),f=()=>{a.value=!document.hidden};let u=null;const d=ve(()=>n.value.filter(C=>C.status==="running").length),g=ve(()=>n.value.filter(C=>C.status==="starting").length),p=ve(()=>d.value>0?`运行中 x${d.value}`:g.value>0?"启动中...":"未启动"),w=ve(()=>o.value&&s.value[o.value]||null),S=ve(()=>{if(!o.value)return"";const C=n.value.find(K=>K.file_name===o.value);return C?C.config_name||C.file_name:o.value}),L=ve(()=>{for(const C in s.value){const K=s.value[C];if(K&&K.version)return K.version}return""}),$=ve(()=>!!(w.value&&w.value.server_info&&w.value.server_info.some(C=>C.connected))),m=ve(()=>{const C=w.value;return!C||!C.server_info||!C.server_info.length?"未配置服务器":`${C.server_info.filter(K=>K.connected).length} / ${C.server_info.length} 已连接`}),_=C=>s.value[C]||{},x=async C=>{try{s.value[C]=await qu(C)}catch(K){console.error("Fetch info error",K)}},y=async()=>{try{const C=await Qu()||[];n.value=C;for(const K of Object.keys(s.value))C.some(Ce=>Ce.file_name===K)||delete s.value[K];for(const K of Object.keys(i.value)){const Ce=C.find(ue=>ue.file_name===K);(!Ce||Ce.status==="stopped")&&delete i.value[K]}if(!o.value||!C.some(K=>K.file_name===o.value)){const K=C.find(Ce=>Ce.status==="running");o.value=K?K.file_name:C.length>0?C[0].file_name:null}for(const K of C)K.status==="running"&&x(K.file_name)}catch(C){console.error("Fetch instances error",C)}},Z=async()=>{try{r.value=await tf()||[]}catch(C){console.error("Fetch list error",C)}},D=async C=>{if(!C){e.toast.error("请先选择一个配置");return}if(!l.value[C]){l.value[C]=!0;try{await Xu(C),t.openStartLog(C),y()}catch(K){e.toast.error("启动失败: "+K.message)}finally{l.value[C]=!1}}},U=async C=>{if(!(!C||l.value[C])){l.value[C]=!0,i.value[C]=!0;try{await qi(C),e.toast.success("已停止"),t.logFileName===C&&(t.stopPolling(),t.showStartLog=!1),y()}catch(K){e.toast.error("停止失败: "+K.message),console.error(K),delete i.value[C]}finally{l.value[C]=!1}}},M=async C=>{if(!(!C||l.value[C])){l.value[C]=!0;try{await ef(C),t.openStartLog(C),y()}catch(K){e.toast.error("重启失败: "+K.message)}finally{l.value[C]=!1}}},z=async C=>{if(!(!C||l.value[C])){l.value[C]=!0;try{await Zu(C),e.toast.success("已移除"),t.logFileName===C&&(t.stopPolling(),t.showStartLog=!1),o.value===C&&(o.value=null),y()}catch(K){e.toast.error("移除失败: "+K.message)}finally{l.value[C]=!1}}};t.bindApp({fetchInstances:y,instanceList:n,configList:r});const se=async()=>{document.addEventListener("visibilitychange",f),await y(),Z();const C=n.value.find(K=>K.status==="starting");C&&t.openStartLog(C.file_name),u=setInterval(()=>{a.value&&y()},3e3)},j=()=>{document.removeEventListener("visibilitychange",f),t.stopPolling(),u&&clearInterval(u)};return on()&&(ls(se),As(j)),{instances:s,instanceList:n,selectedInstance:o,configList:r,loadingMap:l,stoppingMap:i,isPageVisible:a,runningCount:d,startingCount:g,headerStatusText:p,selectedInfo:w,selectedConfigName:S,version:L,isServerConnected:$,serverStatusText:m,infoOf:_,fetchInstances:y,fetchInstanceInfo:x,fetchConfigList:Z,startVnt:D,stopVnt:U,restartVnt:M,dismissInstance:z}}),lf={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"},af={class:"custom-scrollbar min-h-0 flex-1 overflow-y-auto"},cf={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"},nr={__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=l=>{s.escClosable&&l.key==="Escape"&&n("close")};Ge(()=>s.show,l=>{l?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),As(()=>window.removeEventListener("keydown",o));const r=()=>{s.maskClosable&&n("close")};return(l,i)=>(k(),Me(Go,{to:"body"},[ie(So,{name:"modal"},{default:Se(()=>[e.show?(k(),T("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm",onClick:xs(r,["self"])},[c("div",{class:q(["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])},[l.$slots.header?(k(),T("div",lf,[Xn(l.$slots,"header")])):ce("",!0),c("div",af,[Xn(l.$slots,"body")]),l.$slots.footer?(k(),T("div",cf,[Xn(l.$slots,"footer")])):ce("",!0)],2)])):ce("",!0)]),_:3})]))}},uf={class:"pointer-events-none fixed right-4 top-4 z-[100] flex flex-col items-end gap-2"},ff={class:"flex items-center gap-2 px-4 py-2.5"},df=["d"],pf={class:"break-all text-sm text-slate-700 dark:text-slate-200"},hf={__name:"ToastHost",setup(e){const t=is(),s=r=>r==="success"?"bg-green-500":r==="error"?"bg-red-500":"bg-indigo-500",n=r=>r==="success"?"text-green-500":r==="error"?"text-red-500":"text-indigo-500",o=r=>r==="success"?"M5 13l4 4L19 7":r==="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(r,l)=>(k(),Me(Go,{to:"body"},[c("div",uf,[ie(er,{name:"toast"},{default:Se(()=>[(k(!0),T(le,null,Ee(O(t).toasts,i=>(k(),T("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"},[c("span",{class:q(["w-1 shrink-0",s(i.type)])},null,2),c("div",ff,[(k(),T("svg",{class:q(["h-4 w-4 shrink-0",n(i.type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:o(i.type)},null,8,df)],2)),c("span",pf,F(i.message),1)])]))),128))]),_:1})])]))}},mf={class:"text-lg font-bold text-slate-900 flex items-center gap-2 dark:text-white"},gf={key:0,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},vf={class:"px-6 py-5 text-sm text-slate-600 break-all dark:text-slate-300"},_f={__name:"ConfirmHost",setup(e){const t=is();return(s,n)=>(k(),Me(nr,{show:O(t).confirmState.show,"panel-class":"w-full max-w-sm",onClose:O(t).confirmCancel},{header:Se(()=>[c("h3",mf,[O(t).confirmState.danger?(k(),T("svg",gf,[...n[2]||(n[2]=[c("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)])])):ce("",!0),oe(" "+F(O(t).confirmState.title),1)])]),body:Se(()=>[c("p",vf,F(O(t).confirmState.message),1)]),footer:Se(()=>[c("button",{class:"btn-ghost",onClick:n[0]||(n[0]=(...o)=>O(t).confirmCancel&&O(t).confirmCancel(...o))},"取消"),c("button",{class:q(O(t).confirmState.danger?"btn-danger":"btn-primary"),onClick:n[1]||(n[1]=(...o)=>O(t).confirmOk&&O(t).confirmOk(...o))},F(O(t).confirmState.confirmText),3)]),_:1},8,["show","onClose"]))}},or={__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(),T("span",{class:q(["rounded-full inline-block shrink-0",[e.size,t(e.status)]])},null,2))}},bf={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"},xf={class:"relative z-10 mb-2 flex items-center justify-between border-b border-slate-200 pb-2 dark:border-slate-600"},yf={class:"badge-green border border-green-200 dark:border-green-800"},kf={key:0,class:"relative z-10 mb-3"},wf={class:"flex flex-wrap gap-1"},Cf={key:1,class:"relative z-10"},Sf={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"},Ef={__name:"AppTooltip",setup(e,{expose:t}){const s=ae({show:!1,x:0,y:0,info:null});let n=null;const o=(a,f)=>{if(!f.nat_info)return;n&&(clearTimeout(n),n=null);const u=a.currentTarget.getBoundingClientRect();s.value={show:!0,x:u.left+u.width/2,y:u.bottom+10,info:f.nat_info}},r=()=>{n=setTimeout(()=>{s.value.show=!1},100)},l=()=>{n&&(clearTimeout(n),n=null)},i=()=>{s.value.show=!1};return t({showPeerTooltip:o,hidePeerTooltip:r}),(a,f)=>(k(),Me(Go,{to:"body"},[s.value.show?(k(),T("div",{key:0,style:Ln({top:s.value.y+"px",left:s.value.x+"px"}),class:"fixed z-[9999] mt-1 -translate-x-1/2 transform",onMouseenter:l,onMouseleave:i},[c("div",bf,[f[3]||(f[3]=c("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)),c("div",xf,[f[0]||(f[0]=c("span",{class:"text-xs font-bold uppercase text-slate-400"},"NAT Type",-1)),c("span",yf,F(s.value.info.nat_type),1)]),s.value.info.public_ips&&s.value.info.public_ips.length>0?(k(),T("div",kf,[f[1]||(f[1]=c("span",{class:"mb-1 block text-xs text-slate-400"},"Public IPv4:",-1)),c("div",wf,[(k(!0),T(le,null,Ee(s.value.info.public_ips,u=>(k(),T("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"},F(u),1))),128))])])):ce("",!0),s.value.info.ipv6?(k(),T("div",Cf,[f[2]||(f[2]=c("span",{class:"mb-1 block text-xs text-slate-400"},"IPv6:",-1)),c("div",Sf,F(s.value.info.ipv6),1)])):ce("",!0)])],36)):ce("",!0)]))}},Tf={class:"flex min-h-screen flex-col"},Af={class:"sticky top-0 z-30 border-b border-slate-200 bg-white/80 backdrop-blur dark:border-slate-800 dark:bg-slate-900/80"},If={class:"mx-auto flex h-14 max-w-6xl items-center gap-3 px-4 lg:px-8"},Rf={class:"ml-6 hidden h-14 items-stretch gap-1 lg:flex"},$f=["onClick"],Pf={key:0,class:"absolute inset-x-3 bottom-0 h-0.5 rounded-full bg-indigo-600 dark:bg-indigo-400"},Mf={class:"ml-auto flex items-center gap-3"},Of=["title"],Lf={class:"hidden text-xs font-medium text-slate-600 sm:inline dark:text-slate-300"},Nf={class:"hidden text-xs text-slate-400 md:inline dark:text-slate-500"},Vf=["title"],jf={key:0,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Df={key:1,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Bf={key:0,class:"border-t border-slate-200 bg-white px-4 py-2 lg:hidden dark:border-slate-800 dark:bg-slate-900"},Ff=["onClick"],Uf={class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Hf=["d"],Wf=["d"],Kf={class:"flex-1 overflow-x-hidden"},Gf={class:"mx-auto w-full max-w-6xl px-4 py-6 lg:px-8"},qf={class:"flex items-center gap-3"},zf={key:0,class:"h-3 w-3 animate-ping rounded-full bg-blue-500"},Jf={key:1,class:"h-3 w-3 rounded-full bg-green-500"},Yf={key:2,class:"h-3 w-3 rounded-full bg-red-500"},Qf={class:"text-lg font-bold text-slate-900 dark:text-white"},Zf={class:"flex items-center gap-3"},Xf=["title"],ed={class:"font-mono text-xs uppercase tracking-widest text-slate-400"},td={class:"break-all text-slate-600 dark:text-slate-300"},sd={key:0,class:"mt-4 animate-pulse italic text-blue-500"},nd={key:1,class:"mt-4 rounded-lg border border-red-200 bg-red-50 p-3 text-red-600 dark:border-red-900/50 dark:bg-red-900/20 dark:text-red-400"},od={__name:"App",setup(e){const t=Ht(),s=zi(),n=ae(null);Fs("peerTooltip",n);const o=ae(document.documentElement.classList.contains("dark")),r=()=>{o.value=!o.value,document.documentElement.classList.toggle("dark",o.value),localStorage.setItem("vnt-theme",o.value?"dark":"light")},l=ae(!1),i=()=>{l.value=!1},a=[{to:"/",label:"总览",exact:!0,icon:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"},{to:"/instances",label:"实例",icon:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"},{to:"/config",label:"配置",icon:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z",icon2:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},{to:"/peers",label:"设备列表",icon:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"},{to:"/routes",label:"路由",icon:"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-.98l-3.747-1.874M12 7v13m3-13v13m-3 0l3 3"}];return(f,u)=>{const d=yn("router-link"),g=yn("router-view");return k(),T("div",Tf,[c("header",Af,[c("div",If,[c("button",{class:"rounded-lg p-1.5 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",onClick:u[0]||(u[0]=p=>l.value=!l.value)},[...u[3]||(u[3]=[c("svg",{class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)])]),ie(d,{to:"/",class:"flex items-center gap-2",onClick:i},{default:Se(()=>[...u[4]||(u[4]=[c("span",{class:"text-lg font-bold tracking-wide text-indigo-600 dark:text-indigo-400"},"VNT",-1),c("span",{class:"text-sm font-medium text-slate-400 dark:text-slate-500"},"Web",-1)])]),_:1}),c("nav",Rf,[(k(),T(le,null,Ee(a,p=>ie(d,{key:p.to,to:p.to,custom:""},{default:Se(({navigate:w,isActive:S,isExactActive:L})=>[c("button",{onClick:w,class:q(["relative flex items-center px-3 text-sm font-medium transition-colors",(p.exact?L:S)?"text-indigo-600 dark:text-indigo-400":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white"])},[oe(F(p.label)+" ",1),(p.exact?L:S)?(k(),T("span",Pf)):ce("",!0)],10,$f)]),_:2},1032,["to"])),64))]),c("div",Mf,[c("div",{class:"flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3 py-1 dark:border-slate-700 dark:bg-slate-800",title:O(t).headerStatusText},[ie(or,{status:O(t).runningCount>0?"running":O(t).startingCount>0?"starting":"stopped"},null,8,["status"]),c("span",Lf,F(O(t).headerStatusText),1)],8,Of),c("span",Nf,"v"+F(O(t).version||"-"),1),c("button",{class:"rounded-lg border border-slate-200 bg-white p-1.5 text-slate-500 shadow-sm transition-colors hover:bg-slate-50 hover:text-slate-900 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white",title:o.value?"切换到浅色模式":"切换到深色模式",onClick:r},[o.value?(k(),T("svg",jf,[...u[5]||(u[5]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"},null,-1)])])):(k(),T("svg",Df,[...u[6]||(u[6]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"},null,-1)])]))],8,Vf)])]),ie(So,{name:"navdrop"},{default:Se(()=>[l.value?(k(),T("nav",Bf,[(k(),T(le,null,Ee(a,p=>ie(d,{key:p.to,to:p.to,custom:""},{default:Se(({navigate:w,isActive:S,isExactActive:L})=>[c("button",{onClick:$=>{w(),i()},class:q(["flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium transition-colors",(p.exact?L:S)?"bg-indigo-50 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400":"text-slate-500 hover:bg-slate-50 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white"])},[(k(),T("svg",Uf,[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:p.icon},null,8,Hf),p.icon2?(k(),T("path",{key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:p.icon2},null,8,Wf)):ce("",!0)])),oe(" "+F(p.label),1)],10,Ff)]),_:2},1032,["to"])),64))])):ce("",!0)]),_:1})]),c("main",Kf,[c("div",Gf,[ie(g,null,{default:Se(({Component:p})=>[ie(So,{name:"fade",mode:"out-in"},{default:Se(()=>[(k(),Me(_c(p)))]),_:2},1024)]),_:1})])]),ie(nr,{show:O(s).showStartLog,"mask-closable":O(s).startStatus!=="starting","esc-closable":O(s).startStatus!=="starting","panel-class":"w-full max-w-2xl",onClose:O(s).close},{header:Se(()=>[c("div",qf,[O(s).startStatus==="starting"?(k(),T("div",zf)):O(s).startStatus==="running"?(k(),T("div",Jf)):(k(),T("div",Yf)),c("h3",Qf,F(O(s).startStatus==="starting"?"正在启动组网...":O(s).startStatus==="running"?"启动成功":"启动失败"),1)]),c("div",Zf,[c("span",{class:"max-w-[200px] truncate text-sm font-medium text-indigo-600 dark:text-indigo-400",title:O(s).logFileName},F(O(s).logConfigName),9,Xf),c("span",ed,F(O(s).startStatus),1)])]),body:Se(()=>[c("div",{ref:p=>O(s).logContainer=p,class:"scrollbar-hide h-80 space-y-2 overflow-y-auto bg-slate-50 p-6 font-mono text-sm dark:bg-black/20"},[(k(!0),T(le,null,Ee(O(s).startLogs,(p,w)=>(k(),T("div",{key:w,class:"flex gap-3"},[u[7]||(u[7]=c("span",{class:"shrink-0 text-indigo-500 dark:text-indigo-400"},">>>",-1)),c("span",td,F(p),1)]))),128)),O(s).startStatus==="starting"?(k(),T("div",sd," 等待后续步骤... ")):ce("",!0),O(s).startStatus==="stopped"&&O(s).startLogs.length>0?(k(),T("div",nd,[...u[8]||(u[8]=[c("strong",null,"启动失败:",-1),oe(" 请检查配置或网络连接。 ",-1)])])):ce("",!0)],512)]),footer:Se(()=>[O(s).startStatus==="starting"?(k(),T("button",{key:0,class:"btn-ghost",onClick:u[1]||(u[1]=(...p)=>O(s).cancelStart&&O(s).cancelStart(...p))}," 取消组网 ")):ce("",!0),O(s).startStatus==="stopped"||O(s).startStatus==="running"?(k(),T("button",{key:1,class:"btn-primary",onClick:u[2]||(u[2]=(...p)=>O(s).close&&O(s).close(...p))}," 关闭窗口 ")):ce("",!0)]),_:1},8,["show","mask-closable","esc-closable","onClose"]),ie(hf),ie(_f),ie(Ef,{ref_key:"tooltipRef",ref:n},null,512)])}}};const ms=typeof document<"u";function Ji(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function rd(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Ji(e.default)}const he=Object.assign;function ao(e,t){const s={};for(const n in t){const o=t[n];s[n]=lt(o)?o.map(e):e(o)}return s}const Ks=()=>{},lt=Array.isArray;function Zr(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const Yi=/#/g,ld=/&/g,id=/\//g,ad=/=/g,cd=/\?/g,Qi=/\+/g,ud=/%5B/g,fd=/%5D/g,Zi=/%5E/g,dd=/%60/g,Xi=/%7B/g,pd=/%7C/g,ea=/%7D/g,hd=/%20/g;function rr(e){return e==null?"":encodeURI(""+e).replace(pd,"|").replace(ud,"[").replace(fd,"]")}function md(e){return rr(e).replace(Xi,"{").replace(ea,"}").replace(Zi,"^")}function Io(e){return rr(e).replace(Qi,"%2B").replace(hd,"+").replace(Yi,"%23").replace(ld,"%26").replace(dd,"`").replace(Xi,"{").replace(ea,"}").replace(Zi,"^")}function gd(e){return Io(e).replace(ad,"%3D")}function vd(e){return rr(e).replace(Yi,"%23").replace(cd,"%3F")}function _d(e){return vd(e).replace(id,"%2F")}function tn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const bd=/\/$/,xd=e=>e.replace(bd,"");function co(e,t,s="/"){let n,o={},r="",l="";const i=t.indexOf("#");let a=t.indexOf("?");return a=i>=0&&a>i?-1:a,a>=0&&(n=t.slice(0,a),r=t.slice(a,i>0?i:t.length),o=e(r.slice(1))),i>=0&&(n=n||t.slice(0,i),l=t.slice(i,t.length)),n=Cd(n??t,s),{fullPath:n+r+l,path:n,query:o,hash:tn(l)}}function yd(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Xr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function kd(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])&&ta(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 ta(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!wd(e[s],t[s]))return!1;return!0}function wd(e,t){return lt(e)?el(e,t):lt(t)?el(t,e):e?.valueOf()===t?.valueOf()}function el(e,t){return lt(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Cd(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 r=s.length-1,l,i;for(l=0;l1&&r--;else break;return s.slice(0,r).join("/")+"/"+n.slice(l).join("/")}const Ot={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Ro=(function(e){return e.pop="pop",e.push="push",e})({}),uo=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Sd(e){if(!e)if(ms){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),xd(e)}const Ed=/^[^#]+#/;function Td(e,t){return e.replace(Ed,"#")+t}function Ad(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 Gn=()=>({left:window.scrollX,top:window.scrollY});function Id(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=Ad(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 tl(e,t){return(history.state?history.state.position-t:-1)+e}const $o=new Map;function Rd(e,t){$o.set(e,t)}function $d(e){const t=$o.get(e);return $o.delete(e),t}function Pd(e){return typeof e=="string"||e&&typeof e=="object"}function sa(e){return typeof e=="string"||typeof e=="symbol"}let Te=(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 na=Symbol("");Te.MATCHER_NOT_FOUND+"",Te.NAVIGATION_GUARD_REDIRECT+"",Te.NAVIGATION_ABORTED+"",Te.NAVIGATION_CANCELLED+"",Te.NAVIGATION_DUPLICATED+"";function Ss(e,t){return he(new Error,{type:e,[na]:!0},t)}function yt(e,t){return e instanceof Error&&na in e&&(t==null||!!(e.type&t))}const Md=["params","query","hash"];function Od(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const s of Md)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function Ld(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;no&&Io(o)):[n&&Io(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function Nd(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=lt(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const Vd=Symbol(""),nl=Symbol(""),lr=Symbol(""),oa=Symbol(""),Po=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 Bt(e,t,s,n,o,r=l=>l()){const l=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((i,a)=>{const f=g=>{g===!1?a(Ss(Te.NAVIGATION_ABORTED,{from:s,to:t})):g instanceof Error?a(g):Pd(g)?a(Ss(Te.NAVIGATION_GUARD_REDIRECT,{from:t,to:g})):(l&&n.enterCallbacks[o]===l&&typeof g=="function"&&l.push(g),i())},u=r(()=>e.call(n&&n.instances[o],t,s,f));let d=Promise.resolve(u);e.length<3&&(d=d.then(f)),d.catch(g=>a(g))})}function fo(e,t,s,n,o=r=>r()){const r=[];for(const l of e)for(const i in l.components){let a=l.components[i];if(!(t!=="beforeRouteEnter"&&!l.instances[i]))if(Ji(a)){const f=(a.__vccOpts||a)[t];f&&r.push(Bt(f,s,n,l,i,o))}else{let f=a();r.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${i}" at "${l.path}"`);const d=rd(u)?u.default:u;l.mods[i]=u,l.components[i]=d;const g=(d.__vccOpts||d)[t];return g&&Bt(g,s,n,l,i,o)()}))}}return r}function jd(e,t){const s=[],n=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let l=0;lCs(f,i))?n.push(i):s.push(i));const a=e.matched[l];a&&(t.matched.find(f=>Cs(f,a))||o.push(a))}return[s,n,o]}let Dd=()=>location.protocol+"//"+location.host;function ra(e,t){const{pathname:s,search:n,hash:o}=t,r=e.indexOf("#");if(r>-1){let l=o.includes(e.slice(r))?e.slice(r).length:1,i=o.slice(l);return i[0]!=="/"&&(i="/"+i),Xr(i,"")}return Xr(s,e)+n+o}function Bd(e,t,s,n){let o=[],r=[],l=null;const i=({state:g})=>{const p=ra(e,location),w=s.value,S=t.value;let L=0;if(g){if(s.value=p,t.value=g,l&&l===w){l=null;return}L=S?g.position-S.position:0}else n(p);o.forEach($=>{$(s.value,w,{delta:L,type:Ro.pop,direction:L?L>0?uo.forward:uo.back:uo.unknown})})};function a(){l=s.value}function f(g){o.push(g);const p=()=>{const w=o.indexOf(g);w>-1&&o.splice(w,1)};return r.push(p),p}function u(){if(document.visibilityState==="hidden"){const{history:g}=window;if(!g.state)return;g.replaceState(he({},g.state,{scroll:Gn()}),"")}}function d(){for(const g of r)g();r=[],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:a,listen:f,destroy:d}}function ol(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?Gn():null}}function Fd(e){const{history:t,location:s}=window,n={value:ra(e,s)},o={value:t.state};o.value||r(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,f,u){const d=e.indexOf("#"),g=d>-1?(s.host&&document.querySelector("base")?e:e.slice(d))+a:Dd()+e+a;try{t[u?"replaceState":"pushState"](f,"",g),o.value=f}catch(p){console.error(p),s[u?"replace":"assign"](g)}}function l(a,f){r(a,he({},t.state,ol(o.value.back,a,o.value.forward,!0),f,{position:o.value.position}),!0),n.value=a}function i(a,f){const u=he({},o.value,t.state,{forward:a,scroll:Gn()});r(u.current,u,!0),r(a,he({},ol(n.value,a,null),{position:u.position+1},f),!1),n.value=a}return{location:n,state:o,push:i,replace:l}}function Ud(e){e=Sd(e);const t=Fd(e),s=Bd(e,t.state,t.location,t.replace);function n(r,l=!0){l||s.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:n,createHref:Td.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 Hd(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Ud(e)}let es=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var $e=(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})($e||{});const Wd={type:es.Static,value:""},Kd=/[a-zA-Z0-9_]/;function Gd(e){if(!e)return[[]];if(e==="/")return[[Wd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${s})/"${f}": ${p}`)}let s=$e.Static,n=s;const o=[];let r;function l(){r&&o.push(r),r=[]}let i=0,a,f="",u="";function d(){f&&(s===$e.Static?r.push({type:es.Static,value:f}):s===$e.Param||s===$e.ParamRegExp||s===$e.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),r.push({type:es.Param,value:f,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),f="")}function g(){f+=a}for(;it.length?t.length===1&&t[0]===He.Static+He.Segment?1:-1:0}function la(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Qd={strict:!1,end:!0,sensitive:!1};function Zd(e,t,s){const n=Jd(Gd(e.path),s),o=he(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Xd(e,t){const s=[],n=new Map;t=Zr(Qd,t);function o(d){return n.get(d)}function r(d,g,p){const w=!p,S=al(d);S.aliasOf=p&&p.record;const L=Zr(t,d),$=[S];if("alias"in d){const x=typeof d.alias=="string"?[d.alias]:d.alias;for(const y of x)$.push(al(he({},S,{components:p?p.record.components:S.components,path:y,aliasOf:p?p.record:S})))}let m,_;for(const x of $){const{path:y}=x;if(g&&y[0]!=="/"){const Z=g.record.path,D=Z[Z.length-1]==="/"?"":"/";x.path=g.record.path+(y&&D+y)}if(m=Zd(x,g,L),p?p.alias.push(m):(_=_||m,_!==m&&_.alias.push(m),w&&d.name&&!cl(m)&&l(d.name)),ia(m)&&a(m),S.children){const Z=S.children;for(let D=0;D{l(_)}:Ks}function l(d){if(sa(d)){const g=n.get(d);g&&(n.delete(d),s.splice(s.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=s.indexOf(d);g>-1&&(s.splice(g,1),d.record.name&&n.delete(d.record.name),d.children.forEach(l),d.alias.forEach(l))}}function i(){return s}function a(d){const g=sp(d,s);s.splice(g,0,d),d.record.name&&!cl(d)&&n.set(d.record.name,d)}function f(d,g){let p,w={},S,L;if("name"in d&&d.name){if(p=n.get(d.name),!p)throw Ss(Te.MATCHER_NOT_FOUND,{location:d});L=p.record.name,w=he(il(g.params,p.keys.filter(_=>!_.optional).concat(p.parent?p.parent.keys.filter(_=>_.optional):[]).map(_=>_.name)),d.params&&il(d.params,p.keys.map(_=>_.name))),S=p.stringify(w)}else if(d.path!=null)S=d.path,p=s.find(_=>_.re.test(S)),p&&(w=p.parse(S),L=p.record.name);else{if(p=g.name?n.get(g.name):s.find(_=>_.re.test(g.path)),!p)throw Ss(Te.MATCHER_NOT_FOUND,{location:d,currentLocation:g});L=p.record.name,w=he({},g.params,d.params),S=p.stringify(w)}const $=[];let m=p;for(;m;)$.unshift(m.record),m=m.parent;return{name:L,path:S,params:w,matched:$,meta:tp($)}}e.forEach(d=>r(d));function u(){s.length=0,n.clear()}return{addRoute:r,resolve:f,removeRoute:l,clearRoutes:u,getRoutes:i,getRecordMatcher:o}}function il(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function al(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ep(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 ep(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 cl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function tp(e){return e.reduce((t,s)=>he(t,s.meta),{})}function sp(e,t){let s=0,n=t.length;for(;s!==n;){const r=s+n>>1;la(e,t[r])<0?n=r:s=r+1}const o=np(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function np(e){let t=e;for(;t=t.parent;)if(ia(t)&&la(e,t)===0)return t}function ia({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ul(e){const t=ot(lr),s=ot(oa),n=ve(()=>{const a=O(e.to);return t.resolve(a)}),o=ve(()=>{const{matched:a}=n.value,{length:f}=a,u=a[f-1],d=s.matched;if(!u||!d.length)return-1;const g=d.findIndex(Cs.bind(null,u));if(g>-1)return g;const p=fl(a[f-2]);return f>1&&fl(u)===p&&d[d.length-1].path!==p?d.findIndex(Cs.bind(null,a[f-2])):g}),r=ve(()=>o.value>-1&&ap(s.params,n.value.params)),l=ve(()=>o.value>-1&&o.value===s.matched.length-1&&ta(s.params,n.value.params));function i(a={}){if(ip(a)){const f=t[O(e.replace)?"replace":"push"](O(e.to)).catch(Ks);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:n,href:ve(()=>n.value.href),isActive:r,isExactActive:l,navigate:i}}function op(e){return e.length===1?e[0]:e}const rp=ni({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:ul,setup(e,{slots:t}){const s=rs(ul(e)),{options:n}=ot(lr),o=ve(()=>({[dl(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[dl(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const r=t.default&&op(t.default(s));return e.custom?r:Zo("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),lp=rp;function ip(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 ap(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(!lt(o)||o.length!==n.length||n.some((r,l)=>r.valueOf()!==o[l].valueOf()))return!1}return!0}function fl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const dl=(e,t,s)=>e??t??s,cp=ni({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=ot(Po),o=ve(()=>e.route||n.value),r=ot(nl,0),l=ve(()=>{let f=O(r);const{matched:u}=o.value;let d;for(;(d=u[f])&&!d.components;)f++;return f}),i=ve(()=>o.value.matched[l.value]);Fs(nl,ve(()=>l.value+1)),Fs(Vd,i),Fs(Po,o);const a=ae();return Ge(()=>[a.value,i.value,e.name],([f,u,d],[g,p,w])=>{u&&(u.instances[d]=f,p&&p!==u&&f&&f===g&&(u.leaveGuards.size||(u.leaveGuards=p.leaveGuards),u.updateGuards.size||(u.updateGuards=p.updateGuards))),f&&u&&(!p||!Cs(u,p)||!g)&&(u.enterCallbacks[d]||[]).forEach(S=>S(f))},{flush:"post"}),()=>{const f=o.value,u=e.name,d=i.value,g=d&&d.components[u];if(!g)return pl(s.default,{Component:g,route:f});const p=d.props[u],w=p?p===!0?f.params:typeof p=="function"?p(f):p:null,L=Zo(g,he({},w,t,{onVnodeUnmounted:$=>{$.component.isUnmounted&&(d.instances[u]=null)},ref:a}));return pl(s.default,{Component:L,route:f})||L}}});function pl(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const up=cp;function fp(e){const t=Xd(e.routes,e),s=e.parseQuery||Ld,n=e.stringifyQuery||sl,o=e.history,r=Os(),l=Os(),i=Os(),a=Fa(Ot);let f=Ot;ms&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=ao.bind(null,I=>""+I),d=ao.bind(null,_d),g=ao.bind(null,tn);function p(I,G){let H,Y;return sa(I)?(H=t.getRecordMatcher(I),Y=G):Y=I,t.addRoute(Y,H)}function w(I){const G=t.getRecordMatcher(I);G&&t.removeRoute(G)}function S(){return t.getRoutes().map(I=>I.record)}function L(I){return!!t.getRecordMatcher(I)}function $(I,G){if(G=he({},G||a.value),typeof I=="string"){const b=co(s,I,G.path),A=t.resolve({path:b.path},G),R=o.createHref(b.fullPath);return he(b,A,{params:g(A.params),hash:tn(b.hash),redirectedFrom:void 0,href:R})}let H;if(I.path!=null)H=he({},I,{path:co(s,I.path,G.path).path});else{const b=he({},I.params);for(const A in b)b[A]==null&&delete b[A];H=he({},I,{params:d(b)}),G.params=d(G.params)}const Y=t.resolve(H,G),fe=I.hash||"";Y.params=u(g(Y.params));const h=yd(n,he({},I,{hash:md(fe),path:Y.path})),v=o.createHref(h);return he({fullPath:h,hash:fe,query:n===sl?Nd(I.query):I.query||{}},Y,{redirectedFrom:void 0,href:v})}function m(I){return typeof I=="string"?co(s,I,a.value.path):he({},I)}function _(I,G){if(f!==I)return Ss(Te.NAVIGATION_CANCELLED,{from:G,to:I})}function x(I){return D(I)}function y(I){return x(he(m(I),{replace:!0}))}function Z(I,G){const H=I.matched[I.matched.length-1];if(H&&H.redirect){const{redirect:Y}=H;let fe=typeof Y=="function"?Y(I,G):Y;return typeof fe=="string"&&(fe=fe.includes("?")||fe.includes("#")?fe=m(fe):{path:fe},fe.params={}),he({query:I.query,hash:I.hash,params:fe.path!=null?{}:I.params},fe)}}function D(I,G){const H=f=$(I),Y=a.value,fe=I.state,h=I.force,v=I.replace===!0,b=Z(H,Y);if(b)return D(he(m(b),{state:typeof b=="object"?he({},fe,b.state):fe,force:h,replace:v}),G||H);const A=H;A.redirectedFrom=G;let R;return!h&&kd(n,Y,H)&&(R=Ss(Te.NAVIGATION_DUPLICATED,{to:A,from:Y}),at(Y,Y,!0,!1)),(R?Promise.resolve(R):z(A,Y)).catch(E=>yt(E)?yt(E,Te.NAVIGATION_GUARD_REDIRECT)?E:qe(E):re(E,A,Y)).then(E=>{if(E){if(yt(E,Te.NAVIGATION_GUARD_REDIRECT))return D(he({replace:v},m(E.to),{state:typeof E.to=="object"?he({},fe,E.to.state):fe,force:h}),G||A)}else E=j(A,Y,!0,v,fe);return se(A,Y,E),E})}function U(I,G){const H=_(I,G);return H?Promise.reject(H):Promise.resolve()}function M(I){const G=cs.values().next().value;return G&&typeof G.runWithContext=="function"?G.runWithContext(I):I()}function z(I,G){let H;const[Y,fe,h]=jd(I,G);H=fo(Y.reverse(),"beforeRouteLeave",I,G);for(const b of Y)b.leaveGuards.forEach(A=>{H.push(Bt(A,I,G))});const v=U.bind(null,I,G);return H.push(v),Xe(H).then(()=>{H=[];for(const b of r.list())H.push(Bt(b,I,G));return H.push(v),Xe(H)}).then(()=>{H=fo(fe,"beforeRouteUpdate",I,G);for(const b of fe)b.updateGuards.forEach(A=>{H.push(Bt(A,I,G))});return H.push(v),Xe(H)}).then(()=>{H=[];for(const b of h)if(b.beforeEnter)if(lt(b.beforeEnter))for(const A of b.beforeEnter)H.push(Bt(A,I,G));else H.push(Bt(b.beforeEnter,I,G));return H.push(v),Xe(H)}).then(()=>(I.matched.forEach(b=>b.enterCallbacks={}),H=fo(h,"beforeRouteEnter",I,G,M),H.push(v),Xe(H))).then(()=>{H=[];for(const b of l.list())H.push(Bt(b,I,G));return H.push(v),Xe(H)}).catch(b=>yt(b,Te.NAVIGATION_CANCELLED)?b:Promise.reject(b))}function se(I,G,H){i.list().forEach(Y=>M(()=>Y(I,G,H)))}function j(I,G,H,Y,fe){const h=_(I,G);if(h)return h;const v=G===Ot,b=ms?history.state:{};H&&(Y||v?o.replace(I.fullPath,he({scroll:v&&b&&b.scroll},fe)):o.push(I.fullPath,fe)),a.value=I,at(I,G,H,v),qe()}let C;function K(){C||(C=o.listen((I,G,H)=>{if(!Wt.listening)return;const Y=$(I),fe=Z(Y,Wt.currentRoute.value);if(fe){D(he(fe,{replace:!0,force:!0}),Y).catch(Ks);return}f=Y;const h=a.value;ms&&Rd(tl(h.fullPath,H.delta),Gn()),z(Y,h).catch(v=>yt(v,Te.NAVIGATION_ABORTED|Te.NAVIGATION_CANCELLED)?v:yt(v,Te.NAVIGATION_GUARD_REDIRECT)?(D(he(m(v.to),{force:!0}),Y).then(b=>{yt(b,Te.NAVIGATION_ABORTED|Te.NAVIGATION_DUPLICATED)&&!H.delta&&H.type===Ro.pop&&o.go(-1,!1)}).catch(Ks),Promise.reject()):(H.delta&&o.go(-H.delta,!1),re(v,Y,h))).then(v=>{v=v||j(Y,h,!1),v&&(H.delta&&!yt(v,Te.NAVIGATION_CANCELLED)?o.go(-H.delta,!1):H.type===Ro.pop&&yt(v,Te.NAVIGATION_ABORTED|Te.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),se(Y,h,v)}).catch(Ks)}))}let Ce=Os(),ue=Os(),ee;function re(I,G,H){qe(I);const Y=ue.list();return Y.length?Y.forEach(fe=>fe(I,G,H)):console.error(I),Promise.reject(I)}function Be(){return ee&&a.value!==Ot?Promise.resolve():new Promise((I,G)=>{Ce.add([I,G])})}function qe(I){return ee||(ee=!I,K(),Ce.list().forEach(([G,H])=>I?H(I):G()),Ce.reset()),I}function at(I,G,H,Y){const{scrollBehavior:fe}=e;if(!ms||!fe)return Promise.resolve();const h=!H&&$d(tl(I.fullPath,0))||(Y||!H)&&history.state&&history.state.scroll||null;return $t().then(()=>fe(I,G,h)).then(v=>v&&Id(v)).catch(v=>re(v,I,G))}const ze=I=>o.go(I);let as;const cs=new Set,Wt={currentRoute:a,listening:!0,addRoute:p,removeRoute:w,clearRoutes:t.clearRoutes,hasRoute:L,getRoutes:S,resolve:$,options:e,push:x,replace:y,go:ze,back:()=>ze(-1),forward:()=>ze(1),beforeEach:r.add,beforeResolve:l.add,afterEach:i.add,onError:ue.add,isReady:Be,install(I){I.component("RouterLink",lp),I.component("RouterView",up),I.config.globalProperties.$router=Wt,Object.defineProperty(I.config.globalProperties,"$route",{enumerable:!0,get:()=>O(a)}),ms&&!as&&a.value===Ot&&(as=!0,x(o.location).catch(Y=>{}));const G={};for(const Y in Ot)Object.defineProperty(G,Y,{get:()=>a.value[Y],enumerable:!0});I.provide(lr,Wt),I.provide(oa,Fl(G)),I.provide(Po,a);const H=I.unmount;cs.add(I),I.unmount=function(){cs.delete(I),cs.size<1&&(f=Ot,C&&C(),C=null,a.value=Ot,as=!1,ee=!1),H()}}};function Xe(I){return I.reduce((G,H)=>G.then(()=>M(H)),Promise.resolve())}return Wt}const dp={class:"card"},pp={key:0,class:"flex flex-wrap items-center justify-between gap-3"},hp={key:1,class:"text-sm muted"},mp={key:2,class:"flex flex-col gap-3 sm:flex-row sm:items-end"},gp={class:"flex-1"},vp=["value"],_p=["disabled"],bp={key:0,class:"animate-spin"},aa={__name:"StartPanel",setup(e){const t=Ht(),s=is(),n=ae(""),o=ve(()=>t.configList.filter(l=>!t.instanceList.some(i=>i.file_name===l.file_name)));Ge(o,l=>{l.some(i=>i.file_name===n.value)||(n.value=l.length?l[0].file_name:"")},{immediate:!0});const r=()=>{if(!n.value){s.toast.error("请先选择一个配置");return}t.startVnt(n.value)};return(l,i)=>{const a=yn("router-link");return k(),T("div",dp,[i[6]||(i[6]=c("h2",{class:"mb-4 text-base font-bold text-slate-900 dark:text-white"},"启动组网",-1)),O(t).configList.length===0?(k(),T("div",pp,[i[2]||(i[2]=c("p",{class:"text-sm muted"},"还没有任何配置,先创建一个组网配置吧。",-1)),ie(a,{to:"/config",class:"btn-primary btn-sm"},{default:Se(()=>[...i[1]||(i[1]=[oe("去新建配置",-1)])]),_:1})])):o.value.length===0?(k(),T("div",hp," 所有配置均已启动。 ")):(k(),T("div",mp,[c("div",gp,[i[4]||(i[4]=c("label",{class:"mb-1.5 block text-xs font-medium muted"},"选择配置",-1)),be(c("select",{"onUpdate:modelValue":i[0]||(i[0]=f=>n.value=f),class:"input"},[i[3]||(i[3]=c("option",{value:"",disabled:""},"请选择配置...",-1)),(k(!0),T(le,null,Ee(o.value,f=>(k(),T("option",{key:f.file_name,value:f.file_name},F(f.config_name||f.file_name),9,vp))),128))],512),[[Bi,n.value]])]),c("button",{class:"btn-primary px-8",disabled:!n.value||!!O(t).loadingMap[n.value],onClick:r},[O(t).loadingMap[n.value]?(k(),T("span",bp,"⟳")):ce("",!0),i[5]||(i[5]=oe(" 启动 ",-1))],8,_p)]))])}}},xp={class:"flex items-center justify-between gap-2"},yp=["title"],kp={class:"flex shrink-0 items-center gap-1.5"},wp={key:0,class:"badge-yellow",title:"配置文件在启动后被修改,重启实例后生效"},Cp={class:"mt-2 text-sm"},Sp={class:"ml-1 font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Ep={class:"mt-3 flex gap-4 text-xs muted"},Tp={class:"font-bold tabular-nums text-blue-600 dark:text-blue-400"},Ap={class:"font-bold tabular-nums text-green-600 dark:text-green-400"},Ip={class:"font-bold tabular-nums text-slate-400"},Rp={class:"mt-4 flex flex-wrap justify-end gap-2"},$p={key:0,class:"flex items-center gap-1.5 text-xs muted"},Pp=["disabled"],Mp={key:0,class:"animate-spin"},Op=["disabled"],Lp={key:0,class:"animate-spin"},Np=["disabled"],Vp={key:0,class:"animate-spin"},ca={__name:"InstanceCard",props:{inst:{type:Object,required:!0},selectable:{type:Boolean,default:!1}},setup(e){const t=e,s=Ht(),n=is(),o=ve(()=>s.infoOf(t.inst.file_name)),r=ve(()=>!!s.loadingMap[t.inst.file_name]),l=ve(()=>!!s.stoppingMap[t.inst.file_name]),i=ve(()=>t.inst.config_name||t.inst.file_name),a=w=>l.value?"badge-yellow":w==="running"?"badge-green":w==="starting"?"badge-blue":"badge-gray",f=w=>l.value?"停止中":w==="running"?"运行中":w==="starting"?"启动中":"已停止",u=()=>{t.selectable&&(s.selectedInstance=t.inst.file_name)},d=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)},p=async()=>{await n.confirm({title:"移除实例",message:`确定要移除已停止的实例 ${i.value} 吗?`,danger:!0,confirmText:"移除"})&&s.dismissInstance(t.inst.file_name)};return(w,S)=>(k(),T("div",{class:q(["card",[e.selectable?"cursor-pointer":"",e.selectable&&O(s).selectedInstance===e.inst.file_name?"ring-2 ring-indigo-500 dark:ring-indigo-400":""]]),onClick:u},[c("div",xp,[c("h3",{class:"truncate text-base font-bold text-slate-900 dark:text-white",title:e.inst.file_name},F(i.value),9,yp),c("div",kp,[o.value.config_changed?(k(),T("span",wp," 配置发生变化 ")):ce("",!0),c("span",{class:q([a(e.inst.status),l.value?"animate-pulse":""])},F(f(e.inst.status)),3)])]),c("div",Cp,[S[0]||(S[0]=c("span",{class:"muted"},"虚拟 IP:",-1)),c("span",Sp,F(o.value.ip||"-"),1)]),c("div",Ep,[c("span",null,[S[1]||(S[1]=oe(" 在线 ",-1)),c("span",Tp,F(o.value.online_client_num||0),1)]),c("span",null,[S[2]||(S[2]=oe(" 直连 ",-1)),c("span",Ap,F(o.value.direct_client_num||0),1)]),c("span",null,[S[3]||(S[3]=oe(" 离线 ",-1)),c("span",Ip,F(o.value.offline_client_num||0),1)])]),c("div",Rp,[l.value?(k(),T("span",$p,[...S[4]||(S[4]=[c("span",{class:"inline-block animate-spin"},"⟳",-1),oe(" 正在停止,请稍候... ",-1)])])):(k(),T(le,{key:1},[e.inst.status==="running"||e.inst.status==="stopped"?(k(),T("button",{key:0,class:"btn-primary btn-sm",disabled:r.value,onClick:xs(g,["stop"])},[r.value?(k(),T("span",Mp,"⟳")):ce("",!0),oe(" "+F(e.inst.status==="stopped"?"重新启动":"重启"),1)],8,Pp)):ce("",!0),e.inst.status!=="stopped"?(k(),T("button",{key:1,class:"btn-danger btn-sm",disabled:r.value,onClick:xs(d,["stop"])},[r.value?(k(),T("span",Lp,"⟳")):ce("",!0),S[5]||(S[5]=oe(" 停止 ",-1))],8,Op)):ce("",!0),e.inst.status==="stopped"?(k(),T("button",{key:2,class:"btn-ghost btn-sm",disabled:r.value,onClick:xs(p,["stop"])},[r.value?(k(),T("span",Vp,"⟳")):ce("",!0),S[6]||(S[6]=oe(" 移除 ",-1))],8,Np)):ce("",!0)],64))])],2))}},jp={class:"card p-12 text-center text-slate-500 dark:text-slate-400"},ln={__name:"EmptyState",props:{text:{type:String,default:"暂无数据"}},setup(e){return(t,s)=>(k(),T("div",jp,[s[0]||(s[0]=c("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"},[c("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)),c("p",null,F(e.text),1)]))}},Dp={class:"space-y-6"},Bp={class:"flex flex-wrap items-end justify-between gap-4"},Fp={class:"page-subtitle"},Up={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},Hp={class:"card"},Wp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Kp={class:"ml-1 text-sm font-normal muted"},Gp={class:"card"},qp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},zp={class:"card"},Jp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Yp={class:"card"},Qp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Zp={class:"text-sm font-normal muted"},Xp={key:1,class:"muted"},e0={class:"mb-3 flex items-center justify-between"},t0={__name:"DashboardView",setup(e){const t=Ht(),s=ve(()=>Object.values(t.instances).reduce((r,l)=>r+(l?.online_client_num||0),0)),n=ve(()=>{const r=t.instanceList.filter(i=>i.status==="running");return{connected:r.filter(i=>t.instances[i.file_name]?.server_info?.some(f=>f.connected)).length,total:r.length}}),o=ve(()=>t.runningCount>0?`运行中 ${t.runningCount} 个实例`:t.startingCount>0?"有实例正在启动...":"全部实例已停止");return(r,l)=>{const i=yn("router-link");return k(),T("div",Dp,[c("div",Bp,[c("div",null,[l[0]||(l[0]=c("h1",{class:"page-title"},"总览",-1)),c("p",Fp,F(o.value),1)]),ie(i,{to:"/config",class:"btn-ghost btn-sm"},{default:Se(()=>[...l[1]||(l[1]=[oe("管理配置",-1)])]),_:1})]),c("div",Up,[c("div",Hp,[l[2]||(l[2]=c("div",{class:"text-xs font-medium muted"},"运行实例",-1)),c("div",Wp,[oe(F(O(t).runningCount),1),c("span",Kp,"/ "+F(O(t).instanceList.length),1)])]),c("div",Gp,[l[3]||(l[3]=c("div",{class:"text-xs font-medium muted"},"配置总数",-1)),c("div",qp,F(O(t).configList.length),1)]),c("div",zp,[l[4]||(l[4]=c("div",{class:"text-xs font-medium muted"},"在线设备",-1)),c("div",Jp,F(s.value),1)]),c("div",Yp,[l[5]||(l[5]=c("div",{class:"text-xs font-medium muted"},"服务器连接",-1)),c("div",Qp,[n.value.total>0?(k(),T(le,{key:0},[c("span",{class:q(n.value.connected>0?"text-green-600 dark:text-green-400":"text-red-500")},F(n.value.connected),3),c("span",Zp,"/ "+F(n.value.total)+" 已连接",1)],64)):(k(),T("span",Xp,"-"))])])]),ie(aa),c("div",null,[c("div",e0,[l[7]||(l[7]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"实例概览",-1)),ie(i,{to:"/instances",class:"text-sm font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400"},{default:Se(()=>[...l[6]||(l[6]=[oe("查看详情 →",-1)])]),_:1})]),O(t).instanceList.length===0?(k(),Me(ln,{key:0,text:O(t).configList.length===0?"暂无配置,请先新建配置":"暂无运行中的组网,请在上方选择配置启动"},null,8,["text"])):(k(),Me(er,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Se(()=>[(k(!0),T(le,null,Ee(O(t).instanceList,a=>(k(),Me(ca,{key:a.file_name,inst:a},null,8,["inst"]))),128))]),_:1}))])])}}},s0={class:"space-y-6"},n0={class:"card"},o0={class:"mb-4 text-lg font-bold text-slate-900 dark:text-white"},r0={class:"ml-2 text-sm font-medium text-indigo-600 dark:text-indigo-400"},l0={class:"grid grid-cols-1 gap-4 text-sm md:grid-cols-2"},i0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},a0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},c0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},u0={class:"font-mono text-slate-900 dark:text-white"},f0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},d0={class:"font-mono text-slate-900 dark:text-white"},p0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},h0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},m0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},g0={class:"font-mono text-indigo-600 dark:text-indigo-400"},v0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},_0=["title"],b0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},x0={class:"text-slate-900 dark:text-white"},y0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},k0=["title"],w0={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},C0={class:"text-sm text-slate-600 dark:text-slate-300"},S0={class:"mt-4"},E0={class:"flex flex-wrap gap-2"},T0={key:0,class:"text-xs text-slate-400"},A0={class:"card p-0 overflow-hidden"},I0={class:"custom-scrollbar max-h-[400px] overflow-x-auto"},R0={class:"table"},$0={class:"font-mono"},P0={class:"tabular-nums"},M0={key:0},O0={__name:"InstancesView",setup(e){const t=Ht();return(s,n)=>(k(),T("div",s0,[n[13]||(n[13]=c("div",null,[c("h1",{class:"page-title"},"实例"),c("p",{class:"page-subtitle"},"管理组网实例,点击卡片查看详情")],-1)),ie(aa),O(t).instanceList.length===0?(k(),Me(ln,{key:0,text:"暂无运行中的组网,请在上方选择配置启动"})):(k(),Me(er,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Se(()=>[(k(!0),T(le,null,Ee(O(t).instanceList,o=>(k(),Me(ca,{key:o.file_name,inst:o,selectable:""},null,8,["inst"]))),128))]),_:1})),O(t).selectedInstance&&O(t).selectedInfo?(k(),T(le,{key:2},[c("div",n0,[c("h2",o0,[n[0]||(n[0]=oe(" 网络详情 ",-1)),c("span",r0,F(O(t).selectedConfigName),1)]),c("div",l0,[c("div",i0,[n[1]||(n[1]=c("span",{class:"muted"},"虚拟 IP / 掩码",-1)),c("span",a0,F(O(t).selectedInfo.ip||"-")+" / "+F(O(t).selectedInfo.prefix_len||"-"),1)]),c("div",c0,[n[2]||(n[2]=c("span",{class:"muted"},"网关",-1)),c("span",u0,F(O(t).selectedInfo.gateway||"-"),1)]),c("div",f0,[n[3]||(n[3]=c("span",{class:"muted"},"网络编号",-1)),c("span",d0,F(O(t).selectedInfo.network_code||"-"),1)]),c("div",p0,[n[4]||(n[4]=c("span",{class:"muted"},"MTU",-1)),c("span",h0,F(O(t).selectedInfo.mtu||""),1)]),c("div",m0,[n[5]||(n[5]=c("span",{class:"muted"},"NAT 类型",-1)),c("span",g0,F(O(t).selectedInfo.nat_type||"Unknown"),1)]),c("div",v0,[n[6]||(n[6]=c("span",{class:"muted"},"Public IPv6",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-slate-900 dark:text-white",title:O(t).selectedInfo.public_ipv6},F(O(t).selectedInfo.public_ipv6||"-"),9,_0)]),c("div",b0,[n[7]||(n[7]=c("span",{class:"muted"},"设备名称",-1)),c("span",x0,F(O(t).selectedInfo.name||"-"),1)]),c("div",y0,[n[8]||(n[8]=c("span",{class:"muted"},"设备 ID",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-xs text-slate-500 dark:text-slate-400",title:O(t).selectedInfo.device_id},F(O(t).selectedInfo.device_id||"-"),9,k0)])]),c("div",w0,[(k(),T(le,null,Ee([{key:"encrypt",label:"加密"},{key:"compress",label:"压缩"},{key:"fec",label:"FEC纠错"},{key:"rtx",label:"QUIC传输"}],o=>c("div",{key:o.key,class:"flex items-center gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50"},[c("span",{class:q(["h-2 w-2 rounded-full",O(t).selectedInfo[o.key]?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),c("span",C0,F(o.label),1)])),64))]),c("div",S0,[n[9]||(n[9]=c("span",{class:"mb-2 block text-sm muted"},"Public IPv4s",-1)),c("div",E0,[(k(!0),T(le,null,Ee(O(t).selectedInfo.public_ipv4s,o=>(k(),T("span",{key:o,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"},F(o),1))),128)),!O(t).selectedInfo.public_ipv4s||O(t).selectedInfo.public_ipv4s.length===0?(k(),T("span",T0,"无")):ce("",!0)])])]),c("div",A0,[n[12]||(n[12]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"服务器连接列表")],-1)),c("div",I0,[c("table",R0,[n[11]||(n[11]=c("thead",null,[c("tr",null,[c("th",null,"地址"),c("th",null,"状态"),c("th",null,"延迟"),c("th",null,"版本")])],-1)),c("tbody",null,[(k(!0),T(le,null,Ee(O(t).selectedInfo.server_info,(o,r)=>(k(),T("tr",{key:r},[c("td",$0,F(o.server),1),c("td",null,[c("span",{class:q(o.connected?"badge-green":"badge-red")},F(o.connected?"已连接":"未连接"),3)]),c("td",P0,F(o.server_rtt?o.server_rtt+" ms":"-"),1),c("td",null,F(o.server_version||"-"),1)]))),128)),!O(t).selectedInfo.server_info||O(t).selectedInfo.server_info.length===0?(k(),T("tr",M0,[...n[10]||(n[10]=[c("td",{colspan:"4",class:"text-center text-slate-400"},"暂无数据",-1)])])):ce("",!0)])])])])],64)):ce("",!0)]))}},Mo=()=>({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:"",password:"",cert_mode:"skip",fingerprint:"",udp_stun:[],tcp_stun:[],tunnel_port:null}),hl=e=>{const t=Mo(),s=e.split(` +`);for(const n of s){const o=n.trim();if(!(!o||o.startsWith("#"))){if(o.includes("config_name")){const r=o.match(/config_name\s*=\s*"([^"]*)"/);r&&(t.config_name=r[1])}else if(o.includes("network_code")){const r=o.match(/network_code\s*=\s*"([^"]*)"/);r&&(t.network_code=r[1])}else if(o.startsWith("server")){const r=o.match(/server\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.server=l.map(i=>i.replace(/"/g,"")))}}else if(o.includes("ip =")){const r=o.match(/ip\s*=\s*"([^"]*)"/);r&&(t.ip=r[1])}else if(o.includes("mtu =")){const r=o.match(/mtu\s*=\s*(\d+)/);r&&(t.mtu=parseInt(r[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 r=o.match(/input\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.input=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("output")){const r=o.match(/output\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.output=l.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 r=o.match(/port_mapping\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.port_mapping=l.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 r=o.match(/device_name\s*=\s*"([^"]*)"/);r&&(t.device_name=r[1])}else if(o.includes("device_id")){const r=o.match(/device_id\s*=\s*"([^"]*)"/);r&&(t.device_id=r[1])}else if(o.includes("tun_name")){const r=o.match(/tun_name\s*=\s*"([^"]*)"/);r&&(t.tun_name=r[1])}else if(o.includes("password =")){const r=o.match(/password\s*=\s*"([^"]*)"/);r&&(t.password=r[1])}else if(o.includes("cert_mode")){const r=o.match(/cert_mode\s*=\s*"([^"]*)"/);if(r){const l=r[1];l.startsWith("finger:")?(t.cert_mode="finger",t.fingerprint=l.substring(7)):t.cert_mode=l}}else if(o.startsWith("udp_stun")){const r=o.match(/udp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.udp_stun=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("tcp_stun")){const r=o.match(/tcp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.tcp_stun=l.map(i=>i.replace(/"/g,"")))}}}}return t},po=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(a=>a.trim());s.length>0&&(t+=`# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) +`,t+=`# dynamic 协议使用dns txt解析记录值 +`,t+=`server = [${s.map(a=>`"${a}"`).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(a=>a.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(a=>`"${a}"`).join(", ")}] +`);const o=e.output.filter(a=>a.trim());o.length>0&&(t+=` +# 出栈允许网段,用于点对网,允许指定网段的转发 +`,t+=`output = [${o.map(a=>`"${a}"`).join(", ")}] +`),e.no_nat&&(t+=` +# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网 +`,t+=`# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 +`,t+=`no_nat = true +`),e.no_tun&&(t+=` +# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 +`,t+=`no_tun = true +`);const r=e.port_mapping.filter(a=>a.trim());r.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 = [${r.map(a=>`"${a}"`).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}" +`),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 l=e.udp_stun.filter(a=>a.trim());l.length>0&&(t+=` +# 自定义UDP STUN地址,不设置则用默认stun +`,t+=`udp_stun = [${l.map(a=>`"${a}"`).join(", ")}] +`);const i=e.tcp_stun.filter(a=>a.trim());return i.length>0&&(t+=` +# 自定义TCP STUN地址,不设置则用默认stun +`,t+=`tcp_stun = [${i.map(a=>`"${a}"`).join(", ")}] +`),t},L0=`# 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" + +# --- 安全配置 --- + +# 加密密码 (可选) +# 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"]`,N0={class:"text-lg font-bold text-slate-900 dark:text-white"},V0={class:"flex items-center gap-4"},j0={class:"flex rounded-lg border border-slate-300 bg-slate-100 p-1 dark:border-slate-600 dark:bg-slate-800"},D0={key:0,class:"text-sm text-slate-500 font-mono hidden md:block"},B0={class:"h-full overflow-y-auto scrollbar-hide p-6"},F0={class:"max-w-4xl mx-auto space-y-6"},U0={class:"card"},H0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},W0={class:"mt-4"},K0={class:"space-y-2"},G0=["onUpdate:modelValue"],q0=["onClick"],z0={class:"card"},J0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Y0={class:"card"},Q0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Z0={class:"card"},X0={class:"space-y-4"},eh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},th={key:0},sh={class:"card"},nh={class:"space-y-4"},oh={class:"space-y-2"},rh=["onUpdate:modelValue"],lh=["onClick"],ih={class:"space-y-2"},ah=["onUpdate:modelValue"],ch=["onClick"],uh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},fh={class:"card"},dh={class:"space-y-4"},ph={class:"space-y-2"},hh=["onUpdate:modelValue"],mh=["onClick"],gh={class:"card"},vh={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},_h={class:"card"},bh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},xh={class:"space-y-2"},yh=["onUpdate:modelValue"],kh=["onClick"],wh={class:"space-y-2"},Ch=["onUpdate:modelValue"],Sh=["onClick"],Eh={class:"h-full"},Th={class:"flex-1 text-left text-xs text-slate-500"},Ah={key:0},Ih={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",ds="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",ps="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",Lt="text-md mb-4 flex items-center font-bold text-slate-900 dark:text-white",Rh={__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=is(),r=ae(""),l=ae(""),i=ae("new"),a=ae("form"),f=ae(""),u=ae(!1),d=ae(!1),g=ae(!1),p=ae(Mo());Ge(()=>s.show,async $=>{if($)if(l.value=s.fileName||"",i.value=s.fileName?"edit":"new",a.value="form",u.value=!1,d.value=!1,s.fileName)try{const m=await sf(s.fileName);r.value=m,f.value=m,g.value=!0,p.value=hl(m),$t(()=>{g.value=!1})}catch(m){o.toast.error("获取配置失败: "+m.message),n("close")}else f.value="",p.value=Mo(),r.value=L0});const w=()=>{a.value==="toml"?(a.value="form",g.value=!0,p.value=hl(r.value),$t(()=>{g.value=!1})):a.value="form"},S=()=>{a.value==="form"&&(d.value?(r.value=po(p.value),d.value=!1):f.value&&!u.value?r.value=f.value:r.value=po(p.value)),a.value="toml"};Ge(r,($,m)=>{a.value==="toml"&&m!==void 0&&(u.value=!0)}),Ge(p,()=>{a.value==="form"&&s.show&&!g.value&&(d.value=!0)},{deep:!0});const L=async()=>{try{let $=r.value;if(a.value==="form"){if(!p.value.network_code.trim()){o.toast.error("请填写网络编号");return}if(p.value.server.filter(_=>_.trim()).length===0){o.toast.error("请至少填写一个服务器地址");return}$=po(p.value)}await nf(l.value||null,$),o.toast.success("配置已保存"),n("close"),n("saved")}catch($){o.toast.error("保存失败: "+$.message)}};return($,m)=>(k(),Me(nr,{show:e.show,"mask-closable":!1,"panel-class":"w-full max-w-6xl h-[85vh]",onClose:m[26]||(m[26]=_=>n("close"))},{header:Se(()=>[c("h3",N0,F(i.value==="new"?"新建配置":"编辑配置"),1),c("div",V0,[c("div",j0,[c("button",{onClick:w,class:q([a.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"])},[...m[27]||(m[27]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 表单模式 ",-1)])],2),c("button",{onClick:S,class:q([a.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"])},[...m[28]||(m[28]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})],-1),oe(" TOML模式 ",-1)])],2)]),l.value?(k(),T("div",D0,F(l.value),1)):ce("",!0)])]),body:Se(()=>[be(c("div",B0,[c("div",F0,[c("div",U0,[c("h4",{class:q(Lt)},[...m[29]||(m[29]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),oe(" 基础配置 ",-1)])]),c("div",H0,[c("div",null,[m[30]||(m[30]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"配置名称",-1)),be(c("input",{"onUpdate:modelValue":m[0]||(m[0]=_=>p.value.config_name=_),type:"text",placeholder:"例如: 我的VPN配置",class:"input"},null,512),[[Le,p.value.config_name]])]),c("div",null,[m[31]||(m[31]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 网络编号 "),c("span",{class:"text-red-500"},"*")],-1)),be(c("input",{"onUpdate:modelValue":m[1]||(m[1]=_=>p.value.network_code=_),type:"text",placeholder:"例如: my_network",required:"",class:"input"},null,512),[[Le,p.value.network_code]])])]),c("div",W0,[m[34]||(m[34]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 服务器地址 "),c("span",{class:"text-red-500"},"*"),c("span",{class:"text-xs text-slate-500 ml-2"},"支持 quic:// tcp:// wss:// dynamic://")],-1)),c("div",K0,[(k(!0),T(le,null,Ee(p.value.server,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.server[x]=y,type:"text",placeholder:"例如: quic://1.2.3.4:29872",class:"input flex-1"},null,8,G0),[[Le,p.value.server[x]]]),p.value.server.length>1?(k(),T("button",{key:0,onClick:y=>p.value.server.splice(x,1),class:q(ds)},[...m[32]||(m[32]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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,q0)):ce("",!0)]))),128)),c("button",{onClick:m[2]||(m[2]=_=>p.value.server.push("")),class:q(ps)},[...m[33]||(m[33]=[c("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),oe(" 添加服务器 ",-1)])])])])]),c("div",z0,[c("h4",{class:q(Lt)},[...m[35]||(m[35]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 网络设置 ",-1)])]),c("div",J0,[c("div",null,[m[36]||(m[36]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 自定义虚拟IP "),c("span",{class:"text-xs text-slate-500 ml-1"},"(可选)")],-1)),be(c("input",{"onUpdate:modelValue":m[3]||(m[3]=_=>p.value.ip=_),type:"text",placeholder:"例如: 10.26.0.2",class:"input"},null,512),[[Le,p.value.ip]])]),c("div",null,[m[37]||(m[37]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"MTU",-1)),be(c("input",{"onUpdate:modelValue":m[4]||(m[4]=_=>p.value.mtu=_),type:"number",placeholder:"1380",class:"input"},null,512),[[Le,p.value.mtu,void 0,{number:!0}]])]),c("div",null,[m[38]||(m[38]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"隧道端口",-1)),be(c("input",{"onUpdate:modelValue":m[5]||(m[5]=_=>p.value.tunnel_port=_),type:"number",placeholder:"0 (自动分配)",class:"input"},null,512),[[Le,p.value.tunnel_port,void 0,{number:!0}]])])])]),c("div",Y0,[c("h4",{class:q(Lt)},[...m[39]||(m[39]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),oe(" 传输优化 ",-1)])]),c("div",Q0,[c("label",{class:q(Yt)},[m[40]||(m[40]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"QUIC传输优化"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"重传丢包")],-1)),be(c("input",{"onUpdate:modelValue":m[6]||(m[6]=_=>p.value.rtx=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.rtx]])]),c("label",{class:q(Yt)},[m[41]||(m[41]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"FEC前向纠错"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"损失部分带宽提升稳定性")],-1)),be(c("input",{"onUpdate:modelValue":m[7]||(m[7]=_=>p.value.fec=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.fec]])]),c("label",{class:q(Yt)},[m[42]||(m[42]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"LZ4压缩"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"减少传输数据量")],-1)),be(c("input",{"onUpdate:modelValue":m[8]||(m[8]=_=>p.value.compress=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.compress]])]),c("label",{class:q(Yt)},[m[43]||(m[43]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭P2P打洞"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅通过服务器中转")],-1)),be(c("input",{"onUpdate:modelValue":m[9]||(m[9]=_=>p.value.no_punch=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_punch]])])])]),c("div",Z0,[c("h4",{class:q(Lt)},[...m[44]||(m[44]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 安全配置 ",-1)])]),c("div",X0,[c("div",eh,[c("div",null,[m[45]||(m[45]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"组网加密密码(连接公共服务器时建议填写,同一组网密码需要相同)",-1)),be(c("input",{"onUpdate:modelValue":m[10]||(m[10]=_=>p.value.password=_),type:"password",placeholder:"留空则不加密",class:"input"},null,512),[[Le,p.value.password]])]),c("div",null,[m[47]||(m[47]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"服务端证书校验模式",-1)),be(c("select",{"onUpdate:modelValue":m[11]||(m[11]=_=>p.value.cert_mode=_),class:"input"},[...m[46]||(m[46]=[c("option",{value:"skip"},"跳过验证 (默认)",-1),c("option",{value:"standard"},"系统证书验证",-1),c("option",{value:"finger"},"证书指纹验证",-1)])],512),[[Bi,p.value.cert_mode]])])]),p.value.cert_mode==="finger"?(k(),T("div",th,[m[48]||(m[48]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 证书指纹 "),c("span",{class:"text-xs text-slate-500 ml-1"},"(服务端启动时日志会输出指纹)")],-1)),be(c("input",{"onUpdate:modelValue":m[12]||(m[12]=_=>p.value.fingerprint=_),type:"text",placeholder:"例如: 3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1",class:"input font-mono text-sm"},null,512),[[Le,p.value.fingerprint]])])):ce("",!0)])]),c("div",sh,[c("h4",{class:q(Lt)},[...m[49]||(m[49]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" NAT与路由 (点对网) ",-1)])]),c("div",nh,[c("div",null,[m[51]||(m[51]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 入栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR,目标IP")],-1)),c("div",oh,[(k(!0),T(le,null,Ee(p.value.input,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.input[x]=y,type:"text",placeholder:"例如: 192.168.0.0/24,10.26.0.2",class:"input flex-1"},null,8,rh),[[Le,p.value.input[x]]]),c("button",{onClick:y=>p.value.input.splice(x,1),class:q(ds)},[...m[50]||(m[50]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,lh)]))),128)),c("button",{onClick:m[13]||(m[13]=_=>p.value.input.push("")),class:q(ps)}," + 添加入栈网段 ")])]),c("div",null,[m[53]||(m[53]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 出栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR (允许转发的网段)")],-1)),c("div",ih,[(k(!0),T(le,null,Ee(p.value.output,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.output[x]=y,type:"text",placeholder:"例如: 0.0.0.0/0",class:"input flex-1"},null,8,ah),[[Le,p.value.output[x]]]),c("button",{onClick:y=>p.value.output.splice(x,1),class:q(ds)},[...m[52]||(m[52]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,ch)]))),128)),c("button",{onClick:m[14]||(m[14]=_=>p.value.output.push("")),class:q(ps)}," + 添加出栈网段 ")])]),c("div",uh,[c("label",{class:q(Yt)},[m[54]||(m[54]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭内置NAT"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"使用系统网卡转发")],-1)),be(c("input",{"onUpdate:modelValue":m[15]||(m[15]=_=>p.value.no_nat=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_nat]])]),c("label",{class:q(Yt)},[m[55]||(m[55]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭TUN网卡"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅作流量出口或端口映射")],-1)),be(c("input",{"onUpdate:modelValue":m[16]||(m[16]=_=>p.value.no_tun=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_tun]])])])])]),c("div",fh,[c("h4",{class:q(Lt)},[...m[56]||(m[56]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 端口映射 ",-1)])]),c("div",dh,[c("div",null,[m[58]||(m[58]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 映射规则 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: 协议://监听地址-虚拟IP-目标地址")],-1)),c("div",ph,[(k(!0),T(le,null,Ee(p.value.port_mapping,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.port_mapping[x]=y,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,hh),[[Le,p.value.port_mapping[x]]]),c("button",{onClick:y=>p.value.port_mapping.splice(x,1),class:q(ds)},[...m[57]||(m[57]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,mh)]))),128)),c("button",{onClick:m[17]||(m[17]=_=>p.value.port_mapping.push("")),class:q(ps)}," + 添加映射规则 ")])]),c("label",{class:q(Yt)},[m[59]||(m[59]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"允许作为映射出口"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"允许其他设备使用本机作跳板")],-1)),be(c("input",{"onUpdate:modelValue":m[18]||(m[18]=_=>p.value.allow_mapping=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.allow_mapping]])])])]),c("div",gh,[c("h4",{class:q(Lt)},[...m[60]||(m[60]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 设备配置 ",-1)])]),c("div",vh,[c("div",null,[m[61]||(m[61]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备名称",-1)),be(c("input",{"onUpdate:modelValue":m[19]||(m[19]=_=>p.value.device_name=_),type:"text",placeholder:"默认为主机名",class:"input"},null,512),[[Le,p.value.device_name]])]),c("div",null,[m[62]||(m[62]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备ID",-1)),be(c("input",{"onUpdate:modelValue":m[20]||(m[20]=_=>p.value.device_id=_),type:"text",placeholder:"自动生成",class:"input"},null,512),[[Le,p.value.device_id]])]),c("div",null,[m[63]||(m[63]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"虚拟网卡名",-1)),be(c("input",{"onUpdate:modelValue":m[21]||(m[21]=_=>p.value.tun_name=_),type:"text",placeholder:"默认为vnt-tun",class:"input"},null,512),[[Le,p.value.tun_name]])])])]),c("div",_h,[c("h4",{class:q(Lt)},[...m[64]||(m[64]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" STUN配置 (高级) ",-1)])]),c("div",bh,[c("div",null,[m[66]||(m[66]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"UDP STUN服务器",-1)),c("div",xh,[(k(!0),T(le,null,Ee(p.value.udp_stun,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.udp_stun[x]=y,type:"text",placeholder:"例如: stun.l.google.com:19302",class:"input flex-1"},null,8,yh),[[Le,p.value.udp_stun[x]]]),c("button",{onClick:y=>p.value.udp_stun.splice(x,1),class:q(ds)},[...m[65]||(m[65]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,kh)]))),128)),c("button",{onClick:m[22]||(m[22]=_=>p.value.udp_stun.push("")),class:q(ps)}," + 添加UDP STUN ")])]),c("div",null,[m[68]||(m[68]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"TCP STUN服务器",-1)),c("div",wh,[(k(!0),T(le,null,Ee(p.value.tcp_stun,(_,x)=>(k(),T("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":y=>p.value.tcp_stun[x]=y,type:"text",placeholder:"例如: stun.nextcloud.com:443",class:"input flex-1"},null,8,Ch),[[Le,p.value.tcp_stun[x]]]),c("button",{onClick:y=>p.value.tcp_stun.splice(x,1),class:q(ds)},[...m[67]||(m[67]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Sh)]))),128)),c("button",{onClick:m[23]||(m[23]=_=>p.value.tcp_stun.push("")),class:q(ps)}," + 添加TCP STUN ")])])])])])],512),[[Vr,a.value==="form"]]),be(c("div",Eh,[be(c("textarea",{"onUpdate:modelValue":m[24]||(m[24]=_=>r.value=_),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),[[Le,r.value]])],512),[[Vr,a.value==="toml"]])]),footer:Se(()=>[c("div",Th,[a.value==="form"?(k(),T("span",Ah,"填写完成后保存即可生成配置文件")):(k(),T("span",Ih,"* 请使用标准 TOML 格式"))]),c("button",{class:"btn-ghost",onClick:m[25]||(m[25]=_=>n("close"))},"取消"),c("button",{class:"btn-primary",onClick:L},"保存配置")]),_:1},8,["show"]))}},$h={class:"space-y-6"},Ph={class:"flex items-end justify-between gap-4"},Mh={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Oh=["onClick"],Lh={key:0,class:"absolute right-0 top-0 rounded-bl bg-green-500 px-2 py-1 text-xs text-white"},Nh={key:1,class:"absolute right-0 top-0 rounded-bl bg-indigo-500 px-2 py-1 text-xs text-white"},Vh={class:"flex items-start"},jh={class:"overflow-hidden"},Dh=["title"],Bh=["title"],Fh={class:"mt-4 flex justify-end opacity-0 transition-opacity group-hover:opacity-100"},Uh=["onClick"],Hh=["onClick"],Wh={__name:"ConfigView",setup(e){const t=Ht(),s=is(),n=ae(!1),o=ae(null),r=u=>{const d=t.instanceList.find(g=>g.file_name===u);return d?d.status:null},l=u=>{const d=r(u);return d==="running"?"ring-2 ring-green-500/60":d==="starting"?"ring-2 ring-indigo-500/60":""},i=u=>{o.value=u,n.value=!0},a=()=>{t.fetchConfigList()},f=async u=>{if(await s.confirm({title:"删除配置",message:`确定要删除配置 ${u} 吗?`,danger:!0,confirmText:"删除"}))try{await of(u),s.toast.success("配置已删除"),t.fetchConfigList()}catch(g){s.toast.error(g.message)}};return ls(()=>t.fetchConfigList()),(u,d)=>(k(),T("div",$h,[c("div",Ph,[d[3]||(d[3]=c("div",null,[c("h1",{class:"page-title"},"配置"),c("p",{class:"page-subtitle"},"管理组网配置文件")],-1)),c("button",{class:"btn-primary",onClick:d[0]||(d[0]=g=>i(null))},[...d[2]||(d[2]=[c("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),oe(" 新建配置 ",-1)])])]),O(t).configList.length===0?(k(),Me(ln,{key:0,text:"暂无配置,点击右上角新建"})):(k(),T("div",Mh,[(k(!0),T(le,null,Ee(O(t).configList,g=>(k(),T("div",{key:g.file_name,class:q([l(g.file_name),"card group relative flex min-h-[140px] cursor-pointer flex-col justify-between overflow-hidden"]),onClick:p=>i(g.file_name)},[r(g.file_name)==="running"?(k(),T("div",Lh," 运行中 ")):r(g.file_name)==="starting"?(k(),T("div",Nh," 启动中 ")):ce("",!0),c("div",Vh,[d[4]||(d[4]=c("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"},[c("svg",{class:"h-6 w-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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)),c("div",jh,[c("h3",{class:"truncate text-lg font-bold text-slate-900 dark:text-white",title:g.config_name},F(g.config_name||"Unnamed"),9,Dh),c("p",{class:"truncate font-mono text-xs text-slate-400",title:g.file_name},F(g.file_name),9,Bh)])]),c("div",Fh,[c("button",{class:"mr-4 text-sm text-indigo-600 hover:text-indigo-500 dark:text-indigo-400",onClick:xs(p=>i(g.file_name),["stop"])}," 编辑 ",8,Uh),c("button",{class:"text-sm text-red-500 hover:text-red-400",onClick:xs(p=>f(g.file_name),["stop"])}," 删除 ",8,Hh)])],10,Oh))),128))])),ie(Rh,{show:n.value,"file-name":o.value,onClose:d[1]||(d[1]=g=>n.value=!1),onSaved:a},null,8,["show","file-name"])]))}},Kh=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())}`},ml=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},qh={class:"flex items-center gap-4 mb-2 text-xs text-slate-400"},zh={class:"ml-auto"},Jh={__name:"SpeedChart",props:{history:{type:Object,required:!0},size:{type:Number,default:60}},setup(e,{expose:t}){const s=e,n=ae(null),o=ae(""),r=()=>{const l=n.value;if(!l)return;const i=l.getContext("2d"),a=s.history?s.history.tx:[],f=s.history?s.history.rx:[],u=s.size,d=window.devicePixelRatio||1,g=l.getBoundingClientRect();if(g.width===0)return;l.width=g.width*d,l.height=g.height*d,i.setTransform(d,0,0,d,0,0);const p=g.width,w=g.height,L=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)"},$=8,m=4,_=0,y=p-_-0,Z=w-$-m;i.fillStyle=L.bg,i.fillRect(0,0,p,w);const D=[...a,...f];let U=D.length>0?Math.max(...D):0;U<1024&&(U=1024);const M=Gh(U);o.value="峰值: "+Oo(M);const z=4;i.strokeStyle=L.grid,i.lineWidth=1;for(let C=0;C<=z;C++){const K=$+Z/z*C;i.beginPath(),i.moveTo(_,K),i.lineTo(_+y,K),i.stroke()}const se=6;for(let C=0;C<=se;C++){const K=_+y/se*C;i.beginPath(),i.moveTo(K,$),i.lineTo(K,$+Z),i.stroke()}const j=(C,K,Ce)=>{if(C.length<2)return;const ue=y/(u-1),ee=u-C.length;i.beginPath(),i.moveTo(_+ee*ue,$+Z);for(let re=0;re$t(r)),Ge(()=>[s.history?.tx?.length,s.history?.rx?.length,s.history?.tx?.at(-1),s.history?.rx?.at(-1)],()=>$t(r)),t({draw:r}),(l,i)=>(k(),T("div",null,[c("div",qh,[i[0]||(i[0]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-green-400 mr-1"}),oe("上传速度")],-1)),i[1]||(i[1]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-blue-400 mr-1"}),oe("下载速度")],-1)),c("span",zh,F(o.value),1)]),c("canvas",{ref_key:"canvasRef",ref:n,class:"rounded w-full block h-[150px]"},null,512)]))}},Yh={class:"space-y-4"},Qh={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Zh=["onClick"],Xh={key:2,class:"card overflow-hidden p-0"},em={class:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-700"},tm={class:"flex gap-4 text-sm muted"},sm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},nm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},om={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},rm={class:"table"},lm={class:"transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50"},im=["onClick"],am={class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},cm=["onMouseenter"],um={class:"hidden text-xs text-slate-400 md:table-cell"},fm={class:"flex items-center gap-2"},dm={key:0,class:"tooltip"},pm={key:1,class:"tooltip"},hm={key:2,class:"tooltip cursor-help"},mm={class:"tooltip-text"},gm={key:1,class:"text-yellow-600 dark:text-yellow-400"},vm={key:2,class:"text-slate-400"},_m={class:"tabular-nums"},bm=["title"],xm={key:1,class:"text-slate-400"},ym={class:"text-xs"},km={key:0,class:"leading-relaxed"},wm={class:"text-green-600 tabular-nums dark:text-green-400"},Cm={class:"text-blue-600 tabular-nums dark:text-blue-400"},Sm={key:1,class:"text-slate-400"},Em={class:"hidden font-mono text-xs text-slate-400 md:table-cell"},Tm={key:0},Am={colspan:"10",class:"p-0"},Im={class:"border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-700/50 dark:bg-slate-950/60"},Rm=60,$m={__name:"PeersView",setup(e){const t=Ht(),s=ot("peerTooltip"),n=(_,x)=>s.value?.showPeerTooltip(_,x),o=()=>s.value?.hidePeerTooltip(),r=ae([]);let l=null,i={},a=0;const f=rs({}),u={},d=_=>{f[_]=!f[_]},g=()=>{const _=t.instanceList.find(x=>x.file_name===t.selectedInstance);return _?_.status:null},p=()=>{r.value=[],i={},a=0;for(const _ in u)delete u[_];for(const _ in f)delete f[_]},w=async()=>{if(!t.selectedInstance||g()!=="running"){p();return}try{const _=await zu(t.selectedInstance)||[],x=Date.now(),y=a>0?(x-a)/1e3:0,Z={};for(const D of _)if(D.traffic){const U=D.ip,M=i[U];if(M&&y>0){const z=Math.max(0,D.traffic.tx_bytes-M.tx_bytes),se=Math.max(0,D.traffic.rx_bytes-M.rx_bytes);D.traffic.tx_speed=Math.round(z/y),D.traffic.rx_speed=Math.round(se/y)}else D.traffic.tx_speed=0,D.traffic.rx_speed=0;Z[U]={tx_bytes:D.traffic.tx_bytes,rx_bytes:D.traffic.rx_bytes},u[U]||(u[U]={tx:[],rx:[]}),u[U].tx.push(D.traffic.tx_speed),u[U].rx.push(D.traffic.rx_speed),u[U].tx.length>Rm&&(u[U].tx.shift(),u[U].rx.shift())}i=Z,a=x,r.value=_}catch(_){console.error(_)}};ls(()=>{w(),l=setInterval(()=>{t.isPageVisible&&w()},3e3)}),As(()=>{l&&clearInterval(l)}),Ge(()=>t.selectedInstance,()=>{p(),w()}),Ge(g,_=>{_==="running"&&w()});const S=_=>_.metric===1?"text-purple-600 font-medium dark:text-purple-400":"text-blue-600 dark:text-blue-400",L=_=>{const x=_.metric===1,y=_.protocol.includes("Tcp");return x?y?"打洞TCP直连":"打洞UDP直连":y?"客户端TCP中继":"客户端UDP中继"},$=_=>_===3?"己方加密对方未加密":_===4?"己方未加密对方加密":_===5?"密钥不一致":"未知错误",m=_=>t.selectedInstance===_?"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(_,x)=>(k(),T("div",Yh,[x[8]||(x[8]=c("div",null,[c("h1",{class:"page-title"},"设备列表"),c("p",{class:"page-subtitle"},"查看各实例的设备连接与流量状况")],-1)),O(t).instanceList.length>0?(k(),T("div",Qh,[(k(!0),T(le,null,Ee(O(t).instanceList,y=>(k(),T("button",{key:y.file_name,onClick:Z=>O(t).selectedInstance=y.file_name,class:q([m(y.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ie(or,{status:y.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),oe(" "+F(y.config_name||y.file_name),1)],10,Zh))),128))])):ce("",!0),O(t).selectedInstance?(k(),T("div",Xh,[c("div",em,[x[2]||(x[2]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"设备列表",-1)),c("div",tm,[c("span",null,[x[0]||(x[0]=oe(" Online: ",-1)),c("span",sm,F(r.value.filter(y=>y.online).length),1)]),c("span",null,[x[1]||(x[1]=oe(" Total: ",-1)),c("span",nm,F(r.value.length),1)])])]),c("div",om,[c("table",rm,[x[7]||(x[7]=c("thead",null,[c("tr",null,[c("th",{class:"w-8 px-2"}),c("th",null,"IP地址"),c("th",null,"名称"),c("th",{class:"hidden md:table-cell"},"版本"),c("th",null,"状态"),c("th",null,"模式"),c("th",null,"延迟"),c("th",null,"丢包率"),c("th",null,"流量"),c("th",{class:"hidden md:table-cell"},"最后在线")])],-1)),c("tbody",null,[(k(!0),T(le,null,Ee(r.value,y=>(k(),T(le,{key:y.ip},[c("tr",lm,[c("td",{class:"cursor-pointer select-none px-2 text-center",onClick:Z=>d(y.ip)},[(k(),T("svg",{class:q(["inline-block h-4 w-4 text-slate-400 transition-transform duration-200",{"rotate-90":f[y.ip]}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...x[3]||(x[3]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2))],8,im),c("td",am,[c("span",{class:"cursor-help border-b border-dotted border-indigo-400/50 pb-0.5",onMouseenter:Z=>n(Z,y),onMouseleave:o},F(y.ip),41,cm)]),c("td",null,F(y.name||"-"),1),c("td",um,F(y.version||"-"),1),c("td",null,[c("div",fm,[c("span",{class:q(y.online?"badge-green":"badge-gray")},F(y.online?"Online":"Offline"),3),y.online&&y.key_equal===1?(k(),T("div",dm,[...x[4]||(x[4]=[c("svg",{class:"h-4 w-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),c("span",{class:"tooltip-text"},"双方加密传输",-1)])])):y.online&&y.key_equal===2?(k(),T("div",pm,[...x[5]||(x[5]=[c("svg",{class:"h-4 w-4 text-yellow-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),c("span",{class:"tooltip-text"},"双方未加密",-1)])])):y.online&&[3,4,5].includes(y.key_equal)?(k(),T("div",hm,[x[6]||(x[6]=c("svg",{class:"h-4 w-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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)),c("span",mm,F($(y.key_equal)),1)])):ce("",!0)])]),c("td",null,[y.online&&y.route?(k(),T("span",{key:0,class:q(S(y.route))},F(L(y.route)),3)):y.online?(k(),T("span",gm,"服务器中继")):(k(),T("span",vm,"-"))]),c("td",_m,F(y.route?y.route.rtt+" ms":"-"),1),c("td",null,[y.packet_loss?(k(),T("span",{key:0,class:q(y.packet_loss.loss_rate>10?"text-red-600 dark:text-red-400":y.packet_loss.loss_rate>5?"text-yellow-600 dark:text-yellow-400":"text-green-600 dark:text-green-400"),title:"Sent: "+y.packet_loss.sent+", Received: "+y.packet_loss.received},F(y.packet_loss.loss_rate.toFixed(1))+"%",11,bm)):(k(),T("span",xm,"-"))]),c("td",ym,[y.traffic?(k(),T("div",km,[c("div",wm," ↑ "+F(O(ml)(y.traffic.tx_bytes))+" ("+F(O(Oo)(y.traffic.tx_speed))+") ",1),c("div",Cm," ↓ "+F(O(ml)(y.traffic.rx_bytes))+" ("+F(O(Oo)(y.traffic.rx_speed))+") ",1)])):(k(),T("span",Sm,"-"))]),c("td",Em,F(O(Kh)(y.last_connected_time)),1)]),f[y.ip]?(k(),T("tr",Tm,[c("td",Am,[c("div",Im,[ie(Jh,{history:u[y.ip]||{tx:[],rx:[]},size:60},null,8,["history"])])])])):ce("",!0)],64))),128))])])])])):(k(),Me(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},Pm={class:"space-y-4"},Mm={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Om=["onClick"],Lm={key:2,class:"card overflow-hidden p-0"},Nm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},Vm={class:"table"},jm=["rowspan"],Dm={class:"font-mono tabular-nums text-yellow-700 dark:text-yellow-300"},Bm={class:"tabular-nums"},Fm={class:"tabular-nums"},Um={__name:"RoutesView",setup(e){const t=Ht(),s=ae([]);let n=null;const o=()=>{const i=t.instanceList.find(a=>a.file_name===t.selectedInstance);return i?i.status:null},r=async()=>{if(!t.selectedInstance||o()!=="running"){s.value=[];return}try{s.value=await Ju(t.selectedInstance)||[]}catch(i){console.error(i)}};ls(()=>{r(),n=setInterval(()=>{t.isPageVisible&&r()},3e3)}),As(()=>{n&&clearInterval(n)}),Ge(()=>t.selectedInstance,()=>{r()}),Ge(o,i=>{i==="running"&&r()});const l=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,a)=>(k(),T("div",Pm,[a[2]||(a[2]=c("div",null,[c("h1",{class:"page-title"},"路由"),c("p",{class:"page-subtitle"},"查看各实例的路由表")],-1)),O(t).instanceList.length>0?(k(),T("div",Mm,[(k(!0),T(le,null,Ee(O(t).instanceList,f=>(k(),T("button",{key:f.file_name,onClick:u=>O(t).selectedInstance=f.file_name,class:q([l(f.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ie(or,{status:f.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),oe(" "+F(f.config_name||f.file_name),1)],10,Om))),128))])):ce("",!0),O(t).selectedInstance?(k(),T("div",Lm,[a[1]||(a[1]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"路由表")],-1)),c("div",Nm,[c("table",Vm,[a[0]||(a[0]=c("thead",null,[c("tr",null,[c("th",null,"目标节点IP"),c("th",null,"目标网络"),c("th",null,"跳数"),c("th",null,"延迟")])],-1)),c("tbody",null,[(k(!0),T(le,null,Ee(s.value,f=>(k(),T(le,{key:f.ip},[(k(!0),T(le,null,Ee(f.routes,(u,d)=>(k(),T("tr",{key:d,class:"hover:bg-slate-50 dark:hover:bg-slate-800/50"},[d===0?(k(),T("td",{key:0,rowspan:f.routes.length,class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},F(f.ip),9,jm)):ce("",!0),c("td",Dm,F(u.addr),1),c("td",Bm,F(u.metric),1),c("td",Fm,F(u.rtt)+" ms",1)]))),128))],64))),128))])])])])):(k(),Me(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},Hm=[{path:"/",component:t0},{path:"/instances",component:O0},{path:"/general",redirect:"/instances"},{path:"/config",component:Wh},{path:"/peers",component:$m},{path:"/routes",component:Um}],Wm=fp({history:Hd(),routes:Hm});ju(od).use(Fu()).use(Wm).mount("#app"); diff --git a/vnt-web/static/assets/index-DHCLVx7I.js b/vnt-web/static/assets/index-DHCLVx7I.js deleted file mode 100644 index ee73e95..0000000 --- a/vnt-web/static/assets/index-DHCLVx7I.js +++ /dev/null @@ -1,168 +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 r of o)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function s(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function n(o){if(o.ep)return;o.ep=!0;const r=s(o);fetch(o.href,r)}})();function Lo(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const xe={},gs=[],bt=()=>{},ml=()=>!1,An=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),In=e=>e.startsWith("onUpdate:"),Ie=Object.assign,No=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},ca=Object.prototype.hasOwnProperty,me=(e,t)=>ca.call(e,t),z=Array.isArray,vs=e=>sn(e)==="[object Map]",Es=e=>sn(e)==="[object Set]",cr=e=>sn(e)==="[object Date]",se=e=>typeof e=="function",we=e=>typeof e=="string",Ze=e=>typeof e=="symbol",ge=e=>e!==null&&typeof e=="object",gl=e=>(ge(e)||se(e))&&se(e.then)&&se(e.catch),vl=Object.prototype.toString,sn=e=>vl.call(e),ua=e=>sn(e).slice(8,-1),_l=e=>sn(e)==="[object Object]",Rn=e=>we(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,js=Lo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),$n=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},fa=/-\w/g,Ke=$n(e=>e.replace(fa,t=>t.slice(1).toUpperCase())),da=/\B([A-Z])/g,os=$n(e=>e.replace(da,"-$1").toLowerCase()),Pn=$n(e=>e.charAt(0).toUpperCase()+e.slice(1)),qn=$n(e=>e?`on${Pn(e)}`:""),vt=(e,t)=>!Object.is(e,t),pn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Mn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},pa=e=>{const t=we(e)?Number(e):NaN;return isNaN(t)?e:t};let ur;const On=()=>ur||(ur=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(z(e)){const t={};for(let s=0;s{if(s){const n=s.split(ma);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function G(e){let t="";if(we(e))t=e;else if(z(e))for(let s=0;sTs(s,t))}const yl=e=>!!(e&&e.__v_isRef===!0),F=e=>we(e)?e:e==null?"":z(e)||ge(e)&&(e.toString===vl||!se(e.toString))?yl(e)?F(e.value):JSON.stringify(e,kl,2):String(e),kl=(e,t)=>yl(t)?kl(e,t.value):vs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,o],r)=>(s[zn(n,r)+" =>"]=o,s),{})}:Es(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>zn(s))}:Ze(t)?zn(t):ge(t)&&!z(t)&&!_l(t)?String(t):t,zn=(e,t="")=>{var s;return Ze(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let $e;class wl{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&&$e&&($e.active?(this.parent=$e,this.index=($e.scopes||($e.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($e===this)$e=this.prevScope;else{let t=$e;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 Il(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Rl(e){let t,s=e.depsTail,n=s;for(;n;){const o=n.prevDep;n.version===-1?(n===s&&(s=o),Bo(n),ka(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=o}e.deps=t,e.depsTail=s}function ho(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&($l(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function $l(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||!ho(e))))return;e.flags|=2;const t=e.dep,s=ke,n=nt;ke=e,nt=!0;try{Il(e);const o=e.fn(e._value);(t.version===0||vt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{ke=s,nt=n,Rl(e),e.flags&=-3}}function Bo(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 r=s.computed.deps;r;r=r.nextDep)Bo(r,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function ka(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let nt=!0;const Pl=[];function At(){Pl.push(nt),nt=!1}function It(){const e=Pl.pop();nt=e===void 0?!0:e}function fr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=ke;ke=void 0;try{t()}finally{ke=s}}}let Gs=0;class wa{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 Fo{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(!ke||!nt||ke===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==ke)s=this.activeLink=new wa(ke,this),ke.deps?(s.prevDep=ke.depsTail,ke.depsTail.nextDep=s,ke.depsTail=s):ke.deps=ke.depsTail=s,Ml(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=ke.depsTail,s.nextDep=void 0,ke.depsTail.nextDep=s,ke.depsTail=s,ke.deps===s&&(ke.deps=n)}return s}trigger(t){this.version++,Gs++,this.notify(t)}notify(t){jo();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Do()}}}function Ml(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)Ml(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const mn=new WeakMap,ts=Symbol(""),mo=Symbol(""),qs=Symbol("");function Ne(e,t,s){if(nt&&ke){let n=mn.get(e);n||mn.set(e,n=new Map);let o=n.get(s);o||(n.set(s,o=new Fo),o.map=n,o.key=s),o.track()}}function Ct(e,t,s,n,o,r){const l=mn.get(e);if(!l){Gs++;return}const i=a=>{a&&a.trigger()};if(jo(),t==="clear")l.forEach(i);else{const a=z(e),f=a&&Rn(s);if(a&&s==="length"){const u=Number(n);l.forEach((p,g)=>{(g==="length"||g===qs||!Ze(g)&&g>=u)&&i(p)})}else switch((s!==void 0||l.has(void 0))&&i(l.get(s)),f&&i(l.get(qs)),t){case"add":a?f&&i(l.get("length")):(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"delete":a||(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"set":vs(e)&&i(l.get(ts));break}}Do()}function Ca(e,t){const s=mn.get(e);return s&&s.get(t)}function us(e){const t=ce(e);return t===e?t:(Ne(t,"iterate",qs),Qe(e)?t:t.map(rt))}function Nn(e){return Ne(e=ce(e),"iterate",qs),e}function mt(e,t){return Rt(e)?ys(Et(e)?rt(t):t):rt(t)}const Sa={__proto__:null,[Symbol.iterator](){return Yn(this,Symbol.iterator,e=>mt(this,e))},concat(...e){return us(this).concat(...e.map(t=>z(t)?us(t):t))},entries(){return Yn(this,"entries",e=>(e[1]=mt(this,e[1]),e))},every(e,t){return xt(this,"every",e,t,void 0,arguments)},filter(e,t){return xt(this,"filter",e,t,s=>s.map(n=>mt(this,n)),arguments)},find(e,t){return xt(this,"find",e,t,s=>mt(this,s),arguments)},findIndex(e,t){return xt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return xt(this,"findLast",e,t,s=>mt(this,s),arguments)},findLastIndex(e,t){return xt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return xt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qn(this,"includes",e)},indexOf(...e){return Qn(this,"indexOf",e)},join(e){return us(this).join(e)},lastIndexOf(...e){return Qn(this,"lastIndexOf",e)},map(e,t){return xt(this,"map",e,t,void 0,arguments)},pop(){return Rs(this,"pop")},push(...e){return Rs(this,"push",e)},reduce(e,...t){return dr(this,"reduce",e,t)},reduceRight(e,...t){return dr(this,"reduceRight",e,t)},shift(){return Rs(this,"shift")},some(e,t){return xt(this,"some",e,t,void 0,arguments)},splice(...e){return Rs(this,"splice",e)},toReversed(){return us(this).toReversed()},toSorted(e){return us(this).toSorted(e)},toSpliced(...e){return us(this).toSpliced(...e)},unshift(...e){return Rs(this,"unshift",e)},values(){return Yn(this,"values",e=>mt(this,e))}};function Yn(e,t,s){const n=Nn(e),o=n[t]();return n!==e&&!Qe(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=s(r.value)),r}),o}const Ea=Array.prototype;function xt(e,t,s,n,o,r){const l=Nn(e),i=l!==e&&!Qe(e),a=l[t];if(a!==Ea[t]){const p=a.apply(e,r);return i?rt(p):p}let f=s;l!==e&&(i?f=function(p,g){return s.call(this,mt(e,p),g,e)}:s.length>2&&(f=function(p,g){return s.call(this,p,g,e)}));const u=a.call(l,f,n);return i&&o?o(u):u}function dr(e,t,s,n){const o=Nn(e),r=o!==e&&!Qe(e);let l=s,i=!1;o!==e&&(r?(i=n.length===0,l=function(f,u,p){return i&&(i=!1,f=mt(e,f)),s.call(this,f,mt(e,u),p,e)}):s.length>3&&(l=function(f,u,p){return s.call(this,f,u,p,e)}));const a=o[t](l,...n);return i?mt(e,a):a}function Qn(e,t,s){const n=ce(e);Ne(n,"iterate",qs);const o=n[t](...s);return(o===-1||o===!1)&&Vn(s[0])?(s[0]=ce(s[0]),n[t](...s)):o}function Rs(e,t,s=[]){At(),jo();const n=ce(e)[t].apply(e,s);return Do(),It(),n}const Ta=Lo("__proto__,__v_isRef,__isVue"),Ol=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ze));function Aa(e){Ze(e)||(e=String(e));const t=ce(this);return Ne(t,"has",e),t.hasOwnProperty(e)}class Ll{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,r=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return r;if(s==="__v_raw")return n===(o?r?ja:Dl:r?jl:Vl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const l=z(t);if(!o){let a;if(l&&(a=Sa[s]))return a;if(s==="hasOwnProperty")return Aa}const i=Reflect.get(t,s,Ee(t)?t:n);if((Ze(s)?Ol.has(s):Ta(s))||(o||Ne(t,"get",s),r))return i;if(Ee(i)){const a=l&&Rn(s)?i:i.value;return o&&ge(a)?vo(a):a}return ge(i)?o?vo(i):rs(i):i}}class Nl extends Ll{constructor(t=!1){super(!1,t)}set(t,s,n,o){let r=t[s];const l=z(t)&&Rn(s);if(!this._isShallow){const f=Rt(r);if(!Qe(n)&&!Rt(n)&&(r=ce(r),n=ce(n)),!l&&Ee(r)&&!Ee(n))return f||(r.value=n),!0}const i=l?Number(s)e,an=e=>Reflect.getPrototypeOf(e);function Ma(e,t,s){return function(...n){const o=this.__v_raw,r=ce(o),l=vs(r),i=e==="entries"||e===Symbol.iterator&&l,a=e==="keys"&&l,f=o[e](...n),u=s?go:t?ys:rt;return!t&&Ne(r,"iterate",a?mo:ts),Ie(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 cn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Oa(e,t){const s={get(o){const r=this.__v_raw,l=ce(r),i=ce(o);e||(vt(o,i)&&Ne(l,"get",o),Ne(l,"get",i));const{has:a}=an(l),f=t?go:e?ys:rt;if(a.call(l,o))return f(r.get(o));if(a.call(l,i))return f(r.get(i));r!==l&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Ne(ce(o),"iterate",ts),o.size},has(o){const r=this.__v_raw,l=ce(r),i=ce(o);return e||(vt(o,i)&&Ne(l,"has",o),Ne(l,"has",i)),o===i?r.has(o):r.has(o)||r.has(i)},forEach(o,r){const l=this,i=l.__v_raw,a=ce(i),f=t?go:e?ys:rt;return!e&&Ne(a,"iterate",ts),i.forEach((u,p)=>o.call(r,f(u),f(p),l))}};return Ie(s,e?{add:cn("add"),set:cn("set"),delete:cn("delete"),clear:cn("clear")}:{add(o){const r=ce(this),l=an(r),i=ce(o),a=!t&&!Qe(o)&&!Rt(o)?i:o;return l.has.call(r,a)||vt(o,a)&&l.has.call(r,o)||vt(i,a)&&l.has.call(r,i)||(r.add(a),Ct(r,"add",a,a)),this},set(o,r){!t&&!Qe(r)&&!Rt(r)&&(r=ce(r));const l=ce(this),{has:i,get:a}=an(l);let f=i.call(l,o);f||(o=ce(o),f=i.call(l,o));const u=a.call(l,o);return l.set(o,r),f?vt(r,u)&&Ct(l,"set",o,r):Ct(l,"add",o,r),this},delete(o){const r=ce(this),{has:l,get:i}=an(r);let a=l.call(r,o);a||(o=ce(o),a=l.call(r,o)),i&&i.call(r,o);const f=r.delete(o);return a&&Ct(r,"delete",o,void 0),f},clear(){const o=ce(this),r=o.size!==0,l=o.clear();return r&&Ct(o,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=Ma(o,e,t)}),s}function Uo(e,t){const s=Oa(e,t);return(n,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(me(s,o)&&o in n?s:n,o,r)}const La={get:Uo(!1,!1)},Na={get:Uo(!1,!0)},Va={get:Uo(!0,!1)};const Vl=new WeakMap,jl=new WeakMap,Dl=new WeakMap,ja=new WeakMap;function Da(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function rs(e){return Rt(e)?e:Ho(e,!1,Ra,La,Vl)}function Bl(e){return Ho(e,!1,Pa,Na,jl)}function vo(e){return Ho(e,!0,$a,Va,Dl)}function Ho(e,t,s,n,o){if(!ge(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const r=o.get(e);if(r)return r;const l=Da(ua(e));if(l===0)return e;const i=new Proxy(e,l===2?n:s);return o.set(e,i),i}function Et(e){return Rt(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function Rt(e){return!!(e&&e.__v_isReadonly)}function Qe(e){return!!(e&&e.__v_isShallow)}function Vn(e){return e?!!e.__v_raw:!1}function ce(e){const t=e&&e.__v_raw;return t?ce(t):e}function Wo(e){return!me(e,"__v_skip")&&Object.isExtensible(e)&&bl(e,"__v_skip",!0),e}const rt=e=>ge(e)?rs(e):e,ys=e=>ge(e)?vo(e):e;function Ee(e){return e?e.__v_isRef===!0:!1}function ue(e){return Fl(e,!1)}function Ba(e){return Fl(e,!0)}function Fl(e,t){return Ee(e)?e:new Fa(e,t)}class Fa{constructor(t,s){this.dep=new Fo,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:ce(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||Qe(t)||Rt(t);t=n?t:ce(t),vt(t,s)&&(this._rawValue=t,this._value=n?t:rt(t),this.dep.trigger())}}function O(e){return Ee(e)?e.value:e}const Ua={get:(e,t,s)=>t==="__v_raw"?e:O(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 Ul(e){return Et(e)?e:new Proxy(e,Ua)}function Ha(e){const t=z(e)?new Array(e.length):{};for(const s in e)t[s]=Ka(e,s);return t}class Wa{constructor(t,s,n){this._object=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=Ze(s)?s:String(s),this._raw=ce(t);let o=!0,r=t;if(!z(t)||Ze(this._key)||!Rn(this._key))do o=!Vn(r)||Qe(r);while(o&&(r=r.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=O(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 Ca(this._raw,this._key)}}function Ka(e,t,s){return new Wa(e,t,s)}class Ga{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Fo(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)&&ke!==this)return Al(this,!0),!0}get value(){const t=this.dep.track();return $l(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function qa(e,t,s=!1){let n,o;return se(e)?n=e:(n=e.get,o=e.set),new Ga(n,o,s)}const un={},gn=new WeakMap;let Qt;function za(e,t=!1,s=Qt){if(s){let n=gn.get(s);n||gn.set(s,n=[]),n.push(e)}}function Ja(e,t,s=xe){const{immediate:n,deep:o,once:r,scheduler:l,augmentJob:i,call:a}=s,f=y=>o?y:Qe(y)||o===!1||o===0?St(y,1):St(y);let u,p,g,d,T=!1,I=!1;if(Ee(e)?(p=()=>e.value,T=Qe(e)):Et(e)?(p=()=>f(e),T=!0):z(e)?(I=!0,T=e.some(y=>Et(y)||Qe(y)),p=()=>e.map(y=>{if(Ee(y))return y.value;if(Et(y))return f(y);if(se(y))return a?a(y,2):y()})):se(e)?t?p=a?()=>a(e,2):e:p=()=>{if(g){At();try{g()}finally{It()}}const y=Qt;Qt=u;try{return a?a(e,3,[d]):e(d)}finally{Qt=y}}:p=bt,t&&o){const y=p,w=o===!0?1/0:o;p=()=>St(y(),w)}const L=Sl(),$=()=>{u.stop(),L&&L.active&&No(L.effects,u)};if(r&&t){const y=t;t=(...w)=>{const Q=y(...w);return $(),Q}}let m=I?new Array(e.length).fill(un):un;const _=y=>{if(!(!(u.flags&1)||!u.dirty&&!y))if(t){const w=u.run();if(y||o||T||(I?w.some((Q,D)=>vt(Q,m[D])):vt(w,m))){g&&g();const Q=Qt;Qt=u;try{const D=[w,m===un?void 0:I&&m[0]===un?[]:m,d];m=w,a?a(t,3,D):t(...D)}finally{Qt=Q}}}else u.run()};return i&&i(_),u=new El(p),u.scheduler=l?()=>l(_,!1):_,d=y=>za(y,!1,u),g=u.onStop=()=>{const y=gn.get(u);if(y){if(a)a(y,4);else for(const w of y)w();gn.delete(u)}},t?n?_(!0):m=u.run():l?l(_.bind(null,!0),!0):u.run(),$.pause=u.pause.bind(u),$.resume=u.resume.bind(u),$.stop=$,$}function St(e,t=1/0,s){if(t<=0||!ge(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ee(e))St(e.value,t,s);else if(z(e))for(let n=0;n{St(n,t,s)});else if(_l(e)){for(const n in e)St(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&St(e[n],t,s)}return e}function nn(e,t,s,n){try{return n?e(...n):e()}catch(o){jn(o,t,s)}}function st(e,t,s,n){if(se(e)){const o=nn(e,t,s,n);return o&&gl(o)&&o.catch(r=>{jn(r,t,s)}),o}if(z(e)){const o=[];for(let r=0;r>>1,o=We[n],r=zs(o);r=zs(s)?We.push(e):We.splice(Qa(t),0,e),e.flags|=1,Wl()}}function Wl(){vn||(vn=Hl.then(Gl))}function Za(e){if(!z(e))Dt&&e.id===-1?Dt.splice(hs+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,Dt){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function Gl(e){try{for(ht=0;ht{n._d&&wn(-1);const r=_n(t),l=Tt.length;let i;try{i=e(...o)}finally{for(let a=Tt.length;a>l;a--)Qo();_n(r),n._d&&wn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function _e(e,t){if(Le===null)return e;const s=Wn(Le),n=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&se(t)?t.call(n&&n.proxy):t}}function Xa(){return!!(on()||ss)}const ec=Symbol.for("v-scx"),tc=()=>ot(ec);function Ge(e,t,s){return zl(e,t,s)}function zl(e,t,s=xe){const{immediate:n,deep:o,flush:r,once:l}=s,i=Ie({},s),a=t&&n||!t&&r!=="post";let f;if(Xs){if(r==="sync"){const d=tc();f=d.__watcherHandles||(d.__watcherHandles=[])}else if(!a){const d=()=>{};return d.stop=bt,d.resume=bt,d.pause=bt,d}}const u=je;i.call=(d,T,I)=>st(d,u,T,I);let p=!1;r==="post"?i.scheduler=d=>{Ue(d,u&&u.suspense)}:r!=="sync"&&(p=!0,i.scheduler=(d,T)=>{T?d():Ko(d)}),i.augmentJob=d=>{t&&(d.flags|=4),p&&(d.flags|=2,u&&(d.id=u.uid,d.i=u))};const g=Ja(e,t,i);return Xs&&(f?f.push(g):a&&g()),g}function sc(e,t,s){const n=this.proxy,o=we(e)?e.includes(".")?Jl(n,e):()=>n[e]:e.bind(n,n);let r;se(t)?r=t:(r=t.handler,s=t);const l=rn(this),i=zl(o,r.bind(n),s);return l(),i}function Jl(e,t){const s=t.split(".");return()=>{let n=e;for(let o=0;oe.__isTeleport,Zt=e=>e&&(e.disabled||e.disabled===""),nc=e=>e&&(e.defer||e.defer===""),hr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,mr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_o=(e,t)=>{const s=e&&e.to;return we(s)?t?t(s):null:s},oc={name:"Teleport",__isTeleport:!0,process(e,t,s,n,o,r,l,i,a,f){const{mc:u,pc:p,pbc:g,o:{insert:d,querySelector:T,createText:I,createComment:L,parentNode:$}}=f,m=Zt(t.props);let{dynamicChildren:_}=t;const y=(D,U,M)=>{D.shapeFlag&16&&u(D.children,U,M,o,r,l,i,a)},w=(D=t)=>{const U=Zt(D.props),M=D.target=_o(D.props,T),q=bo(M,D,I,d);M&&(l!=="svg"&&hr(M)?l="svg":l!=="mathml"&&mr(M)&&(l="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),U||(y(D,M,q),Ls(D,!1)))},Q=D=>{const U=()=>{if(Nt.get(D)===U){if(Nt.delete(D),Zt(D.props)){const M=$(D.el)||s;y(D,M,D.anchor),Ls(D,!0)}w(D)}};Nt.set(D,U),Ue(U,r)};if(e==null){const D=t.el=I(""),U=t.anchor=I("");if(d(D,s,n),d(U,s,n),nc(t.props)||r&&r.pendingBranch){Q(t);return}m&&(y(t,s,U),Ls(t,!0)),w()}else{t.el=e.el;const D=t.anchor=e.anchor,U=Nt.get(e);if(U){U.flags|=8,Nt.delete(e),Q(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,q=t.targetAnchor=e.targetAnchor,te=Zt(e.props),x=te?s:M,N=te?D:q;if(l==="svg"||hr(M)?l="svg":(l==="mathml"||mr(M))&&(l="mathml"),_?(g(e.dynamicChildren,_,x,o,r,l,i),Yo(e,t,!0)):a||p(e,t,x,N,o,r,l,i,!1),m)te?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):fn(t,s,D,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const ie=_o(t.props,T);ie&&(t.target=ie,fn(t,ie,null,f,0))}else te&&fn(t,M,q,f,1);Ls(t,m)}},remove(e,t,s,{um:n,o:{remove:o}},r){const{shapeFlag:l,children:i,anchor:a,targetStart:f,targetAnchor:u,target:p,props:g}=e,d=Zt(g),T=r||!d,I=Nt.get(e);if(I&&(I.flags|=8,Nt.delete(e)),p&&(o(f),o(u)),r&&o(a),!I&&(d||p)&&l&16)for(let L=0;L{e.isMounted=!0}),li(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],Zl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},Xl=e=>{const t=e.subTree;return t.component?Xl(t.component):t},lc={name:"BaseTransition",props:Zl,setup(e,{slots:t}){const s=on(),n=Ql();return()=>{const o=t.default&&qo(t.default(),!0),r=o&&o.length?ei(o):s.subTree?fe():void 0;if(!r)return;const l=ce(e),{mode:i}=l;if(n.isLeaving)return Zn(r);const a=bn(r);if(!a)return Zn(r);let f=Js(a,l,n,s,p=>f=p);a.type!==Ve&&ns(a,f);let u=s.subTree&&bn(s.subTree);if(u&&u.type!==Ve&&!Xt(u,a)&&Xl(s).type!==Ve){let p=Js(u,l,n,s);if(ns(u,p),i==="out-in"&&a.type!==Ve)return n.isLeaving=!0,p.afterLeave=()=>{n.isLeaving=!1,s.job.flags&8||s.update(),delete p.afterLeave,u=void 0},Zn(r);i==="in-out"&&a.type!==Ve?p.delayLeave=(g,d,T)=>{const I=ti(n,u);I[String(u.key)]=u,g[tt]=()=>{d(),g[tt]=void 0,delete f.delayedLeave,u=void 0},f.delayedLeave=()=>{T(),delete f.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return r}}};function ei(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==Ve){t=s;break}}return t}const ic=lc;function ti(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 Js(e,t,s,n,o){const{appear:r,mode:l,persisted:i=!1,onBeforeEnter:a,onEnter:f,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:g,onLeave:d,onAfterLeave:T,onLeaveCancelled:I,onBeforeAppear:L,onAppear:$,onAfterAppear:m,onAppearCancelled:_}=t,y=String(e.key),w=ti(s,e),Q=(M,q)=>{M&&st(M,n,9,q)},D=(M,q)=>{const te=q[1];Q(M,q),z(M)?M.every(x=>x.length<=1)&&te():M.length<=1&&te()},U={mode:l,persisted:i,beforeEnter(M){let q=a;if(!s.isMounted)if(r)q=L||a;else return;M[tt]&&M[tt](!0);const te=w[y];te&&Xt(e,te)&&te.el[tt]&&te.el[tt](),Q(q,[M])},enter(M){if(w[y]===e)return;let q=f,te=u,x=p;if(!s.isMounted)if(r)q=$||f,te=m||u,x=_||p;else return;let N=!1;M[$s]=Pe=>{N||(N=!0,Pe?Q(x,[M]):Q(te,[M]),U.delayedLeave&&U.delayedLeave(),M[$s]=void 0)};const ie=M[$s].bind(null,!1);q?D(q,[M,ie]):ie()},leave(M,q){const te=String(e.key);if(M[$s]&&M[$s](!0),s.isUnmounting)return q();Q(g,[M]);let x=!1;M[tt]=ie=>{x||(x=!0,q(),ie?Q(I,[M]):Q(T,[M]),M[tt]=void 0,w[te]===e&&delete w[te])};const N=M[tt].bind(null,!1);w[te]=e,d?D(d,[M,N]):N()},clone(M){const q=Js(M,t,s,n,o);return o&&o(q),q}};return U}function Zn(e){if(Bn(e))return e=Ut(e),e.children=null,e}function bn(e){if(!Bn(e))return Dn(e.type)&&e.children?ei(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&&se(s.default))return s.default()}}function ns(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;ns(Dn(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 qo(e,t=!1,s){let n=[],o=0;for(let r=0;r1)for(let r=0;rUs(I,t&&(z(t)?t[L]:t),s,n,o));return}if(bs(n)&&!o){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Us(e,t,s,n.component.subTree);return}const r=n.shapeFlag&4?Wn(n.component):n.el,l=o?null:r,{i,r:a}=e,f=t&&t.r,u=i.refs===xe?i.refs={}:i.refs,p=i.setupState,g=ce(p),d=p===xe?ml:I=>gr(u,I)?!1:me(g,I),T=(I,L)=>!(L&&gr(u,L));if(f!=null&&f!==a){if(vr(t),we(f))u[f]=null,d(f)&&(p[f]=null);else if(Ee(f)){const I=t;T(f,I.k)&&(f.value=null),I.k&&(u[I.k]=null)}}if(se(a))nn(a,i,12,[l,u]);else{const I=we(a),L=Ee(a);if(I||L){const $=()=>{if(e.f){const m=I?d(a)?p[a]:u[a]:T()||!e.k?a.value:u[e.k];if(o)z(m)&&No(m,r);else if(z(m))m.includes(r)||m.push(r);else if(I)u[a]=[r],d(a)&&(p[a]=u[a]);else{const _=[r];T(a,e.k)&&(a.value=_),e.k&&(u[e.k]=_)}}else I?(u[a]=l,d(a)&&(p[a]=l)):L&&(T(a,e.k)&&(a.value=l),e.k&&(u[e.k]=l))};if(l){const m=()=>{$(),xn.delete(e)};m.id=-1,xn.set(e,m),Ue(m,s)}else vr(e),$()}}}function vr(e){const t=xn.get(e);t&&(t.flags|=8,xn.delete(e))}On().requestIdleCallback;On().cancelIdleCallback;const bs=e=>!!e.type.__asyncLoader,Bn=e=>e.type.__isKeepAlive;function ac(e,t){oi(e,"a",t)}function cc(e,t){oi(e,"da",t)}function oi(e,t,s=je){const n=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Fn(t,n,s),s){let o=s.parent;for(;o&&o.parent;)Bn(o.parent.vnode)&&uc(n,t,s,o),o=o.parent}}function uc(e,t,s,n){const o=Fn(t,e,n,!0);As(()=>{No(n[t],o)},s)}function Fn(e,t,s=je,n=!1){if(s){const o=s[e]||(s[e]=[]),r=t.__weh||(t.__weh=(...l)=>{At();const i=rn(s),a=st(t,s,e,l);return i(),It(),a});return n?o.unshift(r):o.push(r),r}}const Pt=e=>(t,s=je)=>{(!Xs||e==="sp")&&Fn(e,(...n)=>t(...n),s)},fc=Pt("bm"),ls=Pt("m"),dc=Pt("bu"),ri=Pt("u"),li=Pt("bum"),As=Pt("um"),pc=Pt("sp"),hc=Pt("rtg"),mc=Pt("rtc");function gc(e,t=je){Fn("ec",e,t)}const ii="components";function yn(e,t){return ci(ii,e,!0,t)||e}const ai=Symbol.for("v-ndc");function vc(e){return we(e)?ci(ii,e,!1)||e:e||ai}function ci(e,t,s=!0,n=!1){const o=Le||je;if(o){const r=o.type;{const i=eu(r,!1);if(i&&(i===t||i===Ke(t)||i===Pn(Ke(t))))return r}const l=_r(o[e]||r[e],t)||_r(o.appContext[e],t);return!l&&n?r:l}}function _r(e,t){return e&&(e[t]||e[Ke(t)]||e[Pn(Ke(t))])}function Ce(e,t,s,n){let o;const r=s,l=z(e);if(l||we(e)){const i=l&&Et(e);let a=!1,f=!1;i&&(a=!Qe(e),f=Rt(e),e=Nn(e)),o=new Array(e.length);for(let u=0,p=e.length;ut(i,a,void 0,r));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,f=i.length;a0;return t!=="default"&&(f.name=t),k(),De(re,null,[le("slot",f,n)],u?-2:64)}let l=e[t];l&&l._c&&(l._d=!1);const i=Tt.length;k();let a;try{const f=l&&ui(l(s)),u=s.key||r||f&&f.key;a=De(re,{key:(u&&!Ze(u)?u:`_${t}`)+(!f&&n?"_fb":"")},f||(n?n():[]),f&&e._===1?64:-2)}catch(f){for(let u=Tt.length;u>i;u--)Qo();throw f}finally{l&&l._c&&(l._d=!0)}return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),a}function ui(e){return e.some(t=>Qs(t)?!(t.type===Ve||t.type===re&&!ui(t.children)):!0)?e:null}const xo=e=>e?Ii(e)?Wn(e):xo(e.parent):null,Hs=Ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>xo(e.parent),$root:e=>xo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>di(e),$forceUpdate:e=>e.f||(e.f=()=>{Ko(e.update)}),$nextTick:e=>e.n||(e.n=$t.bind(e.proxy)),$watch:e=>sc.bind(e)}),eo=(e,t)=>e!==xe&&!e.__isScriptSetup&&me(e,t),_c={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:o,props:r,accessCache:l,type:i,appContext:a}=e;if(t[0]!=="$"){const g=l[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 r[t]}else{if(eo(n,t))return l[t]=1,n[t];if(o!==xe&&me(o,t))return l[t]=2,o[t];if(me(r,t))return l[t]=3,r[t];if(s!==xe&&me(s,t))return l[t]=4,s[t];yo&&(l[t]=0)}}const f=Hs[t];let u,p;if(f)return t==="$attrs"&&Ne(e.attrs,"get",""),f(e);if((u=i.__cssModules)&&(u=u[t]))return u;if(s!==xe&&me(s,t))return l[t]=4,s[t];if(p=a.config.globalProperties,me(p,t))return p[t]},set({_:e},t,s){const{data:n,setupState:o,ctx:r}=e;return eo(o,t)?(o[t]=s,!0):n!==xe&&me(n,t)?(n[t]=s,!0):me(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:o,props:r,type:l}},i){let a;return!!(s[i]||e!==xe&&i[0]!=="$"&&me(e,i)||eo(t,i)||me(r,i)||me(n,i)||me(Hs,i)||me(o.config.globalProperties,i)||(a=l.__cssModules)&&a[i])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:me(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function br(e){return z(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let yo=!0;function bc(e){const t=di(e),s=e.proxy,n=e.ctx;yo=!1,t.beforeCreate&&xr(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:l,watch:i,provide:a,inject:f,created:u,beforeMount:p,mounted:g,beforeUpdate:d,updated:T,activated:I,deactivated:L,beforeDestroy:$,beforeUnmount:m,destroyed:_,unmounted:y,render:w,renderTracked:Q,renderTriggered:D,errorCaptured:U,serverPrefetch:M,expose:q,inheritAttrs:te,components:x,directives:N,filters:ie}=t;if(f&&xc(f,n,null),l)for(const X in l){const ne=l[X];se(ne)&&(n[X]=ne.bind(s))}if(o){const X=o.call(s,s);ge(X)&&(e.data=rs(X))}if(yo=!0,r)for(const X in r){const ne=r[X],Be=se(ne)?ne.bind(s,s):se(ne.get)?ne.get.bind(s,s):bt,qe=!se(ne)&&se(ne.set)?ne.set.bind(s):bt,at=ye({get:Be,set:qe});Object.defineProperty(n,X,{enumerable:!0,configurable:!0,get:()=>at.value,set:ze=>at.value=ze})}if(i)for(const X in i)fi(i[X],n,s,X);if(a){const X=se(a)?a.call(s):a;Reflect.ownKeys(X).forEach(ne=>{Fs(ne,X[ne])})}u&&xr(u,e,"c");function pe(X,ne){z(ne)?ne.forEach(Be=>X(Be.bind(s))):ne&&X(ne.bind(s))}if(pe(fc,p),pe(ls,g),pe(dc,d),pe(ri,T),pe(ac,I),pe(cc,L),pe(gc,U),pe(mc,Q),pe(hc,D),pe(li,m),pe(As,y),pe(pc,M),z(q))if(q.length){const X=e.exposed||(e.exposed={});q.forEach(ne=>{Object.defineProperty(X,ne,{get:()=>s[ne],set:Be=>s[ne]=Be,enumerable:!0})})}else e.exposed||(e.exposed={});w&&e.render===bt&&(e.render=w),te!=null&&(e.inheritAttrs=te),x&&(e.components=x),N&&(e.directives=N),M&&ni(e)}function xc(e,t,s=bt){z(e)&&(e=ko(e));for(const n in e){const o=e[n];let r;ge(o)?"default"in o?r=ot(o.from||n,o.default,!0):r=ot(o.from||n):r=ot(o),Ee(r)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[n]=r}}function xr(e,t,s){st(z(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function fi(e,t,s,n){let o=n.includes(".")?Jl(s,n):()=>s[n];if(we(e)){const r=t[e];se(r)&&Ge(o,r)}else if(se(e))Ge(o,e.bind(s));else if(ge(e))if(z(e))e.forEach(r=>fi(r,t,s,n));else{const r=se(e.handler)?e.handler.bind(s):t[e.handler];se(r)&&Ge(o,r,e)}}function di(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:l}}=e.appContext,i=r.get(t);let a;return i?a=i:!o.length&&!s&&!n?a=t:(a={},o.length&&o.forEach(f=>kn(a,f,l,!0)),kn(a,t,l)),ge(t)&&r.set(t,a),a}function kn(e,t,s,n=!1){const{mixins:o,extends:r}=t;r&&kn(e,r,s,!0),o&&o.forEach(l=>kn(e,l,s,!0));for(const l in t)if(!(n&&l==="expose")){const i=yc[l]||s&&s[l];e[l]=i?i(e[l],t[l]):t[l]}return e}const yc={data:yr,props:kr,emits:kr,methods:Ns,computed:Ns,beforeCreate:Fe,created:Fe,beforeMount:Fe,mounted:Fe,beforeUpdate:Fe,updated:Fe,beforeDestroy:Fe,beforeUnmount:Fe,destroyed:Fe,unmounted:Fe,activated:Fe,deactivated:Fe,errorCaptured:Fe,serverPrefetch:Fe,components:Ns,directives:Ns,watch:wc,provide:yr,inject:kc};function yr(e,t){return t?e?function(){return Ie(se(e)?e.call(this,this):e,se(t)?t.call(this,this):t)}:t:e}function kc(e,t){return Ns(ko(e),ko(t))}function ko(e){if(z(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ke(t)}Modifiers`]||e[`${os(t)}Modifiers`];function Tc(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||xe;let o=s;const r=t.startsWith("update:"),l=r&&Ec(n,t.slice(7));l&&(l.trim&&(o=s.map(u=>we(u)?u.trim():u)),l.number&&(o=s.map(Mn)));let i,a=n[i=qn(t)]||n[i=qn(Ke(t))];!a&&r&&(a=n[i=qn(os(t))]),a&&st(a,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,st(f,e,6,o)}}const Ac=new WeakMap;function hi(e,t,s=!1){const n=s?Ac:t.emitsCache,o=n.get(e);if(o!==void 0)return o;const r=e.emits;let l={},i=!1;if(!se(e)){const a=f=>{const u=hi(f,t,!0);u&&(i=!0,Ie(l,u))};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!i?(ge(e)&&n.set(e,null),null):(z(r)?r.forEach(a=>l[a]=null):Ie(l,r),ge(e)&&n.set(e,l),l)}function Un(e,t){return!e||!An(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),me(e,t[0].toLowerCase()+t.slice(1))||me(e,os(t))||me(e,t))}function wr(e){const{type:t,vnode:s,proxy:n,withProxy:o,propsOptions:[r],slots:l,attrs:i,emit:a,render:f,renderCache:u,props:p,data:g,setupState:d,ctx:T,inheritAttrs:I}=e,L=_n(e);let $,m;try{if(s.shapeFlag&4){const y=o||n,w=y;$=gt(f.call(w,y,u,p,d,g,T)),m=i}else{const y=t;$=gt(y.length>1?y(p,{attrs:i,slots:l,emit:a}):y(p,null)),m=t.props?i:Ic(i)}}catch(y){Tt.length=0,jn(y,e,1),$=le(Ve)}let _=$;if(m&&I!==!1){const y=Object.keys(m),{shapeFlag:w}=_;y.length&&w&7&&(r&&y.some(In)&&(m=Rc(m,r)),_=Ut(_,m,!1,!0))}if(s.dirs&&(_=Ut(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(s.dirs):s.dirs),s.transition){const y=Dn(_.type)&&bn(_)||_;ns(y,s.transition)}return $=_,_n(L),$}const Ic=e=>{let t;for(const s in e)(s==="class"||s==="style"||An(s))&&((t||(t={}))[s]=e[s]);return t},Rc=(e,t)=>{const s={};for(const n in e)(!In(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function $c(e,t,s){const{props:n,children:o,component:r}=e,{props:l,children:i,patchFlag:a}=t,f=r.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&a>=0){if(a&1024)return!0;if(a&16)return n?Cr(n,l,f):!!l;if(a&8){const u=t.dynamicProps;for(let p=0;pObject.create(gi),_i=e=>Object.getPrototypeOf(e)===gi;function Mc(e,t,s,n=!1){const o={},r=vi();e.propsDefaults=Object.create(null),bi(e,t,o,r);for(const l in e.propsOptions[0])l in o||(o[l]=void 0);s?e.props=n?o:Bl(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function Oc(e,t,s,n){const{props:o,attrs:r,vnode:{patchFlag:l}}=e,i=ce(o),[a]=e.propsOptions;let f=!1;if((n||l>0)&&!(l&16)){if(l&8){const u=e.vnode.dynamicProps;for(let p=0;p{a=!0;const[g,d]=xi(p,t,!0);Ie(l,g),d&&i.push(...d)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!r&&!a)return ge(e)&&n.set(e,gs),gs;if(z(r))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Jo=e=>z(e)?e.map(gt):[gt(e)],Nc=(e,t,s)=>{if(t._n)return t;const n=Te((...o)=>Jo(t(...o)),s);return n._c=!1,n},yi=(e,t,s)=>{const n=e._ctx;for(const o in e){if(zo(o))continue;const r=e[o];if(se(r))t[o]=Nc(o,r,n);else if(r!=null){const l=Jo(r);t[o]=()=>l}}},ki=(e,t)=>{const s=Jo(t);e.slots.default=()=>s},wi=(e,t,s)=>{for(const n in t)(s||!zo(n))&&(e[n]=t[n])},Vc=(e,t,s)=>{const n=e.slots=vi();if(e.vnode.shapeFlag&32){const o=t._;o?(wi(n,t,s),s&&bl(n,"_",o,!0)):yi(t,n)}else t&&ki(e,t)},jc=(e,t,s)=>{const{vnode:n,slots:o}=e;let r=!0,l=xe;if(n.shapeFlag&32){const i=t._;i?s&&i===1?r=!1:wi(o,t,s):(r=!t.$stable,yi(t,o)),l=t}else t&&(ki(e,t),l={default:1});if(r)for(const i in o)!zo(i)&&l[i]==null&&delete o[i]},Ue=Hc;function Dc(e){return Bc(e)}function Bc(e,t){const s=On();s.__VUE__=!0;const{insert:n,remove:o,patchProp:r,createElement:l,createText:i,createComment:a,setText:f,setElementText:u,parentNode:p,nextSibling:g,setScopeId:d=bt,insertStaticContent:T}=e,I=(h,v,b,S=null,R=null,C=null,B=void 0,j=null,V=!!v.dynamicChildren)=>{if(h===v)return;h&&!Xt(h,v)&&(S=A(h),ze(h,R,C,!0),h=null),v.patchFlag===-2&&(V=!1,v.dynamicChildren=null);const{type:P,ref:Z,shapeFlag:W}=v;switch(P){case Hn:L(h,v,b,S);break;case Ve:$(h,v,b,S);break;case so:h==null&&m(v,b,S,B);break;case re:x(h,v,b,S,R,C,B,j,V);break;default:W&1?w(h,v,b,S,R,C,B,j,V):W&6?N(h,v,b,S,R,C,B,j,V):(W&64||W&128)&&P.process(h,v,b,S,R,C,B,j,V,J)}Z!=null&&R?Us(Z,h&&h.ref,C,v||h,!v):Z==null&&h&&h.ref!=null&&Us(h.ref,null,C,h,!0)},L=(h,v,b,S)=>{if(h==null)n(v.el=i(v.children),b,S);else{const R=v.el=h.el;v.children!==h.children&&f(R,v.children)}},$=(h,v,b,S)=>{h==null?n(v.el=a(v.children||""),b,S):v.el=h.el},m=(h,v,b,S)=>{[h.el,h.anchor]=T(h.children,v,b,S,h.el,h.anchor)},_=({el:h,anchor:v},b,S)=>{let R;for(;h&&h!==v;)R=g(h),n(h,b,S),h=R;n(v,b,S)},y=({el:h,anchor:v})=>{let b;for(;h&&h!==v;)b=g(h),o(h),h=b;o(v)},w=(h,v,b,S,R,C,B,j,V)=>{if(v.type==="svg"?B="svg":v.type==="math"&&(B="mathml"),h==null)Q(v,b,S,R,C,B,j,V);else{const P=h.el&&h.el._isVueCE?h.el:null;try{P&&P._beginPatch(),M(h,v,R,C,B,j,V)}finally{P&&P._endPatch()}}},Q=(h,v,b,S,R,C,B,j)=>{let V,P;const{props:Z,shapeFlag:W,transition:Y,dirs:ee}=h;if(V=h.el=l(h.type,C,Z&&Z.is,Z),W&8?u(V,h.children):W&16&&U(h.children,V,null,S,R,to(h,C),B,j),ee&&Kt(h,null,S,"created"),D(V,h,h.scopeId,B,S),Z){for(const be in Z)be!=="value"&&!js(be)&&r(V,be,null,Z[be],C,S);"value"in Z&&r(V,"value",null,Z.value,C),(P=Z.onVnodeBeforeMount)&&dt(P,S,h)}ee&&Kt(h,null,S,"beforeMount");const de=Fc(R,Y);de&&Y.beforeEnter(V),n(V,v,b),((P=Z&&Z.onVnodeMounted)||de||ee)&&Ue(()=>{P&&dt(P,S,h),de&&Y.enter(V),ee&&Kt(h,null,S,"mounted")},R)},D=(h,v,b,S,R)=>{if(b&&d(h,b),S)for(let C=0;C{for(let P=V;P{const j=v.el=h.el;let{patchFlag:V,dynamicChildren:P,dirs:Z}=v;V|=h.patchFlag&16;const W=h.props||xe,Y=v.props||xe;let ee;if(b&&Gt(b,!1),(ee=Y.onVnodeBeforeUpdate)&&dt(ee,b,v,h),Z&&Kt(v,h,b,"beforeUpdate"),b&&Gt(b,!0),P&&(!h.dynamicChildren||h.dynamicChildren.length!==P.length)&&(V=0,B=!1,P=null),(W.innerHTML&&Y.innerHTML==null||W.textContent&&Y.textContent==null)&&u(j,""),P?q(h.dynamicChildren,P,j,b,S,to(v,R),C):B||ne(h,v,j,null,b,S,to(v,R),C,!1),V>0){if(V&16)te(j,W,Y,b,R);else if(V&2&&W.class!==Y.class&&r(j,"class",null,Y.class,R),V&4&&r(j,"style",W.style,Y.style,R),V&8){const de=v.dynamicProps;for(let be=0;be{ee&&dt(ee,b,v,h),Z&&Kt(v,h,b,"updated")},S)},q=(h,v,b,S,R,C,B)=>{for(let j=0;j{if(v!==b){if(v!==xe)for(const C in v)!js(C)&&!(C in b)&&r(h,C,v[C],null,R,S);for(const C in b){if(js(C))continue;const B=b[C],j=v[C];B!==j&&C!=="value"&&r(h,C,j,B,R,S)}"value"in b&&r(h,"value",v.value,b.value,R)}},x=(h,v,b,S,R,C,B,j,V)=>{const P=v.el=h?h.el:i(""),Z=v.anchor=h?h.anchor:i("");let{patchFlag:W,dynamicChildren:Y,slotScopeIds:ee}=v;ee&&(j=j?j.concat(ee):ee),h==null?(n(P,b,S),n(Z,b,S),U(v.children||[],b,Z,R,C,B,j,V)):W>0&&W&64&&Y&&h.dynamicChildren&&h.dynamicChildren.length===Y.length?(q(h.dynamicChildren,Y,b,R,C,B,j),(v.key!=null||R&&v===R.subTree)&&Yo(h,v,!0)):ne(h,v,b,Z,R,C,B,j,V)},N=(h,v,b,S,R,C,B,j,V)=>{v.slotScopeIds=j,h==null?v.shapeFlag&512?R.ctx.activate(v,b,S,B,V):ie(v,b,S,R,C,B,V):Pe(h,v,V)},ie=(h,v,b,S,R,C,B)=>{const j=h.component=Jc(h,S,R);if(Bn(h)&&(j.ctx.renderer=J),Yc(j,!1,B),j.asyncDep){if(R&&R.registerDep(j,pe,B),!h.el){const V=j.subTree=le(Ve);$(null,V,v,b),h.placeholder=V.el}}else pe(j,h,v,b,R,C,B)},Pe=(h,v,b)=>{const S=v.component=h.component;if($c(h,v,b))if(S.asyncDep&&!S.asyncResolved){X(S,v,b);return}else S.next=v,S.update();else v.el=h.el,S.vnode=v},pe=(h,v,b,S,R,C,B)=>{const j=()=>{if(h.isMounted){let{next:W,bu:Y,u:ee,parent:de,vnode:be}=h;{const ut=Ci(h);if(ut){W&&(W.el=be.el,X(h,W,B)),ut.asyncDep.then(()=>{Ue(()=>{h.isUnmounted||P()},R)});return}}let ve=W,Ae;Gt(h,!1),W?(W.el=be.el,X(h,W,B)):W=be,Y&&pn(Y),(Ae=W.props&&W.props.onVnodeBeforeUpdate)&&dt(Ae,de,W,be),Gt(h,!0);const Me=wr(h),ct=h.subTree;h.subTree=Me,I(ct,Me,p(ct.el),A(ct),h,R,C),W.el=Me.el,ve===null&&Pc(h,Me.el),ee&&Ue(ee,R),(Ae=W.props&&W.props.onVnodeUpdated)&&Ue(()=>dt(Ae,de,W,be),R)}else{let W;const{el:Y,props:ee}=v,{bm:de,m:be,parent:ve,root:Ae,type:Me}=h,ct=bs(v);Gt(h,!1),de&&pn(de),!ct&&(W=ee&&ee.onVnodeBeforeMount)&&dt(W,ve,v),Gt(h,!0);{Ae.ce&&Ae.ce._hasShadowRoot()&&Ae.ce._injectChildStyle(Me,h.parent?h.parent.type:void 0);const ut=h.subTree=wr(h);I(null,ut,b,S,h,R,C),v.el=ut.el}if(be&&Ue(be,R),!ct&&(W=ee&&ee.onVnodeMounted)){const ut=v;Ue(()=>dt(W,ve,ut),R)}(v.shapeFlag&256||ve&&bs(ve.vnode)&&ve.vnode.shapeFlag&256)&&h.a&&Ue(h.a,R),h.isMounted=!0,v=b=S=null}};h.scope.on();const V=h.effect=new El(j);h.scope.off();const P=h.update=V.run.bind(V),Z=h.job=V.runIfDirty.bind(V);Z.i=h,Z.id=h.uid,V.scheduler=()=>Ko(Z),Gt(h,!0),P()},X=(h,v,b)=>{v.component=h;const S=h.vnode.props;h.vnode=v,h.next=null,Oc(h,v.props,S,b),jc(h,v.children,b),At(),pr(h),It()},ne=(h,v,b,S,R,C,B,j,V=!1)=>{const P=h&&h.children,Z=h?h.shapeFlag:0,W=v.children,{patchFlag:Y,shapeFlag:ee}=v;if(Y>0){if(Y&128){qe(P,W,b,S,R,C,B,j,V);return}else if(Y&256){Be(P,W,b,S,R,C,B,j,V);return}}ee&8?(Z&16&&Xe(P,R,C),W!==P&&u(b,W)):Z&16?ee&16?qe(P,W,b,S,R,C,B,j,V):Xe(P,R,C,!0):(Z&8&&u(b,""),ee&16&&U(W,b,S,R,C,B,j,V))},Be=(h,v,b,S,R,C,B,j,V)=>{h=h||gs,v=v||gs;const P=h.length,Z=v.length,W=Math.min(P,Z);let Y;for(Y=0;YZ?Xe(h,R,C,!0,!1,W):U(v,b,S,R,C,B,j,V,W)},qe=(h,v,b,S,R,C,B,j,V)=>{let P=0;const Z=v.length;let W=h.length-1,Y=Z-1;for(;P<=W&&P<=Y;){const ee=h[P],de=v[P]=V?wt(v[P]):gt(v[P]);if(Xt(ee,de))I(ee,de,b,null,R,C,B,j,V);else break;P++}for(;P<=W&&P<=Y;){const ee=h[W],de=v[Y]=V?wt(v[Y]):gt(v[Y]);if(Xt(ee,de))I(ee,de,b,null,R,C,B,j,V);else break;W--,Y--}if(P>W){if(P<=Y){const ee=Y+1,de=eeY)for(;P<=W;)ze(h[P],R,C,!0),P++;else{const ee=P,de=P,be=new Map;for(P=de;P<=Y;P++){const Je=v[P]=V?wt(v[P]):gt(v[P]);Je.key!=null&&be.set(Je.key,P)}let ve,Ae=0;const Me=Y-de+1;let ct=!1,ut=0;const Is=new Array(Me);for(P=0;P=Me){ze(Je,R,C,!0);continue}let ft;if(Je.key!=null)ft=be.get(Je.key);else for(ve=de;ve<=Y;ve++)if(Is[ve-de]===0&&Xt(Je,v[ve])){ft=ve;break}ft===void 0?ze(Je,R,C,!0):(Is[ft-de]=P+1,ft>=ut?ut=ft:ct=!0,I(Je,v[ft],b,null,R,C,B,j,V),Ae++)}const lr=ct?Uc(Is):gs;for(ve=lr.length-1,P=Me-1;P>=0;P--){const Je=de+P,ft=v[Je],ir=v[Je+1],ar=Je+1{const{el:C,type:B,transition:j,children:V,shapeFlag:P}=h;if(P&6){at(h.component.subTree,v,b,S);return}if(P&128){h.suspense.move(v,b,S);return}if(P&64){B.move(h,v,b,J);return}if(B===re){n(C,v,b);for(let W=0;Wj.enter(C),R));else{const{leave:W,delayLeave:Y,afterLeave:ee}=j,de=()=>{h.ctx.isUnmounted?o(C):n(C,v,b)},be=()=>{const ve=C._isLeaving||!!C[tt];C._isLeaving&&C[tt](!0),j.persisted&&!ve?de():W(C,()=>{de(),ee&&ee()})};Y?Y(C,de,be):be()}else n(C,v,b)},ze=(h,v,b,S=!1,R=!1)=>{const{type:C,props:B,ref:j,children:V,dynamicChildren:P,shapeFlag:Z,patchFlag:W,dirs:Y,cacheIndex:ee,memo:de}=h;if(W===-2&&(R=!1),j!=null&&(At(),Us(j,null,b,h,!0),It()),ee!=null&&(v.renderCache[ee]=void 0),Z&256){v.ctx.deactivate(h);return}const be=Z&1&&Y,ve=!bs(h);let Ae;if(ve&&(Ae=B&&B.onVnodeBeforeUnmount)&&dt(Ae,v,h),Z&6)Wt(h.component,b,S);else{if(Z&128){h.suspense.unmount(b,S);return}be&&Kt(h,null,v,"beforeUnmount"),Z&64?h.type.remove(h,v,b,J,S):P&&!P.hasOnce&&(C!==re||W>0&&W&64)?Xe(P,v,b,!1,!0):(C===re&&W&384||!R&&Z&16)&&Xe(V,v,b),S&&as(h)}const Me=de!=null&&ee==null;(ve&&(Ae=B&&B.onVnodeUnmounted)||be||Me)&&Ue(()=>{Ae&&dt(Ae,v,h),be&&Kt(h,null,v,"unmounted"),Me&&(h.el=null)},b)},as=h=>{const{type:v,el:b,anchor:S,transition:R}=h;if(v===re){cs(b,S);return}if(v===so){y(h);return}const C=()=>{o(b),R&&!R.persisted&&R.afterLeave&&R.afterLeave()};if(h.shapeFlag&1&&R&&!R.persisted){const{leave:B,delayLeave:j}=R,V=()=>B(b,C);j?j(h.el,C,V):V()}else C()},cs=(h,v)=>{let b;for(;h!==v;)b=g(h),o(h),h=b;o(v)},Wt=(h,v,b)=>{const{bum:S,scope:R,job:C,subTree:B,um:j,m:V,a:P}=h;Er(V),Er(P),S&&pn(S),R.stop(),C&&(C.flags|=8,ze(B,h,v,b)),j&&Ue(j,v),Ue(()=>{h.isUnmounted=!0},v)},Xe=(h,v,b,S=!1,R=!1,C=0)=>{for(let B=C;B{if(h.shapeFlag&6)return A(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();const v=g(h.anchor||h.el),b=v&&v[Yl];return b?g(b):v};let K=!1;const H=(h,v,b)=>{let S;h==null?v._vnode&&(ze(v._vnode,null,null,!0),S=v._vnode.component):I(v._vnode||null,h,v,null,null,null,b),v._vnode=h,K||(K=!0,pr(S),Kl(),K=!1)},J={p:I,um:ze,m:at,r:as,mt:ie,mc:U,pc:ne,pbc:q,n:A,o:e};return{render:H,hydrate:void 0,createApp:Sc(H)}}function to({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 Gt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Fc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Yo(e,t,s=!1){const n=e.children,o=t.children;if(z(n)&&z(o))for(let r=0;r>1,e[s[i]]0&&(t[n]=s[r-1]),s[r]=n)}}for(r=s.length,l=s[r-1];r-- >0;)s[r]=l,l=t[l];return s}function Ci(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ci(t)}function Er(e){if(e)for(let t=0;te.__isSuspense;function Hc(e,t){t&&t.pendingBranch?z(e)?t.effects.push(...e):t.effects.push(e):Za(e)}const re=Symbol.for("v-fgt"),Hn=Symbol.for("v-txt"),Ve=Symbol.for("v-cmt"),so=Symbol.for("v-stc"),Tt=[];let Ye=null;function k(e=!1){Tt.push(Ye=e?null:[])}function Qo(){Tt.pop(),Ye=Tt[Tt.length-1]||null}let Ys=1;function wn(e,t=!1){Ys+=e,e<0&&Ye&&t&&(Ye.hasOnce=!0)}function Ti(e){return e.dynamicChildren=Ys>0?Ye||gs:null,Qo(),Ys>0&&Ye&&Ye.push(e),e}function E(e,t,s,n,o,r){return Ti(c(e,t,s,n,o,r,!0))}function De(e,t,s,n,o){return Ti(le(e,t,s,n,o,!0))}function Qs(e){return e?e.__v_isVNode===!0:!1}function Xt(e,t){return e.type===t.type&&e.key===t.key}const Ai=({key:e})=>e??null,hn=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?we(e)||Ee(e)||se(e)?{i:Le,r:e,k:t,f:!!s}:e:null);function c(e,t=null,s=null,n=0,o=null,r=e===re?0:1,l=!1,i=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ai(t),ref:t&&hn(t),scopeId:ql,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:r,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Le};return i?(Cn(a,s),r&128&&e.normalize(a)):s&&(a.shapeFlag|=we(s)?8:16),Ys>0&&!l&&Ye&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&Ye.push(a),a}const le=Wc;function Wc(e,t=null,s=null,n=0,o=null,r=!1){if((!e||e===ai)&&(e=Ve),Qs(e)){const i=Ut(e,t,!0);return s&&Cn(i,s),Ys>0&&!r&&Ye&&(i.shapeFlag&6?Ye[Ye.indexOf(e)]=i:Ye.push(i)),i.patchFlag=-2,i}if(tu(e)&&(e=e.__vccOpts),t){t=Kc(t);let{class:i,style:a}=t;i&&!we(i)&&(t.class=G(i)),ge(a)&&(Vn(a)&&!z(a)&&(a=Ie({},a)),t.style=Ln(a))}const l=we(e)?1:Ei(e)?128:Dn(e)?64:ge(e)?4:se(e)?2:0;return c(e,t,s,n,o,l,r,!0)}function Kc(e){return e?Vn(e)||_i(e)?Ie({},e):e:null}function Ut(e,t,s=!1,n=!1){const{props:o,ref:r,patchFlag:l,children:i,transition:a}=e,f=t?Gc(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&Ai(f),ref:t&&t.ref?s&&r?z(r)?r.concat(hn(t)):[r,hn(t)]:hn(t):r,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!==re?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ut(e.ssContent),ssFallback:e.ssFallback&&Ut(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&n&&ns(u,a.clone(u)),u}function oe(e=" ",t=0){return le(Hn,null,e,t)}function fe(e="",t=!1){return t?(k(),De(Ve,null,e)):le(Ve,null,e)}function gt(e){return e==null||typeof e=="boolean"?le(Ve):z(e)?le(re,null,e.slice()):Qs(e)?wt(e):le(Hn,null,String(e))}function wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ut(e)}function Cn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(z(t))s=16;else if(typeof t=="object")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),Cn(e,o()),o._c&&(o._d=!0));return}else{s=32;const o=t._;!o&&!_i(t)?t._ctx=Le:o===3&&Le&&(Le.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(se(t)){if(n&65){Cn(e,{default:t});return}t={default:t,_ctx:Le},s=32}else t=String(t),n&64?(s=16,t=[oe(t)]):s=8;e.children=t,e.shapeFlag|=s}function Gc(...e){const t={};for(let s=0;sje||Le;let Sn,Zs;{const e=On(),t=(s,n)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(n),r=>{o.length>1?o.forEach(l=>l(r)):o[0](r)}};Sn=t("__VUE_INSTANCE_SETTERS__",s=>je=s),Zs=t("__VUE_SSR_SETTERS__",s=>Xs=s)}const rn=e=>{const t=je;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},Tr=()=>{je&&je.scope.off(),Sn(null)};function Ii(e){return e.vnode.shapeFlag&4}let Xs=!1;function Yc(e,t=!1,s=!1){t&&Zs(t);const{props:n,children:o}=e.vnode,r=Ii(e);Mc(e,n,r,t),Vc(e,o,s||t);const l=r?Qc(e,t):void 0;return t&&Zs(!1),l}function Qc(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,_c);const{setup:n}=s;if(n){At();const o=e.setupContext=n.length>1?Xc(e):null,r=rn(e),l=nn(n,e,0,[e.props,o]),i=gl(l);if(It(),r(),(i||e.sp)&&!bs(e)&&ni(e),i){if(l.then(Tr,Tr),t)return l.then(a=>{Zs(!0);try{Ar(e,a,t)}finally{Zs(!1)}}).catch(a=>{jn(a,e,0)});e.asyncDep=l}else Ar(e,l)}else Ri(e)}function Ar(e,t,s){se(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Ul(t)),Ri(e)}function Ri(e,t,s){const n=e.type;e.render||(e.render=n.render||bt);{const o=rn(e);At();try{bc(e)}finally{It(),o()}}}const Zc={get(e,t){return Ne(e,"get",""),e[t]}};function Xc(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Zc),slots:e.slots,emit:e.emit,expose:t}}function Wn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ul(Wo(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 eu(e,t=!0){return se(e)?e.displayName||e.name:e.name||t&&e.__name}function tu(e){return se(e)&&"__vccOpts"in e}const ye=(e,t)=>qa(e,t,Xs);function Zo(e,t,s){try{wn(-1);const n=arguments.length;return n===2?ge(t)&&!z(t)?Qs(t)?le(e,null,[t]):le(e,t):le(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Qs(s)&&(s=[s]),le(e,t,s))}finally{wn(1)}}const su="3.5.41";let Co;const Ir=typeof window<"u"&&window.trustedTypes;if(Ir)try{Co=Ir.createPolicy("vue",{createHTML:e=>e})}catch{}const $i=Co?e=>Co.createHTML(e):e=>e,nu="http://www.w3.org/2000/svg",ou="http://www.w3.org/1998/Math/MathML",kt=typeof document<"u"?document:null,Rr=kt&&kt.createElement("template"),ru={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"?kt.createElementNS(nu,e):t==="mathml"?kt.createElementNS(ou,e):s?kt.createElement(e,{is:s}):kt.createElement(e);return e==="select"&&n&&n.multiple!=null&&o.setAttribute("multiple",n.multiple),o},createText:e=>kt.createTextNode(e),createComment:e=>kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,o,r){const l=s?s.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===r||!(o=o.nextSibling)););else{Rr.innerHTML=$i(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const i=Rr.content;if(n==="svg"||n==="mathml"){const a=i.firstChild;for(;a.firstChild;)i.appendChild(a.firstChild);i.removeChild(a)}t.insertBefore(i,s)}return[l?l.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Mt="transition",Ps="animation",ks=Symbol("_vtc"),Pi={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},Mi=Ie({},Zl,Pi),lu=e=>(e.displayName="Transition",e.props=Mi,e),So=lu((e,{slots:t})=>Zo(ic,Oi(e),t)),qt=(e,t=[])=>{z(e)?e.forEach(s=>s(...t)):e&&e(...t)},$r=e=>e?z(e)?e.some(t=>t.length>1):e.length>1:!1;function Oi(e){const t={};for(const x in e)x in Pi||(t[x]=e[x]);if(e.css===!1)return t;const{name:s="v",type:n,duration:o,enterFromClass:r=`${s}-enter-from`,enterActiveClass:l=`${s}-enter-active`,enterToClass:i=`${s}-enter-to`,appearFromClass:a=r,appearActiveClass:f=l,appearToClass:u=i,leaveFromClass:p=`${s}-leave-from`,leaveActiveClass:g=`${s}-leave-active`,leaveToClass:d=`${s}-leave-to`}=e,T=iu(o),I=T&&T[0],L=T&&T[1],{onBeforeEnter:$,onEnter:m,onEnterCancelled:_,onLeave:y,onLeaveCancelled:w,onBeforeAppear:Q=$,onAppear:D=m,onAppearCancelled:U=_}=t,M=(x,N,ie,Pe)=>{x._enterCancelled=Pe,Vt(x,N?u:i),Vt(x,N?f:l),ie&&ie()},q=(x,N)=>{x._isLeaving=!1,Vt(x,p),Vt(x,d),Vt(x,g),N&&N()},te=x=>(N,ie)=>{const Pe=x?D:m,pe=()=>M(N,x,ie);qt(Pe,[N,pe]),Pr(()=>{Vt(N,x?a:r),pt(N,x?u:i),$r(Pe)||Mr(N,n,I,pe)})};return Ie(t,{onBeforeEnter(x){qt($,[x]),pt(x,r),pt(x,l)},onBeforeAppear(x){qt(Q,[x]),pt(x,a),pt(x,f)},onEnter:te(!1),onAppear:te(!0),onLeave(x,N){x._isLeaving=!0;const ie=()=>q(x,N);pt(x,p),x._enterCancelled?(pt(x,g),Eo(x)):(Eo(x),pt(x,g)),Pr(()=>{x._isLeaving&&(Vt(x,p),pt(x,d),$r(y)||Mr(x,n,L,ie))}),qt(y,[x,ie])},onEnterCancelled(x){M(x,!1,void 0,!0),qt(_,[x])},onAppearCancelled(x){M(x,!0,void 0,!0),qt(U,[x])},onLeaveCancelled(x){q(x),qt(w,[x])}})}function iu(e){if(e==null)return null;if(ge(e))return[no(e.enter),no(e.leave)];{const t=no(e);return[t,t]}}function no(e){return pa(e)}function pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[ks]||(e[ks]=new Set)).add(t)}function Vt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[ks];s&&(s.delete(t),s.size||(e[ks]=void 0))}function Pr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let au=0;function Mr(e,t,s,n){const o=e._endId=++au,r=()=>{o===e._endId&&n()};if(s!=null)return setTimeout(r,s);const{type:l,timeout:i,propCount:a}=Li(e,t);if(!l)return n();const f=l+"end";let u=0;const p=()=>{e.removeEventListener(f,g),r()},g=d=>{d.target===e&&++u>=a&&p()};setTimeout(()=>{u(s[T]||"").split(", "),o=n(`${Mt}Delay`),r=n(`${Mt}Duration`),l=Or(o,r),i=n(`${Ps}Delay`),a=n(`${Ps}Duration`),f=Or(i,a);let u=null,p=0,g=0;t===Mt?l>0&&(u=Mt,p=l,g=r.length):t===Ps?f>0&&(u=Ps,p=f,g=a.length):(p=Math.max(l,f),u=p>0?l>f?Mt:Ps:null,g=u?u===Mt?r.length:a.length:0);const d=u===Mt&&/\b(?:transform|all)(?:,|$)/.test(n(`${Mt}Property`).toString());return{type:u,timeout:p,propCount:g,hasTransform:d}}function Or(e,t){for(;e.lengthLr(s)+Lr(e[n])))}function Lr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Eo(e){return(e?e.ownerDocument:document).body.offsetHeight}function cu(e,t,s){const n=e[ks];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const En=Symbol("_vod"),Xo=Symbol("_vsh"),Nr={name:"show",beforeMount(e,{value:t},{transition:s}){e[En]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Ms(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),Ms(e,!0),n.enter(e)):n.leave(e,()=>{Ms(e,!1)}):Ms(e,t))},beforeUnmount(e,{value:t}){Ms(e,t)}};function Ms(e,t){e.style.display=t?e[En]:"none",e[Xo]=!t}const uu=Symbol(""),fu=/(?:^|;)\s*display\s*:/;function du(e,t,s){const n=e.style,o=we(s);let r=!1;if(s&&!o){if(t)if(we(t))for(const l of t.split(";")){const i=l.slice(0,l.indexOf(":")).trim();s[i]==null&&Vs(n,i,"")}else for(const l in t)s[l]==null&&Vs(n,l,"");for(const l in s){l==="display"&&(r=!0);const i=s[l];i!=null?hu(e,l,!we(t)&&t?t[l]:void 0,i)||Vs(n,l,i):Vs(n,l,"")}}else if(o){if(t!==s){const l=n[uu];l&&(s+=";"+l),n.cssText=s,r=fu.test(s)}}else t&&e.removeAttribute("style");En in e&&(e[En]=r?n.display:"",e[Xo]&&(n.display="none"))}const Vr=/\s*!important$/;function Vs(e,t,s){if(z(s))s.forEach(n=>Vs(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=pu(e,t);Vr.test(s)?e.setProperty(os(n),s.replace(Vr,""),"important"):e[n]=s}}const jr=["Webkit","Moz","ms"],oo={};function pu(e,t){const s=oo[t];if(s)return s;let n=Ke(t);if(n!=="filter"&&n in e)return oo[t]=n;n=Pn(n);for(let o=0;oro||(xu.then(()=>ro=0),ro=Date.now());function ku(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const o=s.value;if(z(o)){const r=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{r.call(n),n._stopped=!0};const l=o.slice(),i=[n];for(let a=0;ae.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,wu=(e,t,s,n,o,r)=>{const l=o==="svg";t==="class"?cu(e,n,l):t==="style"?du(e,s,n):An(t)?In(t)||gu(e,t,s,n,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Cu(e,t,n,l))?(Fr(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,n,l,r,t!=="value")):e._isVueCE&&(Su(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!we(n)))?Fr(e,Ke(t),n,r,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Br(e,t,n,l))};function Cu(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&Hr(t)&&se(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 Hr(t)&&we(s)?!1:t in e}function Su(e,t){const s=e._def.props;if(!s)return!1;const n=Ke(t);return Array.isArray(s)?s.some(o=>Ke(o)===n):Object.keys(s).some(o=>Ke(o)===n)}const Ni=new WeakMap,Vi=new WeakMap,Tn=Symbol("_moveCb"),Wr=Symbol("_enterCb"),Eu=e=>(delete e.props.mode,e),Tu=Eu({name:"TransitionGroup",props:Ie({},Mi,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=on(),n=Ql();let o,r;return ri(()=>{if(!o.length)return;const l=e.moveClass||`${e.name||"v"}-move`;if(!Pu(o[0].el,s.vnode.el,l)){o=[];return}o.forEach(Iu),o.forEach(Ru);const i=o.filter($u);Eo(s.vnode.el),i.forEach(a=>{const f=a.el,u=f.style;pt(f,l),u.transform=u.webkitTransform=u.transitionDuration="";const p=f[Tn]=g=>{g&&g.target!==f||(!g||g.propertyName.endsWith("transform"))&&(f.removeEventListener("transitionend",p),f[Tn]=null,Vt(f,l))};f.addEventListener("transitionend",p)}),o=[]}),()=>{const l=ce(e),i=Oi(l);let a=l.tag||re;if(o=[],r)for(let f=0;f{i.split(/\s+/).forEach(a=>a&&n.classList.remove(a))}),s.split(/\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(n);const{hasTransform:l}=Li(n);return r.removeChild(n),l}const ws=e=>{const t=e.props["onUpdate:modelValue"]||!1;return z(t)?s=>pn(t,s):t};function Mu(e){e.target.composing=!0}function Kr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _t=Symbol("_assign"),dn=Symbol("_initialValue");function lo(e,t,s){return t&&(e=e.trim()),s&&(e=Mn(e)),e}const Oe={created(e,{modifiers:{lazy:t,trim:s,number:n}},o){e.parentNode&&(e.type==="text"?e[dn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[dn]=e.defaultValue.replace(/\r\n?/g,` -`))),e[_t]=ws(o);const r=n||o.props&&o.props.type==="number";Ft(e,t?"change":"input",l=>{l.target.composing||e[_t](lo(e.value,s,r))}),(s||r)&&Ft(e,"change",()=>{e.value=lo(e.value,s,r)}),t||(Ft(e,"compositionstart",Mu),Ft(e,"compositionend",Kr),Ft(e,"change",Kr))},mounted(e,{value:t,modifiers:{trim:s,number:n}}){const o=t??"",r=e[dn];delete e[dn],r!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==r?e[_t](lo(e.value,s,n)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:o,number:r}},l){if(e[_t]=ws(l),e.composing)return;const i=(r||e.type==="number")&&!/^0\d/.test(e.value)?Mn(e.value):e.value,a=t??"";if(i===a)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(n&&t===s||o&&e.value.trim()===a)||(e.value=a)}},zt={deep:!0,created(e,t,s){e[_t]=ws(s),Ft(e,"change",()=>{const n=e._modelValue,o=en(e),r=e.checked,l=e[_t];if(z(n)){const i=Vo(n,o),a=i!==-1;if(r&&!a)l(n.concat(o));else if(!r&&a){const f=[...n];f.splice(i,1),l(f)}}else if(Es(n)){const i=new Set(n);r?i.add(o):i.delete(o),l(i)}else l(Bi(e,r))})},mounted:Gr,beforeUpdate(e,t,s){e[_t]=ws(s),Gr(e,t,s)}};function Gr(e,{value:t,oldValue:s},n){e._modelValue=t;let o;if(z(t))o=Vo(t,n.props.value)>-1;else if(Es(t))o=t.has(n.props.value);else{if(t===s)return;o=Ts(t,Bi(e,!0))}e.checked!==o&&(e.checked=o)}const Di={deep:!0,created(e,{value:t,modifiers:{number:s}},n){e._modelValue=t,Ft(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Mn(en(r)):en(r));e[_t](e.multiple?Es(e._modelValue)?new Set(o):o:o[0]),e._assigning=!0,$t(()=>{e._assigning=!1})}),e[_t]=ws(n)},mounted(e,{value:t}){qr(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[_t]=ws(s)},updated(e,{value:t}){e._assigning||qr(e,t)}};function qr(e,t){const s=e.multiple,n=z(t);if(!(s&&!n&&!Es(t))){for(let o=0,r=e.options.length;oString(f)===String(i)):l.selected=Vo(t,i)>-1}else l.selected=t.has(i);else if(Ts(en(l),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function en(e){return"_value"in e?e._value:e.value}function Bi(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Ou=["ctrl","shift","alt","meta"],Lu={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)=>Ou.some(s=>e[`${s}Key`]&&!t.includes(s))},xs=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((o,...r)=>{for(let l=0;l{const t=Vu().createApp(...e),{mount:s}=t;return t.mount=n=>{const o=Bu(n);if(!o)return;const r=t._component;!se(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const l=s(o,!1,Du(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),l},t});function Du(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Bu(e){return we(e)?document.querySelector(e):e}let Fi;const Kn=e=>Fi=e,Ui=Symbol();function To(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 Fu(){const e=Cl(!0),t=e.run(()=>ue({}));let s=[],n=[];const o=Wo({install(r){Kn(o),o._a=r,r.provide(Ui,o),r.config.globalProperties.$pinia=o,n.forEach(l=>s.push(l)),n=[]},use(r){return this._a?s.push(r):n.push(r),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return o}const Hi=()=>{};function Jr(e,t,s,n=Hi){e.add(t);const o=()=>{e.delete(t)&&n()};return!s&&Sl()&&ya(o),o}function fs(e,...t){e.forEach(s=>{s(...t)})}const Uu=e=>e(),Yr=Symbol(),io=Symbol();function Ao(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];To(o)&&To(n)&&e.hasOwnProperty(s)&&!Ee(n)&&!Et(n)?e[s]=Ao(o,n):e[s]=n}return e}const Hu=Symbol();function Wu(e){return!To(e)||!Object.prototype.hasOwnProperty.call(e,Hu)}const{assign:jt}=Object;function Ku(e){return!!(Ee(e)&&e.effect)}function Gu(e,t,s,n){const{state:o,actions:r,getters:l}=t,i=s.state.value[e];let a;function f(){i||(s.state.value[e]=o?o():{});const u=Ha(s.state.value[e]);return jt(u,r,Object.keys(l||{}).reduce((p,g)=>(p[g]=Wo(ye(()=>{Kn(s);const d=s._s.get(e);return l[g].call(d,d)})),p),{}))}return a=Wi(e,f,t,s,n,!0),a}function Wi(e,t,s={},n,o,r){let l;const i=jt({actions:{}},s),a={deep:!0};let f,u,p=new Set,g=new Set,d;const T=n.state.value[e];!r&&!T&&(n.state.value[e]={});let I;function L(U){let M;f=u=!1,typeof U=="function"?(U(n.state.value[e]),M={type:Ws.patchFunction,storeId:e,events:d}):(Ao(n.state.value[e],U),M={type:Ws.patchObject,payload:U,storeId:e,events:d});const q=I=Symbol();$t().then(()=>{I===q&&(f=!0)}),u=!0,fs(p,M,n.state.value[e])}const $=r?function(){const{state:M}=s,q=M?M():{};this.$patch(te=>{jt(te,q)})}:Hi;function m(){l.stop(),p.clear(),g.clear(),n._s.delete(e)}const _=(U,M="")=>{if(Yr in U)return U[io]=M,U;const q=function(){Kn(n);const te=Array.from(arguments),x=new Set,N=new Set;function ie(X){x.add(X)}function Pe(X){N.add(X)}fs(g,{args:te,name:q[io],store:w,after:ie,onError:Pe});let pe;try{pe=U.apply(this&&this.$id===e?this:w,te)}catch(X){throw fs(N,X),X}return pe instanceof Promise?pe.then(X=>(fs(x,X),X)).catch(X=>(fs(N,X),Promise.reject(X))):(fs(x,pe),pe)};return q[Yr]=!0,q[io]=M,q},y={_p:n,$id:e,$onAction:Jr.bind(null,g),$patch:L,$reset:$,$subscribe(U,M={}){const q=Jr(p,U,M.detached,()=>te()),te=l.run(()=>Ge(()=>n.state.value[e],x=>{(M.flush==="sync"?u:f)&&U({storeId:e,type:Ws.direct,events:d},x)},jt({},a,M)));return q},$dispose:m},w=rs(y);n._s.set(e,w);const D=(n._a&&n._a.runWithContext||Uu)(()=>n._e.run(()=>(l=Cl()).run(()=>t({action:_}))));for(const U in D){const M=D[U];if(Ee(M)&&!Ku(M)||Et(M))r||(T&&Wu(M)&&(Ee(M)?M.value=T[U]:Ao(M,T[U])),n.state.value[e][U]=M);else if(typeof M=="function"){const q=_(M,U);D[U]=q,i.actions[U]=M}}return jt(w,D),jt(ce(w),D),Object.defineProperty(w,"$state",{get:()=>n.state.value[e],set:U=>{L(M=>{jt(M,U)})}}),n._p.forEach(U=>{jt(w,l.run(()=>U({store:w,app:n._a,pinia:n,options:i})))}),T&&r&&s.hydrate&&s.hydrate(w.$state,T),f=!0,u=!0,w}function er(e,t,s){let n;const o=typeof t=="function";n=o?s:t;function r(l,i){const a=Xa();return l=l||(a?ot(Ui,null):null),l&&Kn(l),l=Fi,l._s.has(e)||(o?Wi(e,t,n,l):Gu(e,n,l)),l._s.get(e)}return r.$id=e,r}const it=async(e,t)=>{const n=await(await fetch(e,t)).json();if(n.code!==0)throw new Error(n.msg||"请求失败");return n.data},Ki={"Content-Type":"application/json"},qu=e=>it(`/api/info?file_name=${encodeURIComponent(e)}`),zu=e=>it(`/api/peers?file_name=${encodeURIComponent(e)}`),Ju=e=>it(`/api/routes?file_name=${encodeURIComponent(e)}`),Yu=e=>it(`/api/start/status?file_name=${encodeURIComponent(e)}`),Qu=()=>it("/api/instances"),Zu=e=>it(`/api/instance?file_name=${encodeURIComponent(e)}`,{method:"DELETE"}),tr=(e,t)=>it(e,{method:"POST",headers:Ki,body:JSON.stringify({file_name:t})}),Xu=e=>tr("/api/start",e),Gi=e=>tr("/api/stop",e),ef=e=>tr("/api/restart",e),tf=()=>it("/api/config/list"),sf=e=>it(`/api/config?file_name=${encodeURIComponent(e)}`),nf=(e,t)=>it("/api/config",{method:"POST",headers:Ki,body:JSON.stringify({file_name:e||null,config:t})}),of=e=>it(`/api/config?file_name=${encodeURIComponent(e)}`,{method:"DELETE"});let rf=0;const is=er("ui",()=>{const e=ue([]),t=(i,a,f=3e3)=>{const u=++rf;e.value.push({id:u,type:i,message:a}),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=rs({show:!1,title:"",message:"",danger:!1,confirmText:"确定",resolve:null});return{toasts:e,toast:s,confirmState:n,confirm:({title:i="确认操作",message:a="",danger:f=!1,confirmText:u="确定"}={})=>new Promise(p=>{n.show=!0,n.title=i,n.message=a,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}}}),qi=er("startLog",()=>{const e=ue(!1),t=ue([]),s=ue("stopped"),n=ue(null),o=ue(null);let r=null,l=null,i=null,a=null;const f=({fetchInstances:$,instanceList:m,configList:_})=>{l=$,i=m,a=_},u=ye(()=>{if(!n.value)return"";const $=(i?.value||[]).find(_=>_.file_name===n.value);if($)return $.config_name||$.file_name;const m=(a?.value||[]).find(_=>_.file_name===n.value);return m?m.config_name||m.file_name:n.value}),p=async()=>{if(n.value)try{const $=await Yu(n.value);t.value=$.logs||[],s.value=$.status,$t(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)}),s.value==="running"?(g(),l&&l(),e.value=!1):s.value==="stopped"&&t.value.length>0&&(g(),l&&l())}catch($){console.error($)}},g=()=>{r&&(clearInterval(r),r=null)},d=()=>{g(),r=setInterval(p,1e3),p()};return{showStartLog:e,startLogs:t,startStatus:s,logFileName:n,logContainer:o,logConfigName:u,bindApp:f,openStartLog:$=>{n.value=$,t.value=[],s.value="starting",e.value=!0,d()},pollStartStatus:p,startPolling:d,stopPolling:g,cancelStart:async()=>{g();const $=n.value;if($)try{await Gi($),t.value.push("启动已手动取消")}catch{}s.value="stopped",l&&l()},close:()=>{e.value=!1}}}),Ht=er("app",()=>{const e=is(),t=qi(),s=ue({}),n=ue([]),o=ue(null),r=ue([]),l=ue({}),i=ue(!document.hidden),a=()=>{i.value=!document.hidden};let f=null;const u=ye(()=>n.value.filter(x=>x.status==="running").length),p=ye(()=>n.value.filter(x=>x.status==="starting").length),g=ye(()=>u.value>0?`运行中 x${u.value}`:p.value>0?"启动中...":"未启动"),d=ye(()=>o.value&&s.value[o.value]||null),T=ye(()=>{if(!o.value)return"";const x=n.value.find(N=>N.file_name===o.value);return x?x.config_name||x.file_name:o.value}),I=ye(()=>{for(const x in s.value){const N=s.value[x];if(N&&N.version)return N.version}return""}),L=ye(()=>!!(d.value&&d.value.server_info&&d.value.server_info.some(x=>x.connected))),$=ye(()=>{const x=d.value;return!x||!x.server_info||!x.server_info.length?"未配置服务器":`${x.server_info.filter(N=>N.connected).length} / ${x.server_info.length} 已连接`}),m=x=>s.value[x]||{},_=async x=>{try{s.value[x]=await qu(x)}catch(N){console.error("Fetch info error",N)}},y=async()=>{try{const x=await Qu()||[];n.value=x;for(const N of Object.keys(s.value))x.some(ie=>ie.file_name===N)||delete s.value[N];if(!o.value||!x.some(N=>N.file_name===o.value)){const N=x.find(ie=>ie.status==="running");o.value=N?N.file_name:x.length>0?x[0].file_name:null}for(const N of x)N.status==="running"&&_(N.file_name)}catch(x){console.error("Fetch instances error",x)}},w=async()=>{try{r.value=await tf()||[]}catch(x){console.error("Fetch list error",x)}},Q=async x=>{if(!x){e.toast.error("请先选择一个配置");return}if(!l.value[x]){l.value[x]=!0;try{await Xu(x),t.openStartLog(x),y()}catch(N){e.toast.error("启动失败: "+N.message)}finally{l.value[x]=!1}}},D=async x=>{if(!(!x||l.value[x])){l.value[x]=!0;try{await Gi(x),e.toast.success("已停止"),t.logFileName===x&&(t.stopPolling(),t.showStartLog=!1),y()}catch(N){e.toast.error("停止失败: "+N.message),console.error(N)}finally{l.value[x]=!1}}},U=async x=>{if(!(!x||l.value[x])){l.value[x]=!0;try{await ef(x),t.openStartLog(x),y()}catch(N){e.toast.error("重启失败: "+N.message)}finally{l.value[x]=!1}}},M=async x=>{if(!(!x||l.value[x])){l.value[x]=!0;try{await Zu(x),e.toast.success("已移除"),t.logFileName===x&&(t.stopPolling(),t.showStartLog=!1),o.value===x&&(o.value=null),y()}catch(N){e.toast.error("移除失败: "+N.message)}finally{l.value[x]=!1}}};t.bindApp({fetchInstances:y,instanceList:n,configList:r});const q=async()=>{document.addEventListener("visibilitychange",a),await y(),w();const x=n.value.find(N=>N.status==="starting");x&&t.openStartLog(x.file_name),f=setInterval(()=>{i.value&&y()},3e3)},te=()=>{document.removeEventListener("visibilitychange",a),t.stopPolling(),f&&clearInterval(f)};return on()&&(ls(q),As(te)),{instances:s,instanceList:n,selectedInstance:o,configList:r,loadingMap:l,isPageVisible:i,runningCount:u,startingCount:p,headerStatusText:g,selectedInfo:d,selectedConfigName:T,version:I,isServerConnected:L,serverStatusText:$,infoOf:m,fetchInstances:y,fetchInstanceInfo:_,fetchConfigList:w,startVnt:Q,stopVnt:D,restartVnt:U,dismissInstance:M}}),lf={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"},af={class:"custom-scrollbar min-h-0 flex-1 overflow-y-auto"},cf={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"},sr={__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=l=>{s.escClosable&&l.key==="Escape"&&n("close")};Ge(()=>s.show,l=>{l?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),As(()=>window.removeEventListener("keydown",o));const r=()=>{s.maskClosable&&n("close")};return(l,i)=>(k(),De(Go,{to:"body"},[le(So,{name:"modal"},{default:Te(()=>[e.show?(k(),E("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm",onClick:xs(r,["self"])},[c("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])},[l.$slots.header?(k(),E("div",lf,[Xn(l.$slots,"header")])):fe("",!0),c("div",af,[Xn(l.$slots,"body")]),l.$slots.footer?(k(),E("div",cf,[Xn(l.$slots,"footer")])):fe("",!0)],2)])):fe("",!0)]),_:3})]))}},uf={class:"pointer-events-none fixed right-4 top-4 z-[100] flex flex-col items-end gap-2"},ff={class:"flex items-center gap-2 px-4 py-2.5"},df=["d"],pf={class:"break-all text-sm text-slate-700 dark:text-slate-200"},hf={__name:"ToastHost",setup(e){const t=is(),s=r=>r==="success"?"bg-green-500":r==="error"?"bg-red-500":"bg-indigo-500",n=r=>r==="success"?"text-green-500":r==="error"?"text-red-500":"text-indigo-500",o=r=>r==="success"?"M5 13l4 4L19 7":r==="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(r,l)=>(k(),De(Go,{to:"body"},[c("div",uf,[le(Au,{name:"toast"},{default:Te(()=>[(k(!0),E(re,null,Ce(O(t).toasts,i=>(k(),E("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"},[c("span",{class:G(["w-1 shrink-0",s(i.type)])},null,2),c("div",ff,[(k(),E("svg",{class:G(["h-4 w-4 shrink-0",n(i.type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:o(i.type)},null,8,df)],2)),c("span",pf,F(i.message),1)])]))),128))]),_:1})])]))}},mf={class:"text-lg font-bold text-slate-900 flex items-center gap-2 dark:text-white"},gf={key:0,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},vf={class:"px-6 py-5 text-sm text-slate-600 break-all dark:text-slate-300"},_f={__name:"ConfirmHost",setup(e){const t=is();return(s,n)=>(k(),De(sr,{show:O(t).confirmState.show,"panel-class":"w-full max-w-sm",onClose:O(t).confirmCancel},{header:Te(()=>[c("h3",mf,[O(t).confirmState.danger?(k(),E("svg",gf,[...n[2]||(n[2]=[c("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)])])):fe("",!0),oe(" "+F(O(t).confirmState.title),1)])]),body:Te(()=>[c("p",vf,F(O(t).confirmState.message),1)]),footer:Te(()=>[c("button",{class:"btn-ghost",onClick:n[0]||(n[0]=(...o)=>O(t).confirmCancel&&O(t).confirmCancel(...o))},"取消"),c("button",{class:G(O(t).confirmState.danger?"btn-danger":"btn-primary"),onClick:n[1]||(n[1]=(...o)=>O(t).confirmOk&&O(t).confirmOk(...o))},F(O(t).confirmState.confirmText),3)]),_:1},8,["show","onClose"]))}},nr={__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(),E("span",{class:G(["rounded-full inline-block shrink-0",[e.size,t(e.status)]])},null,2))}},bf={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"},xf={class:"relative z-10 mb-2 flex items-center justify-between border-b border-slate-200 pb-2 dark:border-slate-600"},yf={class:"badge-green border border-green-200 dark:border-green-800"},kf={key:0,class:"relative z-10 mb-3"},wf={class:"flex flex-wrap gap-1"},Cf={key:1,class:"relative z-10"},Sf={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"},Ef={__name:"AppTooltip",setup(e,{expose:t}){const s=ue({show:!1,x:0,y:0,info:null});let n=null;const o=(a,f)=>{if(!f.nat_info)return;n&&(clearTimeout(n),n=null);const u=a.currentTarget.getBoundingClientRect();s.value={show:!0,x:u.left+u.width/2,y:u.bottom+10,info:f.nat_info}},r=()=>{n=setTimeout(()=>{s.value.show=!1},100)},l=()=>{n&&(clearTimeout(n),n=null)},i=()=>{s.value.show=!1};return t({showPeerTooltip:o,hidePeerTooltip:r}),(a,f)=>(k(),De(Go,{to:"body"},[s.value.show?(k(),E("div",{key:0,style:Ln({top:s.value.y+"px",left:s.value.x+"px"}),class:"fixed z-[9999] mt-1 -translate-x-1/2 transform",onMouseenter:l,onMouseleave:i},[c("div",bf,[f[3]||(f[3]=c("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)),c("div",xf,[f[0]||(f[0]=c("span",{class:"text-xs font-bold uppercase text-slate-400"},"NAT Type",-1)),c("span",yf,F(s.value.info.nat_type),1)]),s.value.info.public_ips&&s.value.info.public_ips.length>0?(k(),E("div",kf,[f[1]||(f[1]=c("span",{class:"mb-1 block text-xs text-slate-400"},"Public IPv4:",-1)),c("div",wf,[(k(!0),E(re,null,Ce(s.value.info.public_ips,u=>(k(),E("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"},F(u),1))),128))])])):fe("",!0),s.value.info.ipv6?(k(),E("div",Cf,[f[2]||(f[2]=c("span",{class:"mb-1 block text-xs text-slate-400"},"IPv6:",-1)),c("div",Sf,F(s.value.info.ipv6),1)])):fe("",!0)])],36)):fe("",!0)]))}},Tf={class:"flex min-h-screen flex-col"},Af={class:"sticky top-0 z-30 border-b border-slate-200 bg-white/80 backdrop-blur dark:border-slate-800 dark:bg-slate-900/80"},If={class:"mx-auto flex h-14 max-w-6xl items-center gap-3 px-4 lg:px-8"},Rf={class:"ml-6 hidden h-14 items-stretch gap-1 lg:flex"},$f=["onClick"],Pf={key:0,class:"absolute inset-x-3 bottom-0 h-0.5 rounded-full bg-indigo-600 dark:bg-indigo-400"},Mf={class:"ml-auto flex items-center gap-3"},Of=["title"],Lf={class:"hidden text-xs font-medium text-slate-600 sm:inline dark:text-slate-300"},Nf={class:"hidden text-xs text-slate-400 md:inline dark:text-slate-500"},Vf=["title"],jf={key:0,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Df={key:1,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Bf={key:0,class:"border-t border-slate-200 bg-white px-4 py-2 lg:hidden dark:border-slate-800 dark:bg-slate-900"},Ff=["onClick"],Uf={class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Hf=["d"],Wf=["d"],Kf={class:"flex-1 overflow-x-hidden"},Gf={class:"mx-auto w-full max-w-6xl px-4 py-6 lg:px-8"},qf={class:"flex items-center gap-3"},zf={key:0,class:"h-3 w-3 animate-ping rounded-full bg-blue-500"},Jf={key:1,class:"h-3 w-3 rounded-full bg-green-500"},Yf={key:2,class:"h-3 w-3 rounded-full bg-red-500"},Qf={class:"text-lg font-bold text-slate-900 dark:text-white"},Zf={class:"flex items-center gap-3"},Xf=["title"],ed={class:"font-mono text-xs uppercase tracking-widest text-slate-400"},td={class:"break-all text-slate-600 dark:text-slate-300"},sd={key:0,class:"mt-4 animate-pulse italic text-blue-500"},nd={key:1,class:"mt-4 rounded-lg border border-red-200 bg-red-50 p-3 text-red-600 dark:border-red-900/50 dark:bg-red-900/20 dark:text-red-400"},od={__name:"App",setup(e){const t=Ht(),s=qi(),n=ue(null);Fs("peerTooltip",n);const o=ue(document.documentElement.classList.contains("dark")),r=()=>{o.value=!o.value,document.documentElement.classList.toggle("dark",o.value),localStorage.setItem("vnt-theme",o.value?"dark":"light")},l=ue(!1),i=()=>{l.value=!1},a=[{to:"/",label:"总览",exact:!0,icon:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"},{to:"/instances",label:"实例",icon:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"},{to:"/config",label:"配置",icon:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z",icon2:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},{to:"/peers",label:"设备列表",icon:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"},{to:"/routes",label:"路由",icon:"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-.98l-3.747-1.874M12 7v13m3-13v13m-3 0l3 3"}];return(f,u)=>{const p=yn("router-link"),g=yn("router-view");return k(),E("div",Tf,[c("header",Af,[c("div",If,[c("button",{class:"rounded-lg p-1.5 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",onClick:u[0]||(u[0]=d=>l.value=!l.value)},[...u[3]||(u[3]=[c("svg",{class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)])]),le(p,{to:"/",class:"flex items-center gap-2",onClick:i},{default:Te(()=>[...u[4]||(u[4]=[c("span",{class:"text-lg font-bold tracking-wide text-indigo-600 dark:text-indigo-400"},"VNT",-1),c("span",{class:"text-sm font-medium text-slate-400 dark:text-slate-500"},"Web",-1)])]),_:1}),c("nav",Rf,[(k(),E(re,null,Ce(a,d=>le(p,{key:d.to,to:d.to,custom:""},{default:Te(({navigate:T,isActive:I,isExactActive:L})=>[c("button",{onClick:T,class:G(["relative flex items-center px-3 text-sm font-medium transition-colors",(d.exact?L:I)?"text-indigo-600 dark:text-indigo-400":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white"])},[oe(F(d.label)+" ",1),(d.exact?L:I)?(k(),E("span",Pf)):fe("",!0)],10,$f)]),_:2},1032,["to"])),64))]),c("div",Mf,[c("div",{class:"flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3 py-1 dark:border-slate-700 dark:bg-slate-800",title:O(t).headerStatusText},[le(nr,{status:O(t).runningCount>0?"running":O(t).startingCount>0?"starting":"stopped"},null,8,["status"]),c("span",Lf,F(O(t).headerStatusText),1)],8,Of),c("span",Nf,"v"+F(O(t).version||"-"),1),c("button",{class:"rounded-lg border border-slate-200 bg-white p-1.5 text-slate-500 shadow-sm transition-colors hover:bg-slate-50 hover:text-slate-900 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white",title:o.value?"切换到浅色模式":"切换到深色模式",onClick:r},[o.value?(k(),E("svg",jf,[...u[5]||(u[5]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"},null,-1)])])):(k(),E("svg",Df,[...u[6]||(u[6]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"},null,-1)])]))],8,Vf)])]),le(So,{name:"navdrop"},{default:Te(()=>[l.value?(k(),E("nav",Bf,[(k(),E(re,null,Ce(a,d=>le(p,{key:d.to,to:d.to,custom:""},{default:Te(({navigate:T,isActive:I,isExactActive:L})=>[c("button",{onClick:$=>{T(),i()},class:G(["flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium transition-colors",(d.exact?L:I)?"bg-indigo-50 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400":"text-slate-500 hover:bg-slate-50 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white"])},[(k(),E("svg",Uf,[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:d.icon},null,8,Hf),d.icon2?(k(),E("path",{key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:d.icon2},null,8,Wf)):fe("",!0)])),oe(" "+F(d.label),1)],10,Ff)]),_:2},1032,["to"])),64))])):fe("",!0)]),_:1})]),c("main",Kf,[c("div",Gf,[le(g,null,{default:Te(({Component:d})=>[le(So,{name:"fade",mode:"out-in"},{default:Te(()=>[(k(),De(vc(d)))]),_:2},1024)]),_:1})])]),le(sr,{show:O(s).showStartLog,"mask-closable":O(s).startStatus!=="starting","esc-closable":O(s).startStatus!=="starting","panel-class":"w-full max-w-2xl",onClose:O(s).close},{header:Te(()=>[c("div",qf,[O(s).startStatus==="starting"?(k(),E("div",zf)):O(s).startStatus==="running"?(k(),E("div",Jf)):(k(),E("div",Yf)),c("h3",Qf,F(O(s).startStatus==="starting"?"正在启动组网...":O(s).startStatus==="running"?"启动成功":"启动失败"),1)]),c("div",Zf,[c("span",{class:"max-w-[200px] truncate text-sm font-medium text-indigo-600 dark:text-indigo-400",title:O(s).logFileName},F(O(s).logConfigName),9,Xf),c("span",ed,F(O(s).startStatus),1)])]),body:Te(()=>[c("div",{ref:d=>O(s).logContainer=d,class:"scrollbar-hide h-80 space-y-2 overflow-y-auto bg-slate-50 p-6 font-mono text-sm dark:bg-black/20"},[(k(!0),E(re,null,Ce(O(s).startLogs,(d,T)=>(k(),E("div",{key:T,class:"flex gap-3"},[u[7]||(u[7]=c("span",{class:"shrink-0 text-indigo-500 dark:text-indigo-400"},">>>",-1)),c("span",td,F(d),1)]))),128)),O(s).startStatus==="starting"?(k(),E("div",sd," 等待后续步骤... ")):fe("",!0),O(s).startStatus==="stopped"&&O(s).startLogs.length>0?(k(),E("div",nd,[...u[8]||(u[8]=[c("strong",null,"启动失败:",-1),oe(" 请检查配置或网络连接。 ",-1)])])):fe("",!0)],512)]),footer:Te(()=>[O(s).startStatus==="starting"?(k(),E("button",{key:0,class:"btn-ghost",onClick:u[1]||(u[1]=(...d)=>O(s).cancelStart&&O(s).cancelStart(...d))}," 取消组网 ")):fe("",!0),O(s).startStatus==="stopped"||O(s).startStatus==="running"?(k(),E("button",{key:1,class:"btn-primary",onClick:u[2]||(u[2]=(...d)=>O(s).close&&O(s).close(...d))}," 关闭窗口 ")):fe("",!0)]),_:1},8,["show","mask-closable","esc-closable","onClose"]),le(hf),le(_f),le(Ef,{ref_key:"tooltipRef",ref:n},null,512)])}}};const ms=typeof document<"u";function zi(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function rd(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&zi(e.default)}const he=Object.assign;function ao(e,t){const s={};for(const n in t){const o=t[n];s[n]=lt(o)?o.map(e):e(o)}return s}const Ks=()=>{},lt=Array.isArray;function Qr(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const Ji=/#/g,ld=/&/g,id=/\//g,ad=/=/g,cd=/\?/g,Yi=/\+/g,ud=/%5B/g,fd=/%5D/g,Qi=/%5E/g,dd=/%60/g,Zi=/%7B/g,pd=/%7C/g,Xi=/%7D/g,hd=/%20/g;function or(e){return e==null?"":encodeURI(""+e).replace(pd,"|").replace(ud,"[").replace(fd,"]")}function md(e){return or(e).replace(Zi,"{").replace(Xi,"}").replace(Qi,"^")}function Io(e){return or(e).replace(Yi,"%2B").replace(hd,"+").replace(Ji,"%23").replace(ld,"%26").replace(dd,"`").replace(Zi,"{").replace(Xi,"}").replace(Qi,"^")}function gd(e){return Io(e).replace(ad,"%3D")}function vd(e){return or(e).replace(Ji,"%23").replace(cd,"%3F")}function _d(e){return vd(e).replace(id,"%2F")}function tn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const bd=/\/$/,xd=e=>e.replace(bd,"");function co(e,t,s="/"){let n,o={},r="",l="";const i=t.indexOf("#");let a=t.indexOf("?");return a=i>=0&&a>i?-1:a,a>=0&&(n=t.slice(0,a),r=t.slice(a,i>0?i:t.length),o=e(r.slice(1))),i>=0&&(n=n||t.slice(0,i),l=t.slice(i,t.length)),n=Cd(n??t,s),{fullPath:n+r+l,path:n,query:o,hash:tn(l)}}function yd(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Zr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function kd(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])&&ea(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 ea(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!wd(e[s],t[s]))return!1;return!0}function wd(e,t){return lt(e)?Xr(e,t):lt(t)?Xr(t,e):e?.valueOf()===t?.valueOf()}function Xr(e,t){return lt(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Cd(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 r=s.length-1,l,i;for(l=0;l1&&r--;else break;return s.slice(0,r).join("/")+"/"+n.slice(l).join("/")}const Ot={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Ro=(function(e){return e.pop="pop",e.push="push",e})({}),uo=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Sd(e){if(!e)if(ms){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),xd(e)}const Ed=/^[^#]+#/;function Td(e,t){return e.replace(Ed,"#")+t}function Ad(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 Gn=()=>({left:window.scrollX,top:window.scrollY});function Id(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=Ad(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 el(e,t){return(history.state?history.state.position-t:-1)+e}const $o=new Map;function Rd(e,t){$o.set(e,t)}function $d(e){const t=$o.get(e);return $o.delete(e),t}function Pd(e){return typeof e=="string"||e&&typeof e=="object"}function ta(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 sa=Symbol("");Se.MATCHER_NOT_FOUND+"",Se.NAVIGATION_GUARD_REDIRECT+"",Se.NAVIGATION_ABORTED+"",Se.NAVIGATION_CANCELLED+"",Se.NAVIGATION_DUPLICATED+"";function Ss(e,t){return he(new Error,{type:e,[sa]:!0},t)}function yt(e,t){return e instanceof Error&&sa in e&&(t==null||!!(e.type&t))}const Md=["params","query","hash"];function Od(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const s of Md)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function Ld(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;no&&Io(o)):[n&&Io(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function Nd(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=lt(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const Vd=Symbol(""),sl=Symbol(""),rr=Symbol(""),na=Symbol(""),Po=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 Bt(e,t,s,n,o,r=l=>l()){const l=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((i,a)=>{const f=g=>{g===!1?a(Ss(Se.NAVIGATION_ABORTED,{from:s,to:t})):g instanceof Error?a(g):Pd(g)?a(Ss(Se.NAVIGATION_GUARD_REDIRECT,{from:t,to:g})):(l&&n.enterCallbacks[o]===l&&typeof g=="function"&&l.push(g),i())},u=r(()=>e.call(n&&n.instances[o],t,s,f));let p=Promise.resolve(u);e.length<3&&(p=p.then(f)),p.catch(g=>a(g))})}function fo(e,t,s,n,o=r=>r()){const r=[];for(const l of e)for(const i in l.components){let a=l.components[i];if(!(t!=="beforeRouteEnter"&&!l.instances[i]))if(zi(a)){const f=(a.__vccOpts||a)[t];f&&r.push(Bt(f,s,n,l,i,o))}else{let f=a();r.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${i}" at "${l.path}"`);const p=rd(u)?u.default:u;l.mods[i]=u,l.components[i]=p;const g=(p.__vccOpts||p)[t];return g&&Bt(g,s,n,l,i,o)()}))}}return r}function jd(e,t){const s=[],n=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let l=0;lCs(f,i))?n.push(i):s.push(i));const a=e.matched[l];a&&(t.matched.find(f=>Cs(f,a))||o.push(a))}return[s,n,o]}let Dd=()=>location.protocol+"//"+location.host;function oa(e,t){const{pathname:s,search:n,hash:o}=t,r=e.indexOf("#");if(r>-1){let l=o.includes(e.slice(r))?e.slice(r).length:1,i=o.slice(l);return i[0]!=="/"&&(i="/"+i),Zr(i,"")}return Zr(s,e)+n+o}function Bd(e,t,s,n){let o=[],r=[],l=null;const i=({state:g})=>{const d=oa(e,location),T=s.value,I=t.value;let L=0;if(g){if(s.value=d,t.value=g,l&&l===T){l=null;return}L=I?g.position-I.position:0}else n(d);o.forEach($=>{$(s.value,T,{delta:L,type:Ro.pop,direction:L?L>0?uo.forward:uo.back:uo.unknown})})};function a(){l=s.value}function f(g){o.push(g);const d=()=>{const T=o.indexOf(g);T>-1&&o.splice(T,1)};return r.push(d),d}function u(){if(document.visibilityState==="hidden"){const{history:g}=window;if(!g.state)return;g.replaceState(he({},g.state,{scroll:Gn()}),"")}}function p(){for(const g of r)g();r=[],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:a,listen:f,destroy:p}}function nl(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?Gn():null}}function Fd(e){const{history:t,location:s}=window,n={value:oa(e,s)},o={value:t.state};o.value||r(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,f,u){const p=e.indexOf("#"),g=p>-1?(s.host&&document.querySelector("base")?e:e.slice(p))+a:Dd()+e+a;try{t[u?"replaceState":"pushState"](f,"",g),o.value=f}catch(d){console.error(d),s[u?"replace":"assign"](g)}}function l(a,f){r(a,he({},t.state,nl(o.value.back,a,o.value.forward,!0),f,{position:o.value.position}),!0),n.value=a}function i(a,f){const u=he({},o.value,t.state,{forward:a,scroll:Gn()});r(u.current,u,!0),r(a,he({},nl(n.value,a,null),{position:u.position+1},f),!1),n.value=a}return{location:n,state:o,push:i,replace:l}}function Ud(e){e=Sd(e);const t=Fd(e),s=Bd(e,t.state,t.location,t.replace);function n(r,l=!0){l||s.pauseListeners(),history.go(r)}const o=he({location:"",base:e,go:n,createHref:Td.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 Hd(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Ud(e)}let es=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Re=(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})(Re||{});const Wd={type:es.Static,value:""},Kd=/[a-zA-Z0-9_]/;function Gd(e){if(!e)return[[]];if(e==="/")return[[Wd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(d){throw new Error(`ERR (${s})/"${f}": ${d}`)}let s=Re.Static,n=s;const o=[];let r;function l(){r&&o.push(r),r=[]}let i=0,a,f="",u="";function p(){f&&(s===Re.Static?r.push({type:es.Static,value:f}):s===Re.Param||s===Re.ParamRegExp||s===Re.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),r.push({type:es.Param,value:f,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),f="")}function g(){f+=a}for(;it.length?t.length===1&&t[0]===He.Static+He.Segment?1:-1:0}function ra(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Qd={strict:!1,end:!0,sensitive:!1};function Zd(e,t,s){const n=Jd(Gd(e.path),s),o=he(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Xd(e,t){const s=[],n=new Map;t=Qr(Qd,t);function o(p){return n.get(p)}function r(p,g,d){const T=!d,I=il(p);I.aliasOf=d&&d.record;const L=Qr(t,p),$=[I];if("alias"in p){const y=typeof p.alias=="string"?[p.alias]:p.alias;for(const w of y)$.push(il(he({},I,{components:d?d.record.components:I.components,path:w,aliasOf:d?d.record:I})))}let m,_;for(const y of $){const{path:w}=y;if(g&&w[0]!=="/"){const Q=g.record.path,D=Q[Q.length-1]==="/"?"":"/";y.path=g.record.path+(w&&D+w)}if(m=Zd(y,g,L),d?d.alias.push(m):(_=_||m,_!==m&&_.alias.push(m),T&&p.name&&!al(m)&&l(p.name)),la(m)&&a(m),I.children){const Q=I.children;for(let D=0;D{l(_)}:Ks}function l(p){if(ta(p)){const g=n.get(p);g&&(n.delete(p),s.splice(s.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=s.indexOf(p);g>-1&&(s.splice(g,1),p.record.name&&n.delete(p.record.name),p.children.forEach(l),p.alias.forEach(l))}}function i(){return s}function a(p){const g=sp(p,s);s.splice(g,0,p),p.record.name&&!al(p)&&n.set(p.record.name,p)}function f(p,g){let d,T={},I,L;if("name"in p&&p.name){if(d=n.get(p.name),!d)throw Ss(Se.MATCHER_NOT_FOUND,{location:p});L=d.record.name,T=he(ll(g.params,d.keys.filter(_=>!_.optional).concat(d.parent?d.parent.keys.filter(_=>_.optional):[]).map(_=>_.name)),p.params&&ll(p.params,d.keys.map(_=>_.name))),I=d.stringify(T)}else if(p.path!=null)I=p.path,d=s.find(_=>_.re.test(I)),d&&(T=d.parse(I),L=d.record.name);else{if(d=g.name?n.get(g.name):s.find(_=>_.re.test(g.path)),!d)throw Ss(Se.MATCHER_NOT_FOUND,{location:p,currentLocation:g});L=d.record.name,T=he({},g.params,p.params),I=d.stringify(T)}const $=[];let m=d;for(;m;)$.unshift(m.record),m=m.parent;return{name:L,path:I,params:T,matched:$,meta:tp($)}}e.forEach(p=>r(p));function u(){s.length=0,n.clear()}return{addRoute:r,resolve:f,removeRoute:l,clearRoutes:u,getRoutes:i,getRecordMatcher:o}}function ll(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function il(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ep(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 ep(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 al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function tp(e){return e.reduce((t,s)=>he(t,s.meta),{})}function sp(e,t){let s=0,n=t.length;for(;s!==n;){const r=s+n>>1;ra(e,t[r])<0?n=r:s=r+1}const o=np(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function np(e){let t=e;for(;t=t.parent;)if(la(t)&&ra(e,t)===0)return t}function la({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function cl(e){const t=ot(rr),s=ot(na),n=ye(()=>{const a=O(e.to);return t.resolve(a)}),o=ye(()=>{const{matched:a}=n.value,{length:f}=a,u=a[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 d=ul(a[f-2]);return f>1&&ul(u)===d&&p[p.length-1].path!==d?p.findIndex(Cs.bind(null,a[f-2])):g}),r=ye(()=>o.value>-1&&ap(s.params,n.value.params)),l=ye(()=>o.value>-1&&o.value===s.matched.length-1&&ea(s.params,n.value.params));function i(a={}){if(ip(a)){const f=t[O(e.replace)?"replace":"push"](O(e.to)).catch(Ks);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:n,href:ye(()=>n.value.href),isActive:r,isExactActive:l,navigate:i}}function op(e){return e.length===1?e[0]:e}const rp=si({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:cl,setup(e,{slots:t}){const s=rs(cl(e)),{options:n}=ot(rr),o=ye(()=>({[fl(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[fl(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const r=t.default&&op(t.default(s));return e.custom?r:Zo("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),lp=rp;function ip(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 ap(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(!lt(o)||o.length!==n.length||n.some((r,l)=>r.valueOf()!==o[l].valueOf()))return!1}return!0}function ul(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const fl=(e,t,s)=>e??t??s,cp=si({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=ot(Po),o=ye(()=>e.route||n.value),r=ot(sl,0),l=ye(()=>{let f=O(r);const{matched:u}=o.value;let p;for(;(p=u[f])&&!p.components;)f++;return f}),i=ye(()=>o.value.matched[l.value]);Fs(sl,ye(()=>l.value+1)),Fs(Vd,i),Fs(Po,o);const a=ue();return Ge(()=>[a.value,i.value,e.name],([f,u,p],[g,d,T])=>{u&&(u.instances[p]=f,d&&d!==u&&f&&f===g&&(u.leaveGuards.size||(u.leaveGuards=d.leaveGuards),u.updateGuards.size||(u.updateGuards=d.updateGuards))),f&&u&&(!d||!Cs(u,d)||!g)&&(u.enterCallbacks[p]||[]).forEach(I=>I(f))},{flush:"post"}),()=>{const f=o.value,u=e.name,p=i.value,g=p&&p.components[u];if(!g)return dl(s.default,{Component:g,route:f});const d=p.props[u],T=d?d===!0?f.params:typeof d=="function"?d(f):d:null,L=Zo(g,he({},T,t,{onVnodeUnmounted:$=>{$.component.isUnmounted&&(p.instances[u]=null)},ref:a}));return dl(s.default,{Component:L,route:f})||L}}});function dl(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const up=cp;function fp(e){const t=Xd(e.routes,e),s=e.parseQuery||Ld,n=e.stringifyQuery||tl,o=e.history,r=Os(),l=Os(),i=Os(),a=Ba(Ot);let f=Ot;ms&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=ao.bind(null,A=>""+A),p=ao.bind(null,_d),g=ao.bind(null,tn);function d(A,K){let H,J;return ta(A)?(H=t.getRecordMatcher(A),J=K):J=A,t.addRoute(J,H)}function T(A){const K=t.getRecordMatcher(A);K&&t.removeRoute(K)}function I(){return t.getRoutes().map(A=>A.record)}function L(A){return!!t.getRecordMatcher(A)}function $(A,K){if(K=he({},K||a.value),typeof A=="string"){const b=co(s,A,K.path),S=t.resolve({path:b.path},K),R=o.createHref(b.fullPath);return he(b,S,{params:g(S.params),hash:tn(b.hash),redirectedFrom:void 0,href:R})}let H;if(A.path!=null)H=he({},A,{path:co(s,A.path,K.path).path});else{const b=he({},A.params);for(const S in b)b[S]==null&&delete b[S];H=he({},A,{params:p(b)}),K.params=p(K.params)}const J=t.resolve(H,K),ae=A.hash||"";J.params=u(g(J.params));const h=yd(n,he({},A,{hash:md(ae),path:J.path})),v=o.createHref(h);return he({fullPath:h,hash:ae,query:n===tl?Nd(A.query):A.query||{}},J,{redirectedFrom:void 0,href:v})}function m(A){return typeof A=="string"?co(s,A,a.value.path):he({},A)}function _(A,K){if(f!==A)return Ss(Se.NAVIGATION_CANCELLED,{from:K,to:A})}function y(A){return D(A)}function w(A){return y(he(m(A),{replace:!0}))}function Q(A,K){const H=A.matched[A.matched.length-1];if(H&&H.redirect){const{redirect:J}=H;let ae=typeof J=="function"?J(A,K):J;return typeof ae=="string"&&(ae=ae.includes("?")||ae.includes("#")?ae=m(ae):{path:ae},ae.params={}),he({query:A.query,hash:A.hash,params:ae.path!=null?{}:A.params},ae)}}function D(A,K){const H=f=$(A),J=a.value,ae=A.state,h=A.force,v=A.replace===!0,b=Q(H,J);if(b)return D(he(m(b),{state:typeof b=="object"?he({},ae,b.state):ae,force:h,replace:v}),K||H);const S=H;S.redirectedFrom=K;let R;return!h&&kd(n,J,H)&&(R=Ss(Se.NAVIGATION_DUPLICATED,{to:S,from:J}),at(J,J,!0,!1)),(R?Promise.resolve(R):q(S,J)).catch(C=>yt(C)?yt(C,Se.NAVIGATION_GUARD_REDIRECT)?C:qe(C):ne(C,S,J)).then(C=>{if(C){if(yt(C,Se.NAVIGATION_GUARD_REDIRECT))return D(he({replace:v},m(C.to),{state:typeof C.to=="object"?he({},ae,C.to.state):ae,force:h}),K||S)}else C=x(S,J,!0,v,ae);return te(S,J,C),C})}function U(A,K){const H=_(A,K);return H?Promise.reject(H):Promise.resolve()}function M(A){const K=cs.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext(A):A()}function q(A,K){let H;const[J,ae,h]=jd(A,K);H=fo(J.reverse(),"beforeRouteLeave",A,K);for(const b of J)b.leaveGuards.forEach(S=>{H.push(Bt(S,A,K))});const v=U.bind(null,A,K);return H.push(v),Xe(H).then(()=>{H=[];for(const b of r.list())H.push(Bt(b,A,K));return H.push(v),Xe(H)}).then(()=>{H=fo(ae,"beforeRouteUpdate",A,K);for(const b of ae)b.updateGuards.forEach(S=>{H.push(Bt(S,A,K))});return H.push(v),Xe(H)}).then(()=>{H=[];for(const b of h)if(b.beforeEnter)if(lt(b.beforeEnter))for(const S of b.beforeEnter)H.push(Bt(S,A,K));else H.push(Bt(b.beforeEnter,A,K));return H.push(v),Xe(H)}).then(()=>(A.matched.forEach(b=>b.enterCallbacks={}),H=fo(h,"beforeRouteEnter",A,K,M),H.push(v),Xe(H))).then(()=>{H=[];for(const b of l.list())H.push(Bt(b,A,K));return H.push(v),Xe(H)}).catch(b=>yt(b,Se.NAVIGATION_CANCELLED)?b:Promise.reject(b))}function te(A,K,H){i.list().forEach(J=>M(()=>J(A,K,H)))}function x(A,K,H,J,ae){const h=_(A,K);if(h)return h;const v=K===Ot,b=ms?history.state:{};H&&(J||v?o.replace(A.fullPath,he({scroll:v&&b&&b.scroll},ae)):o.push(A.fullPath,ae)),a.value=A,at(A,K,H,v),qe()}let N;function ie(){N||(N=o.listen((A,K,H)=>{if(!Wt.listening)return;const J=$(A),ae=Q(J,Wt.currentRoute.value);if(ae){D(he(ae,{replace:!0,force:!0}),J).catch(Ks);return}f=J;const h=a.value;ms&&Rd(el(h.fullPath,H.delta),Gn()),q(J,h).catch(v=>yt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_CANCELLED)?v:yt(v,Se.NAVIGATION_GUARD_REDIRECT)?(D(he(m(v.to),{force:!0}),J).then(b=>{yt(b,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&!H.delta&&H.type===Ro.pop&&o.go(-1,!1)}).catch(Ks),Promise.reject()):(H.delta&&o.go(-H.delta,!1),ne(v,J,h))).then(v=>{v=v||x(J,h,!1),v&&(H.delta&&!yt(v,Se.NAVIGATION_CANCELLED)?o.go(-H.delta,!1):H.type===Ro.pop&&yt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),te(J,h,v)}).catch(Ks)}))}let Pe=Os(),pe=Os(),X;function ne(A,K,H){qe(A);const J=pe.list();return J.length?J.forEach(ae=>ae(A,K,H)):console.error(A),Promise.reject(A)}function Be(){return X&&a.value!==Ot?Promise.resolve():new Promise((A,K)=>{Pe.add([A,K])})}function qe(A){return X||(X=!A,ie(),Pe.list().forEach(([K,H])=>A?H(A):K()),Pe.reset()),A}function at(A,K,H,J){const{scrollBehavior:ae}=e;if(!ms||!ae)return Promise.resolve();const h=!H&&$d(el(A.fullPath,0))||(J||!H)&&history.state&&history.state.scroll||null;return $t().then(()=>ae(A,K,h)).then(v=>v&&Id(v)).catch(v=>ne(v,A,K))}const ze=A=>o.go(A);let as;const cs=new Set,Wt={currentRoute:a,listening:!0,addRoute:d,removeRoute:T,clearRoutes:t.clearRoutes,hasRoute:L,getRoutes:I,resolve:$,options:e,push:y,replace:w,go:ze,back:()=>ze(-1),forward:()=>ze(1),beforeEach:r.add,beforeResolve:l.add,afterEach:i.add,onError:pe.add,isReady:Be,install(A){A.component("RouterLink",lp),A.component("RouterView",up),A.config.globalProperties.$router=Wt,Object.defineProperty(A.config.globalProperties,"$route",{enumerable:!0,get:()=>O(a)}),ms&&!as&&a.value===Ot&&(as=!0,y(o.location).catch(J=>{}));const K={};for(const J in Ot)Object.defineProperty(K,J,{get:()=>a.value[J],enumerable:!0});A.provide(rr,Wt),A.provide(na,Bl(K)),A.provide(Po,a);const H=A.unmount;cs.add(A),A.unmount=function(){cs.delete(A),cs.size<1&&(f=Ot,N&&N(),N=null,a.value=Ot,as=!1,X=!1),H()}}};function Xe(A){return A.reduce((K,H)=>K.then(()=>M(H)),Promise.resolve())}return Wt}const dp={class:"card"},pp={key:0,class:"flex flex-wrap items-center justify-between gap-3"},hp={key:1,class:"text-sm muted"},mp={key:2,class:"flex flex-col gap-3 sm:flex-row sm:items-end"},gp={class:"flex-1"},vp=["value"],_p=["disabled"],bp={key:0,class:"animate-spin"},ia={__name:"StartPanel",setup(e){const t=Ht(),s=is(),n=ue(""),o=ye(()=>t.configList.filter(l=>!t.instanceList.some(i=>i.file_name===l.file_name)));Ge(o,l=>{l.some(i=>i.file_name===n.value)||(n.value=l.length?l[0].file_name:"")},{immediate:!0});const r=()=>{if(!n.value){s.toast.error("请先选择一个配置");return}t.startVnt(n.value)};return(l,i)=>{const a=yn("router-link");return k(),E("div",dp,[i[6]||(i[6]=c("h2",{class:"mb-4 text-base font-bold text-slate-900 dark:text-white"},"启动组网",-1)),O(t).configList.length===0?(k(),E("div",pp,[i[2]||(i[2]=c("p",{class:"text-sm muted"},"还没有任何配置,先创建一个组网配置吧。",-1)),le(a,{to:"/config",class:"btn-primary btn-sm"},{default:Te(()=>[...i[1]||(i[1]=[oe("去新建配置",-1)])]),_:1})])):o.value.length===0?(k(),E("div",hp," 所有配置均已启动。 ")):(k(),E("div",mp,[c("div",gp,[i[4]||(i[4]=c("label",{class:"mb-1.5 block text-xs font-medium muted"},"选择配置",-1)),_e(c("select",{"onUpdate:modelValue":i[0]||(i[0]=f=>n.value=f),class:"input"},[i[3]||(i[3]=c("option",{value:"",disabled:""},"请选择配置...",-1)),(k(!0),E(re,null,Ce(o.value,f=>(k(),E("option",{key:f.file_name,value:f.file_name},F(f.config_name||f.file_name),9,vp))),128))],512),[[Di,n.value]])]),c("button",{class:"btn-primary px-8",disabled:!n.value||!!O(t).loadingMap[n.value],onClick:r},[O(t).loadingMap[n.value]?(k(),E("span",bp,"⟳")):fe("",!0),i[5]||(i[5]=oe(" 启动 ",-1))],8,_p)]))])}}},xp={class:"flex items-center justify-between gap-2"},yp=["title"],kp={class:"mt-2 text-sm"},wp={class:"ml-1 font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Cp={class:"mt-3 flex gap-4 text-xs muted"},Sp={class:"font-bold tabular-nums text-blue-600 dark:text-blue-400"},Ep={class:"font-bold tabular-nums text-green-600 dark:text-green-400"},Tp={class:"font-bold tabular-nums text-slate-400"},Ap={class:"mt-4 flex flex-wrap justify-end gap-2"},Ip=["disabled"],Rp={key:0,class:"animate-spin"},$p=["disabled"],Pp={key:0,class:"animate-spin"},Mp=["disabled"],Op={key:0,class:"animate-spin"},aa={__name:"InstanceCard",props:{inst:{type:Object,required:!0},selectable:{type:Boolean,default:!1}},setup(e){const t=e,s=Ht(),n=is(),o=ye(()=>s.infoOf(t.inst.file_name)),r=ye(()=>!!s.loadingMap[t.inst.file_name]),l=g=>g==="running"?"badge-green":g==="starting"?"badge-blue":"badge-gray",i=g=>g==="running"?"运行中":g==="starting"?"启动中":"已停止",a=()=>{t.selectable&&(s.selectedInstance=t.inst.file_name)},f=async()=>{await n.confirm({title:"停止组网",message:`确定要停止 ${t.inst.file_name} 吗?`,danger:!0,confirmText:"停止"})&&s.stopVnt(t.inst.file_name)},u=async()=>{await n.confirm({title:"重启组网",message:`确定要重启 ${t.inst.file_name} 吗?`})&&s.restartVnt(t.inst.file_name)},p=async()=>{await n.confirm({title:"移除实例",message:`确定要移除已停止的实例 ${t.inst.file_name} 吗?`,danger:!0,confirmText:"移除"})&&s.dismissInstance(t.inst.file_name)};return(g,d)=>(k(),E("div",{class:G(["card",[e.selectable?"cursor-pointer":"",e.selectable&&O(s).selectedInstance===e.inst.file_name?"ring-2 ring-indigo-500 dark:ring-indigo-400":""]]),onClick:a},[c("div",xp,[c("h3",{class:"truncate text-base font-bold text-slate-900 dark:text-white",title:e.inst.file_name},F(e.inst.config_name||e.inst.file_name),9,yp),c("span",{class:G(["shrink-0",l(e.inst.status)])},F(i(e.inst.status)),3)]),c("div",kp,[d[0]||(d[0]=c("span",{class:"muted"},"虚拟 IP:",-1)),c("span",wp,F(o.value.ip||"-"),1)]),c("div",Cp,[c("span",null,[d[1]||(d[1]=oe(" 在线 ",-1)),c("span",Sp,F(o.value.online_client_num||0),1)]),c("span",null,[d[2]||(d[2]=oe(" 直连 ",-1)),c("span",Ep,F(o.value.direct_client_num||0),1)]),c("span",null,[d[3]||(d[3]=oe(" 离线 ",-1)),c("span",Tp,F(o.value.offline_client_num||0),1)])]),c("div",Ap,[e.inst.status==="running"||e.inst.status==="stopped"?(k(),E("button",{key:0,class:"btn-primary btn-sm",disabled:r.value,onClick:xs(u,["stop"])},[r.value?(k(),E("span",Rp,"⟳")):fe("",!0),oe(" "+F(e.inst.status==="stopped"?"重新启动":"重启"),1)],8,Ip)):fe("",!0),e.inst.status!=="stopped"?(k(),E("button",{key:1,class:"btn-danger btn-sm",disabled:r.value,onClick:xs(f,["stop"])},[r.value?(k(),E("span",Pp,"⟳")):fe("",!0),d[4]||(d[4]=oe(" 停止 ",-1))],8,$p)):fe("",!0),e.inst.status==="stopped"?(k(),E("button",{key:2,class:"btn-ghost btn-sm",disabled:r.value,onClick:xs(p,["stop"])},[r.value?(k(),E("span",Op,"⟳")):fe("",!0),d[5]||(d[5]=oe(" 移除 ",-1))],8,Mp)):fe("",!0)])],2))}},Lp={class:"card p-12 text-center text-slate-500 dark:text-slate-400"},ln={__name:"EmptyState",props:{text:{type:String,default:"暂无数据"}},setup(e){return(t,s)=>(k(),E("div",Lp,[s[0]||(s[0]=c("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"},[c("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)),c("p",null,F(e.text),1)]))}},Np={class:"space-y-6"},Vp={class:"flex flex-wrap items-end justify-between gap-4"},jp={class:"page-subtitle"},Dp={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},Bp={class:"card"},Fp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Up={class:"ml-1 text-sm font-normal muted"},Hp={class:"card"},Wp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Kp={class:"card"},Gp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},qp={class:"card"},zp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Jp={class:"text-sm font-normal muted"},Yp={key:1,class:"muted"},Qp={class:"mb-3 flex items-center justify-between"},Zp={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2"},Xp={__name:"DashboardView",setup(e){const t=Ht(),s=ye(()=>Object.values(t.instances).reduce((r,l)=>r+(l?.online_client_num||0),0)),n=ye(()=>{const r=t.instanceList.filter(i=>i.status==="running");return{connected:r.filter(i=>t.instances[i.file_name]?.server_info?.some(f=>f.connected)).length,total:r.length}}),o=ye(()=>t.runningCount>0?`运行中 ${t.runningCount} 个实例`:t.startingCount>0?"有实例正在启动...":"全部实例已停止");return(r,l)=>{const i=yn("router-link");return k(),E("div",Np,[c("div",Vp,[c("div",null,[l[0]||(l[0]=c("h1",{class:"page-title"},"总览",-1)),c("p",jp,F(o.value),1)]),le(i,{to:"/config",class:"btn-ghost btn-sm"},{default:Te(()=>[...l[1]||(l[1]=[oe("管理配置",-1)])]),_:1})]),c("div",Dp,[c("div",Bp,[l[2]||(l[2]=c("div",{class:"text-xs font-medium muted"},"运行实例",-1)),c("div",Fp,[oe(F(O(t).runningCount),1),c("span",Up,"/ "+F(O(t).instanceList.length),1)])]),c("div",Hp,[l[3]||(l[3]=c("div",{class:"text-xs font-medium muted"},"配置总数",-1)),c("div",Wp,F(O(t).configList.length),1)]),c("div",Kp,[l[4]||(l[4]=c("div",{class:"text-xs font-medium muted"},"在线设备",-1)),c("div",Gp,F(s.value),1)]),c("div",qp,[l[5]||(l[5]=c("div",{class:"text-xs font-medium muted"},"服务器连接",-1)),c("div",zp,[n.value.total>0?(k(),E(re,{key:0},[c("span",{class:G(n.value.connected>0?"text-green-600 dark:text-green-400":"text-red-500")},F(n.value.connected),3),c("span",Jp,"/ "+F(n.value.total)+" 已连接",1)],64)):(k(),E("span",Yp,"-"))])])]),le(ia),c("div",null,[c("div",Qp,[l[7]||(l[7]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"实例概览",-1)),le(i,{to:"/instances",class:"text-sm font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400"},{default:Te(()=>[...l[6]||(l[6]=[oe("查看详情 →",-1)])]),_:1})]),O(t).instanceList.length===0?(k(),De(ln,{key:0,text:O(t).configList.length===0?"暂无配置,请先新建配置":"暂无运行中的组网,请在上方选择配置启动"},null,8,["text"])):(k(),E("div",Zp,[(k(!0),E(re,null,Ce(O(t).instanceList,a=>(k(),De(aa,{key:a.file_name,inst:a},null,8,["inst"]))),128))]))])])}}},e0={class:"space-y-6"},t0={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2"},s0={class:"card"},n0={class:"mb-4 text-lg font-bold text-slate-900 dark:text-white"},o0={class:"ml-2 text-sm font-medium text-indigo-600 dark:text-indigo-400"},r0={class:"grid grid-cols-1 gap-4 text-sm md:grid-cols-2"},l0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},i0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},a0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},c0={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"},f0={class:"font-mono text-slate-900 dark:text-white"},d0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},p0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},h0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},m0={class:"font-mono text-indigo-600 dark:text-indigo-400"},g0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},v0=["title"],_0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},b0={class:"text-slate-900 dark:text-white"},x0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},y0=["title"],k0={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},w0={class:"text-sm text-slate-600 dark:text-slate-300"},C0={class:"mt-4"},S0={class:"flex flex-wrap gap-2"},E0={key:0,class:"text-xs text-slate-400"},T0={class:"card p-0 overflow-hidden"},A0={class:"custom-scrollbar max-h-[400px] overflow-x-auto"},I0={class:"table"},R0={class:"font-mono"},$0={class:"tabular-nums"},P0={key:0},M0={__name:"InstancesView",setup(e){const t=Ht();return(s,n)=>(k(),E("div",e0,[n[13]||(n[13]=c("div",null,[c("h1",{class:"page-title"},"实例"),c("p",{class:"page-subtitle"},"管理组网实例,点击卡片查看详情")],-1)),le(ia),O(t).instanceList.length===0?(k(),De(ln,{key:0,text:"暂无运行中的组网,请在上方选择配置启动"})):(k(),E("div",t0,[(k(!0),E(re,null,Ce(O(t).instanceList,o=>(k(),De(aa,{key:o.file_name,inst:o,selectable:""},null,8,["inst"]))),128))])),O(t).selectedInstance&&O(t).selectedInfo?(k(),E(re,{key:2},[c("div",s0,[c("h2",n0,[n[0]||(n[0]=oe(" 网络详情 ",-1)),c("span",o0,F(O(t).selectedConfigName),1)]),c("div",r0,[c("div",l0,[n[1]||(n[1]=c("span",{class:"muted"},"虚拟 IP / 掩码",-1)),c("span",i0,F(O(t).selectedInfo.ip||"-")+" / "+F(O(t).selectedInfo.prefix_len||"-"),1)]),c("div",a0,[n[2]||(n[2]=c("span",{class:"muted"},"网关",-1)),c("span",c0,F(O(t).selectedInfo.gateway||"-"),1)]),c("div",u0,[n[3]||(n[3]=c("span",{class:"muted"},"网络编号",-1)),c("span",f0,F(O(t).selectedInfo.network_code||"-"),1)]),c("div",d0,[n[4]||(n[4]=c("span",{class:"muted"},"MTU",-1)),c("span",p0,F(O(t).selectedInfo.mtu||""),1)]),c("div",h0,[n[5]||(n[5]=c("span",{class:"muted"},"NAT 类型",-1)),c("span",m0,F(O(t).selectedInfo.nat_type||"Unknown"),1)]),c("div",g0,[n[6]||(n[6]=c("span",{class:"muted"},"Public IPv6",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-slate-900 dark:text-white",title:O(t).selectedInfo.public_ipv6},F(O(t).selectedInfo.public_ipv6||"-"),9,v0)]),c("div",_0,[n[7]||(n[7]=c("span",{class:"muted"},"设备名称",-1)),c("span",b0,F(O(t).selectedInfo.name||"-"),1)]),c("div",x0,[n[8]||(n[8]=c("span",{class:"muted"},"设备 ID",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-xs text-slate-500 dark:text-slate-400",title:O(t).selectedInfo.device_id},F(O(t).selectedInfo.device_id||"-"),9,y0)])]),c("div",k0,[(k(),E(re,null,Ce([{key:"encrypt",label:"加密"},{key:"compress",label:"压缩"},{key:"fec",label:"FEC纠错"},{key:"rtx",label:"QUIC传输"}],o=>c("div",{key:o.key,class:"flex items-center gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50"},[c("span",{class:G(["h-2 w-2 rounded-full",O(t).selectedInfo[o.key]?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),c("span",w0,F(o.label),1)])),64))]),c("div",C0,[n[9]||(n[9]=c("span",{class:"mb-2 block text-sm muted"},"Public IPv4s",-1)),c("div",S0,[(k(!0),E(re,null,Ce(O(t).selectedInfo.public_ipv4s,o=>(k(),E("span",{key:o,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"},F(o),1))),128)),!O(t).selectedInfo.public_ipv4s||O(t).selectedInfo.public_ipv4s.length===0?(k(),E("span",E0,"无")):fe("",!0)])])]),c("div",T0,[n[12]||(n[12]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"服务器连接列表")],-1)),c("div",A0,[c("table",I0,[n[11]||(n[11]=c("thead",null,[c("tr",null,[c("th",null,"地址"),c("th",null,"状态"),c("th",null,"延迟"),c("th",null,"版本")])],-1)),c("tbody",null,[(k(!0),E(re,null,Ce(O(t).selectedInfo.server_info,(o,r)=>(k(),E("tr",{key:r},[c("td",R0,F(o.server),1),c("td",null,[c("span",{class:G(o.connected?"badge-green":"badge-red")},F(o.connected?"已连接":"未连接"),3)]),c("td",$0,F(o.server_rtt?o.server_rtt+" ms":"-"),1),c("td",null,F(o.server_version||"-"),1)]))),128)),!O(t).selectedInfo.server_info||O(t).selectedInfo.server_info.length===0?(k(),E("tr",P0,[...n[10]||(n[10]=[c("td",{colspan:"4",class:"text-center text-slate-400"},"暂无数据",-1)])])):fe("",!0)])])])])],64)):fe("",!0)]))}},Mo=()=>({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:"",password:"",cert_mode:"skip",fingerprint:"",udp_stun:[],tcp_stun:[],tunnel_port:null}),pl=e=>{const t=Mo(),s=e.split(` -`);for(const n of s){const o=n.trim();if(!(!o||o.startsWith("#"))){if(o.includes("config_name")){const r=o.match(/config_name\s*=\s*"([^"]*)"/);r&&(t.config_name=r[1])}else if(o.includes("network_code")){const r=o.match(/network_code\s*=\s*"([^"]*)"/);r&&(t.network_code=r[1])}else if(o.startsWith("server")){const r=o.match(/server\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.server=l.map(i=>i.replace(/"/g,"")))}}else if(o.includes("ip =")){const r=o.match(/ip\s*=\s*"([^"]*)"/);r&&(t.ip=r[1])}else if(o.includes("mtu =")){const r=o.match(/mtu\s*=\s*(\d+)/);r&&(t.mtu=parseInt(r[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 r=o.match(/input\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.input=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("output")){const r=o.match(/output\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.output=l.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 r=o.match(/port_mapping\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.port_mapping=l.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 r=o.match(/device_name\s*=\s*"([^"]*)"/);r&&(t.device_name=r[1])}else if(o.includes("device_id")){const r=o.match(/device_id\s*=\s*"([^"]*)"/);r&&(t.device_id=r[1])}else if(o.includes("tun_name")){const r=o.match(/tun_name\s*=\s*"([^"]*)"/);r&&(t.tun_name=r[1])}else if(o.includes("password =")){const r=o.match(/password\s*=\s*"([^"]*)"/);r&&(t.password=r[1])}else if(o.includes("cert_mode")){const r=o.match(/cert_mode\s*=\s*"([^"]*)"/);if(r){const l=r[1];l.startsWith("finger:")?(t.cert_mode="finger",t.fingerprint=l.substring(7)):t.cert_mode=l}}else if(o.startsWith("udp_stun")){const r=o.match(/udp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.udp_stun=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("tcp_stun")){const r=o.match(/tcp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.tcp_stun=l.map(i=>i.replace(/"/g,"")))}}}}return t},po=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(a=>a.trim());s.length>0&&(t+=`# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) -`,t+=`# dynamic 协议使用dns txt解析记录值 -`,t+=`server = [${s.map(a=>`"${a}"`).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(a=>a.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(a=>`"${a}"`).join(", ")}] -`);const o=e.output.filter(a=>a.trim());o.length>0&&(t+=` -# 出栈允许网段,用于点对网,允许指定网段的转发 -`,t+=`output = [${o.map(a=>`"${a}"`).join(", ")}] -`),e.no_nat&&(t+=` -# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网 -`,t+=`# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 -`,t+=`no_nat = true -`),e.no_tun&&(t+=` -# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 -`,t+=`no_tun = true -`);const r=e.port_mapping.filter(a=>a.trim());r.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 = [${r.map(a=>`"${a}"`).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}" -`),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 l=e.udp_stun.filter(a=>a.trim());l.length>0&&(t+=` -# 自定义UDP STUN地址,不设置则用默认stun -`,t+=`udp_stun = [${l.map(a=>`"${a}"`).join(", ")}] -`);const i=e.tcp_stun.filter(a=>a.trim());return i.length>0&&(t+=` -# 自定义TCP STUN地址,不设置则用默认stun -`,t+=`tcp_stun = [${i.map(a=>`"${a}"`).join(", ")}] -`),t},O0=`# 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" - -# --- 安全配置 --- - -# 加密密码 (可选) -# 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"]`,L0={class:"text-lg font-bold text-slate-900 dark:text-white"},N0={class:"flex items-center gap-4"},V0={class:"flex rounded-lg border border-slate-300 bg-slate-100 p-1 dark:border-slate-600 dark:bg-slate-800"},j0={key:0,class:"text-sm text-slate-500 font-mono hidden md:block"},D0={class:"h-full overflow-y-auto scrollbar-hide p-6"},B0={class:"max-w-4xl mx-auto space-y-6"},F0={class:"card"},U0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},H0={class:"mt-4"},W0={class:"space-y-2"},K0=["onUpdate:modelValue"],G0=["onClick"],q0={class:"card"},z0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},J0={class:"card"},Y0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Q0={class:"card"},Z0={class:"space-y-4"},X0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},eh={key:0},th={class:"card"},sh={class:"space-y-4"},nh={class:"space-y-2"},oh=["onUpdate:modelValue"],rh=["onClick"],lh={class:"space-y-2"},ih=["onUpdate:modelValue"],ah=["onClick"],ch={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},uh={class:"card"},fh={class:"space-y-4"},dh={class:"space-y-2"},ph=["onUpdate:modelValue"],hh=["onClick"],mh={class:"card"},gh={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},vh={class:"card"},_h={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},bh={class:"space-y-2"},xh=["onUpdate:modelValue"],yh=["onClick"],kh={class:"space-y-2"},wh=["onUpdate:modelValue"],Ch=["onClick"],Sh={class:"h-full"},Eh={class:"flex-1 text-left text-xs text-slate-500"},Th={key:0},Ah={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",ds="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",ps="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",Lt="text-md mb-4 flex items-center font-bold text-slate-900 dark:text-white",Ih={__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=is(),r=ue(""),l=ue(""),i=ue("new"),a=ue("form"),f=ue(""),u=ue(!1),p=ue(!1),g=ue(!1),d=ue(Mo());Ge(()=>s.show,async $=>{if($)if(l.value=s.fileName||"",i.value=s.fileName?"edit":"new",a.value="form",u.value=!1,p.value=!1,s.fileName)try{const m=await sf(s.fileName);r.value=m,f.value=m,g.value=!0,d.value=pl(m),$t(()=>{g.value=!1})}catch(m){o.toast.error("获取配置失败: "+m.message),n("close")}else f.value="",d.value=Mo(),r.value=O0});const T=()=>{a.value==="toml"?(a.value="form",g.value=!0,d.value=pl(r.value),$t(()=>{g.value=!1})):a.value="form"},I=()=>{a.value==="form"&&(p.value?(r.value=po(d.value),p.value=!1):f.value&&!u.value?r.value=f.value:r.value=po(d.value)),a.value="toml"};Ge(r,($,m)=>{a.value==="toml"&&m!==void 0&&(u.value=!0)}),Ge(d,()=>{a.value==="form"&&s.show&&!g.value&&(p.value=!0)},{deep:!0});const L=async()=>{try{let $=r.value;if(a.value==="form"){if(!d.value.network_code.trim()){o.toast.error("请填写网络编号");return}if(d.value.server.filter(_=>_.trim()).length===0){o.toast.error("请至少填写一个服务器地址");return}$=po(d.value)}await nf(l.value||null,$),o.toast.success("配置已保存"),n("close"),n("saved")}catch($){o.toast.error("保存失败: "+$.message)}};return($,m)=>(k(),De(sr,{show:e.show,"mask-closable":!1,"panel-class":"w-full max-w-6xl h-[85vh]",onClose:m[26]||(m[26]=_=>n("close"))},{header:Te(()=>[c("h3",L0,F(i.value==="new"?"新建配置":"编辑配置"),1),c("div",N0,[c("div",V0,[c("button",{onClick:T,class:G([a.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"])},[...m[27]||(m[27]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 表单模式 ",-1)])],2),c("button",{onClick:I,class:G([a.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"])},[...m[28]||(m[28]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})],-1),oe(" TOML模式 ",-1)])],2)]),l.value?(k(),E("div",j0,F(l.value),1)):fe("",!0)])]),body:Te(()=>[_e(c("div",D0,[c("div",B0,[c("div",F0,[c("h4",{class:G(Lt)},[...m[29]||(m[29]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),oe(" 基础配置 ",-1)])]),c("div",U0,[c("div",null,[m[30]||(m[30]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"配置名称",-1)),_e(c("input",{"onUpdate:modelValue":m[0]||(m[0]=_=>d.value.config_name=_),type:"text",placeholder:"例如: 我的VPN配置",class:"input"},null,512),[[Oe,d.value.config_name]])]),c("div",null,[m[31]||(m[31]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 网络编号 "),c("span",{class:"text-red-500"},"*")],-1)),_e(c("input",{"onUpdate:modelValue":m[1]||(m[1]=_=>d.value.network_code=_),type:"text",placeholder:"例如: my_network",required:"",class:"input"},null,512),[[Oe,d.value.network_code]])])]),c("div",H0,[m[34]||(m[34]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 服务器地址 "),c("span",{class:"text-red-500"},"*"),c("span",{class:"text-xs text-slate-500 ml-2"},"支持 quic:// tcp:// wss:// dynamic://")],-1)),c("div",W0,[(k(!0),E(re,null,Ce(d.value.server,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.server[y]=w,type:"text",placeholder:"例如: quic://1.2.3.4:29872",class:"input flex-1"},null,8,K0),[[Oe,d.value.server[y]]]),d.value.server.length>1?(k(),E("button",{key:0,onClick:w=>d.value.server.splice(y,1),class:G(ds)},[...m[32]||(m[32]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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,G0)):fe("",!0)]))),128)),c("button",{onClick:m[2]||(m[2]=_=>d.value.server.push("")),class:G(ps)},[...m[33]||(m[33]=[c("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),oe(" 添加服务器 ",-1)])])])])]),c("div",q0,[c("h4",{class:G(Lt)},[...m[35]||(m[35]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 网络设置 ",-1)])]),c("div",z0,[c("div",null,[m[36]||(m[36]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 自定义虚拟IP "),c("span",{class:"text-xs text-slate-500 ml-1"},"(可选)")],-1)),_e(c("input",{"onUpdate:modelValue":m[3]||(m[3]=_=>d.value.ip=_),type:"text",placeholder:"例如: 10.26.0.2",class:"input"},null,512),[[Oe,d.value.ip]])]),c("div",null,[m[37]||(m[37]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"MTU",-1)),_e(c("input",{"onUpdate:modelValue":m[4]||(m[4]=_=>d.value.mtu=_),type:"number",placeholder:"1380",class:"input"},null,512),[[Oe,d.value.mtu,void 0,{number:!0}]])]),c("div",null,[m[38]||(m[38]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"隧道端口",-1)),_e(c("input",{"onUpdate:modelValue":m[5]||(m[5]=_=>d.value.tunnel_port=_),type:"number",placeholder:"0 (自动分配)",class:"input"},null,512),[[Oe,d.value.tunnel_port,void 0,{number:!0}]])])])]),c("div",J0,[c("h4",{class:G(Lt)},[...m[39]||(m[39]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),oe(" 传输优化 ",-1)])]),c("div",Y0,[c("label",{class:G(Yt)},[m[40]||(m[40]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"QUIC传输优化"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"重传丢包")],-1)),_e(c("input",{"onUpdate:modelValue":m[6]||(m[6]=_=>d.value.rtx=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.rtx]])]),c("label",{class:G(Yt)},[m[41]||(m[41]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"FEC前向纠错"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"损失部分带宽提升稳定性")],-1)),_e(c("input",{"onUpdate:modelValue":m[7]||(m[7]=_=>d.value.fec=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.fec]])]),c("label",{class:G(Yt)},[m[42]||(m[42]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"LZ4压缩"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"减少传输数据量")],-1)),_e(c("input",{"onUpdate:modelValue":m[8]||(m[8]=_=>d.value.compress=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.compress]])]),c("label",{class:G(Yt)},[m[43]||(m[43]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭P2P打洞"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅通过服务器中转")],-1)),_e(c("input",{"onUpdate:modelValue":m[9]||(m[9]=_=>d.value.no_punch=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.no_punch]])])])]),c("div",Q0,[c("h4",{class:G(Lt)},[...m[44]||(m[44]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 安全配置 ",-1)])]),c("div",Z0,[c("div",X0,[c("div",null,[m[45]||(m[45]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"组网加密密码(连接公共服务器时建议填写,同一组网密码需要相同)",-1)),_e(c("input",{"onUpdate:modelValue":m[10]||(m[10]=_=>d.value.password=_),type:"password",placeholder:"留空则不加密",class:"input"},null,512),[[Oe,d.value.password]])]),c("div",null,[m[47]||(m[47]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"服务端证书校验模式",-1)),_e(c("select",{"onUpdate:modelValue":m[11]||(m[11]=_=>d.value.cert_mode=_),class:"input"},[...m[46]||(m[46]=[c("option",{value:"skip"},"跳过验证 (默认)",-1),c("option",{value:"standard"},"系统证书验证",-1),c("option",{value:"finger"},"证书指纹验证",-1)])],512),[[Di,d.value.cert_mode]])])]),d.value.cert_mode==="finger"?(k(),E("div",eh,[m[48]||(m[48]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 证书指纹 "),c("span",{class:"text-xs text-slate-500 ml-1"},"(服务端启动时日志会输出指纹)")],-1)),_e(c("input",{"onUpdate:modelValue":m[12]||(m[12]=_=>d.value.fingerprint=_),type:"text",placeholder:"例如: 3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1",class:"input font-mono text-sm"},null,512),[[Oe,d.value.fingerprint]])])):fe("",!0)])]),c("div",th,[c("h4",{class:G(Lt)},[...m[49]||(m[49]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" NAT与路由 (点对网) ",-1)])]),c("div",sh,[c("div",null,[m[51]||(m[51]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 入栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR,目标IP")],-1)),c("div",nh,[(k(!0),E(re,null,Ce(d.value.input,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.input[y]=w,type:"text",placeholder:"例如: 192.168.0.0/24,10.26.0.2",class:"input flex-1"},null,8,oh),[[Oe,d.value.input[y]]]),c("button",{onClick:w=>d.value.input.splice(y,1),class:G(ds)},[...m[50]||(m[50]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,rh)]))),128)),c("button",{onClick:m[13]||(m[13]=_=>d.value.input.push("")),class:G(ps)}," + 添加入栈网段 ")])]),c("div",null,[m[53]||(m[53]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 出栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR (允许转发的网段)")],-1)),c("div",lh,[(k(!0),E(re,null,Ce(d.value.output,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.output[y]=w,type:"text",placeholder:"例如: 0.0.0.0/0",class:"input flex-1"},null,8,ih),[[Oe,d.value.output[y]]]),c("button",{onClick:w=>d.value.output.splice(y,1),class:G(ds)},[...m[52]||(m[52]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,ah)]))),128)),c("button",{onClick:m[14]||(m[14]=_=>d.value.output.push("")),class:G(ps)}," + 添加出栈网段 ")])]),c("div",ch,[c("label",{class:G(Yt)},[m[54]||(m[54]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭内置NAT"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"使用系统网卡转发")],-1)),_e(c("input",{"onUpdate:modelValue":m[15]||(m[15]=_=>d.value.no_nat=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.no_nat]])]),c("label",{class:G(Yt)},[m[55]||(m[55]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭TUN网卡"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅作流量出口或端口映射")],-1)),_e(c("input",{"onUpdate:modelValue":m[16]||(m[16]=_=>d.value.no_tun=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.no_tun]])])])])]),c("div",uh,[c("h4",{class:G(Lt)},[...m[56]||(m[56]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 端口映射 ",-1)])]),c("div",fh,[c("div",null,[m[58]||(m[58]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[oe(" 映射规则 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: 协议://监听地址-虚拟IP-目标地址")],-1)),c("div",dh,[(k(!0),E(re,null,Ce(d.value.port_mapping,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.port_mapping[y]=w,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,ph),[[Oe,d.value.port_mapping[y]]]),c("button",{onClick:w=>d.value.port_mapping.splice(y,1),class:G(ds)},[...m[57]||(m[57]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,hh)]))),128)),c("button",{onClick:m[17]||(m[17]=_=>d.value.port_mapping.push("")),class:G(ps)}," + 添加映射规则 ")])]),c("label",{class:G(Yt)},[m[59]||(m[59]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"允许作为映射出口"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"允许其他设备使用本机作跳板")],-1)),_e(c("input",{"onUpdate:modelValue":m[18]||(m[18]=_=>d.value.allow_mapping=_),type:"checkbox",class:G(Jt)},null,512),[[zt,d.value.allow_mapping]])])])]),c("div",mh,[c("h4",{class:G(Lt)},[...m[60]||(m[60]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" 设备配置 ",-1)])]),c("div",gh,[c("div",null,[m[61]||(m[61]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备名称",-1)),_e(c("input",{"onUpdate:modelValue":m[19]||(m[19]=_=>d.value.device_name=_),type:"text",placeholder:"默认为主机名",class:"input"},null,512),[[Oe,d.value.device_name]])]),c("div",null,[m[62]||(m[62]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备ID",-1)),_e(c("input",{"onUpdate:modelValue":m[20]||(m[20]=_=>d.value.device_id=_),type:"text",placeholder:"自动生成",class:"input"},null,512),[[Oe,d.value.device_id]])]),c("div",null,[m[63]||(m[63]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"虚拟网卡名",-1)),_e(c("input",{"onUpdate:modelValue":m[21]||(m[21]=_=>d.value.tun_name=_),type:"text",placeholder:"默认为vnt-tun",class:"input"},null,512),[[Oe,d.value.tun_name]])])])]),c("div",vh,[c("h4",{class:G(Lt)},[...m[64]||(m[64]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),oe(" STUN配置 (高级) ",-1)])]),c("div",_h,[c("div",null,[m[66]||(m[66]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"UDP STUN服务器",-1)),c("div",bh,[(k(!0),E(re,null,Ce(d.value.udp_stun,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.udp_stun[y]=w,type:"text",placeholder:"例如: stun.l.google.com:19302",class:"input flex-1"},null,8,xh),[[Oe,d.value.udp_stun[y]]]),c("button",{onClick:w=>d.value.udp_stun.splice(y,1),class:G(ds)},[...m[65]||(m[65]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,yh)]))),128)),c("button",{onClick:m[22]||(m[22]=_=>d.value.udp_stun.push("")),class:G(ps)}," + 添加UDP STUN ")])]),c("div",null,[m[68]||(m[68]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"TCP STUN服务器",-1)),c("div",kh,[(k(!0),E(re,null,Ce(d.value.tcp_stun,(_,y)=>(k(),E("div",{key:y,class:"flex gap-2"},[_e(c("input",{"onUpdate:modelValue":w=>d.value.tcp_stun[y]=w,type:"text",placeholder:"例如: stun.nextcloud.com:443",class:"input flex-1"},null,8,wh),[[Oe,d.value.tcp_stun[y]]]),c("button",{onClick:w=>d.value.tcp_stun.splice(y,1),class:G(ds)},[...m[67]||(m[67]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Ch)]))),128)),c("button",{onClick:m[23]||(m[23]=_=>d.value.tcp_stun.push("")),class:G(ps)}," + 添加TCP STUN ")])])])])])],512),[[Nr,a.value==="form"]]),_e(c("div",Sh,[_e(c("textarea",{"onUpdate:modelValue":m[24]||(m[24]=_=>r.value=_),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),[[Oe,r.value]])],512),[[Nr,a.value==="toml"]])]),footer:Te(()=>[c("div",Eh,[a.value==="form"?(k(),E("span",Th,"填写完成后保存即可生成配置文件")):(k(),E("span",Ah,"* 请使用标准 TOML 格式"))]),c("button",{class:"btn-ghost",onClick:m[25]||(m[25]=_=>n("close"))},"取消"),c("button",{class:"btn-primary",onClick:L},"保存配置")]),_:1},8,["show"]))}},Rh={class:"space-y-6"},$h={class:"flex items-end justify-between gap-4"},Ph={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Mh=["onClick"],Oh={key:0,class:"absolute right-0 top-0 rounded-bl bg-green-500 px-2 py-1 text-xs text-white"},Lh={key:1,class:"absolute right-0 top-0 rounded-bl bg-indigo-500 px-2 py-1 text-xs text-white"},Nh={class:"flex items-start"},Vh={class:"overflow-hidden"},jh=["title"],Dh=["title"],Bh={class:"mt-4 flex justify-end opacity-0 transition-opacity group-hover:opacity-100"},Fh=["onClick"],Uh=["onClick"],Hh={__name:"ConfigView",setup(e){const t=Ht(),s=is(),n=ue(!1),o=ue(null),r=u=>{const p=t.instanceList.find(g=>g.file_name===u);return p?p.status:null},l=u=>{const p=r(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},a=()=>{t.fetchConfigList()},f=async u=>{if(await s.confirm({title:"删除配置",message:`确定要删除配置 ${u} 吗?`,danger:!0,confirmText:"删除"}))try{await of(u),s.toast.success("配置已删除"),t.fetchConfigList()}catch(g){s.toast.error(g.message)}};return ls(()=>t.fetchConfigList()),(u,p)=>(k(),E("div",Rh,[c("div",$h,[p[3]||(p[3]=c("div",null,[c("h1",{class:"page-title"},"配置"),c("p",{class:"page-subtitle"},"管理组网配置文件")],-1)),c("button",{class:"btn-primary",onClick:p[0]||(p[0]=g=>i(null))},[...p[2]||(p[2]=[c("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),oe(" 新建配置 ",-1)])])]),O(t).configList.length===0?(k(),De(ln,{key:0,text:"暂无配置,点击右上角新建"})):(k(),E("div",Ph,[(k(!0),E(re,null,Ce(O(t).configList,g=>(k(),E("div",{key:g.file_name,class:G([l(g.file_name),"card group relative flex min-h-[140px] cursor-pointer flex-col justify-between overflow-hidden"]),onClick:d=>i(g.file_name)},[r(g.file_name)==="running"?(k(),E("div",Oh," 运行中 ")):r(g.file_name)==="starting"?(k(),E("div",Lh," 启动中 ")):fe("",!0),c("div",Nh,[p[4]||(p[4]=c("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"},[c("svg",{class:"h-6 w-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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)),c("div",Vh,[c("h3",{class:"truncate text-lg font-bold text-slate-900 dark:text-white",title:g.config_name},F(g.config_name||"Unnamed"),9,jh),c("p",{class:"truncate font-mono text-xs text-slate-400",title:g.file_name},F(g.file_name),9,Dh)])]),c("div",Bh,[c("button",{class:"mr-4 text-sm text-indigo-600 hover:text-indigo-500 dark:text-indigo-400",onClick:xs(d=>i(g.file_name),["stop"])}," 编辑 ",8,Fh),c("button",{class:"text-sm text-red-500 hover:text-red-400",onClick:xs(d=>f(g.file_name),["stop"])}," 删除 ",8,Uh)])],10,Mh))),128))])),le(Ih,{show:n.value,"file-name":o.value,onClose:p[1]||(p[1]=g=>n.value=!1),onSaved:a},null,8,["show","file-name"])]))}},Wh=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())}`},hl=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},Gh={class:"flex items-center gap-4 mb-2 text-xs text-slate-400"},qh={class:"ml-auto"},zh={__name:"SpeedChart",props:{history:{type:Object,required:!0},size:{type:Number,default:60}},setup(e,{expose:t}){const s=e,n=ue(null),o=ue(""),r=()=>{const l=n.value;if(!l)return;const i=l.getContext("2d"),a=s.history?s.history.tx:[],f=s.history?s.history.rx:[],u=s.size,p=window.devicePixelRatio||1,g=l.getBoundingClientRect();if(g.width===0)return;l.width=g.width*p,l.height=g.height*p,i.setTransform(p,0,0,p,0,0);const d=g.width,T=g.height,L=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)"},$=8,m=4,_=0,w=d-_-0,Q=T-$-m;i.fillStyle=L.bg,i.fillRect(0,0,d,T);const D=[...a,...f];let U=D.length>0?Math.max(...D):0;U<1024&&(U=1024);const M=Kh(U);o.value="峰值: "+Oo(M);const q=4;i.strokeStyle=L.grid,i.lineWidth=1;for(let N=0;N<=q;N++){const ie=$+Q/q*N;i.beginPath(),i.moveTo(_,ie),i.lineTo(_+w,ie),i.stroke()}const te=6;for(let N=0;N<=te;N++){const ie=_+w/te*N;i.beginPath(),i.moveTo(ie,$),i.lineTo(ie,$+Q),i.stroke()}const x=(N,ie,Pe)=>{if(N.length<2)return;const pe=w/(u-1),X=u-N.length;i.beginPath(),i.moveTo(_+X*pe,$+Q);for(let ne=0;ne$t(r)),Ge(()=>[s.history?.tx?.length,s.history?.rx?.length,s.history?.tx?.at(-1),s.history?.rx?.at(-1)],()=>$t(r)),t({draw:r}),(l,i)=>(k(),E("div",null,[c("div",Gh,[i[0]||(i[0]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-green-400 mr-1"}),oe("上传速度")],-1)),i[1]||(i[1]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-blue-400 mr-1"}),oe("下载速度")],-1)),c("span",qh,F(o.value),1)]),c("canvas",{ref_key:"canvasRef",ref:n,class:"rounded w-full block h-[150px]"},null,512)]))}},Jh={class:"space-y-4"},Yh={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Qh=["onClick"],Zh={key:2,class:"card overflow-hidden p-0"},Xh={class:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-700"},em={class:"flex gap-4 text-sm muted"},tm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},sm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},nm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},om={class:"table"},rm={class:"transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50"},lm=["onClick"],im={class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},am=["onMouseenter"],cm={class:"hidden text-xs text-slate-400 md:table-cell"},um={class:"flex items-center gap-2"},fm={key:0,class:"tooltip"},dm={key:1,class:"tooltip"},pm={key:2,class:"tooltip cursor-help"},hm={class:"tooltip-text"},mm={key:1,class:"text-yellow-600 dark:text-yellow-400"},gm={key:2,class:"text-slate-400"},vm={class:"tabular-nums"},_m=["title"],bm={key:1,class:"text-slate-400"},xm={class:"text-xs"},ym={key:0,class:"leading-relaxed"},km={class:"text-green-600 tabular-nums dark:text-green-400"},wm={class:"text-blue-600 tabular-nums dark:text-blue-400"},Cm={key:1,class:"text-slate-400"},Sm={class:"hidden font-mono text-xs text-slate-400 md:table-cell"},Em={key:0},Tm={colspan:"10",class:"p-0"},Am={class:"border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-700/50 dark:bg-slate-950/60"},Im=60,Rm={__name:"PeersView",setup(e){const t=Ht(),s=ot("peerTooltip"),n=(_,y)=>s.value?.showPeerTooltip(_,y),o=()=>s.value?.hidePeerTooltip(),r=ue([]);let l=null,i={},a=0;const f=rs({}),u={},p=_=>{f[_]=!f[_]},g=()=>{const _=t.instanceList.find(y=>y.file_name===t.selectedInstance);return _?_.status:null},d=()=>{r.value=[],i={},a=0;for(const _ in u)delete u[_];for(const _ in f)delete f[_]},T=async()=>{if(!t.selectedInstance||g()!=="running"){d();return}try{const _=await zu(t.selectedInstance)||[],y=Date.now(),w=a>0?(y-a)/1e3:0,Q={};for(const D of _)if(D.traffic){const U=D.ip,M=i[U];if(M&&w>0){const q=Math.max(0,D.traffic.tx_bytes-M.tx_bytes),te=Math.max(0,D.traffic.rx_bytes-M.rx_bytes);D.traffic.tx_speed=Math.round(q/w),D.traffic.rx_speed=Math.round(te/w)}else D.traffic.tx_speed=0,D.traffic.rx_speed=0;Q[U]={tx_bytes:D.traffic.tx_bytes,rx_bytes:D.traffic.rx_bytes},u[U]||(u[U]={tx:[],rx:[]}),u[U].tx.push(D.traffic.tx_speed),u[U].rx.push(D.traffic.rx_speed),u[U].tx.length>Im&&(u[U].tx.shift(),u[U].rx.shift())}i=Q,a=y,r.value=_}catch(_){console.error(_)}};ls(()=>{T(),l=setInterval(()=>{t.isPageVisible&&T()},3e3)}),As(()=>{l&&clearInterval(l)}),Ge(()=>t.selectedInstance,()=>{d(),T()}),Ge(g,_=>{_==="running"&&T()});const I=_=>_.metric===1?"text-purple-600 font-medium dark:text-purple-400":"text-blue-600 dark:text-blue-400",L=_=>{const y=_.metric===1,w=_.protocol.includes("Tcp");return y?w?"打洞TCP直连":"打洞UDP直连":w?"客户端TCP中继":"客户端UDP中继"},$=_=>_===3?"己方加密对方未加密":_===4?"己方未加密对方加密":_===5?"密钥不一致":"未知错误",m=_=>t.selectedInstance===_?"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(_,y)=>(k(),E("div",Jh,[y[8]||(y[8]=c("div",null,[c("h1",{class:"page-title"},"设备列表"),c("p",{class:"page-subtitle"},"查看各实例的设备连接与流量状况")],-1)),O(t).instanceList.length>0?(k(),E("div",Yh,[(k(!0),E(re,null,Ce(O(t).instanceList,w=>(k(),E("button",{key:w.file_name,onClick:Q=>O(t).selectedInstance=w.file_name,class:G([m(w.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[le(nr,{status:w.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),oe(" "+F(w.config_name||w.file_name),1)],10,Qh))),128))])):fe("",!0),O(t).selectedInstance?(k(),E("div",Zh,[c("div",Xh,[y[2]||(y[2]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"设备列表",-1)),c("div",em,[c("span",null,[y[0]||(y[0]=oe(" Online: ",-1)),c("span",tm,F(r.value.filter(w=>w.online).length),1)]),c("span",null,[y[1]||(y[1]=oe(" Total: ",-1)),c("span",sm,F(r.value.length),1)])])]),c("div",nm,[c("table",om,[y[7]||(y[7]=c("thead",null,[c("tr",null,[c("th",{class:"w-8 px-2"}),c("th",null,"IP地址"),c("th",null,"名称"),c("th",{class:"hidden md:table-cell"},"版本"),c("th",null,"状态"),c("th",null,"模式"),c("th",null,"延迟"),c("th",null,"丢包率"),c("th",null,"流量"),c("th",{class:"hidden md:table-cell"},"最后在线")])],-1)),c("tbody",null,[(k(!0),E(re,null,Ce(r.value,w=>(k(),E(re,{key:w.ip},[c("tr",rm,[c("td",{class:"cursor-pointer select-none px-2 text-center",onClick:Q=>p(w.ip)},[(k(),E("svg",{class:G(["inline-block h-4 w-4 text-slate-400 transition-transform duration-200",{"rotate-90":f[w.ip]}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...y[3]||(y[3]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2))],8,lm),c("td",im,[c("span",{class:"cursor-help border-b border-dotted border-indigo-400/50 pb-0.5",onMouseenter:Q=>n(Q,w),onMouseleave:o},F(w.ip),41,am)]),c("td",null,F(w.name||"-"),1),c("td",cm,F(w.version||"-"),1),c("td",null,[c("div",um,[c("span",{class:G(w.online?"badge-green":"badge-gray")},F(w.online?"Online":"Offline"),3),w.online&&w.key_equal===1?(k(),E("div",fm,[...y[4]||(y[4]=[c("svg",{class:"h-4 w-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),c("span",{class:"tooltip-text"},"双方加密传输",-1)])])):w.online&&w.key_equal===2?(k(),E("div",dm,[...y[5]||(y[5]=[c("svg",{class:"h-4 w-4 text-yellow-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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),c("span",{class:"tooltip-text"},"双方未加密",-1)])])):w.online&&[3,4,5].includes(w.key_equal)?(k(),E("div",pm,[y[6]||(y[6]=c("svg",{class:"h-4 w-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("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)),c("span",hm,F($(w.key_equal)),1)])):fe("",!0)])]),c("td",null,[w.online&&w.route?(k(),E("span",{key:0,class:G(I(w.route))},F(L(w.route)),3)):w.online?(k(),E("span",mm,"服务器中继")):(k(),E("span",gm,"-"))]),c("td",vm,F(w.route?w.route.rtt+" ms":"-"),1),c("td",null,[w.packet_loss?(k(),E("span",{key:0,class:G(w.packet_loss.loss_rate>10?"text-red-600 dark:text-red-400":w.packet_loss.loss_rate>5?"text-yellow-600 dark:text-yellow-400":"text-green-600 dark:text-green-400"),title:"Sent: "+w.packet_loss.sent+", Received: "+w.packet_loss.received},F(w.packet_loss.loss_rate.toFixed(1))+"%",11,_m)):(k(),E("span",bm,"-"))]),c("td",xm,[w.traffic?(k(),E("div",ym,[c("div",km," ↑ "+F(O(hl)(w.traffic.tx_bytes))+" ("+F(O(Oo)(w.traffic.tx_speed))+") ",1),c("div",wm," ↓ "+F(O(hl)(w.traffic.rx_bytes))+" ("+F(O(Oo)(w.traffic.rx_speed))+") ",1)])):(k(),E("span",Cm,"-"))]),c("td",Sm,F(O(Wh)(w.last_connected_time)),1)]),f[w.ip]?(k(),E("tr",Em,[c("td",Tm,[c("div",Am,[le(zh,{history:u[w.ip]||{tx:[],rx:[]},size:60},null,8,["history"])])])])):fe("",!0)],64))),128))])])])])):(k(),De(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},$m={class:"space-y-4"},Pm={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Mm=["onClick"],Om={key:2,class:"card overflow-hidden p-0"},Lm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},Nm={class:"table"},Vm=["rowspan"],jm={class:"font-mono tabular-nums text-yellow-700 dark:text-yellow-300"},Dm={class:"tabular-nums"},Bm={class:"tabular-nums"},Fm={__name:"RoutesView",setup(e){const t=Ht(),s=ue([]);let n=null;const o=()=>{const i=t.instanceList.find(a=>a.file_name===t.selectedInstance);return i?i.status:null},r=async()=>{if(!t.selectedInstance||o()!=="running"){s.value=[];return}try{s.value=await Ju(t.selectedInstance)||[]}catch(i){console.error(i)}};ls(()=>{r(),n=setInterval(()=>{t.isPageVisible&&r()},3e3)}),As(()=>{n&&clearInterval(n)}),Ge(()=>t.selectedInstance,()=>{r()}),Ge(o,i=>{i==="running"&&r()});const l=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,a)=>(k(),E("div",$m,[a[2]||(a[2]=c("div",null,[c("h1",{class:"page-title"},"路由"),c("p",{class:"page-subtitle"},"查看各实例的路由表")],-1)),O(t).instanceList.length>0?(k(),E("div",Pm,[(k(!0),E(re,null,Ce(O(t).instanceList,f=>(k(),E("button",{key:f.file_name,onClick:u=>O(t).selectedInstance=f.file_name,class:G([l(f.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[le(nr,{status:f.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),oe(" "+F(f.config_name||f.file_name),1)],10,Mm))),128))])):fe("",!0),O(t).selectedInstance?(k(),E("div",Om,[a[1]||(a[1]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"路由表")],-1)),c("div",Lm,[c("table",Nm,[a[0]||(a[0]=c("thead",null,[c("tr",null,[c("th",null,"目标节点IP"),c("th",null,"目标网络"),c("th",null,"跳数"),c("th",null,"延迟")])],-1)),c("tbody",null,[(k(!0),E(re,null,Ce(s.value,f=>(k(),E(re,{key:f.ip},[(k(!0),E(re,null,Ce(f.routes,(u,p)=>(k(),E("tr",{key:p,class:"hover:bg-slate-50 dark:hover:bg-slate-800/50"},[p===0?(k(),E("td",{key:0,rowspan:f.routes.length,class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},F(f.ip),9,Vm)):fe("",!0),c("td",jm,F(u.addr),1),c("td",Dm,F(u.metric),1),c("td",Bm,F(u.rtt)+" ms",1)]))),128))],64))),128))])])])])):(k(),De(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},Um=[{path:"/",component:Xp},{path:"/instances",component:M0},{path:"/general",redirect:"/instances"},{path:"/config",component:Hh},{path:"/peers",component:Rm},{path:"/routes",component:Fm}],Hm=fp({history:Hd(),routes:Um});ju(od).use(Fu()).use(Hm).mount("#app"); diff --git a/vnt-web/static/assets/index-DVj6b74x.css b/vnt-web/static/assets/index-xUGHQxai.css similarity index 57% rename from vnt-web/static/assets/index-DVj6b74x.css rename to vnt-web/static/assets/index-xUGHQxai.css index d5fa2a2..409ebd9 100644 --- a/vnt-web/static/assets/index-DVj6b74x.css +++ b/vnt-web/static/assets/index-xUGHQxai.css @@ -1 +1 @@ -@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-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-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-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-600:oklch(55.8% .288 302.321);--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-2xl:42rem;--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-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) 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)}.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}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.-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)}.bottom-0{bottom:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.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)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.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-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-80{height:calc(var(--spacing) * 80)}.h-\[85vh\]{height:85vh}.h-\[150px\]{height:150px}.h-full{height:100%}.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-\[140px\]{min-height:140px}.min-h-screen{min-height:100vh}.w-1{width:var(--spacing)}.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-12{width:calc(var(--spacing) * 12)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-sm{max-width:var(--container-sm)}.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}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.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}.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-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}: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-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-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-t{border-top-style:var(--tw-border-style);border-top-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-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-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-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-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-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.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\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.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)}.py-6{padding-block:calc(var(--spacing) * 6)}.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))}.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)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.text-blue-500{color:var(--color-blue-500)}.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-purple-600{color:var(--color-purple-600)}.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-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}.italic{font-style:italic}.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,)}.opacity-0{opacity:0}.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)}.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)}.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\/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-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-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-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.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-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}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}}@media(min-width:48rem){.md\:block{display:block}.md\:inline{display:inline}.md\:table-cell{display:table-cell}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:flex{display:flex}.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-8{padding-inline:calc(var(--spacing) * 8)}}.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-red-900\/50:where(.dark,.dark *){border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.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-black\/20:where(.dark,.dark *){background-color:#0003}@supports (color:color-mix(in lab,red,red)){.dark\:bg-black\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.dark\:bg-indigo-400:where(.dark,.dark *){background-color:var(--color-indigo-400)}.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-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.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-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-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-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\/80:where(.dark,.dark *){background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 80%,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-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.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\:ring-indigo-400:where(.dark,.dark *){--tw-ring-color:var(--color-indigo-400)}@media(hover:hover){.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-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-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)}.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}.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)}@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 ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} +@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-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-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-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-600:oklch(55.8% .288 302.321);--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-2xl:42rem;--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-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) 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)}.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}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.-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)}.bottom-0{bottom:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.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)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.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-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-80{height:calc(var(--spacing) * 80)}.h-\[85vh\]{height:85vh}.h-\[150px\]{height:150px}.h-full{height:100%}.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-\[140px\]{min-height:140px}.min-h-screen{min-height:100vh}.w-1{width:var(--spacing)}.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-12{width:calc(var(--spacing) * 12)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-sm{max-width:var(--container-sm)}.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}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.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}.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)}: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-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-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-t{border-top-style:var(--tw-border-style);border-top-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-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-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-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-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-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.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\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.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)}.py-6{padding-block:calc(var(--spacing) * 6)}.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))}.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)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.text-blue-500{color:var(--color-blue-500)}.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-purple-600{color:var(--color-purple-600)}.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-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}.italic{font-style:italic}.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,)}.opacity-0{opacity:0}.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)}.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)}.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\/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-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-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-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.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-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}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}}@media(min-width:48rem){.md\:block{display:block}.md\:inline{display:inline}.md\:table-cell{display:table-cell}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:flex{display:flex}.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-8{padding-inline:calc(var(--spacing) * 8)}}.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-red-900\/50:where(.dark,.dark *){border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.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-black\/20:where(.dark,.dark *){background-color:#0003}@supports (color:color-mix(in lab,red,red)){.dark\:bg-black\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.dark\:bg-indigo-400:where(.dark,.dark *){background-color:var(--color-indigo-400)}.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-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.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-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-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-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\/80:where(.dark,.dark *){background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 80%,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-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.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\:ring-indigo-400:where(.dark,.dark *){--tw-ring-color:var(--color-indigo-400)}@media(hover:hover){.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-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-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)}.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)}@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 ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/vnt-web/static/index.html b/vnt-web/static/index.html index 923ef93..97b5e9e 100644 --- a/vnt-web/static/index.html +++ b/vnt-web/static/index.html @@ -19,8 +19,8 @@ if (dark) document.documentElement.classList.add("dark"); })(); - - + +
diff --git a/vnt-web/ui/src/components/InstanceCard.vue b/vnt-web/ui/src/components/InstanceCard.vue index 40ff156..63ca472 100644 --- a/vnt-web/ui/src/components/InstanceCard.vue +++ b/vnt-web/ui/src/components/InstanceCard.vue @@ -14,11 +14,27 @@ const ui = useUiStore(); const info = computed(() => app.infoOf(props.inst.file_name)); const loading = computed(() => !!app.loadingMap[props.inst.file_name]); +// 停止中:点击停止后直到实例真正消失/停止 +const stopping = computed(() => !!app.stoppingMap[props.inst.file_name]); +// 展示名优先用配置名称,兜底文件名 +const displayName = computed(() => props.inst.config_name || props.inst.file_name); const statusBadgeClass = (status) => - status === "running" ? "badge-green" : status === "starting" ? "badge-blue" : "badge-gray"; + stopping.value + ? "badge-yellow" + : status === "running" + ? "badge-green" + : status === "starting" + ? "badge-blue" + : "badge-gray"; const statusText = (status) => - status === "running" ? "运行中" : status === "starting" ? "启动中" : "已停止"; + stopping.value + ? "停止中" + : status === "running" + ? "运行中" + : status === "starting" + ? "启动中" + : "已停止"; const select = () => { if (props.selectable) app.selectedInstance = props.inst.file_name; @@ -27,7 +43,7 @@ const select = () => { const confirmStop = async () => { const ok = await ui.confirm({ title: "停止组网", - message: `确定要停止 ${props.inst.file_name} 吗?`, + message: `确定要停止 ${displayName.value} 吗?`, danger: true, confirmText: "停止", }); @@ -37,7 +53,7 @@ const confirmStop = async () => { const confirmRestart = async () => { const ok = await ui.confirm({ title: "重启组网", - message: `确定要重启 ${props.inst.file_name} 吗?`, + message: `确定要重启 ${displayName.value} 吗?`, }); if (ok) app.restartVnt(props.inst.file_name); }; @@ -45,7 +61,7 @@ const confirmRestart = async () => { const confirmDismiss = async () => { const ok = await ui.confirm({ title: "移除实例", - message: `确定要移除已停止的实例 ${props.inst.file_name} 吗?`, + message: `确定要移除已停止的实例 ${displayName.value} 吗?`, danger: true, confirmText: "移除", }); @@ -66,9 +82,20 @@ const confirmDismiss = async () => { >

- {{ inst.config_name || inst.file_name }} + {{ displayName }}

- {{ statusText(inst.status) }} +
+ + 配置发生变化 + + {{ + statusText(inst.status) + }} +
@@ -98,33 +125,41 @@ const confirmDismiss = async () => {
- - - + +
diff --git a/vnt-web/ui/src/stores/app.js b/vnt-web/ui/src/stores/app.js index 8111676..6448eec 100644 --- a/vnt-web/ui/src/stores/app.js +++ b/vnt-web/ui/src/stores/app.js @@ -22,6 +22,8 @@ export const useAppStore = defineStore("app", () => { const selectedInstance = ref(null); const configList = ref([]); const loadingMap = ref({}); + // 停止中的实例:key=file_name;点击停止后置位,实例从列表消失或变为 stopped 时清除 + const stoppingMap = ref({}); // 页面可见性 const isPageVisible = ref(!document.hidden); @@ -93,6 +95,13 @@ export const useAppStore = defineStore("app", () => { delete instances.value[key]; } } + // 停止已生效(实例消失或进入 stopped)时清除停止中标记 + for (const key of Object.keys(stoppingMap.value)) { + const inst = list.find((i) => i.file_name === key); + if (!inst || inst.status === "stopped") { + delete stoppingMap.value[key]; + } + } // 默认选中逻辑:当前选中失效时优先第一个 running,否则第一个,否则 null if ( !selectedInstance.value || @@ -145,6 +154,7 @@ export const useAppStore = defineStore("app", () => { const stopVnt = async (fileName) => { if (!fileName || loadingMap.value[fileName]) return; loadingMap.value[fileName] = true; + stoppingMap.value[fileName] = true; try { await stopVntApi(fileName); ui.toast.success("已停止"); @@ -156,6 +166,8 @@ export const useAppStore = defineStore("app", () => { } catch (e) { ui.toast.error("停止失败: " + e.message); console.error(e); + // 停止失败,恢复可操作状态 + delete stoppingMap.value[fileName]; } finally { loadingMap.value[fileName] = false; } @@ -231,6 +243,7 @@ export const useAppStore = defineStore("app", () => { selectedInstance, configList, loadingMap, + stoppingMap, isPageVisible, runningCount, startingCount, diff --git a/vnt-web/ui/src/style.css b/vnt-web/ui/src/style.css index 11027de..1497e33 100644 --- a/vnt-web/ui/src/style.css +++ b/vnt-web/ui/src/style.css @@ -59,6 +59,20 @@ body { opacity: 0; } +/* 实例卡片列表:停止/移除后渐隐收缩消失 */ +.card-list-enter-active, +.card-list-leave-active { + transition: + opacity 0.3s ease, + transform 0.3s ease; +} + +.card-list-enter-from, +.card-list-leave-to { + opacity: 0; + transform: scale(0.96); +} + /* 弹窗动画 */ .modal-enter-active, .modal-leave-active { diff --git a/vnt-web/ui/src/views/DashboardView.vue b/vnt-web/ui/src/views/DashboardView.vue index 8c1ab5e..4a5fd63 100644 --- a/vnt-web/ui/src/views/DashboardView.vue +++ b/vnt-web/ui/src/views/DashboardView.vue @@ -95,9 +95,9 @@ const statusSummary = computed(() => { v-if="app.instanceList.length === 0" :text="app.configList.length === 0 ? '暂无配置,请先新建配置' : '暂无运行中的组网,请在上方选择配置启动'" /> -
+ -
+ diff --git a/vnt-web/ui/src/views/InstancesView.vue b/vnt-web/ui/src/views/InstancesView.vue index cbfd8f3..2a8d028 100644 --- a/vnt-web/ui/src/views/InstancesView.vue +++ b/vnt-web/ui/src/views/InstancesView.vue @@ -20,9 +20,9 @@ const app = useAppStore(); -
+ -
+