From 7513465b61e5e9b65ac7bad8ce96b355d7c0edfe Mon Sep 17 00:00:00 2001 From: lbl <1791778603@qq.com> Date: Sat, 22 Aug 2026 00:53:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(vnt-web):=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BA=20Vite+Vue3+Pinia=20=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E5=B9=B6=E9=87=8D=E6=96=B0=E8=AE=BE=E8=AE=A1=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 单文件 index.html 拆分为 vnt-web/ui(pnpm+Vite+Vue3 SFC+Pinia+Tailwind v4),构建产物输出到 static/ - UI 重新设计:浅色简洁风(可切换深色模式)、顶部导航、新增总览仪表盘首页 - 自定义弹窗/toast/确认框替换全部原生 alert/confirm,交互与过渡统一 - 响应式布局:移动端汉堡导航,表格与卡片自适应 - 实例卡片移除日志按钮;启动组网默认选中第一个配置 --- .gitignore | 4 +- README.md | 11 + vnt-web/static/assets/index-DHCLVx7I.js | 168 + vnt-web/static/assets/index-DVj6b74x.css | 1 + vnt-web/static/index.html | 3250 +------------------ vnt-web/static/tailwindcss3.4.17.js.gz | Bin 123080 -> 0 bytes vnt-web/static/vue-router.global.prod.js.gz | Bin 9597 -> 0 bytes vnt-web/static/vue.global.prod.js.gz | Bin 58885 -> 0 bytes vnt-web/ui/index.html | 27 + vnt-web/ui/package.json | 21 + vnt-web/ui/pnpm-lock.yaml | 1312 ++++++++ vnt-web/ui/src/App.vue | 276 ++ vnt-web/ui/src/api/index.js | 73 + vnt-web/ui/src/components/AppModal.vue | 65 + vnt-web/ui/src/components/AppTooltip.vue | 89 + vnt-web/ui/src/components/ConfirmHost.vue | 48 + vnt-web/ui/src/components/EmptyState.vue | 24 + vnt-web/ui/src/components/InstanceCard.vue | 130 + vnt-web/ui/src/components/SpeedChart.vue | 136 + vnt-web/ui/src/components/StartPanel.vue | 72 + vnt-web/ui/src/components/StatusDot.vue | 17 + vnt-web/ui/src/components/ToastHost.vue | 45 + vnt-web/ui/src/main.js | 7 + vnt-web/ui/src/router/index.js | 21 + vnt-web/ui/src/stores/app.js | 252 ++ vnt-web/ui/src/stores/startLog.js | 116 + vnt-web/ui/src/stores/ui.js | 64 + vnt-web/ui/src/style.css | 229 ++ vnt-web/ui/src/utils/format.js | 55 + vnt-web/ui/src/utils/toml.js | 349 ++ vnt-web/ui/src/views/ConfigEditor.vue | 609 ++++ vnt-web/ui/src/views/ConfigView.vue | 135 + vnt-web/ui/src/views/DashboardView.vue | 103 + vnt-web/ui/src/views/InstancesView.vue | 152 + vnt-web/ui/src/views/PeersView.vue | 318 ++ vnt-web/ui/src/views/RoutesView.vue | 122 + vnt-web/ui/vite.config.js | 16 + 37 files changed, 5090 insertions(+), 3227 deletions(-) create mode 100644 vnt-web/static/assets/index-DHCLVx7I.js create mode 100644 vnt-web/static/assets/index-DVj6b74x.css delete mode 100644 vnt-web/static/tailwindcss3.4.17.js.gz delete mode 100644 vnt-web/static/vue-router.global.prod.js.gz delete mode 100644 vnt-web/static/vue.global.prod.js.gz create mode 100644 vnt-web/ui/index.html create mode 100644 vnt-web/ui/package.json create mode 100644 vnt-web/ui/pnpm-lock.yaml create mode 100644 vnt-web/ui/src/App.vue create mode 100644 vnt-web/ui/src/api/index.js create mode 100644 vnt-web/ui/src/components/AppModal.vue create mode 100644 vnt-web/ui/src/components/AppTooltip.vue create mode 100644 vnt-web/ui/src/components/ConfirmHost.vue create mode 100644 vnt-web/ui/src/components/EmptyState.vue create mode 100644 vnt-web/ui/src/components/InstanceCard.vue create mode 100644 vnt-web/ui/src/components/SpeedChart.vue create mode 100644 vnt-web/ui/src/components/StartPanel.vue create mode 100644 vnt-web/ui/src/components/StatusDot.vue create mode 100644 vnt-web/ui/src/components/ToastHost.vue create mode 100644 vnt-web/ui/src/main.js create mode 100644 vnt-web/ui/src/router/index.js create mode 100644 vnt-web/ui/src/stores/app.js create mode 100644 vnt-web/ui/src/stores/startLog.js create mode 100644 vnt-web/ui/src/stores/ui.js create mode 100644 vnt-web/ui/src/style.css create mode 100644 vnt-web/ui/src/utils/format.js create mode 100644 vnt-web/ui/src/utils/toml.js create mode 100644 vnt-web/ui/src/views/ConfigEditor.vue create mode 100644 vnt-web/ui/src/views/ConfigView.vue create mode 100644 vnt-web/ui/src/views/DashboardView.vue create mode 100644 vnt-web/ui/src/views/InstancesView.vue create mode 100644 vnt-web/ui/src/views/PeersView.vue create mode 100644 vnt-web/ui/src/views/RoutesView.vue create mode 100644 vnt-web/ui/vite.config.js diff --git a/.gitignore b/.gitignore index d883c10..d95a484 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ vnt_config vnt_current_config.txt logs/* -/.tools/ \ No newline at end of file +/.tools/ +node_modules +vnt-web/ui/dist \ No newline at end of file diff --git a/README.md b/README.md index cd359ec..a9be007 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,17 @@ 2. 浏览器打开 http://127.0.0.1:19099 3. 在页面上添加组网配置,再启动组网 +## 前端构建 + +web 前端源码位于 `vnt-web/ui/`(Vite + Vue 3 + Pinia + Tailwind CSS v4),构建产物输出到 `vnt-web/static/`,由 RustEmbed 嵌入二进制。 + +``` +cd vnt-web/ui +pnpm install +pnpm build +``` + +开发调试使用 `pnpm dev`,Vite dev server 会将 `/api` 代理到 `127.0.0.1:19099`(需先启动 vnt2_web)。 # VNT2.0新特性 diff --git a/vnt-web/static/assets/index-DHCLVx7I.js b/vnt-web/static/assets/index-DHCLVx7I.js new file mode 100644 index 0000000..ee73e95 --- /dev/null +++ b/vnt-web/static/assets/index-DHCLVx7I.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 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-DVj6b74x.css new file mode 100644 index 0000000..d5fa2a2 --- /dev/null +++ b/vnt-web/static/assets/index-DVj6b74x.css @@ -0,0 +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}} diff --git a/vnt-web/static/index.html b/vnt-web/static/index.html index 2c63a42..923ef93 100644 --- a/vnt-web/static/index.html +++ b/vnt-web/static/index.html @@ -1,3230 +1,28 @@ - - - + + + VNT Dashboard - - - - - - - - -
- - - -
- -
-
-
- - {{ headerStatusText }} -
- -
- - - - 服务器: {{ isServerConnected ? '已连接' : - '未连接' }} -
- -
- {{ selectedInfo.ip }} - {{ selectedConfigName }} -
-
- -
- 设备: - {{ selectedInfo.name || '' }} - {{ (selectedInfo.device_id || '').substring(0, 8) }}... -
-
- - -
- - - - - -
- - -
-
-
-
-
-
-
-

- {{ startStatus === 'starting' ? - '正在启动组网...' : (startStatus === - 'running' ? '启动成功' : '启动失败') }} -

-
-
- {{ logConfigName }} - {{ startStatus }} -
-
-
-
- >>> - {{ log }} -
-
- 等待后续步骤... -
-
- 启动失败: - 请检查配置或网络连接。 -
-
-
- - -
-
-
- - - -
-
-
-
- NAT Type - {{ tooltipState.info.nat_type }} -
-
- Public IPv4: -
- {{ pip }} -
-
-
- IPv6: -
- {{ tooltipState.info.ipv6 }} -
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - + + + + + + +
+ diff --git a/vnt-web/static/tailwindcss3.4.17.js.gz b/vnt-web/static/tailwindcss3.4.17.js.gz deleted file mode 100644 index 774ef19678409b063ac9c08272fba30453e635a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123080 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 diff --git a/vnt-web/static/vue-router.global.prod.js.gz b/vnt-web/static/vue-router.global.prod.js.gz deleted file mode 100644 index 0df3f3ce62316ebe8e0bf45023a6845335aec822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9597 zcmV-@C4$-?iwFRee|%{I1EqXCBzWG;E=75{O<2l)h9^F$?oRoh>b>{)pb`jjy^y5+hFkd;Hr~{b=9@99$bAn z{$hO0wP6+w?jGO$a&Wrn(t1%1UZv&WSz5O_eyX}^B{%zjMV`sBk%MPXUQ@-<->%Yn z@M9-m@`%Z@E3-DQ%20|nS_d6kHf^0}Z7|8IvS|lp5_IK4F7r|@f`g>JUdd`XSX5be zDa&?Z`VZ<*M(bL(U0n|3`0ZQSJgXL6Avc>q6@ny5MpwKlVy^>(tX>QFt_18mp6tde$C&nG4RBu!XF(`tN~uCTCJ z;%Tc_SLzAVB#e^#>#b;#2X&oZkMo9qMV=gec62U^MxxCikVC?1cz|$Q|KF!dL;yISQh6A%Ui%0^W)&2?CMgkEX3AX~#K;>*Mof7<`5i zsBP|7PEo0s+uX~C!{&Z+JRF93a(EJn{Qlty9%^)Gh|I%dkw=)sJm#Yl(V)$=iQ91@ z%k%ak!a^iiN5n6&hF?co?YNV7`ug6cLvs$L_C(V6;qd7dZT*8CN__r!Ad6gsl8P)n# z=Dpa4guw?%J*{ILeI(XPJikcWi?|+z88(5V9A%?athi46-pTqpuEa&!T*SYHX|#2i zdPjlSfNwaIV3<#<53+ugHZqKSxVQaR(NyZy*|P%&J_=&#hJWP`k5f#GJZ+vYHyas& zN28;yXg%_IV9#Ci>G$%wA&OJe0F-`xYw9%;9GrMuyCkkH>0Az;hH_TUMTH1D{#R@v2%S0saI+GOFSMe}irK`(_jV4i*4H>i0NHv-e3rf2j{Z z^Z~*=33P$#y7GNleE>7TFb^@zLmtL4o7XguqBs04jVx>vBcsQRYOiF0!@&_?vPOb} zWD?2*xYdr&W&5CoI6i|$5C#{uTm}kh95+4s^_LH$_!lt0*{{DG%|}PX@V2smx*&oJD~H?&yj463iNW#;zfF#Qo&EaReDv9o+s)hFkvR_gtsn+DYIWal zSayeCuFE$50Crh@7&lp66~#}YtycZ2pSK>k{zc#-?$HvH3S<#5E?V^hxKMyK1r6&b zP+GLcQx1n^kKcX9JZrz*w4PeX1G1-uq~gQtCyUVVloKGNpBKY3~W7-sIHfu#F*$t%C3*Ddh*~ z;VYI<-!qyP6*LMo9j~C4S6Nj+ihvqy^+nZqiu4=rnAapM%JfpkrD$YYXCygTVpQ9t zg{YT({Q-!RL9S~APb$34if$pBP+FPgBt&L-bbJD3r806O>Jf9P2$+?b5#-vPuw>fT z6iSaW8r7r90r5wr{s7?)PCz0DCkCKv;&ZVSSy$IMWC%*l=de9Z=nHJnfYuz70lZqQ zP^T7G({Dl$3(nS)oR3547@*H-6*%=snAiY6F1LxA2FqPvr9~&>H!KE7UDFkIrG9?JS)J8al6N89~fa zMV05EF({R!_l- zG~)v;!0^+s8SB-GhG$DL8V~WK-I-+GfQ8tlH_WXtSyx zL%mKG@R-Lu>ecdsN^f5C-c)QOZsKMJH|U z)dHePmlQCyuX%a9+8XnLKbZrcY?%g{5xq_Vv*O9 zw;y-Y?*8%gp@C}rkim@~tu$?c36V#(MYzieq#^%_R7XeJpigZfpQ|+3=Hr;p2Q{lo z7mL#?pxjdoFG~pu$AY;l)99_O&Lp-VyRxWKD18MGgJ|go@v)e)4FlU7p)s} zY+F(A`=0rnDT7Hy6T=fjhXHMpS*C>+EgOUxn`9&g#0em$cbBShT8R6tfH-OE>e^q0 zQ|;vdI#3$H5}7b2>K)hevbvIg0W>!@+<{KS#9(O++(u(Diu&lxhHGLPmdk)q62k?n zIInyPZWGYj8u|=GbPv+dnvC!{uSjzh8H~kNK8B7Qza5`p&8&csnnRRmjdg7bDZkl^ zx?0J)y@t#P%vu7mmL)_&ot_nR$^x2MOo!ukqt7)Gw+^PEck4(>Q!&HTPE7vO`BwH6 zSn}94?4|SSw084H!Wu~oT|lr}Lc~5ehD}?imrV>pQD!X)tfc_p)(oaTmn4}W41gGy z5@fw5hN{R}F21R&OFiIL{E#S5AshQ-ZT;k^_~)LD02L4#*C~lOv1TqI#q5VUQI7EK z*MIjd3z(n)Pnps7xbtxM1DmC!?65Nm_;7Fl#fioow%{Xj{7)#Z=X^Ndq92Rz+c28_ zGC%qS|9f7_QYvtgh$tZr{?&1!tjg)(NqiEU7x#P3+kW$wnx8;Vk3EktrJlTVWXMNIRLRn#$B1o)|do zb$2^M2Tu!@GwFHNcA$L!csOilPG6hfJJzJ00bQ7yj)hW!gJ3IC!i)6qj|YeUK0f^K zw{y>MZ=_O2++p8rwkmN-RZzHRbLGfOv}rvJeuY|Uke39A=QV0cv`7bVd*ZWsJp1qC z`Gf``lpYQb90G*di2blU5c^_r*0n>GRVAIcD2}IOj`we)@40z6=GOJH3l<@8+`PGfF?-y>6wK9AnTW(^a9>oUp7Ii?$URaqDBLYEH4pHmE~(^Y>zCXUXKY@o&&O=-(&u0f=743_9n z&iSV&^-RuZ^vBW8C>j6PaqqvAtr^N73N4ifozml-Aa-+c1KQ-~P838|dH2pJ6Fx=; zAeG$42O!vhCd{y4O_2{aCSP;i$av2VCay4MSq#fha7c|@PHp4`V=TSMOuf!na(8fmvUB(2`}df1Zp*QxH+voXMbF~V4P42NWSzmO3RipGLMM zQ0v2S(FcII)U>$Mhn3PQ(zL52dW5!GH|mk4yn!q;pT<(3#u74@G7dsc+gUaz=7oWp zu!z8g(rAx_puSz@3%PI}hv7LAjem(%DjRu$1B46gv zPC=}e#A(K9;o=c-!AIID*KoeSkY_mzjPe{4{N6zU>n{icSC;ZfA?ibVS|%<$a(IH{ zBn5g4h<4VGP_hS^G<6^S{J79;HfKEm%?R$cHj}FUU_ZWeD@P)&RI{IVp0l^*kl${n z)0Z!aN5MKgLYHD2!~^OH)~9s=;7>U*GQr3w-}wXdAnazAkx|HPHs`(#%;;la1kkpl zFrV$RM3(}9B>XF<+AQnK*J7)p4FKF-_45Tc4l^UGDP9*a4{HG25f^}FZTRkik0hUs46$ z)PChj9E7T0ncR(2a0*z$5FS&sjrCB+0{f>0al}s-M!Jw69`P>0q0qn<6>Rk}(Pu>Nv@-+>75nVaNqK^^i@aE%OtvA%A5qv^ zdzy5*Y^-{j@MMx4v^!O#FqnZHbvm5NWnUS^T(x!B_YzLnsivA0$w3Y1?WZLuTUc$* z+OaXIf2ycVWXbYS*}IUs_}Ofr0_znU3tG82PRmx-XyrYL6%76+?ntM1K$3Qwn+-N$ zY*{wJ3z=TYZz(AV7=yjNlC9`g3!LvxrKIs6rA0wbGwzz1Oo%29T$v+eQ%q@VHXBkA zVy|jATpO(NYS~c}O*(sIklM9AGtFR^$%W+Ltym?qP6-5V-HXe$`++tcx1P>)VIJ$k zuHbK@mBIx!Jvy=Wc3Dr&a=hKeo%f*P_0pb~>k*UM%548aEOzabl^?<3XbtTQRHULR z6)aNEbTn(A#*>zR`jw-wBId6orEk!&7D$N+6>F{+Nkh;q1+-&YDX&`X{sKH|kt{YF ztQISPX|(9S76th}30XmGONpA{kOD_k6Gfu4DCZXL>a4oh!n|r7vu>d-f}UpWT!2RC z^i2;`LG7mWlM4}E?4QDL=;ssM(7;5mFo1bUOZ6TNAz~vrwqsP2#gx6EO}L1*aq753 zqcs%rjyc4uDQLAPcv^!G`yG>h@;so72Q%NyqRIHL`V8)r^?ue3%q`%3u4RQ{3lag&3D?cA^0Yz`K- zOEigq1ru*8$3pIHhA>V>w5f)`?Y|`Ns*wZ4E!NI+r5skm_iK^YPo+}Wh(bmO8i{qf zSa8}SEA&lOT=n8O+UVe{BIt3-C<<$`5nYo1Y*&{#?;q^{+9stbbrI7{-0hdMh>X-Fvzm2uh{FCHu^ zjl>RIBDTU5Y+J6GDiEuOD86xM#Vcw2+fKlQET5X1_Lei@=$(d$0nH5%Fgk%Y3%Vpz z6x6lk%M8qaxdUE_t)6jm~%IEPU25QVi3x%Ro( z3jsMxnqKp~&v>xl~--T8TeaIV;^rUC;FhkWxYoYcOC5 z?9Fs~g%a=_*C4$CCKqGZPI9lWc0}Z#OM;5!f}e6jYl=&&EV}hDQ{nK`L{4q~E%uOma$hy+>yS(z{D>N0PLPeP+|AT1I`-LxKLlLL0TPV?~R@Jq2?QVh5h zZAD@ljAk!NJ0(Rm-ZciHGZ4j7n)R-5$av_xdgzvhmNayjlCHVGvn0Wbz(B||H;2R2 z#0W$KAiLA zjEPBYj{&$_^Y(K}uQJAz3f>izexjQ30W}J&VG6V(&vI%+ojVa)dFVNbA5~qkDF2f@ z@O)SU3m6mTO1YG?21*{U$lmIpq^4wsDzmF#08 zd>p`-M;YSv$wYjgO)2*!uQcH zXK&Anw0!@|*-@^oVsq*g;8v^uTJ43V@7LJme@2W5rj#RplT7F54D*GS`3{fJqAHEz zT@goirrOg-%GgjjZ0^FHvW5e78TDyiz7N<3owkpva+#mU>u1luK8?TFYA^U2(pyER zX6pW^&W)Q36UOB9C6lE4u&N4~mV$L9`KU;nCf5C=L#JN73TwEYb)G&_2k|3E!_@4$ zv0?DRDm|A0)IiQ1EZ@hEq=53*twPEeEvmMO%dN)*03EfYkQp{iM&-F_*ir0r?S0N0 zu4k{vcjN5|)K*|tZ#N=P7lse1{!ldyqB-m;LsLSHvI_=1)ah<@Z#?d_Gpg5P>&V?x zqpPGe1Vxd1T?EFtlq3cFDRjT_MHr-kSO*0ELrn?6?nE$2_s)koH#3)-*@&phM^MP$ zYVXIn(%1|9P+pYU;VZgP#VJtA?t#fQRSP;uVA#jr zmF5T1UZ!)`B)ybv$W3<-W57{iW7g4qjM!XZe)^|0^~cWLY)@bQ=Xv|3h8T$^qE8Jmr~s^?V~j~2F(Kdve(L07b<@QWoXo%Vm687Xk@W*d!sPaqZ#2h%hfYExm)sc zQEmsVcDJ8yM?MR()=bN53G={vekn!jayp1lEJLTxj6W!YfCij(CR^WJWl(81FkQnL zW8qxP*s7ZooG5nDdI~!%bt$Uhu!7Jcp@4shw&KTL{BYdle^B;nuQI9pCtAKAU36Xi zTJ-TB*jfjU@5r(49c?pLcP~f` zE;&Xy`I9Xz+?F<*1v5j-lbvKvJ`$2Su97^Z=U1;EynOxk>GMYqUO##M&*TpZK5>ft zGkICn*N;{9ycayDBoFOho6TV$%z}V|@W+lhR?L1!BSC7gi$U4=QB9#YldWgYx|igy zZo2@MD%+p0&D@^3Z`1{v)=hGFND()c^sgo(hOM6UO$(d}1t7Ffpyx7b{aBuI8MQr^ zQDm-Bgwc8j5?euc4d~+BvBy3y^2XhBNE3OF?!D;SF8cb*q*mF*m+8mwSg2wS&3FVu z%&O_2ysBrf0NdP!np&v)HkHS@Z+h)r$GIt1z{6(IHta7u^QTJnSm3nV?WgZeWPjn_ z1Ub>SlW4_Vxd8L3KD-3;{zJKbE|WhdC3_8fH(-ZDeI@p#q#@M?VKC|$K-l)q>29+m zxJ=6~Eo`Fb6|825)#MOT?pATud+|IHr@e~bd|#>6N?IKd13%F6SnMZYI8VdJkQ@{` z7{|uG(f?KcL#do36q!vaX~2?VSdPsF5zBO{kTFFw&(koo!8rY`gmO%U=;o^6}qEuyW93Ql%BX?3K1+R!S7L*=_2(8I)^jkj~g z?pPaXOwMc|*zqz4y;4C;@`fqVc4B~$T!kKFoa^c4qni`ic?2 zot(=lMJ&vgbb->VwuC{Sz>k$5qkHkG+fY-5+Y9T^0E)y4Al?v@K6 z&%KX)SS#aM=nwYvhD2@XnsU$O!YT`Y!og;`Xvdt*Mk^`vNL_olK@BOV#1?Jjbl)AN zz7XTCkrRTDv&mI_7DUrJc>%PJ6-CuhJPeYqw>csT%sAE(pZNlIB+bIm)>3SO* zO2bfolFG9_R$nF*9D~Tzhr{>b)tx}184zhk%HM%X`quaeX8$xS*>hsAtUe2?@CBv9 z>wB_$L4sdx%E_I{}9*iFvJVxo4WN(>8&|dD({`FI?v92=Hz=?GHt7Y zYGc6umMbZpsTZAj*vC}G9&AW|x*K-5$#2&Gz>8rAmAE1XJ8K>lA*EfSq ze0s(~()m`MWSP7mV~RYfl+Fb0$cvIaCF?j4+;HdON*(o#XJ^#bKB>}-ge)xVZXQET3x!S z``&>+-|$~t#{Skaib2+X?lj*N*r|$kPo($Ot*FvaVdD1|+RM%U>wxp|*2~|JJKhfU zi6{ngCiWw*G@*EH?O!uh^yk1?{cp~_$DGAi#FuwCm+a*jy)`oILeJJa?$>I0wQdyk zx_-~KHF&Z2Q5DTL=@bo@Z|uD|N_F}Jc3Rp0Fb~Xr3KECeW|L1ltA$EyXOKdozv7S& zhXwv=>uQUsqqx%sy=zZ7T?_La4w7zarBD|nu}orJZzkTyZ=&^^%_e*UomTk?R8S65 zOb4Gcsb4_VGJzt)?pUE|prK^_ZL{u560Q+e#_^{iG8cQ9Tqc=?j$SaU*@ak=^%)k) z*J1AV#p%N>&U=}B0}l3t6K~NL+x-^Um+zkc2@7T|p~Gh^UTJ^y2JS65e@?Mq73>pXiO`Yg2Jo#s9C!g&8;e&>+|oo`J!ipF>^C8aiX>T4m& z?vmyvp-jxh8@gMsgIX%HcOfiCAfJ}aQ{T@{FGXe6PS+HsVW~3FdwIX1O7MW43WimW z&2W%uWzao`~Y$N{2$No4voP2QOINML=Fsm;7HuUq?bv89GUghn- z7bavX)hDCw-0*28JMJAe@Boz_^Q6U8aVZ76QB}@bNFP=;pA*tmCy}|H1)7PM1W#S@ zQm<;_c(F0OCb^<%n_oF%_{VSGdUN%Ws*10#^^o(;s61s6zi%}{uq(*`s&br9r;aOO0kISonrc`Cr584 zu;=I)8S=U=@i3&49`C~g1=sG;#h^>*K5vG@H{j}T5*0+!(E39Vq)xzS|eOpRdZ+fO1mO5}s zy#8RU=1$uA7EN!>Ck!5?CEe$zX$I+lsbSDwq$D6z?`9lC&JVzZY-e+v(7zw&x9xqC zw|7a-9pqCKZUcRZ$|4ol}1FiTD@)muep__&8?I=w{ko< zEgKxv;JWGt^kprb`)pxRzxF<;A7dqFEX!$e#Dx??A!$>07zS&Al{Jz)R<#XZ4d diff --git a/vnt-web/static/vue.global.prod.js.gz b/vnt-web/static/vue.global.prod.js.gz deleted file mode 100644 index cab7f19212bc17c82826a426a169a568a22aede5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58885 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 diff --git a/vnt-web/ui/index.html b/vnt-web/ui/index.html new file mode 100644 index 0000000..e5b960f --- /dev/null +++ b/vnt-web/ui/index.html @@ -0,0 +1,27 @@ + + + + + + VNT Dashboard + + + + +
+ + + diff --git a/vnt-web/ui/package.json b/vnt-web/ui/package.json new file mode 100644 index 0000000..1cf9f41 --- /dev/null +++ b/vnt-web/ui/package.json @@ -0,0 +1,21 @@ +{ + "name": "vnt-web-ui", + "private": true, + "version": "2.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "dependencies": { + "pinia": "^3.0.3", + "vue": "^3.5.18", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.12", + "@vitejs/plugin-vue": "^6.0.1", + "tailwindcss": "^4.1.12", + "vite": "^7.1.3" + } +} diff --git a/vnt-web/ui/pnpm-lock.yaml b/vnt-web/ui/pnpm-lock.yaml new file mode 100644 index 0000000..95908d7 --- /dev/null +++ b/vnt-web/ui/pnpm-lock.yaml @@ -0,0 +1,1312 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + pinia: + specifier: ^3.0.3 + version: 3.0.4(vue@3.5.41) + vue: + specifier: ^3.5.18 + version: 3.5.41 + vue-router: + specifier: ^4.5.1 + version: 4.6.4(vue@3.5.41) + devDependencies: + '@tailwindcss/vite': + specifier: ^4.1.12 + version: 4.3.3(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)) + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.8(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.41) + tailwindcss: + specifier: ^4.1.12 + version: 4.3.3 + vite: + specifier: ^7.1.3 + version: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) + +packages: + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/rollup-android-arm-eabi@4.62.5': + resolution: {integrity: sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.5': + resolution: {integrity: sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.5': + resolution: {integrity: sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.5': + resolution: {integrity: sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.5': + resolution: {integrity: sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.5': + resolution: {integrity: sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.5': + resolution: {integrity: sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.5': + resolution: {integrity: sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.5': + resolution: {integrity: sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.5': + resolution: {integrity: sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.5': + resolution: {integrity: sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.5': + resolution: {integrity: sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.5': + resolution: {integrity: sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.5': + resolution: {integrity: sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.5': + resolution: {integrity: sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.5': + resolution: {integrity: sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.5': + resolution: {integrity: sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.5': + resolution: {integrity: sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.5': + resolution: {integrity: sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.5': + resolution: {integrity: sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.5': + resolution: {integrity: sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.5': + resolution: {integrity: sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.5': + resolution: {integrity: sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.5': + resolution: {integrity: sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.5': + resolution: {integrity: sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==} + cpu: [x64] + os: [win32] + + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.3': + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.41': + resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} + + '@vue/compiler-dom@3.5.41': + resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==} + + '@vue/compiler-sfc@3.5.41': + resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==} + + '@vue/compiler-ssr@3.5.41': + resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.10': + resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} + + '@vue/devtools-kit@7.7.10': + resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} + + '@vue/devtools-shared@7.7.10': + resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} + + '@vue/reactivity@3.5.41': + resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==} + + '@vue/runtime-core@3.5.41': + resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==} + + '@vue/runtime-dom@3.5.41': + resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==} + + '@vue/server-renderer@3.5.41': + resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} + + '@vue/shared@3.5.41': + resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + copy-anything@4.1.0: + resolution: {integrity: sha512-ufbM3smX/Jbnpk5wcQjzd1MgBpzmqfNETUAyZNrGwU9foRlyHoGzMMBBCRzEhQLBjZfFDE1W2ufPXX2vdWkV8Q==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} + engines: {node: '>=10.13.0'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.62.5: + resolution: {integrity: sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue@3.5.41: + resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/rollup-android-arm-eabi@4.62.5': + optional: true + + '@rollup/rollup-android-arm64@4.62.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.5': + optional: true + + '@rollup/rollup-darwin-x64@4.62.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.5': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.5': + optional: true + + '@tailwindcss/node@4.3.3': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.24.5 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 + + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/vite@4.3.3(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + tailwindcss: 4.3.3 + vite: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) + + '@types/estree@1.0.9': {} + + '@vitejs/plugin-vue@6.0.8(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.41)': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) + vue: 3.5.41 + + '@vue/compiler-core@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.41 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.41': + dependencies: + '@vue/compiler-core': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/compiler-sfc@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.41 + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-ssr': 3.5.41 + '@vue/shared': 3.5.41 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.26 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.41': + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.10': + dependencies: + '@vue/devtools-kit': 7.7.10 + + '@vue/devtools-kit@7.7.10': + dependencies: + '@vue/devtools-shared': 7.7.10 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.10': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.41': + dependencies: + '@vue/shared': 3.5.41 + + '@vue/runtime-core@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/runtime-dom@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/runtime-core': 3.5.41 + '@vue/shared': 3.5.41 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.41': + dependencies: + '@vue/compiler-ssr': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/shared@3.5.41': {} + + birpc@2.9.0: {} + + copy-anything@4.1.0: {} + + csstype@3.2.3: {} + + detect-libc@2.1.2: {} + + enhanced-resolve@5.24.5: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@7.0.1: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + fsevents@2.3.3: + optional: true + + graceful-fs@4.2.11: {} + + hookable@5.5.3: {} + + jiti@2.7.0: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mitt@3.0.1: {} + + nanoid@3.3.18: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pinia@3.0.4(vue@3.5.41): + dependencies: + '@vue/devtools-api': 7.7.10 + vue: 3.5.41 + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rfdc@1.4.1: {} + + rollup@4.62.5: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.62.5 + '@rollup/rollup-android-arm64': 4.62.5 + '@rollup/rollup-darwin-arm64': 4.62.5 + '@rollup/rollup-darwin-x64': 4.62.5 + '@rollup/rollup-freebsd-arm64': 4.62.5 + '@rollup/rollup-freebsd-x64': 4.62.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.5 + '@rollup/rollup-linux-arm-musleabihf': 4.62.5 + '@rollup/rollup-linux-arm64-gnu': 4.62.5 + '@rollup/rollup-linux-arm64-musl': 4.62.5 + '@rollup/rollup-linux-loong64-gnu': 4.62.5 + '@rollup/rollup-linux-loong64-musl': 4.62.5 + '@rollup/rollup-linux-ppc64-gnu': 4.62.5 + '@rollup/rollup-linux-ppc64-musl': 4.62.5 + '@rollup/rollup-linux-riscv64-gnu': 4.62.5 + '@rollup/rollup-linux-riscv64-musl': 4.62.5 + '@rollup/rollup-linux-s390x-gnu': 4.62.5 + '@rollup/rollup-linux-x64-gnu': 4.62.5 + '@rollup/rollup-linux-x64-musl': 4.62.5 + '@rollup/rollup-openbsd-x64': 4.62.5 + '@rollup/rollup-openharmony-arm64': 4.62.5 + '@rollup/rollup-win32-arm64-msvc': 4.62.5 + '@rollup/rollup-win32-ia32-msvc': 4.62.5 + '@rollup/rollup-win32-x64-gnu': 4.62.5 + '@rollup/rollup-win32-x64-msvc': 4.62.5 + fsevents: 2.3.3 + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.1.0 + + tailwindcss@4.3.3: {} + + tapable@2.3.3: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0): + dependencies: + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.26 + rollup: 4.62.5 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + + vue-router@4.6.4(vue@3.5.41): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.41 + + vue@3.5.41: + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-sfc': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/server-renderer': 3.5.41 + '@vue/shared': 3.5.41 diff --git a/vnt-web/ui/src/App.vue b/vnt-web/ui/src/App.vue new file mode 100644 index 0000000..af6a58d --- /dev/null +++ b/vnt-web/ui/src/App.vue @@ -0,0 +1,276 @@ + + + diff --git a/vnt-web/ui/src/api/index.js b/vnt-web/ui/src/api/index.js new file mode 100644 index 0000000..267f891 --- /dev/null +++ b/vnt-web/ui/src/api/index.js @@ -0,0 +1,73 @@ +// fetch 封装:统一解包 ApiResponse{code,msg,data},code!==0 抛出带 msg 的错误 +const request = async (url, options) => { + const res = await fetch(url, options); + const json = await res.json(); + if (json.code !== 0) { + throw new Error(json.msg || "请求失败"); + } + return json.data; +}; + +const jsonHeaders = { "Content-Type": "application/json" }; + +// GET /api/info?file_name= +export const getInstanceInfo = (fileName) => + request(`/api/info?file_name=${encodeURIComponent(fileName)}`); + +// GET /api/peers?file_name= +export const getPeers = (fileName) => + request(`/api/peers?file_name=${encodeURIComponent(fileName)}`); + +// GET /api/routes?file_name= +export const getRoutes = (fileName) => + request(`/api/routes?file_name=${encodeURIComponent(fileName)}`); + +// GET /api/start/status?file_name= +export const getStartStatus = (fileName) => + request(`/api/start/status?file_name=${encodeURIComponent(fileName)}`); + +// GET /api/instances +export const getInstances = () => request("/api/instances"); + +// DELETE /api/instance?file_name= +export const deleteInstance = (fileName) => + request(`/api/instance?file_name=${encodeURIComponent(fileName)}`, { + method: "DELETE", + }); + +const postAction = (path, fileName) => + request(path, { + method: "POST", + headers: jsonHeaders, + body: JSON.stringify({ file_name: fileName }), + }); + +// POST /api/start +export const startVntApi = (fileName) => postAction("/api/start", fileName); + +// POST /api/stop +export const stopVntApi = (fileName) => postAction("/api/stop", fileName); + +// POST /api/restart +export const restartVntApi = (fileName) => postAction("/api/restart", fileName); + +// GET /api/config/list +export const getConfigList = () => request("/api/config/list"); + +// GET /api/config?file_name= -> TOML 原文字符串 +export const getConfig = (fileName) => + request(`/api/config?file_name=${encodeURIComponent(fileName)}`); + +// POST /api/config, JSON {file_name?, config} +export const saveConfig = (fileName, config) => + request("/api/config", { + method: "POST", + headers: jsonHeaders, + body: JSON.stringify({ file_name: fileName || null, config }), + }); + +// DELETE /api/config?file_name= +export const deleteConfig = (fileName) => + request(`/api/config?file_name=${encodeURIComponent(fileName)}`, { + method: "DELETE", + }); diff --git a/vnt-web/ui/src/components/AppModal.vue b/vnt-web/ui/src/components/AppModal.vue new file mode 100644 index 0000000..762ce09 --- /dev/null +++ b/vnt-web/ui/src/components/AppModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/vnt-web/ui/src/components/AppTooltip.vue b/vnt-web/ui/src/components/AppTooltip.vue new file mode 100644 index 0000000..606d02f --- /dev/null +++ b/vnt-web/ui/src/components/AppTooltip.vue @@ -0,0 +1,89 @@ + + + diff --git a/vnt-web/ui/src/components/ConfirmHost.vue b/vnt-web/ui/src/components/ConfirmHost.vue new file mode 100644 index 0000000..33ca251 --- /dev/null +++ b/vnt-web/ui/src/components/ConfirmHost.vue @@ -0,0 +1,48 @@ + + + diff --git a/vnt-web/ui/src/components/EmptyState.vue b/vnt-web/ui/src/components/EmptyState.vue new file mode 100644 index 0000000..7326f9e --- /dev/null +++ b/vnt-web/ui/src/components/EmptyState.vue @@ -0,0 +1,24 @@ + + + diff --git a/vnt-web/ui/src/components/InstanceCard.vue b/vnt-web/ui/src/components/InstanceCard.vue new file mode 100644 index 0000000..40ff156 --- /dev/null +++ b/vnt-web/ui/src/components/InstanceCard.vue @@ -0,0 +1,130 @@ + + + diff --git a/vnt-web/ui/src/components/SpeedChart.vue b/vnt-web/ui/src/components/SpeedChart.vue new file mode 100644 index 0000000..98f13c2 --- /dev/null +++ b/vnt-web/ui/src/components/SpeedChart.vue @@ -0,0 +1,136 @@ + + + diff --git a/vnt-web/ui/src/components/StartPanel.vue b/vnt-web/ui/src/components/StartPanel.vue new file mode 100644 index 0000000..864328b --- /dev/null +++ b/vnt-web/ui/src/components/StartPanel.vue @@ -0,0 +1,72 @@ + + + diff --git a/vnt-web/ui/src/components/StatusDot.vue b/vnt-web/ui/src/components/StatusDot.vue new file mode 100644 index 0000000..d47a8ba --- /dev/null +++ b/vnt-web/ui/src/components/StatusDot.vue @@ -0,0 +1,17 @@ + + + diff --git a/vnt-web/ui/src/components/ToastHost.vue b/vnt-web/ui/src/components/ToastHost.vue new file mode 100644 index 0000000..20bc9c7 --- /dev/null +++ b/vnt-web/ui/src/components/ToastHost.vue @@ -0,0 +1,45 @@ + + + diff --git a/vnt-web/ui/src/main.js b/vnt-web/ui/src/main.js new file mode 100644 index 0000000..24f0b7d --- /dev/null +++ b/vnt-web/ui/src/main.js @@ -0,0 +1,7 @@ +import { createApp } from "vue"; +import { createPinia } from "pinia"; +import App from "./App.vue"; +import router from "./router"; +import "./style.css"; + +createApp(App).use(createPinia()).use(router).mount("#app"); diff --git a/vnt-web/ui/src/router/index.js b/vnt-web/ui/src/router/index.js new file mode 100644 index 0000000..c5d58c7 --- /dev/null +++ b/vnt-web/ui/src/router/index.js @@ -0,0 +1,21 @@ +import { createRouter, createWebHashHistory } from "vue-router"; +import DashboardView from "../views/DashboardView.vue"; +import InstancesView from "../views/InstancesView.vue"; +import ConfigView from "../views/ConfigView.vue"; +import PeersView from "../views/PeersView.vue"; +import RoutesView from "../views/RoutesView.vue"; + +const routes = [ + { path: "/", component: DashboardView }, + { path: "/instances", component: InstancesView }, + // 兼容旧路由 + { path: "/general", redirect: "/instances" }, + { path: "/config", component: ConfigView }, + { path: "/peers", component: PeersView }, + { path: "/routes", component: RoutesView }, +]; + +export default createRouter({ + history: createWebHashHistory(), + routes, +}); diff --git a/vnt-web/ui/src/stores/app.js b/vnt-web/ui/src/stores/app.js new file mode 100644 index 0000000..8111676 --- /dev/null +++ b/vnt-web/ui/src/stores/app.js @@ -0,0 +1,252 @@ +import { defineStore } from "pinia"; +import { ref, computed, onMounted, onUnmounted, getCurrentInstance } from "vue"; +import { + getInstances, + getInstanceInfo, + getConfigList, + startVntApi, + stopVntApi, + restartVntApi, + deleteInstance, +} from "../api"; +import { useUiStore } from "./ui"; +import { useStartLogStore } from "./startLog"; + +export const useAppStore = defineStore("app", () => { + const ui = useUiStore(); + const startLog = useStartLogStore(); + + // 多实例状态:key=file_name, value=该实例 info + const instances = ref({}); + const instanceList = ref([]); + const selectedInstance = ref(null); + const configList = ref([]); + const loadingMap = ref({}); + + // 页面可见性 + const isPageVisible = ref(!document.hidden); + const visibilityHandler = () => { + isPageVisible.value = !document.hidden; + }; + + let infoTimer = null; + + const runningCount = computed( + () => instanceList.value.filter((i) => i.status === "running").length, + ); + const startingCount = computed( + () => instanceList.value.filter((i) => i.status === "starting").length, + ); + const headerStatusText = computed(() => { + if (runningCount.value > 0) return `运行中 x${runningCount.value}`; + if (startingCount.value > 0) return "启动中..."; + return "未启动"; + }); + const selectedInfo = computed(() => + selectedInstance.value ? instances.value[selectedInstance.value] || null : null, + ); + const selectedConfigName = computed(() => { + if (!selectedInstance.value) return ""; + const inst = instanceList.value.find( + (i) => i.file_name === selectedInstance.value, + ); + return inst ? inst.config_name || inst.file_name : selectedInstance.value; + }); + const version = computed(() => { + for (const key in instances.value) { + const item = instances.value[key]; + if (item && item.version) return item.version; + } + return ""; + }); + const isServerConnected = computed( + () => + !!( + selectedInfo.value && + selectedInfo.value.server_info && + selectedInfo.value.server_info.some((s) => s.connected) + ), + ); + const serverStatusText = computed(() => { + const si = selectedInfo.value; + if (!si || !si.server_info || !si.server_info.length) return "未配置服务器"; + return `${si.server_info.filter((s) => s.connected).length} / ${si.server_info.length} 已连接`; + }); + + const infoOf = (fileName) => instances.value[fileName] || {}; + + const fetchInstanceInfo = async (fileName) => { + try { + instances.value[fileName] = await getInstanceInfo(fileName); + } catch (e) { + console.error("Fetch info error", e); + } + }; + + const fetchInstances = async () => { + try { + const list = (await getInstances()) || []; + instanceList.value = list; + // 清理已消失实例的 info 缓存 + for (const key of Object.keys(instances.value)) { + if (!list.some((i) => i.file_name === key)) { + delete instances.value[key]; + } + } + // 默认选中逻辑:当前选中失效时优先第一个 running,否则第一个,否则 null + if ( + !selectedInstance.value || + !list.some((i) => i.file_name === selectedInstance.value) + ) { + const running = list.find((i) => i.status === "running"); + selectedInstance.value = running + ? running.file_name + : list.length > 0 + ? list[0].file_name + : null; + } + // 拉取 running 实例的详情 + for (const inst of list) { + if (inst.status === "running") { + fetchInstanceInfo(inst.file_name); + } + } + } catch (e) { + console.error("Fetch instances error", e); + } + }; + + const fetchConfigList = async () => { + try { + configList.value = (await getConfigList()) || []; + } catch (e) { + console.error("Fetch list error", e); + } + }; + + const startVnt = async (fileName) => { + if (!fileName) { + ui.toast.error("请先选择一个配置"); + return; + } + if (loadingMap.value[fileName]) return; + loadingMap.value[fileName] = true; + try { + await startVntApi(fileName); + startLog.openStartLog(fileName); + fetchInstances(); + } catch (e) { + ui.toast.error("启动失败: " + e.message); + } finally { + loadingMap.value[fileName] = false; + } + }; + + const stopVnt = async (fileName) => { + if (!fileName || loadingMap.value[fileName]) return; + loadingMap.value[fileName] = true; + try { + await stopVntApi(fileName); + ui.toast.success("已停止"); + if (startLog.logFileName === fileName) { + startLog.stopPolling(); + startLog.showStartLog = false; + } + fetchInstances(); + } catch (e) { + ui.toast.error("停止失败: " + e.message); + console.error(e); + } finally { + loadingMap.value[fileName] = false; + } + }; + + const restartVnt = async (fileName) => { + if (!fileName || loadingMap.value[fileName]) return; + loadingMap.value[fileName] = true; + try { + await restartVntApi(fileName); + startLog.openStartLog(fileName); + fetchInstances(); + } catch (e) { + ui.toast.error("重启失败: " + e.message); + } finally { + loadingMap.value[fileName] = false; + } + }; + + // 移除已停止(启动失败残留)的实例条目 + const dismissInstance = async (fileName) => { + if (!fileName || loadingMap.value[fileName]) return; + loadingMap.value[fileName] = true; + try { + await deleteInstance(fileName); + ui.toast.success("已移除"); + if (startLog.logFileName === fileName) { + startLog.stopPolling(); + startLog.showStartLog = false; + } + if (selectedInstance.value === fileName) { + selectedInstance.value = null; + } + fetchInstances(); + } catch (e) { + ui.toast.error("移除失败: " + e.message); + } finally { + loadingMap.value[fileName] = false; + } + }; + + // 注入依赖,供启动日志 store 刷新实例与解析配置名 + startLog.bindApp({ fetchInstances, instanceList, configList }); + + const init = async () => { + document.addEventListener("visibilitychange", visibilityHandler); + await fetchInstances(); + fetchConfigList(); + // 页面加载时若有正在启动的实例,恢复其日志弹窗 + const starting = instanceList.value.find((i) => i.status === "starting"); + if (starting) startLog.openStartLog(starting.file_name); + // 全局 3s 轮询实例列表及 running 实例详情(仅页面可见) + infoTimer = setInterval(() => { + if (isPageVisible.value) fetchInstances(); + }, 3000); + }; + + const destroy = () => { + document.removeEventListener("visibilitychange", visibilityHandler); + startLog.stopPolling(); + if (infoTimer) clearInterval(infoTimer); + }; + + // store 在组件 setup 中被使用时自动挂接生命周期 + if (getCurrentInstance()) { + onMounted(init); + onUnmounted(destroy); + } + + return { + instances, + instanceList, + selectedInstance, + configList, + loadingMap, + isPageVisible, + runningCount, + startingCount, + headerStatusText, + selectedInfo, + selectedConfigName, + version, + isServerConnected, + serverStatusText, + infoOf, + fetchInstances, + fetchInstanceInfo, + fetchConfigList, + startVnt, + stopVnt, + restartVnt, + dismissInstance, + }; +}); diff --git a/vnt-web/ui/src/stores/startLog.js b/vnt-web/ui/src/stores/startLog.js new file mode 100644 index 0000000..36483f4 --- /dev/null +++ b/vnt-web/ui/src/stores/startLog.js @@ -0,0 +1,116 @@ +import { defineStore } from "pinia"; +import { ref, computed, nextTick } from "vue"; +import { getStartStatus, stopVntApi } from "../api"; + +// 启动日志弹窗状态 +export const useStartLogStore = defineStore("startLog", () => { + const showStartLog = ref(false); + const startLogs = ref([]); + const startStatus = ref("stopped"); + const logFileName = ref(null); + const logContainer = ref(null); + let statusInterval = null; + + // 由 app store 注入,避免循环依赖 + let fetchInstancesFn = null; + let instanceListRef = null; + let configListRef = null; + const bindApp = ({ fetchInstances, instanceList, configList }) => { + fetchInstancesFn = fetchInstances; + instanceListRef = instanceList; + configListRef = configList; + }; + + const logConfigName = computed(() => { + if (!logFileName.value) return ""; + const inst = (instanceListRef?.value || []).find( + (i) => i.file_name === logFileName.value, + ); + if (inst) return inst.config_name || inst.file_name; + const cfg = (configListRef?.value || []).find( + (c) => c.file_name === logFileName.value, + ); + return cfg ? cfg.config_name || cfg.file_name : logFileName.value; + }); + + const pollStartStatus = async () => { + if (!logFileName.value) return; + try { + const data = await getStartStatus(logFileName.value); + startLogs.value = data.logs || []; + startStatus.value = data.status; + nextTick(() => { + if (logContainer.value) + logContainer.value.scrollTop = logContainer.value.scrollHeight; + }); + + if (startStatus.value === "running") { + stopPolling(); + fetchInstancesFn && fetchInstancesFn(); + showStartLog.value = false; + } else if (startStatus.value === "stopped" && startLogs.value.length > 0) { + stopPolling(); + fetchInstancesFn && fetchInstancesFn(); + } + } catch (e) { + console.error(e); + } + }; + + const stopPolling = () => { + if (statusInterval) { + clearInterval(statusInterval); + statusInterval = null; + } + }; + + const startPolling = () => { + stopPolling(); + statusInterval = setInterval(pollStartStatus, 1000); + pollStartStatus(); + }; + + const openStartLog = (fileName) => { + logFileName.value = fileName; + startLogs.value = []; + startStatus.value = "starting"; + showStartLog.value = true; + startPolling(); + }; + + // 取消组网:停止轮询并 POST /api/stop + const cancelStart = async () => { + stopPolling(); + const fileName = logFileName.value; + if (fileName) { + try { + await stopVntApi(fileName); + startLogs.value.push("启动已手动取消"); + } catch (e) { + // 忽略取消时的网络错误 + } + } + startStatus.value = "stopped"; + fetchInstancesFn && fetchInstancesFn(); + }; + + const close = () => { + showStartLog.value = false; + }; + + return { + showStartLog, + startLogs, + startStatus, + logFileName, + logContainer, + logConfigName, + bindApp, + openStartLog, + pollStartStatus, + startPolling, + stopPolling, + cancelStart, + close, + }; +}); diff --git a/vnt-web/ui/src/stores/ui.js b/vnt-web/ui/src/stores/ui.js new file mode 100644 index 0000000..aa96b0b --- /dev/null +++ b/vnt-web/ui/src/stores/ui.js @@ -0,0 +1,64 @@ +import { defineStore } from "pinia"; +import { reactive, ref } from "vue"; + +let toastId = 0; + +export const useUiStore = defineStore("ui", () => { + // toast 队列 + const toasts = ref([]); + + const pushToast = (type, message, duration = 3000) => { + const id = ++toastId; + toasts.value.push({ id, type, message }); + setTimeout(() => { + toasts.value = toasts.value.filter((t) => t.id !== id); + }, duration); + }; + + const toast = { + success: (msg) => pushToast("success", msg), + error: (msg) => pushToast("error", msg, 4500), + info: (msg) => pushToast("info", msg), + }; + + // confirm 弹窗:返回 Promise + const confirmState = reactive({ + show: false, + title: "", + message: "", + danger: false, + confirmText: "确定", + resolve: null, + }); + + const confirm = ({ title = "确认操作", message = "", danger = false, confirmText = "确定" } = {}) => + new Promise((resolve) => { + confirmState.show = true; + confirmState.title = title; + confirmState.message = message; + confirmState.danger = danger; + confirmState.confirmText = confirmText; + confirmState.resolve = resolve; + }); + + const confirmOk = () => { + confirmState.show = false; + confirmState.resolve && confirmState.resolve(true); + confirmState.resolve = null; + }; + + const confirmCancel = () => { + confirmState.show = false; + confirmState.resolve && confirmState.resolve(false); + confirmState.resolve = null; + }; + + return { + toasts, + toast, + confirmState, + confirm, + confirmOk, + confirmCancel, + }; +}); diff --git a/vnt-web/ui/src/style.css b/vnt-web/ui/src/style.css new file mode 100644 index 0000000..11027de --- /dev/null +++ b/vnt-web/ui/src/style.css @@ -0,0 +1,229 @@ +@import "tailwindcss"; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + /* 全局唯一主色 */ + --color-accent: var(--color-indigo-600); + --color-accent-hover: var(--color-indigo-500); +} + +body { + @apply bg-slate-50 text-slate-700 antialiased dark:bg-slate-950 dark:text-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: transparent; +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + @apply rounded bg-slate-300 dark:bg-slate-600; +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + @apply bg-slate-400 dark:bg-slate-500; +} + +.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 0.2s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* 弹窗动画 */ +.modal-enter-active, +.modal-leave-active { + transition: opacity 0.2s ease; +} + +.modal-enter-active .modal-panel, +.modal-leave-active .modal-panel { + transition: transform 0.2s ease, opacity 0.2s ease; +} + +.modal-enter-from, +.modal-leave-to { + opacity: 0; +} + +.modal-enter-from .modal-panel, +.modal-leave-to .modal-panel { + transform: scale(0.96); + opacity: 0; +} + +/* Toast 动画 */ +.toast-enter-active, +.toast-leave-active { + transition: opacity 0.25s ease, transform 0.25s ease; +} + +.toast-enter-from { + opacity: 0; + transform: translateY(-10px); +} + +.toast-leave-to { + opacity: 0; + transform: translateX(20px); +} + +/* 移动导航动画 */ +.navdrop-enter-active, +.navdrop-leave-active { + transition: opacity 0.2s ease, transform 0.2s ease; +} + +.navdrop-enter-from, +.navdrop-leave-to { + opacity: 0; + transform: translateY(-6px); +} + +@utility btn { + @apply inline-flex items-center justify-center gap-1.5 px-4 py-2 rounded-lg text-sm font-medium + transition-all duration-150 active:scale-95 cursor-pointer + disabled:opacity-50 disabled:cursor-not-allowed disabled:active:scale-100 + focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/40; +} + +@utility badge { + @apply inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium; +} + +@layer components { + .btn-primary { + @apply btn bg-indigo-600 text-white shadow-sm hover:bg-indigo-500 dark:bg-indigo-500 dark:hover:bg-indigo-400; + } + + .btn-ghost { + @apply btn border border-slate-300 bg-white text-slate-700 shadow-sm hover:bg-slate-50 + dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700; + } + + .btn-danger { + @apply btn bg-red-600 text-white shadow-sm hover:bg-red-500; + } + + .btn-sm { + @apply px-3 py-1.5 text-xs; + } + + .card { + @apply rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-shadow duration-200 + hover:shadow-md dark:border-slate-700/80 dark:bg-slate-900; + } + + .input { + @apply w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 + placeholder-slate-400 transition-colors + focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/25 + disabled:opacity-50 disabled:cursor-not-allowed + dark:border-slate-600 dark:bg-slate-800 dark:text-white dark:placeholder-slate-500; + } + + /* 语义徽章:浅色底深色字,dark 下深底浅字 */ + .badge-green { + @apply badge bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300; + } + + .badge-red { + @apply badge bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300; + } + + .badge-yellow { + @apply badge bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-300; + } + + .badge-blue { + @apply badge bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300; + } + + .badge-purple { + @apply badge bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-300; + } + + .badge-gray { + @apply badge bg-slate-100 text-slate-500 dark:bg-slate-700 dark:text-slate-300; + } + + .table { + @apply min-w-full divide-y divide-slate-200 dark:divide-slate-700; + } + + .table thead { + @apply bg-slate-50 dark:bg-slate-800/60; + } + + .table thead th { + @apply px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-slate-500 whitespace-nowrap + dark:text-slate-400; + } + + .table tbody { + @apply divide-y divide-slate-200 bg-white dark:divide-slate-700 dark:bg-transparent; + } + + .table tbody td { + @apply px-4 py-3 text-sm text-slate-600 whitespace-nowrap dark:text-slate-300; + } + + /* 表格内静态 tooltip */ + .tooltip { + @apply relative inline-flex items-center justify-center; + } + + .tooltip .tooltip-text { + @apply invisible absolute bottom-[125%] left-1/2 z-10 w-36 -translate-x-1/2 rounded-md + border border-slate-200 bg-white px-2 py-1.5 text-center text-xs text-slate-600 shadow-lg + opacity-0 transition-opacity duration-300 pointer-events-none + dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200; + } + + .tooltip:hover .tooltip-text { + @apply visible opacity-100; + } + + /* 页面标题区 */ + .page-title { + @apply text-2xl font-bold text-slate-900 dark:text-white; + } + + .page-subtitle { + @apply mt-1 text-sm text-slate-500 dark:text-slate-400; + } + + /* 弱文本 */ + .muted { + @apply text-slate-500 dark:text-slate-400; + } +} diff --git a/vnt-web/ui/src/utils/format.js b/vnt-web/ui/src/utils/format.js new file mode 100644 index 0000000..8f3b63c --- /dev/null +++ b/vnt-web/ui/src/utils/format.js @@ -0,0 +1,55 @@ +// 格式化时间 +export const formatTime = (timestamp) => { + if (!timestamp) return "-"; + const date = new Date(timestamp * 1000); + const pad = (n) => (n < 10 ? "0" + n : n); + return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`; +}; + +// 格式化字节数 +export const formatBytes = (bytes) => { + if (bytes === 0 || bytes === undefined || bytes === null) return "0B"; + const units = ["B", "KB", "MB", "GB", "TB"]; + let i = 0; + let value = bytes; + while (value >= 1024 && i < units.length - 1) { + value /= 1024; + i++; + } + return i === 0 ? value + units[i] : value.toFixed(2) + units[i]; +}; + +// 格式化速度(字节/秒) +export const formatSpeed = (bytesPerSecond) => { + if ( + bytesPerSecond === 0 || + bytesPerSecond === undefined || + bytesPerSecond === null + ) + return "0B/s"; + const units = ["B/s", "KB/s", "MB/s", "GB/s"]; + let i = 0; + let value = bytesPerSecond; + while (value >= 1024 && i < units.length - 1) { + value /= 1024; + i++; + } + return i === 0 ? value + units[i] : value.toFixed(2) + units[i]; +}; + +// 将数值取整到适合的刻度 +export const niceNumber = (val) => { + const units = [ + 1024, // 1KB + 10 * 1024, // 10KB + 100 * 1024, // 100KB + 1024 * 1024, // 1MB + 10 * 1024 * 1024, // 10MB + 100 * 1024 * 1024, // 100MB + 1024 * 1024 * 1024, // 1GB + ]; + for (const u of units) { + if (val <= u) return u; + } + return Math.ceil(val / (1024 * 1024 * 1024)) * 1024 * 1024 * 1024; +}; diff --git a/vnt-web/ui/src/utils/toml.js b/vnt-web/ui/src/utils/toml.js new file mode 100644 index 0000000..27b891b --- /dev/null +++ b/vnt-web/ui/src/utils/toml.js @@ -0,0 +1,349 @@ +// 从旧 index.html 原样迁移的 TOML <-> 表单双向解析逻辑 + +export const emptyFormData = () => ({ + config_name: "", + network_code: "", + server: [""], + ip: "", + mtu: null, + rtx: false, + fec: false, + compress: false, + no_punch: false, + input: [], + output: [], + no_nat: false, + no_tun: false, + port_mapping: [], + allow_mapping: false, + device_name: "", + device_id: "", + tun_name: "", + password: "", + cert_mode: "skip", + fingerprint: "", + udp_stun: [], + tcp_stun: [], + tunnel_port: null, +}); + +// 从TOML解析到表单 +export const parseTomlToForm = (toml) => { + const data = emptyFormData(); + + const lines = toml.split("\n"); + for (const line of lines) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + + if (trimmed.includes("config_name")) { + const match = trimmed.match(/config_name\s*=\s*"([^"]*)"/); + if (match) data.config_name = match[1]; + } else if (trimmed.includes("network_code")) { + const match = trimmed.match(/network_code\s*=\s*"([^"]*)"/); + if (match) data.network_code = match[1]; + } else if (trimmed.startsWith("server")) { + const match = trimmed.match(/server\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.server = items.map((s) => s.replace(/"/g, "")); + } + } else if (trimmed.includes("ip =")) { + const match = trimmed.match(/ip\s*=\s*"([^"]*)"/); + if (match) data.ip = match[1]; + } else if (trimmed.includes("mtu =")) { + const match = trimmed.match(/mtu\s*=\s*(\d+)/); + if (match) data.mtu = parseInt(match[1]); + } else if (trimmed.match(/^rtx\s*=/)) { + data.rtx = trimmed.includes("true"); + } else if (trimmed.match(/^fec\s*=/)) { + data.fec = trimmed.includes("true"); + } else if (trimmed.match(/^compress\s*=/)) { + data.compress = trimmed.includes("true"); + } else if (trimmed.match(/^no_punch\s*=/)) { + data.no_punch = trimmed.includes("true"); + } else if (trimmed.startsWith("input")) { + const match = trimmed.match(/input\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.input = items.map((s) => s.replace(/"/g, "")); + } + } else if (trimmed.startsWith("output")) { + const match = trimmed.match(/output\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.output = items.map((s) => s.replace(/"/g, "")); + } + } else if (trimmed.match(/^no_nat\s*=/)) { + data.no_nat = trimmed.includes("true"); + } else if (trimmed.match(/^no_tun\s*=/)) { + data.no_tun = trimmed.includes("true"); + } else if (trimmed.startsWith("port_mapping")) { + const match = trimmed.match(/port_mapping\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.port_mapping = items.map((s) => s.replace(/"/g, "")); + } + } else if (trimmed.match(/^allow_mapping\s*=/)) { + data.allow_mapping = trimmed.includes("true"); + } else if (trimmed.includes("device_name")) { + const match = trimmed.match(/device_name\s*=\s*"([^"]*)"/); + if (match) data.device_name = match[1]; + } else if (trimmed.includes("device_id")) { + const match = trimmed.match(/device_id\s*=\s*"([^"]*)"/); + if (match) data.device_id = match[1]; + } else if (trimmed.includes("tun_name")) { + const match = trimmed.match(/tun_name\s*=\s*"([^"]*)"/); + if (match) data.tun_name = match[1]; + } else if (trimmed.includes("password =")) { + const match = trimmed.match(/password\s*=\s*"([^"]*)"/); + if (match) data.password = match[1]; + } else if (trimmed.includes("cert_mode")) { + const match = trimmed.match(/cert_mode\s*=\s*"([^"]*)"/); + if (match) { + const value = match[1]; + if (value.startsWith("finger:")) { + data.cert_mode = "finger"; + data.fingerprint = value.substring(7); // 去掉 "finger:" 前缀 + } else { + data.cert_mode = value; + } + } + } else if (trimmed.startsWith("udp_stun")) { + const match = trimmed.match(/udp_stun\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.udp_stun = items.map((s) => s.replace(/"/g, "")); + } + } else if (trimmed.startsWith("tcp_stun")) { + const match = trimmed.match(/tcp_stun\s*=\s*\[(.*)\]/); + if (match) { + const items = match[1].match(/"([^"]*)"/g); + if (items) data.tcp_stun = items.map((s) => s.replace(/"/g, "")); + } + } + } + + return data; +}; + +// 从表单生成TOML +export const formToToml = (formData) => { + let toml = ""; + + if (formData.config_name) { + toml += `# 配置名称\nconfig_name = "${formData.config_name}"\n`; + } + + toml += "\n# --- 网络配置 ---\n"; + toml += "# 网络编号,相同网络编号的会组在同一个虚拟网 (必填)\n"; + toml += `network_code = "${formData.network_code}"\n\n`; + + const servers = formData.server.filter((s) => s.trim()); + if (servers.length > 0) { + toml += "# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填)\n"; + toml += "# dynamic 协议使用dns txt解析记录值\n"; + toml += `server = [${servers.map((s) => `"${s}"`).join(", ")}]\n`; + } + + if (formData.ip) { + toml += "\n# 自定义虚拟 IP (可选)\n"; + toml += `ip = "${formData.ip}"\n`; + } + + if (formData.rtx) { + toml += "\n# 是否启用quic优化传输 (默认 false)\n"; + toml += "# 开启后传输过程几乎不会丢包,但是延迟可能会有波动\n"; + toml += "rtx = true\n"; + } + + if (formData.fec) { + toml += "\n# 是否启用 FEC 前向纠错 (默认 false)\n"; + toml += "# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能\n"; + toml += "fec = true\n"; + } + + if (formData.no_punch) { + toml += "\n# 是否关闭 P2P 打洞 (默认 false)\n"; + toml += "no_punch = true\n"; + } + + if (formData.compress) { + toml += "\n# 是否启用 LZ4 压缩 (默认 false)\n"; + toml += "compress = true\n"; + } + + const inputs = formData.input.filter((s) => s.trim()); + if (inputs.length > 0) { + toml += "\n# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点\n"; + toml += "# 例如192.168.0.0/24,10.26.0.2 表示将192.168.0.0/24网段的数据转发到10.26.0.2\n"; + toml += `input = [${inputs.map((s) => `"${s}"`).join(", ")}]\n`; + } + + const outputs = formData.output.filter((s) => s.trim()); + if (outputs.length > 0) { + toml += "\n# 出栈允许网段,用于点对网,允许指定网段的转发\n"; + toml += `output = [${outputs.map((s) => `"${s}"`).join(", ")}]\n`; + } + + if (formData.no_nat) { + toml += "\n# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网\n"; + toml += "# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好\n"; + toml += "no_nat = true\n"; + } + + if (formData.no_tun) { + toml += "\n# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限\n"; + toml += "no_tun = true\n"; + } + + const portMappings = formData.port_mapping.filter((s) => s.trim()); + if (portMappings.length > 0) { + toml += "\n# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址\n"; + toml += "# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址\n"; + toml += "# 例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 表示将本地tcp的81端口的数据转发到10.0.0.2:80\n"; + toml += "# 例如: 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\n"; + toml += "# 例如: tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80\n"; + toml += `port_mapping = [${portMappings.map((s) => `"${s}"`).join(", ")}]\n`; + } + + if (formData.allow_mapping) { + toml += '\n# 是否允许作为端口映射出口,开启后其他设备才可使用本设备的ip为"目标虚拟IP"\n'; + toml += "# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络\n"; + toml += "allow_mapping = true\n"; + } + + if (formData.mtu) { + toml += "\n# MTU 设置\n"; + toml += `mtu = ${formData.mtu}\n`; + } + + toml += "\n# --- 设备配置 ---\n"; + if (formData.device_name) { + toml += "\n# 设备名称 (可选,默认读取本机 hostname)\n"; + toml += `device_name = "${formData.device_name}"\n`; + } + if (formData.device_id) { + toml += "\n# 设备 ID (可选,不填自动生成,不同设备ID不能相同)\n"; + toml += `device_id = "${formData.device_id}"\n`; + } + if (formData.tun_name) { + toml += "\n# 虚拟网卡名称\n"; + toml += `tun_name = "${formData.tun_name}"\n`; + } + + toml += "\n# --- 安全配置 ---\n"; + if (formData.password) { + toml += "\n# 组网加密密码 (可选)\n"; + toml += `password = "${formData.password}"\n`; + } + if (formData.cert_mode && formData.cert_mode !== "skip") { + toml += "\n# 证书校验方式:\n"; + toml += "# skip 跳过验证(默认)\n"; + toml += "# standard 使用系统证书验证\n"; + toml += "# finger 使用证书指纹验证,服务端启动时日志会输出指纹\n"; + if (formData.cert_mode === "finger" && formData.fingerprint) { + toml += `cert_mode = "finger:${formData.fingerprint}"\n`; + } else { + toml += `cert_mode = "${formData.cert_mode}"\n`; + } + } + + const udpStuns = formData.udp_stun.filter((s) => s.trim()); + if (udpStuns.length > 0) { + toml += "\n# 自定义UDP STUN地址,不设置则用默认stun\n"; + toml += `udp_stun = [${udpStuns.map((s) => `"${s}"`).join(", ")}]\n`; + } + + const tcpStuns = formData.tcp_stun.filter((s) => s.trim()); + if (tcpStuns.length > 0) { + toml += "\n# 自定义TCP STUN地址,不设置则用默认stun\n"; + toml += `tcp_stun = [${tcpStuns.map((s) => `"${s}"`).join(", ")}]\n`; + } + + return toml; +}; + +// 新建配置的 TOML 模板(从旧代码逐字迁移) +export const NEW_CONFIG_TEMPLATE = `# 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"]`; diff --git a/vnt-web/ui/src/views/ConfigEditor.vue b/vnt-web/ui/src/views/ConfigEditor.vue new file mode 100644 index 0000000..23b9e3d --- /dev/null +++ b/vnt-web/ui/src/views/ConfigEditor.vue @@ -0,0 +1,609 @@ + + + diff --git a/vnt-web/ui/src/views/ConfigView.vue b/vnt-web/ui/src/views/ConfigView.vue new file mode 100644 index 0000000..b02ebe9 --- /dev/null +++ b/vnt-web/ui/src/views/ConfigView.vue @@ -0,0 +1,135 @@ + + + diff --git a/vnt-web/ui/src/views/DashboardView.vue b/vnt-web/ui/src/views/DashboardView.vue new file mode 100644 index 0000000..8c1ab5e --- /dev/null +++ b/vnt-web/ui/src/views/DashboardView.vue @@ -0,0 +1,103 @@ + + + diff --git a/vnt-web/ui/src/views/InstancesView.vue b/vnt-web/ui/src/views/InstancesView.vue new file mode 100644 index 0000000..cbfd8f3 --- /dev/null +++ b/vnt-web/ui/src/views/InstancesView.vue @@ -0,0 +1,152 @@ + + + diff --git a/vnt-web/ui/src/views/PeersView.vue b/vnt-web/ui/src/views/PeersView.vue new file mode 100644 index 0000000..b321870 --- /dev/null +++ b/vnt-web/ui/src/views/PeersView.vue @@ -0,0 +1,318 @@ + + + diff --git a/vnt-web/ui/src/views/RoutesView.vue b/vnt-web/ui/src/views/RoutesView.vue new file mode 100644 index 0000000..e128c0a --- /dev/null +++ b/vnt-web/ui/src/views/RoutesView.vue @@ -0,0 +1,122 @@ + + + diff --git a/vnt-web/ui/vite.config.js b/vnt-web/ui/vite.config.js new file mode 100644 index 0000000..e4fa959 --- /dev/null +++ b/vnt-web/ui/vite.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig({ + plugins: [vue(), tailwindcss()], + server: { + proxy: { + "/api": "http://127.0.0.1:19099", + }, + }, + build: { + outDir: "../static", + emptyOutDir: true, + }, +});