From 8b5f7d517e76cba5d4cd0e5e81039f24dd19c341 Mon Sep 17 00:00:00 2001 From: Eeveid <448859157@qq.com> Date: Sat, 28 Mar 2026 19:13:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=89=E5=8D=93=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E6=98=BE=E7=A4=BA=E5=90=8D=E7=A7=B0=E4=B8=8D=E7=AC=A6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=BAlinux=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6=E5=90=8D=E4=B9=B1?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/http.go | 14 ++++++ frontend/dist/assets/index-BoiTbES-.js | 17 +++++++ frontend/dist/assets/index-DPzeYqvr.js | 17 ------- frontend/dist/index.html | 2 +- frontend/src/App.vue | 70 ++++++++++++++++++++++---- 5 files changed, 92 insertions(+), 28 deletions(-) create mode 100644 frontend/dist/assets/index-BoiTbES-.js delete mode 100644 frontend/dist/assets/index-DPzeYqvr.js diff --git a/backend/internal/handler/http.go b/backend/internal/handler/http.go index 4704d51..6f32841 100644 --- a/backend/internal/handler/http.go +++ b/backend/internal/handler/http.go @@ -456,6 +456,7 @@ func (h *HTTPHandler) downloadFallback(c *gin.Context) { defer cancel() filename := filepath.Base(transfer.Name) + filename = decodeDownloadFilename(filename) if filename == "." || filename == "" { filename = "download.bin" } @@ -597,6 +598,19 @@ func contentDisposition(filename string) string { return `attachment; filename="` + escaped + `"` } +func decodeDownloadFilename(filename string) string { + filename = strings.TrimSpace(filename) + if filename == "" || !strings.Contains(filename, "%") { + return filename + } + + decoded, err := url.PathUnescape(filename) + if err != nil { + return filename + } + return strings.TrimSpace(decoded) +} + func (h *HTTPHandler) ensureFallbackBucket(ctx context.Context, transferID string) error { if h.deps.MinIOClient == nil { return nil diff --git a/frontend/dist/assets/index-BoiTbES-.js b/frontend/dist/assets/index-BoiTbES-.js new file mode 100644 index 0000000..4f7d958 --- /dev/null +++ b/frontend/dist/assets/index-BoiTbES-.js @@ -0,0 +1,17 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/** +* @vue/shared v3.5.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Fs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const re={},qt=[],tt=()=>{},ui=()=>!1,Yn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Us=e=>e.startsWith("onUpdate:"),Ce=Object.assign,Ls=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},tl=Object.prototype.hasOwnProperty,Z=(e,t)=>tl.call(e,t),H=Array.isArray,Gt=e=>wn(e)==="[object Map]",fi=e=>wn(e)==="[object Set]",Tr=e=>wn(e)==="[object Date]",K=e=>typeof e=="function",ae=e=>typeof e=="string",qe=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",di=e=>(ne(e)||K(e))&&K(e.then)&&K(e.catch),pi=Object.prototype.toString,wn=e=>pi.call(e),nl=e=>wn(e).slice(8,-1),hi=e=>wn(e)==="[object Object]",Bs=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,cn=Fs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Xn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},sl=/-\w/g,Ae=Xn(e=>e.replace(sl,t=>t.slice(1).toUpperCase())),rl=/\B([A-Z])/g,St=Xn(e=>e.replace(rl,"-$1").toLowerCase()),Zn=Xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),ps=Xn(e=>e?`on${Zn(e)}`:""),et=(e,t)=>!Object.is(e,t),Bn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},js=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let $r;const Qn=()=>$r||($r=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Le(e){if(H(e)){const t={};for(let n=0;n{if(n){const s=n.split(ol);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function It(e){let t="";if(ae(e))t=e;else if(H(e))for(let n=0;n!!(e&&e.__v_isRef===!0),te=e=>ae(e)?e:e==null?"":H(e)||ne(e)&&(e.toString===pi||!K(e.toString))?vi(e)?te(e.value):JSON.stringify(e,yi,2):String(e),yi=(e,t)=>vi(t)?yi(e,t.value):Gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[hs(s,i)+" =>"]=r,n),{})}:fi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>hs(n))}:qe(t)?hs(t):ne(t)&&!H(t)&&!hi(t)?String(t):t,hs=(e,t="")=>{var n;return qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Oe;class dl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Oe=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(fn){let t=fn;for(fn=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;un;){let t=un;for(un=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function xi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Ws(s),hl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ts(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Si(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Si(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===gn)||(e.globalVersion=gn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ts(e))))return;e.flags|=2;const t=e.dep,n=ie,s=Ve;ie=e,Ve=!0;try{xi(e);const r=e.fn(e._value);(t.version===0||et(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ie=n,Ve=s,Ii(e),e.flags&=-3}}function Ws(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ws(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function hl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ve=!0;const Ci=[];function ft(){Ci.push(Ve),Ve=!1}function dt(){const e=Ci.pop();Ve=e===void 0?!0:e}function kr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ie;ie=void 0;try{t()}finally{ie=n}}}let gn=0;class ml{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Vs{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(!ie||!Ve||ie===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ie)n=this.activeLink=new ml(ie,this),ie.deps?(n.prevDep=ie.depsTail,ie.depsTail.nextDep=n,ie.depsTail=n):ie.deps=ie.depsTail=n,Ti(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ie.depsTail,n.nextDep=void 0,ie.depsTail.nextDep=n,ie.depsTail=n,ie.deps===n&&(ie.deps=s)}return n}trigger(t){this.version++,gn++,this.notify(t)}notify(t){Ks();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{zs()}}}function Ti(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ti(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const $s=new WeakMap,Dt=Symbol(""),ks=Symbol(""),vn=Symbol("");function xe(e,t,n){if(Ve&&ie){let s=$s.get(e);s||$s.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Vs),r.map=s,r.key=n),r.track()}}function ct(e,t,n,s,r,i){const a=$s.get(e);if(!a){gn++;return}const c=f=>{f&&f.trigger()};if(Ks(),t==="clear")a.forEach(c);else{const f=H(e),h=f&&Bs(n);if(f&&n==="length"){const p=Number(s);a.forEach((_,T)=>{(T==="length"||T===vn||!qe(T)&&T>=p)&&c(_)})}else switch((n!==void 0||a.has(void 0))&&c(a.get(n)),h&&c(a.get(vn)),t){case"add":f?h&&c(a.get("length")):(c(a.get(Dt)),Gt(e)&&c(a.get(ks)));break;case"delete":f||(c(a.get(Dt)),Gt(e)&&c(a.get(ks)));break;case"set":Gt(e)&&c(a.get(Dt));break}}zs()}function Ht(e){const t=X(e);return t===e?t:(xe(t,"iterate",vn),je(e)?t:t.map(Ge))}function es(e){return xe(e=X(e),"iterate",vn),e}function Ze(e,t){return pt(e)?Qt(Nt(e)?Ge(t):t):Ge(t)}const gl={__proto__:null,[Symbol.iterator](){return gs(this,Symbol.iterator,e=>Ze(this,e))},concat(...e){return Ht(this).concat(...e.map(t=>H(t)?Ht(t):t))},entries(){return gs(this,"entries",e=>(e[1]=Ze(this,e[1]),e))},every(e,t){return ot(this,"every",e,t,void 0,arguments)},filter(e,t){return ot(this,"filter",e,t,n=>n.map(s=>Ze(this,s)),arguments)},find(e,t){return ot(this,"find",e,t,n=>Ze(this,n),arguments)},findIndex(e,t){return ot(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ot(this,"findLast",e,t,n=>Ze(this,n),arguments)},findLastIndex(e,t){return ot(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ot(this,"forEach",e,t,void 0,arguments)},includes(...e){return vs(this,"includes",e)},indexOf(...e){return vs(this,"indexOf",e)},join(e){return Ht(this).join(e)},lastIndexOf(...e){return vs(this,"lastIndexOf",e)},map(e,t){return ot(this,"map",e,t,void 0,arguments)},pop(){return on(this,"pop")},push(...e){return on(this,"push",e)},reduce(e,...t){return Mr(this,"reduce",e,t)},reduceRight(e,...t){return Mr(this,"reduceRight",e,t)},shift(){return on(this,"shift")},some(e,t){return ot(this,"some",e,t,void 0,arguments)},splice(...e){return on(this,"splice",e)},toReversed(){return Ht(this).toReversed()},toSorted(e){return Ht(this).toSorted(e)},toSpliced(...e){return Ht(this).toSpliced(...e)},unshift(...e){return on(this,"unshift",e)},values(){return gs(this,"values",e=>Ze(this,e))}};function gs(e,t,n){const s=es(e),r=s[t]();return s!==e&&!je(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const vl=Array.prototype;function ot(e,t,n,s,r,i){const a=es(e),c=a!==e&&!je(e),f=a[t];if(f!==vl[t]){const _=f.apply(e,i);return c?Ge(_):_}let h=n;a!==e&&(c?h=function(_,T){return n.call(this,Ze(e,_),T,e)}:n.length>2&&(h=function(_,T){return n.call(this,_,T,e)}));const p=f.call(a,h,s);return c&&r?r(p):p}function Mr(e,t,n,s){const r=es(e),i=r!==e&&!je(e);let a=n,c=!1;r!==e&&(i?(c=s.length===0,a=function(h,p,_){return c&&(c=!1,h=Ze(e,h)),n.call(this,h,Ze(e,p),_,e)}):n.length>3&&(a=function(h,p,_){return n.call(this,h,p,_,e)}));const f=r[t](a,...s);return c?Ze(e,f):f}function vs(e,t,n){const s=X(e);xe(s,"iterate",vn);const r=s[t](...n);return(r===-1||r===!1)&&Ys(n[0])?(n[0]=X(n[0]),s[t](...n)):r}function on(e,t,n=[]){ft(),Ks();const s=X(e)[t].apply(e,n);return zs(),dt(),s}const yl=Fs("__proto__,__v_isRef,__isVue"),$i=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(qe));function _l(e){qe(e)||(e=String(e));const t=X(this);return xe(t,"has",e),t.hasOwnProperty(e)}class ki{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Ml:Ei:i?Ai:Ri).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const a=H(t);if(!r){let f;if(a&&(f=gl[n]))return f;if(n==="hasOwnProperty")return _l}const c=Reflect.get(t,n,Se(t)?t:s);if((qe(n)?$i.has(n):yl(n))||(r||xe(t,"get",n),i))return c;if(Se(c)){const f=a&&Bs(n)?c:c.value;return r&&ne(f)?Rs(f):f}return ne(c)?r?Rs(c):Gs(c):c}}class Mi extends ki{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const a=H(t)&&Bs(n);if(!this._isShallow){const h=pt(i);if(!je(s)&&!pt(s)&&(i=X(i),s=X(s)),!a&&Se(i)&&!Se(s))return h||(i.value=s),!0}const c=a?Number(n)e,Rn=e=>Reflect.getPrototypeOf(e);function Sl(e,t,n){return function(...s){const r=this.__v_raw,i=X(r),a=Gt(i),c=e==="entries"||e===Symbol.iterator&&a,f=e==="keys"&&a,h=r[e](...s),p=n?Ms:t?Qt:Ge;return!t&&xe(i,"iterate",f?ks:Dt),Ce(Object.create(h),{next(){const{value:_,done:T}=h.next();return T?{value:_,done:T}:{value:c?[p(_[0]),p(_[1])]:p(_),done:T}}})}}function An(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Cl(e,t){const n={get(r){const i=this.__v_raw,a=X(i),c=X(r);e||(et(r,c)&&xe(a,"get",r),xe(a,"get",c));const{has:f}=Rn(a),h=t?Ms:e?Qt:Ge;if(f.call(a,r))return h(i.get(r));if(f.call(a,c))return h(i.get(c));i!==a&&i.get(r)},get size(){const r=this.__v_raw;return!e&&xe(X(r),"iterate",Dt),r.size},has(r){const i=this.__v_raw,a=X(i),c=X(r);return e||(et(r,c)&&xe(a,"has",r),xe(a,"has",c)),r===c?i.has(r):i.has(r)||i.has(c)},forEach(r,i){const a=this,c=a.__v_raw,f=X(c),h=t?Ms:e?Qt:Ge;return!e&&xe(f,"iterate",Dt),c.forEach((p,_)=>r.call(i,h(p),h(_),a))}};return Ce(n,e?{add:An("add"),set:An("set"),delete:An("delete"),clear:An("clear")}:{add(r){const i=X(this),a=Rn(i),c=X(r),f=!t&&!je(r)&&!pt(r)?c:r;return a.has.call(i,f)||et(r,f)&&a.has.call(i,r)||et(c,f)&&a.has.call(i,c)||(i.add(f),ct(i,"add",f,f)),this},set(r,i){!t&&!je(i)&&!pt(i)&&(i=X(i));const a=X(this),{has:c,get:f}=Rn(a);let h=c.call(a,r);h||(r=X(r),h=c.call(a,r));const p=f.call(a,r);return a.set(r,i),h?et(i,p)&&ct(a,"set",r,i):ct(a,"add",r,i),this},delete(r){const i=X(this),{has:a,get:c}=Rn(i);let f=a.call(i,r);f||(r=X(r),f=a.call(i,r)),c&&c.call(i,r);const h=i.delete(r);return f&&ct(i,"delete",r,void 0),h},clear(){const r=X(this),i=r.size!==0,a=r.clear();return i&&ct(r,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Sl(r,e,t)}),n}function qs(e,t){const n=Cl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Tl={get:qs(!1,!1)},$l={get:qs(!1,!0)},kl={get:qs(!0,!1)};const Ri=new WeakMap,Ai=new WeakMap,Ei=new WeakMap,Ml=new WeakMap;function Rl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Al(e){return e.__v_skip||!Object.isExtensible(e)?0:Rl(nl(e))}function Gs(e){return pt(e)?e:Js(e,!1,wl,Tl,Ri)}function El(e){return Js(e,!1,Il,$l,Ai)}function Rs(e){return Js(e,!0,xl,kl,Ei)}function Js(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Al(e);if(i===0)return e;const a=r.get(e);if(a)return a;const c=new Proxy(e,i===2?s:n);return r.set(e,c),c}function Nt(e){return pt(e)?Nt(e.__v_raw):!!(e&&e.__v_isReactive)}function pt(e){return!!(e&&e.__v_isReadonly)}function je(e){return!!(e&&e.__v_isShallow)}function Ys(e){return e?!!e.__v_raw:!1}function X(e){const t=e&&e.__v_raw;return t?X(t):e}function Ol(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&mi(e,"__v_skip",!0),e}const Ge=e=>ne(e)?Gs(e):e,Qt=e=>ne(e)?Rs(e):e;function Se(e){return e?e.__v_isRef===!0:!1}function oe(e){return Pl(e,!1)}function Pl(e,t){return Se(e)?e:new Dl(e,t)}class Dl{constructor(t,n){this.dep=new Vs,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:X(t),this._value=n?t:Ge(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||je(t)||pt(t);t=s?t:X(t),et(t,n)&&(this._rawValue=t,this._value=s?t:Ge(t),this.dep.trigger())}}function Nl(e){return Se(e)?e.value:e}const Fl={get:(e,t,n)=>t==="__v_raw"?e:Nl(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Se(r)&&!Se(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Oi(e){return Nt(e)?e:new Proxy(e,Fl)}class Ul{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Vs(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=gn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ie!==this)return wi(this,!0),!0}get value(){const t=this.dep.track();return Si(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Ll(e,t,n=!1){let s,r;return K(e)?s=e:(s=e.get,r=e.set),new Ul(s,r,n)}const En={},zn=new WeakMap;let Pt;function Bl(e,t=!1,n=Pt){if(n){let s=zn.get(n);s||zn.set(n,s=[]),s.push(e)}}function jl(e,t,n=re){const{immediate:s,deep:r,once:i,scheduler:a,augmentJob:c,call:f}=n,h=F=>r?F:je(F)||r===!1||r===0?ut(F,1):ut(F);let p,_,T,S,U=!1,N=!1;if(Se(e)?(_=()=>e.value,U=je(e)):Nt(e)?(_=()=>h(e),U=!0):H(e)?(N=!0,U=e.some(F=>Nt(F)||je(F)),_=()=>e.map(F=>{if(Se(F))return F.value;if(Nt(F))return h(F);if(K(F))return f?f(F,2):F()})):K(e)?t?_=f?()=>f(e,2):e:_=()=>{if(T){ft();try{T()}finally{dt()}}const F=Pt;Pt=p;try{return f?f(e,3,[S]):e(S)}finally{Pt=F}}:_=tt,t&&r){const F=_,le=r===!0?1/0:r;_=()=>ut(F(),le)}const Y=pl(),z=()=>{p.stop(),Y&&Y.active&&Ls(Y.effects,p)};if(i&&t){const F=t;t=(...le)=>{F(...le),z()}}let A=N?new Array(e.length).fill(En):En;const Q=F=>{if(!(!(p.flags&1)||!p.dirty&&!F))if(t){const le=p.run();if(r||U||(N?le.some((he,Te)=>et(he,A[Te])):et(le,A))){T&&T();const he=Pt;Pt=p;try{const Te=[le,A===En?void 0:N&&A[0]===En?[]:A,S];A=le,f?f(t,3,Te):t(...Te)}finally{Pt=he}}}else p.run()};return c&&c(Q),p=new _i(_),p.scheduler=a?()=>a(Q,!1):Q,S=F=>Bl(F,!1,p),T=p.onStop=()=>{const F=zn.get(p);if(F){if(f)f(F,4);else for(const le of F)le();zn.delete(p)}},t?s?Q(!0):A=p.run():a?a(Q.bind(null,!0),!0):p.run(),z.pause=p.pause.bind(p),z.resume=p.resume.bind(p),z.stop=z,z}function ut(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Se(e))ut(e.value,t,n);else if(H(e))for(let s=0;s{ut(s,t,n)});else if(hi(e)){for(const s in e)ut(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&ut(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function xn(e,t,n,s){try{return s?e(...s):e()}catch(r){ts(r,t,n)}}function nt(e,t,n,s){if(K(e)){const r=xn(e,t,n,s);return r&&di(r)&&r.catch(i=>{ts(i,t,n)}),r}if(H(e)){const r=[];for(let i=0;i>>1,r=Re[s],i=yn(r);i=yn(n)?Re.push(e):Re.splice(Kl(t),0,e),e.flags|=1,Ni()}}function Ni(){Wn||(Wn=Pi.then(Ui))}function zl(e){H(e)?Jt.push(...e):wt&&e.id===-1?wt.splice(zt+1,0,e):e.flags&1||(Jt.push(e),e.flags|=1),Ni()}function Rr(e,t,n=Xe+1){for(;nyn(n)-yn(s));if(Jt.length=0,wt){wt.push(...t);return}for(wt=t,zt=0;zte.id==null?e.flags&2?-1:1/0:e.id;function Ui(e){try{for(Xe=0;Xe{s._d&&Hr(-1);const i=Vn(t);let a;try{a=e(...r)}finally{Vn(i),s._d&&Hr(1)}return a};return s._n=!0,s._c=!0,s._d=!0,s}function Wl(e,t){if(ye===null)return e;const n=is(ye),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&K(t)?t.call(s&&s.proxy):t}}const ql=Symbol.for("v-scx"),Gl=()=>jn(ql);function Ft(e,t,n){return Bi(e,t,n)}function Bi(e,t,n=re){const{immediate:s,deep:r,flush:i,once:a}=n,c=Ce({},n),f=t&&s||!t&&i!=="post";let h;if(bn){if(i==="sync"){const S=Gl();h=S.__watcherHandles||(S.__watcherHandles=[])}else if(!f){const S=()=>{};return S.stop=tt,S.resume=tt,S.pause=tt,S}}const p=Ie;c.call=(S,U,N)=>nt(S,p,U,N);let _=!1;i==="post"?c.scheduler=S=>{Ee(S,p&&p.suspense)}:i!=="sync"&&(_=!0,c.scheduler=(S,U)=>{U?S():Xs(S)}),c.augmentJob=S=>{t&&(S.flags|=4),_&&(S.flags|=2,p&&(S.id=p.uid,S.i=p))};const T=jl(e,t,c);return bn&&(h?h.push(T):f&&T()),T}function Jl(e,t,n){const s=this.proxy,r=ae(e)?e.includes(".")?ji(s,e):()=>s[e]:e.bind(s,s);let i;K(t)?i=t:(i=t.handler,n=t);const a=In(this),c=Bi(r,i.bind(s),n);return a(),c}function ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Zl=Symbol("_leaveCb");function Zs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Zs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Hi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ar(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const qn=new WeakMap;function dn(e,t,n,s,r=!1){if(H(e)){e.forEach((N,Y)=>dn(N,t&&(H(t)?t[Y]:t),n,s,r));return}if(Xt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&dn(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?is(s.component):s.el,a=r?null:i,{i:c,r:f}=e,h=t&&t.r,p=c.refs===re?c.refs={}:c.refs,_=c.setupState,T=X(_),S=_===re?ui:N=>Ar(p,N)?!1:Z(T,N),U=(N,Y)=>!(Y&&Ar(p,Y));if(h!=null&&h!==f){if(Er(t),ae(h))p[h]=null,S(h)&&(_[h]=null);else if(Se(h)){const N=t;U(h,N.k)&&(h.value=null),N.k&&(p[N.k]=null)}}if(K(f))xn(f,c,12,[a,p]);else{const N=ae(f),Y=Se(f);if(N||Y){const z=()=>{if(e.f){const A=N?S(f)?_[f]:p[f]:U()||!e.k?f.value:p[e.k];if(r)H(A)&&Ls(A,i);else if(H(A))A.includes(i)||A.push(i);else if(N)p[f]=[i],S(f)&&(_[f]=p[f]);else{const Q=[i];U(f,e.k)&&(f.value=Q),e.k&&(p[e.k]=Q)}}else N?(p[f]=a,S(f)&&(_[f]=a)):Y&&(U(f,e.k)&&(f.value=a),e.k&&(p[e.k]=a))};if(a){const A=()=>{z(),qn.delete(e)};A.id=-1,qn.set(e,A),Ee(A,n)}else Er(e),z()}}}function Er(e){const t=qn.get(e);t&&(t.flags|=8,qn.delete(e))}Qn().requestIdleCallback;Qn().cancelIdleCallback;const Xt=e=>!!e.type.__asyncLoader,Ki=e=>e.type.__isKeepAlive;function Ql(e,t){zi(e,"a",t)}function ea(e,t){zi(e,"da",t)}function zi(e,t,n=Ie){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ns(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Ki(r.parent.vnode)&&ta(s,t,n,r),r=r.parent}}function ta(e,t,n,s){const r=ns(t,e,s,!0);Vi(()=>{Ls(s[t],r)},n)}function ns(e,t,n=Ie,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{ft();const c=In(n),f=nt(t,n,e,a);return c(),dt(),f});return s?r.unshift(i):r.push(i),i}}const gt=e=>(t,n=Ie)=>{(!bn||e==="sp")&&ns(e,(...s)=>t(...s),n)},na=gt("bm"),Wi=gt("m"),sa=gt("bu"),ra=gt("u"),Qs=gt("bum"),Vi=gt("um"),ia=gt("sp"),oa=gt("rtg"),la=gt("rtc");function aa(e,t=Ie){ns("ec",e,t)}const ca="components",qi=Symbol.for("v-ndc");function ua(e){return ae(e)?fa(ca,e,!1)||e:e||qi}function fa(e,t,n=!0,s=!1){const r=ye||Ie;if(r){const i=r.type;{const c=Ya(i,!1);if(c&&(c===t||c===Ae(t)||c===Zn(Ae(t))))return i}const a=Or(r[e]||i[e],t)||Or(r.appContext[e],t);return!a&&s?i:a}}function Or(e,t){return e&&(e[t]||e[Ae(t)]||e[Zn(Ae(t))])}function en(e,t,n,s){let r;const i=n,a=H(e);if(a||ae(e)){const c=a&&Nt(e);let f=!1,h=!1;c&&(f=!je(e),h=pt(e),e=es(e)),r=new Array(e.length);for(let p=0,_=e.length;p<_;p++)r[p]=t(f?h?Qt(Ge(e[p])):Ge(e[p]):e[p],p,void 0,i)}else if(typeof e=="number"){r=new Array(e);for(let c=0;ct(c,f,void 0,i));else{const c=Object.keys(e);r=new Array(c.length);for(let f=0,h=c.length;f0;return j(),mt(fe,null,[q("slot",n,s)],h?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),j();const a=i&&Gi(i(n)),c=n.key||a&&a.key,f=mt(fe,{key:(c&&!qe(c)?c:`_${t}`)+(!a&&s?"_fb":"")},a||[],a&&e._===1?64:-2);return f.scopeId&&(f.slotScopeIds=[f.scopeId+"-s"]),i&&i._c&&(i._d=!0),f}function Gi(e){return e.some(t=>nr(t)?!(t.type===ht||t.type===fe&&!Gi(t.children)):!0)?e:null}const As=e=>e?go(e)?is(e):As(e.parent):null,pn=Ce(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=>As(e.parent),$root:e=>As(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Yi(e),$forceUpdate:e=>e.f||(e.f=()=>{Xs(e.update)}),$nextTick:e=>e.n||(e.n=Di.bind(e.proxy)),$watch:e=>Jl.bind(e)}),ys=(e,t)=>e!==re&&!e.__isScriptSetup&&Z(e,t),pa={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:a,type:c,appContext:f}=e;if(t[0]!=="$"){const T=a[t];if(T!==void 0)switch(T){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ys(s,t))return a[t]=1,s[t];if(r!==re&&Z(r,t))return a[t]=2,r[t];if(Z(i,t))return a[t]=3,i[t];if(n!==re&&Z(n,t))return a[t]=4,n[t];Es&&(a[t]=0)}}const h=pn[t];let p,_;if(h)return t==="$attrs"&&xe(e.attrs,"get",""),h(e);if((p=c.__cssModules)&&(p=p[t]))return p;if(n!==re&&Z(n,t))return a[t]=4,n[t];if(_=f.config.globalProperties,Z(_,t))return _[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ys(r,t)?(r[t]=n,!0):s!==re&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:a}},c){let f;return!!(n[c]||e!==re&&c[0]!=="$"&&Z(e,c)||ys(t,c)||Z(i,c)||Z(s,c)||Z(pn,c)||Z(r.config.globalProperties,c)||(f=a.__cssModules)&&f[c])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Pr(e){return H(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Es=!0;function ha(e){const t=Yi(e),n=e.proxy,s=e.ctx;Es=!1,t.beforeCreate&&Dr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:a,watch:c,provide:f,inject:h,created:p,beforeMount:_,mounted:T,beforeUpdate:S,updated:U,activated:N,deactivated:Y,beforeDestroy:z,beforeUnmount:A,destroyed:Q,unmounted:F,render:le,renderTracked:he,renderTriggered:Te,errorCaptured:$e,serverPrefetch:vt,expose:He,inheritAttrs:Je,components:Ke,directives:yt,filters:de}=t;if(h&&ma(h,s,null),a)for(const B in a){const G=a[B];K(G)&&(s[B]=G.bind(n))}if(r){const B=r.call(n,n);ne(B)&&(e.data=Gs(B))}if(Es=!0,i)for(const B in i){const G=i[B],_e=K(G)?G.bind(n,n):K(G.get)?G.get.bind(n,n):tt,ze=!K(G)&&K(G.set)?G.set.bind(n):tt,be=xt({get:_e,set:ze});Object.defineProperty(s,B,{enumerable:!0,configurable:!0,get:()=>be.value,set:ue=>be.value=ue})}if(c)for(const B in c)Ji(c[B],s,n,B);if(f){const B=K(f)?f.call(n):f;Reflect.ownKeys(B).forEach(G=>{Vl(G,B[G])})}p&&Dr(p,e,"c");function L(B,G){H(G)?G.forEach(_e=>B(_e.bind(n))):G&&B(G.bind(n))}if(L(na,_),L(Wi,T),L(sa,S),L(ra,U),L(Ql,N),L(ea,Y),L(aa,$e),L(la,he),L(oa,Te),L(Qs,A),L(Vi,F),L(ia,vt),H(He))if(He.length){const B=e.exposed||(e.exposed={});He.forEach(G=>{Object.defineProperty(B,G,{get:()=>n[G],set:_e=>n[G]=_e,enumerable:!0})})}else e.exposed||(e.exposed={});le&&e.render===tt&&(e.render=le),Je!=null&&(e.inheritAttrs=Je),Ke&&(e.components=Ke),yt&&(e.directives=yt),vt&&Hi(e)}function ma(e,t,n=tt){H(e)&&(e=Os(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=jn(r.from||s,r.default,!0):i=jn(r.from||s):i=jn(r),Se(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[s]=i}}function Dr(e,t,n){nt(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,s){let r=s.includes(".")?ji(n,s):()=>n[s];if(ae(e)){const i=t[e];K(i)&&Ft(r,i)}else if(K(e))Ft(r,e.bind(n));else if(ne(e))if(H(e))e.forEach(i=>Ji(i,t,n,s));else{const i=K(e.handler)?e.handler.bind(n):t[e.handler];K(i)&&Ft(r,i,e)}}function Yi(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,c=i.get(t);let f;return c?f=c:!r.length&&!n&&!s?f=t:(f={},r.length&&r.forEach(h=>Gn(f,h,a,!0)),Gn(f,t,a)),ne(t)&&i.set(t,f),f}function Gn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Gn(e,i,n,!0),r&&r.forEach(a=>Gn(e,a,n,!0));for(const a in t)if(!(s&&a==="expose")){const c=ga[a]||n&&n[a];e[a]=c?c(e[a],t[a]):t[a]}return e}const ga={data:Nr,props:Fr,emits:Fr,methods:an,computed:an,beforeCreate:Me,created:Me,beforeMount:Me,mounted:Me,beforeUpdate:Me,updated:Me,beforeDestroy:Me,beforeUnmount:Me,destroyed:Me,unmounted:Me,activated:Me,deactivated:Me,errorCaptured:Me,serverPrefetch:Me,components:an,directives:an,watch:ya,provide:Nr,inject:va};function Nr(e,t){return t?e?function(){return Ce(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function va(e,t){return an(Os(e),Os(t))}function Os(e){if(H(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ae(t)}Modifiers`]||e[`${St(t)}Modifiers`];function xa(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||re;let r=n;const i=t.startsWith("update:"),a=i&&wa(s,t.slice(7));a&&(a.trim&&(r=n.map(p=>ae(p)?p.trim():p)),a.number&&(r=n.map(js)));let c,f=s[c=ps(t)]||s[c=ps(Ae(t))];!f&&i&&(f=s[c=ps(St(t))]),f&&nt(f,e,6,r);const h=s[c+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,nt(h,e,6,r)}}const Ia=new WeakMap;function Zi(e,t,n=!1){const s=n?Ia:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let a={},c=!1;if(!K(e)){const f=h=>{const p=Zi(h,t,!0);p&&(c=!0,Ce(a,p))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!i&&!c?(ne(e)&&s.set(e,null),null):(H(i)?i.forEach(f=>a[f]=null):Ce(a,i),ne(e)&&s.set(e,a),a)}function ss(e,t){return!e||!Yn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,St(t))||Z(e,t))}function Ur(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:a,attrs:c,emit:f,render:h,renderCache:p,props:_,data:T,setupState:S,ctx:U,inheritAttrs:N}=e,Y=Vn(e);let z,A;try{if(n.shapeFlag&4){const F=r||s,le=F;z=Qe(h.call(le,F,p,_,S,T,U)),A=c}else{const F=t;z=Qe(F.length>1?F(_,{attrs:c,slots:a,emit:f}):F(_,null)),A=t.props?c:Sa(c)}}catch(F){hn.length=0,ts(F,e,1),z=q(ht)}let Q=z;if(A&&N!==!1){const F=Object.keys(A),{shapeFlag:le}=Q;F.length&&le&7&&(i&&F.some(Us)&&(A=Ca(A,i)),Q=tn(Q,A,!1,!0))}return n.dirs&&(Q=tn(Q,null,!1,!0),Q.dirs=Q.dirs?Q.dirs.concat(n.dirs):n.dirs),n.transition&&Zs(Q,n.transition),z=Q,Vn(Y),z}const Sa=e=>{let t;for(const n in e)(n==="class"||n==="style"||Yn(n))&&((t||(t={}))[n]=e[n]);return t},Ca=(e,t)=>{const n={};for(const s in e)(!Us(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ta(e,t,n){const{props:s,children:r,component:i}=e,{props:a,children:c,patchFlag:f}=t,h=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Lr(s,a,h):!!a;if(f&8){const p=t.dynamicProps;for(let _=0;_Object.create(eo),no=e=>Object.getPrototypeOf(e)===eo;function ka(e,t,n,s=!1){const r={},i=to();e.propsDefaults=Object.create(null),so(e,t,r,i);for(const a in e.propsOptions[0])a in r||(r[a]=void 0);n?e.props=s?r:El(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Ma(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:a}}=e,c=X(r),[f]=e.propsOptions;let h=!1;if((s||a>0)&&!(a&16)){if(a&8){const p=e.vnode.dynamicProps;for(let _=0;_{f=!0;const[T,S]=ro(_,t,!0);Ce(a,T),S&&c.push(...S)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!i&&!f)return ne(e)&&s.set(e,qt),qt;if(H(i))for(let p=0;pe==="_"||e==="_ctx"||e==="$stable",tr=e=>H(e)?e.map(Qe):[Qe(e)],Aa=(e,t,n)=>{if(t._n)return t;const s=Yt((...r)=>tr(t(...r)),n);return s._c=!1,s},io=(e,t,n)=>{const s=e._ctx;for(const r in e){if(er(r))continue;const i=e[r];if(K(i))t[r]=Aa(r,i,s);else if(i!=null){const a=tr(i);t[r]=()=>a}}},oo=(e,t)=>{const n=tr(t);e.slots.default=()=>n},lo=(e,t,n)=>{for(const s in t)(n||!er(s))&&(e[s]=t[s])},Ea=(e,t,n)=>{const s=e.slots=to();if(e.vnode.shapeFlag&32){const r=t._;r?(lo(s,t,n),n&&mi(s,"_",r,!0)):io(t,s)}else t&&oo(e,t)},Oa=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,a=re;if(s.shapeFlag&32){const c=t._;c?n&&c===1?i=!1:lo(r,t,n):(i=!t.$stable,io(t,r)),a=t}else t&&(oo(e,t),a={default:1});if(i)for(const c in r)!er(c)&&a[c]==null&&delete r[c]},Ee=Ua;function Pa(e){return Da(e)}function Da(e,t){const n=Qn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:a,createText:c,createComment:f,setText:h,setElementText:p,parentNode:_,nextSibling:T,setScopeId:S=tt,insertStaticContent:U}=e,N=(d,g,v,I=null,w=null,x=null,R=void 0,k=null,C=!!g.dynamicChildren)=>{if(d===g)return;d&&!ln(d,g)&&(I=Ut(d),ue(d,w,x,!0),d=null),g.patchFlag===-2&&(C=!1,g.dynamicChildren=null);const{type:b,ref:P,shapeFlag:M}=g;switch(b){case rs:Y(d,g,v,I);break;case ht:z(d,g,v,I);break;case bs:d==null&&A(g,v,I,R);break;case fe:Ke(d,g,v,I,w,x,R,k,C);break;default:M&1?le(d,g,v,I,w,x,R,k,C):M&6?yt(d,g,v,I,w,x,R,k,C):(M&64||M&128)&&b.process(d,g,v,I,w,x,R,k,C,$t)}P!=null&&w?dn(P,d&&d.ref,x,g||d,!g):P==null&&d&&d.ref!=null&&dn(d.ref,null,x,d,!0)},Y=(d,g,v,I)=>{if(d==null)s(g.el=c(g.children),v,I);else{const w=g.el=d.el;g.children!==d.children&&h(w,g.children)}},z=(d,g,v,I)=>{d==null?s(g.el=f(g.children||""),v,I):g.el=d.el},A=(d,g,v,I)=>{[d.el,d.anchor]=U(d.children,g,v,I,d.el,d.anchor)},Q=({el:d,anchor:g},v,I)=>{let w;for(;d&&d!==g;)w=T(d),s(d,v,I),d=w;s(g,v,I)},F=({el:d,anchor:g})=>{let v;for(;d&&d!==g;)v=T(d),r(d),d=v;r(g)},le=(d,g,v,I,w,x,R,k,C)=>{if(g.type==="svg"?R="svg":g.type==="math"&&(R="mathml"),d==null)he(g,v,I,w,x,R,k,C);else{const b=d.el&&d.el._isVueCE?d.el:null;try{b&&b._beginPatch(),vt(d,g,w,x,R,k,C)}finally{b&&b._endPatch()}}},he=(d,g,v,I,w,x,R,k)=>{let C,b;const{props:P,shapeFlag:M,transition:O,dirs:D}=d;if(C=d.el=a(d.type,x,P&&P.is,P),M&8?p(C,d.children):M&16&&$e(d.children,C,null,I,w,_s(d,x),R,k),D&&Et(d,null,I,"created"),Te(C,d,d.scopeId,R,I),P){for(const ee in P)ee!=="value"&&!cn(ee)&&i(C,ee,null,P[ee],x,I);"value"in P&&i(C,"value",null,P.value,x),(b=P.onVnodeBeforeMount)&&Ye(b,I,d)}D&&Et(d,null,I,"beforeMount");const W=Na(w,O);W&&O.beforeEnter(C),s(C,g,v),((b=P&&P.onVnodeMounted)||W||D)&&Ee(()=>{b&&Ye(b,I,d),W&&O.enter(C),D&&Et(d,null,I,"mounted")},w)},Te=(d,g,v,I,w)=>{if(v&&S(d,v),I)for(let x=0;x{for(let b=C;b{const k=g.el=d.el;let{patchFlag:C,dynamicChildren:b,dirs:P}=g;C|=d.patchFlag&16;const M=d.props||re,O=g.props||re;let D;if(v&&Ot(v,!1),(D=O.onVnodeBeforeUpdate)&&Ye(D,v,g,d),P&&Et(g,d,v,"beforeUpdate"),v&&Ot(v,!0),(M.innerHTML&&O.innerHTML==null||M.textContent&&O.textContent==null)&&p(k,""),b?He(d.dynamicChildren,b,k,v,I,_s(g,w),x):R||G(d,g,k,null,v,I,_s(g,w),x,!1),C>0){if(C&16)Je(k,M,O,v,w);else if(C&2&&M.class!==O.class&&i(k,"class",null,O.class,w),C&4&&i(k,"style",M.style,O.style,w),C&8){const W=g.dynamicProps;for(let ee=0;ee{D&&Ye(D,v,g,d),P&&Et(g,d,v,"updated")},I)},He=(d,g,v,I,w,x,R)=>{for(let k=0;k{if(g!==v){if(g!==re)for(const x in g)!cn(x)&&!(x in v)&&i(d,x,g[x],null,w,I);for(const x in v){if(cn(x))continue;const R=v[x],k=g[x];R!==k&&x!=="value"&&i(d,x,k,R,w,I)}"value"in v&&i(d,"value",g.value,v.value,w)}},Ke=(d,g,v,I,w,x,R,k,C)=>{const b=g.el=d?d.el:c(""),P=g.anchor=d?d.anchor:c("");let{patchFlag:M,dynamicChildren:O,slotScopeIds:D}=g;D&&(k=k?k.concat(D):D),d==null?(s(b,v,I),s(P,v,I),$e(g.children||[],v,P,w,x,R,k,C)):M>0&&M&64&&O&&d.dynamicChildren&&d.dynamicChildren.length===O.length?(He(d.dynamicChildren,O,v,w,x,R,k),(g.key!=null||w&&g===w.subTree)&&ao(d,g,!0)):G(d,g,v,P,w,x,R,k,C)},yt=(d,g,v,I,w,x,R,k,C)=>{g.slotScopeIds=k,d==null?g.shapeFlag&512?w.ctx.activate(g,v,I,R,C):de(g,v,I,w,x,R,C):st(d,g,C)},de=(d,g,v,I,w,x,R)=>{const k=d.component=za(d,I,w);if(Ki(d)&&(k.ctx.renderer=$t),Va(k,!1,R),k.asyncDep){if(w&&w.registerDep(k,L,R),!d.el){const C=k.subTree=q(ht);z(null,C,g,v),d.placeholder=C.el}}else L(k,d,g,v,w,x,R)},st=(d,g,v)=>{const I=g.component=d.component;if(Ta(d,g,v))if(I.asyncDep&&!I.asyncResolved){B(I,g,v);return}else I.next=g,I.update();else g.el=d.el,I.vnode=g},L=(d,g,v,I,w,x,R)=>{const k=()=>{if(d.isMounted){let{next:M,bu:O,u:D,parent:W,vnode:ee}=d;{const Fe=co(d);if(Fe){M&&(M.el=ee.el,B(d,M,R)),Fe.asyncDep.then(()=>{Ee(()=>{d.isUnmounted||b()},w)});return}}let J=M,me;Ot(d,!1),M?(M.el=ee.el,B(d,M,R)):M=ee,O&&Bn(O),(me=M.props&&M.props.onVnodeBeforeUpdate)&&Ye(me,W,M,ee),Ot(d,!0);const we=Ur(d),Ne=d.subTree;d.subTree=we,N(Ne,we,_(Ne.el),Ut(Ne),d,w,x),M.el=we.el,J===null&&$a(d,we.el),D&&Ee(D,w),(me=M.props&&M.props.onVnodeUpdated)&&Ee(()=>Ye(me,W,M,ee),w)}else{let M;const{el:O,props:D}=g,{bm:W,m:ee,parent:J,root:me,type:we}=d,Ne=Xt(g);Ot(d,!1),W&&Bn(W),!Ne&&(M=D&&D.onVnodeBeforeMount)&&Ye(M,J,g),Ot(d,!0);{me.ce&&me.ce._hasShadowRoot()&&me.ce._injectChildStyle(we,d.parent?d.parent.type:void 0);const Fe=d.subTree=Ur(d);N(null,Fe,v,I,d,w,x),g.el=Fe.el}if(ee&&Ee(ee,w),!Ne&&(M=D&&D.onVnodeMounted)){const Fe=g;Ee(()=>Ye(M,J,Fe),w)}(g.shapeFlag&256||J&&Xt(J.vnode)&&J.vnode.shapeFlag&256)&&d.a&&Ee(d.a,w),d.isMounted=!0,g=v=I=null}};d.scope.on();const C=d.effect=new _i(k);d.scope.off();const b=d.update=C.run.bind(C),P=d.job=C.runIfDirty.bind(C);P.i=d,P.id=d.uid,C.scheduler=()=>Xs(P),Ot(d,!0),b()},B=(d,g,v)=>{g.component=d;const I=d.vnode.props;d.vnode=g,d.next=null,Ma(d,g.props,I,v),Oa(d,g.children,v),ft(),Rr(d),dt()},G=(d,g,v,I,w,x,R,k,C=!1)=>{const b=d&&d.children,P=d?d.shapeFlag:0,M=g.children,{patchFlag:O,shapeFlag:D}=g;if(O>0){if(O&128){ze(b,M,v,I,w,x,R,k,C);return}else if(O&256){_e(b,M,v,I,w,x,R,k,C);return}}D&8?(P&16&&Tt(b,w,x),M!==b&&p(v,M)):P&16?D&16?ze(b,M,v,I,w,x,R,k,C):Tt(b,w,x,!0):(P&8&&p(v,""),D&16&&$e(M,v,I,w,x,R,k,C))},_e=(d,g,v,I,w,x,R,k,C)=>{d=d||qt,g=g||qt;const b=d.length,P=g.length,M=Math.min(b,P);let O;for(O=0;OP?Tt(d,w,x,!0,!1,M):$e(g,v,I,w,x,R,k,C,M)},ze=(d,g,v,I,w,x,R,k,C)=>{let b=0;const P=g.length;let M=d.length-1,O=P-1;for(;b<=M&&b<=O;){const D=d[b],W=g[b]=C?at(g[b]):Qe(g[b]);if(ln(D,W))N(D,W,v,null,w,x,R,k,C);else break;b++}for(;b<=M&&b<=O;){const D=d[M],W=g[O]=C?at(g[O]):Qe(g[O]);if(ln(D,W))N(D,W,v,null,w,x,R,k,C);else break;M--,O--}if(b>M){if(b<=O){const D=O+1,W=DO)for(;b<=M;)ue(d[b],w,x,!0),b++;else{const D=b,W=b,ee=new Map;for(b=W;b<=O;b++){const ke=g[b]=C?at(g[b]):Qe(g[b]);ke.key!=null&&ee.set(ke.key,b)}let J,me=0;const we=O-W+1;let Ne=!1,Fe=0;const kt=new Array(we);for(b=0;b=we){ue(ke,w,x,!0);continue}let Pe;if(ke.key!=null)Pe=ee.get(ke.key);else for(J=W;J<=O;J++)if(kt[J-W]===0&&ln(ke,g[J])){Pe=J;break}Pe===void 0?ue(ke,w,x,!0):(kt[Pe-W]=b+1,Pe>=Fe?Fe=Pe:Ne=!0,N(ke,g[Pe],v,null,w,x,R,k,C),me++)}const $n=Ne?Fa(kt):qt;for(J=$n.length-1,b=we-1;b>=0;b--){const ke=W+b,Pe=g[ke],Lt=g[ke+1],rn=ke+1{const{el:x,type:R,transition:k,children:C,shapeFlag:b}=d;if(b&6){be(d.component.subTree,g,v,I);return}if(b&128){d.suspense.move(g,v,I);return}if(b&64){R.move(d,g,v,$t);return}if(R===fe){s(x,g,v);for(let M=0;Mk.enter(x),w);else{const{leave:M,delayLeave:O,afterLeave:D}=k,W=()=>{d.ctx.isUnmounted?r(x):s(x,g,v)},ee=()=>{x._isLeaving&&x[Zl](!0),M(x,()=>{W(),D&&D()})};O?O(x,W,ee):ee()}else s(x,g,v)},ue=(d,g,v,I=!1,w=!1)=>{const{type:x,props:R,ref:k,children:C,dynamicChildren:b,shapeFlag:P,patchFlag:M,dirs:O,cacheIndex:D}=d;if(M===-2&&(w=!1),k!=null&&(ft(),dn(k,null,v,d,!0),dt()),D!=null&&(g.renderCache[D]=void 0),P&256){g.ctx.deactivate(d);return}const W=P&1&&O,ee=!Xt(d);let J;if(ee&&(J=R&&R.onVnodeBeforeUnmount)&&Ye(J,g,d),P&6)Sn(d.component,v,I);else{if(P&128){d.suspense.unmount(v,I);return}W&&Et(d,null,g,"beforeUnmount"),P&64?d.type.remove(d,g,v,$t,I):b&&!b.hasOnce&&(x!==fe||M>0&&M&64)?Tt(b,g,v,!1,!0):(x===fe&&M&384||!w&&P&16)&&Tt(C,g,v),I&&_t(d)}(ee&&(J=R&&R.onVnodeUnmounted)||W)&&Ee(()=>{J&&Ye(J,g,d),W&&Et(d,null,g,"unmounted")},v)},_t=d=>{const{type:g,el:v,anchor:I,transition:w}=d;if(g===fe){Ct(v,I);return}if(g===bs){F(d);return}const x=()=>{r(v),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(d.shapeFlag&1&&w&&!w.persisted){const{leave:R,delayLeave:k}=w,C=()=>R(v,x);k?k(d.el,x,C):C()}else x()},Ct=(d,g)=>{let v;for(;d!==g;)v=T(d),r(d),d=v;r(g)},Sn=(d,g,v)=>{const{bum:I,scope:w,job:x,subTree:R,um:k,m:C,a:b}=d;jr(C),jr(b),I&&Bn(I),w.stop(),x&&(x.flags|=8,ue(R,d,g,v)),k&&Ee(k,g),Ee(()=>{d.isUnmounted=!0},g)},Tt=(d,g,v,I=!1,w=!1,x=0)=>{for(let R=x;R{if(d.shapeFlag&6)return Ut(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const g=T(d.anchor||d.el),v=g&&g[Yl];return v?T(v):g};let sn=!1;const Cn=(d,g,v)=>{let I;d==null?g._vnode&&(ue(g._vnode,null,null,!0),I=g._vnode.component):N(g._vnode||null,d,g,null,null,null,v),g._vnode=d,sn||(sn=!0,Rr(I),Fi(),sn=!1)},$t={p:N,um:ue,m:be,r:_t,mt:de,mc:$e,pc:G,pbc:He,n:Ut,o:e};return{render:Cn,hydrate:void 0,createApp:ba(Cn)}}function _s({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Ot({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Na(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ao(e,t,n=!1){const s=e.children,r=t.children;if(H(s)&&H(r))for(let i=0;i>1,e[n[c]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}function co(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:co(t)}function jr(e){if(e)for(let t=0;te.__isSuspense;function Ua(e,t){t&&t.pendingBranch?H(e)?t.effects.push(...e):t.effects.push(e):zl(e)}const fe=Symbol.for("v-fgt"),rs=Symbol.for("v-txt"),ht=Symbol.for("v-cmt"),bs=Symbol.for("v-stc"),hn=[];let De=null;function j(e=!1){hn.push(De=e?null:[])}function La(){hn.pop(),De=hn[hn.length-1]||null}let _n=1;function Hr(e,t=!1){_n+=e,e<0&&De&&t&&(De.hasOnce=!0)}function po(e){return e.dynamicChildren=_n>0?De||qt:null,La(),_n>0&&De&&De.push(e),e}function V(e,t,n,s,r,i){return po(y(e,t,n,s,r,i,!0))}function mt(e,t,n,s,r){return po(q(e,t,n,s,r,!0))}function nr(e){return e?e.__v_isVNode===!0:!1}function ln(e,t){return e.type===t.type&&e.key===t.key}const ho=({key:e})=>e??null,Hn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ae(e)||Se(e)||K(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function y(e,t=null,n=null,s=0,r=null,i=e===fe?0:1,a=!1,c=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ho(t),ref:t&&Hn(t),scopeId:Li,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ye};return c?(sr(f,n),i&128&&e.normalize(f)):n&&(f.shapeFlag|=ae(n)?8:16),_n>0&&!a&&De&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&&De.push(f),f}const q=Ba;function Ba(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===qi)&&(e=ht),nr(e)){const c=tn(e,t,!0);return n&&sr(c,n),_n>0&&!i&&De&&(c.shapeFlag&6?De[De.indexOf(e)]=c:De.push(c)),c.patchFlag=-2,c}if(Xa(e)&&(e=e.__vccOpts),t){t=ja(t);let{class:c,style:f}=t;c&&!ae(c)&&(t.class=It(c)),ne(f)&&(Ys(f)&&!H(f)&&(f=Ce({},f)),t.style=Le(f))}const a=ae(e)?1:fo(e)?128:Xl(e)?64:ne(e)?4:K(e)?2:0;return y(e,t,n,s,r,a,i,!0)}function ja(e){return e?Ys(e)||no(e)?Ce({},e):e:null}function tn(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:a,children:c,transition:f}=e,h=t?mo(r||{},t):r,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&ho(h),ref:t&&t.ref?n&&i?H(i)?i.concat(Hn(t)):[i,Hn(t)]:Hn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:c,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&tn(e.ssContent),ssFallback:e.ssFallback&&tn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return f&&s&&Zs(p,f.clone(p)),p}function nn(e=" ",t=0){return q(rs,null,e,t)}function Be(e="",t=!1){return t?(j(),mt(ht,null,e)):q(ht,null,e)}function Qe(e){return e==null||typeof e=="boolean"?q(ht):H(e)?q(fe,null,e.slice()):nr(e)?at(e):q(rs,null,String(e))}function at(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:tn(e)}function sr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(H(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),sr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!no(t)?t._ctx=ye:r===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),s&64?(n=16,t=[nn(t)]):n=8);e.children=t,e.shapeFlag|=n}function mo(...e){const t={};for(let n=0;nIe||ye;let Jn,Ds;{const e=Qn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(a=>a(i)):r[0](i)}};Jn=t("__VUE_INSTANCE_SETTERS__",n=>Ie=n),Ds=t("__VUE_SSR_SETTERS__",n=>bn=n)}const In=e=>{const t=Ie;return Jn(e),e.scope.on(),()=>{e.scope.off(),Jn(t)}},Kr=()=>{Ie&&Ie.scope.off(),Jn(null)};function go(e){return e.vnode.shapeFlag&4}let bn=!1;function Va(e,t=!1,n=!1){t&&Ds(t);const{props:s,children:r}=e.vnode,i=go(e);ka(e,s,i,t),Ea(e,r,n||t);const a=i?qa(e,t):void 0;return t&&Ds(!1),a}function qa(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,pa);const{setup:s}=n;if(s){ft();const r=e.setupContext=s.length>1?Ja(e):null,i=In(e),a=xn(s,e,0,[e.props,r]),c=di(a);if(dt(),i(),(c||e.sp)&&!Xt(e)&&Hi(e),c){if(a.then(Kr,Kr),t)return a.then(f=>{zr(e,f)}).catch(f=>{ts(f,e,0)});e.asyncDep=a}else zr(e,a)}else vo(e)}function zr(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Oi(t)),vo(e)}function vo(e,t,n){const s=e.type;e.render||(e.render=s.render||tt);{const r=In(e);ft();try{ha(e)}finally{dt(),r()}}}const Ga={get(e,t){return xe(e,"get",""),e[t]}};function Ja(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Ga),slots:e.slots,emit:e.emit,expose:t}}function is(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Oi(Ol(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in pn)return pn[n](e)},has(t,n){return n in t||n in pn}})):e.proxy}function Ya(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Xa(e){return K(e)&&"__vccOpts"in e}const xt=(e,t)=>Ll(e,t,bn),Za="3.5.30";/** +* @vue/runtime-dom v3.5.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ns;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Ns=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const yo=Ns?e=>Ns.createHTML(e):e=>e,Qa="http://www.w3.org/2000/svg",ec="http://www.w3.org/1998/Math/MathML",lt=typeof document<"u"?document:null,Vr=lt&<.createElement("template"),tc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?lt.createElementNS(Qa,e):t==="mathml"?lt.createElementNS(ec,e):n?lt.createElement(e,{is:n}):lt.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>lt.createTextNode(e),createComment:e=>lt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const a=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Vr.innerHTML=yo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const c=Vr.content;if(s==="svg"||s==="mathml"){const f=c.firstChild;for(;f.firstChild;)c.appendChild(f.firstChild);c.removeChild(f)}t.insertBefore(c,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},nc=Symbol("_vtc");function sc(e,t,n){const s=e[nc];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qr=Symbol("_vod"),rc=Symbol("_vsh"),ic=Symbol(""),oc=/(?:^|;)\s*display\s*:/;function lc(e,t,n){const s=e.style,r=ae(n);let i=!1;if(n&&!r){if(t)if(ae(t))for(const a of t.split(";")){const c=a.slice(0,a.indexOf(":")).trim();n[c]==null&&Kn(s,c,"")}else for(const a in t)n[a]==null&&Kn(s,a,"");for(const a in n)a==="display"&&(i=!0),Kn(s,a,n[a])}else if(r){if(t!==n){const a=s[ic];a&&(n+=";"+a),s.cssText=n,i=oc.test(n)}}else t&&e.removeAttribute("style");qr in e&&(e[qr]=i?s.display:"",e[rc]&&(s.display="none"))}const Gr=/\s*!important$/;function Kn(e,t,n){if(H(n))n.forEach(s=>Kn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ac(e,t);Gr.test(n)?e.setProperty(St(s),n.replace(Gr,""),"important"):e[s]=n}}const Jr=["Webkit","Moz","ms"],ws={};function ac(e,t){const n=ws[t];if(n)return n;let s=Ae(t);if(s!=="filter"&&s in e)return ws[t]=s;s=Zn(s);for(let r=0;rxs||(dc.then(()=>xs=0),xs=Date.now());function hc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;nt(mc(s,n.value),t,5,[s])};return n.value=e,n.attached=pc(),n}function mc(e,t){if(H(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ti=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gc=(e,t,n,s,r,i)=>{const a=r==="svg";t==="class"?sc(e,s,a):t==="style"?lc(e,n,s):Yn(t)?Us(t)||uc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):vc(e,t,s,a))?(Zr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Xr(e,t,s,a,i,t!=="value")):e._isVueCE&&(yc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(s)))?Zr(e,Ae(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Xr(e,t,s,a))};function vc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ti(t)&&K(n));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 r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ti(t)&&ae(n)?!1:t in e}function yc(e,t){const n=e._def.props;if(!n)return!1;const s=Ae(t);return Array.isArray(n)?n.some(r=>Ae(r)===s):Object.keys(n).some(r=>Ae(r)===s)}const ni=e=>{const t=e.props["onUpdate:modelValue"]||!1;return H(t)?n=>Bn(t,n):t};function _c(e){e.target.composing=!0}function si(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Is=Symbol("_assign");function ri(e,t,n){return t&&(e=e.trim()),n&&(e=js(e)),e}const bc={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[Is]=ni(r);const i=s||r.props&&r.props.type==="number";Wt(e,t?"change":"input",a=>{a.target.composing||e[Is](ri(e.value,n,i))}),(n||i)&&Wt(e,"change",()=>{e.value=ri(e.value,n,i)}),t||(Wt(e,"compositionstart",_c),Wt(e,"compositionend",si),Wt(e,"change",si))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},a){if(e[Is]=ni(a),e.composing)return;const c=(i||e.type==="number")&&!/^0\d/.test(e.value)?js(e.value):e.value,f=t??"";c!==f&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===f)||(e.value=f))}},wc=["ctrl","shift","alt","meta"],xc={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)=>wc.some(n=>e[`${n}Key`]&&!t.includes(n))},On=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=St(r.key);if(t.some(a=>a===i||Ic[a]===i))return e(r)})},Sc=Ce({patchProp:gc},tc);let ii;function Cc(){return ii||(ii=Pa(Sc))}const Tc=(...e)=>{const t=Cc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=kc(s);if(!r)return;const i=t._component;!K(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const a=n(r,!1,$c(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),a},t};function $c(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function kc(e){return ae(e)?document.querySelector(e):e}const Mc={class:"footer"},Rc={__name:"AppFooter",emits:["request-admin"],setup(e,{emit:t}){const n=t,s=oe(0);let r=null;Qs(()=>{r&&window.clearTimeout(r)});function i(){s.value+=1,s.value===1&&(r=window.setTimeout(()=>{s.value=0,r=null},2e3)),s.value>=5&&(r&&(window.clearTimeout(r),r=null),s.value=0,n("request-admin"))}return(a,c)=>(j(),V("div",Mc,[y("div",null,[c[0]||(c[0]=nn(" © 2026 AirShare Pro. All rights reserved. ",-1)),c[1]||(c[1]=y("span",{class:"divider-line"},"|",-1)),y("span",{id:"admin-trigger",title:"点击 5 次进入后台",onClick:i},"V 1.0.0")]),c[2]||(c[2]=y("div",{style:{"font-size":"12px","margin-top":"4px"}},[y("a",{href:"https://beian.miit.gov.cn/",target:"_blank",rel:"noreferrer"}," 粤ICP备2026888888号-1 ")],-1))]))}},Ac=["fill","stroke"],pe={__name:"LocalIcon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:24}},setup(e){const t=e,n={light_mode:{type:"stroke",shapes:[{tag:"circle",attrs:{cx:"12",cy:"12",r:"4"}},{tag:"path",attrs:{d:"M12 2v2.2"}},{tag:"path",attrs:{d:"M12 19.8V22"}},{tag:"path",attrs:{d:"M4.93 4.93 6.5 6.5"}},{tag:"path",attrs:{d:"m17.5 17.5 1.57 1.57"}},{tag:"path",attrs:{d:"M2 12h2.2"}},{tag:"path",attrs:{d:"M19.8 12H22"}},{tag:"path",attrs:{d:"m4.93 19.07 1.57-1.57"}},{tag:"path",attrs:{d:"M17.5 6.5 19.07 4.93"}}]},dark_mode:{type:"fill",shapes:[{tag:"path",attrs:{d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"}}]},add_circle:{type:"stroke",shapes:[{tag:"circle",attrs:{cx:"12",cy:"12",r:"9"}},{tag:"path",attrs:{d:"M12 8v8"}},{tag:"path",attrs:{d:"M8 12h8"}}]},sensors:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 12h.01"}},{tag:"path",attrs:{d:"M9.2 14.8a4 4 0 0 1 0-5.6"}},{tag:"path",attrs:{d:"M14.8 9.2a4 4 0 0 1 0 5.6"}},{tag:"path",attrs:{d:"M6.4 17.6a8 8 0 0 1 0-11.2"}},{tag:"path",attrs:{d:"M17.6 6.4a8 8 0 0 1 0 11.2"}}]},smartphone:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"7",y:"2.5",width:"10",height:"19",rx:"2.5"}},{tag:"path",attrs:{d:"M10 5h4"}},{tag:"circle",attrs:{cx:"12",cy:"18",r:"0.8"}}]},laptop_mac:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"5",y:"4",width:"14",height:"10",rx:"1.5"}},{tag:"path",attrs:{d:"M3 18h18"}},{tag:"path",attrs:{d:"M8 18a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2"}}]},close:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M6 6l12 12"}},{tag:"path",attrs:{d:"M18 6 6 18"}}]},cloud_upload:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M7 18a4 4 0 1 1 .7-7.94A5.5 5.5 0 0 1 18 11a3.5 3.5 0 1 1-.5 7"}},{tag:"path",attrs:{d:"M12 10v8"}},{tag:"path",attrs:{d:"m8.8 13.2 3.2-3.2 3.2 3.2"}}]},arrow_upward:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 19V6"}},{tag:"path",attrs:{d:"m6.5 11.5 5.5-5.5 5.5 5.5"}}]},send_and_archive:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M3 6h18l-2 4H5Z"}},{tag:"path",attrs:{d:"M5 10v8a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-8"}},{tag:"path",attrs:{d:"M12 11v5"}},{tag:"path",attrs:{d:"m9.5 13.5 2.5 2.5 2.5-2.5"}}]},chat_bubble:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M6 18.5 3.5 21v-5A7.5 7.5 0 0 1 11 4.5h2A7.5 7.5 0 0 1 20.5 12v.5A7.5 7.5 0 0 1 13 20H8.5"}}]},content_copy:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"9",y:"9",width:"10",height:"10",rx:"2"}},{tag:"path",attrs:{d:"M7 15H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v1"}}]},check:{type:"stroke",shapes:[{tag:"path",attrs:{d:"m5 12 4.2 4.2L19 7.5"}}]},draft:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"4",y:"5",width:"16",height:"14",rx:"2"}},{tag:"path",attrs:{d:"m5 7 7 5 7-5"}}]},save:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M5 20h14a1 1 0 0 0 1-1V7.5L16.5 4H5a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1Z"}},{tag:"path",attrs:{d:"M8 4v5h7"}},{tag:"rect",attrs:{x:"8",y:"14",width:"8",height:"4",rx:"1"}}]},download:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 5v10"}},{tag:"path",attrs:{d:"m7.5 10.5 4.5 4.5 4.5-4.5"}},{tag:"path",attrs:{d:"M5 19h14"}}]}},s=xt(()=>n[t.name]||n.close),r=xt(()=>typeof t.size=="number"?`${t.size}px`:/^\d+(\.\d+)?$/.test(t.size)?`${t.size}px`:t.size);return(i,a)=>(j(),V("span",{class:"app-icon",style:Le({width:r.value,height:r.value}),"aria-hidden":"true"},[(j(),V("svg",{viewBox:"0 0 24 24",fill:s.value.type==="fill"?"currentColor":"none",stroke:s.value.type==="stroke"?"currentColor":"none","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[(j(!0),V(fe,null,en(s.value.shapes,(c,f)=>(j(),mt(ua(c.tag),mo({key:`${e.name}-${f}`},{ref_for:!0},c.attrs),null,16))),128))],8,Ac))],4))}},Ec={class:"header"},Oc={__name:"AppHeader",props:{theme:{type:String,required:!0}},emits:["toggle-theme"],setup(e){return(t,n)=>(j(),V("div",Ec,[n[1]||(n[1]=y("h1",null,"AirShare Pro",-1)),n[2]||(n[2]=y("p",null,"跨端局域网 & P2P 传输中心",-1)),y("button",{class:"theme-toggle",title:"切换日夜模式",onClick:n[0]||(n[0]=s=>t.$emit("toggle-theme"))},[q(pe,{id:"theme-icon",name:e.theme==="dark"?"dark_mode":"light_mode",size:"22"},null,8,["name"])])]))}},Pc={class:"card"},Dc={key:0,class:"section-title"},mn={__name:"GlassCard",props:{title:{type:String,default:""}},setup(e){return(t,n)=>(j(),V("div",Pc,[e.title?(j(),V("div",Dc,te(e.title),1)):Be("",!0),da(t.$slots,"default")]))}},Nc={class:"admin-panel active"},Fc={class:"card admin-header-card"},Uc={class:"transfer-head transfer-head-compact"},Lc={class:"main-grid admin-summary-grid"},Bc={class:"admin-stats-panel"},jc={class:"admin-stats-row"},Hc={class:"admin-fluid-content"},Kc={class:"admin-fluid-icon"},zc={class:"admin-fluid-copy"},Wc={key:0,class:"stat-suffix"},Vc={class:"admin-config-stack"},qc={class:"text-input-group admin-config-row admin-config-row-field admin-config-row-last"},Gc={class:"admin-field-control-row"},Jc=["value"],Yc={class:"text-input-group admin-config-row admin-config-row-field admin-config-row-last"},Xc={class:"admin-field-control-row"},Zc=["value"],Qc={class:"admin-config-insights"},eu={class:"admin-config-highlight"},tu={class:"admin-config-highlight"},nu={class:"admin-table-wrapper"},su={class:"admin-table"},ru={__name:"AdminPanel",props:{stats:{type:Array,required:!0},records:{type:Array,required:!0},fileLimit:{type:Number,required:!0},minioCapacity:{type:Number,required:!0}},emits:["exit","save-config","update:file-limit","update:minio-capacity"],setup(e){function t(a){const c=Number(a)||0;return c>=1024?`${(c/1024).toFixed(c%1024===0?0:1)} GB`:`${c} MB`}function n(a){const c=Number(a)||0;return c>=1024?`${(c/1024).toFixed(c%1024===0?0:1)} TB`:`${c} GB`}function s(a){return a==="blue"?{color:"var(--accent-blue)"}:a==="cyan"?{color:"var(--accent-cyan)"}:a==="success"?{color:"var(--success-green)"}:a==="danger"?{color:"var(--danger-red)"}:{color:"var(--text-main)"}}function r(a){return a==="success"?{color:"var(--success-green)",fontWeight:500}:a==="primary"?{color:"var(--accent-blue)",fontWeight:500}:{color:"var(--danger-red)",fontWeight:500}}function i(a){const c=Number(a)||0;return{"--fluid-level":`${Math.max(0,Math.min(c,100))}%`}}return(a,c)=>(j(),V("div",Nc,[y("div",Fc,[y("div",Uc,[c[5]||(c[5]=y("div",{class:"connected-to"},[y("h2",{class:"admin-title"},"管理控制台"),y("p",{class:"admin-subtitle"},"AirShare Pro System Dashboard")],-1)),y("button",{class:"btn-small-primary",type:"button",onClick:c[0]||(c[0]=f=>a.$emit("exit"))},"退出管理")])]),y("div",Lc,[q(mn,{class:"admin-stats-card",title:"系统运行状态"},{default:Yt(()=>[y("div",Bc,[y("div",jc,[(j(!0),V(fe,null,en(e.stats,f=>(j(),V("div",{key:f.label,class:It(["admin-stat-item",{"admin-stat-item-fluid":f.kind==="minio"}])},[f.kind==="minio"?(j(),V("div",{key:0,class:"admin-fluid-card",style:Le(i(f.percent))},[c[6]||(c[6]=y("div",{class:"admin-fluid-fill"},[y("span",{class:"admin-fluid-wave admin-fluid-wave-a"}),y("span",{class:"admin-fluid-wave admin-fluid-wave-b"})],-1)),y("div",Hc,[y("div",Kc,[q(pe,{name:"save",size:"18"})]),y("div",zc,[y("h3",{style:Le(s(f.tone))},te(f.value),5),y("p",null,te(f.label),1),y("small",null,te(f.detail),1)])])],4)):(j(),V(fe,{key:1},[c[7]||(c[7]=y("span",{class:"admin-stat-kicker"},"实时指标",-1)),y("h3",{style:Le(s(f.tone))},[nn(te(f.value),1),f.suffix?(j(),V("span",Wc,te(f.suffix),1)):Be("",!0)],4),y("p",null,te(f.label),1)],64))],2))),128))])])]),_:1}),q(mn,{class:"admin-config-card",title:"核心参数配置"},{default:Yt(()=>[y("div",Vc,[y("div",qc,[c[8]||(c[8]=y("div",{class:"admin-field-meta"},[y("label",{class:"admin-field-label",for:"admin-file-limit"},"单文件大小限制"),y("p",{class:"admin-field-hint"},"单位为 MB,超过该阈值的文件会按当前后端策略处理。")],-1)),y("div",Gc,[y("input",{id:"admin-file-limit",value:e.fileLimit,min:"1",placeholder:"10240",type:"number",onInput:c[1]||(c[1]=f=>a.$emit("update:file-limit",Number(f.target.value)||0))},null,40,Jc),y("button",{title:"保存配置",type:"button",onClick:c[2]||(c[2]=f=>a.$emit("save-config"))},[q(pe,{name:"save",size:"18"})])])]),y("div",Yc,[c[9]||(c[9]=y("div",{class:"admin-field-meta"},[y("label",{class:"admin-field-label",for:"admin-minio-capacity"},"MinIO 总容量"),y("p",{class:"admin-field-hint"},"单位为 GB,用于容量卡和液位比例计算。")],-1)),y("div",Xc,[y("input",{id:"admin-minio-capacity",value:e.minioCapacity,min:"1",placeholder:"120",type:"number",onInput:c[3]||(c[3]=f=>a.$emit("update:minio-capacity",Number(f.target.value)||0))},null,40,Zc),y("button",{title:"保存配置",type:"button",onClick:c[4]||(c[4]=f=>a.$emit("save-config"))},[q(pe,{name:"save",size:"18"})])])]),y("div",Qc,[y("div",eu,[c[10]||(c[10]=y("span",{class:"admin-config-badge"},"ACTIVE POLICY",-1)),y("h3",null,te(t(e.fileLimit)),1),c[11]||(c[11]=y("p",null,"当前单文件阈值。超过该体积后,文件会按后端已设定的传输与存档策略处理。",-1))]),y("div",tu,[c[12]||(c[12]=y("span",{class:"admin-config-badge"},"MINIO CAPACITY",-1)),y("h3",null,te(n(e.minioCapacity)),1),c[13]||(c[13]=y("p",null,"当前 MinIO 总容量基线,用于后台容量展示与液位占比计算。",-1))])])])]),_:1})]),q(mn,{class:"admin-table-card",title:"最近传输记录(Top 5)"},{default:Yt(()=>[y("div",nu,[y("table",su,[c[14]||(c[14]=y("thead",null,[y("tr",null,[y("th",null,"时间"),y("th",null,"发送端特征"),y("th",null,"传输类型"),y("th",null,"数据量"),y("th",null,"状态")])],-1)),y("tbody",null,[(j(!0),V(fe,null,en(e.records,f=>(j(),V("tr",{key:`${f.time}-${f.peer}`},[y("td",null,te(f.time),1),y("td",null,te(f.peer),1),y("td",null,te(f.type),1),y("td",null,te(f.size),1),y("td",{style:Le(r(f.tone))},te(f.status),5)]))),128))])])])]),_:1})]))}},iu={class:"local-device-name"},ou={key:0,class:"radar-container"},lu={class:"radar"},au={key:1,class:"device-list"},cu=["onClick"],uu={class:"device-icon"},fu={class:"device-info"},du={key:2,class:"radar-container"},pu={class:"radar"},hu={__name:"DeviceDiscoveryCard",props:{isScanning:{type:Boolean,required:!0},localDeviceName:{type:String,default:""},devices:{type:Array,required:!0}},emits:["select-device"],setup(e,{emit:t}){const n=t;function s(r){n("select-device",r)}return(r,i)=>(j(),mt(mn,{title:"局域网自动发现"},{default:Yt(()=>[y("p",iu,[i[0]||(i[0]=nn(" 本机:",-1)),y("strong",null,te(e.localDeviceName||"识别中"),1)]),e.isScanning?(j(),V("div",ou,[y("div",lu,[q(pe,{class:"radar-icon",name:"sensors",size:"36"})]),i[1]||(i[1]=y("p",{class:"scan-status"},"正在扫描附近设备...",-1))])):e.devices.length?(j(),V("div",au,[(j(!0),V(fe,null,en(e.devices,a=>(j(),V("button",{key:a.id,class:"device-item",type:"button",onClick:c=>s(a)},[y("div",uu,[q(pe,{name:a.icon,size:"24"},null,8,["name"])]),y("div",fu,[y("h4",null,te(a.name),1),y("p",null,te(a.description),1)]),i[2]||(i[2]=y("div",{class:"device-status-beacon","aria-hidden":"true"},[y("span",{class:"device-status-dot"}),y("span",{class:"device-status-ring"}),y("span",{class:"device-status-ring device-status-ring-delay"})],-1))],8,cu))),128))])):(j(),V("div",du,[y("div",pu,[q(pe,{class:"radar-icon",name:"devices",size:"36"})]),i[3]||(i[3]=y("p",{class:"scan-status"},"暂未发现局域网设备,请保持页面开启后重试",-1))]))]),_:1}))}},mu={key:0,class:"room-action-area"},gu={class:"room-input-group"},vu=["value"],yu={key:0,class:"pending-downloads"},_u={class:"pending-downloads-head"},bu=["href"],wu={class:"pending-download-copy"},xu=["title"],Iu={class:"pending-download-icon","aria-hidden":"true"},Su={key:1,class:"waiting-area"},Cu={class:"huge-code"},Tu={__name:"RemoteRoomCard",props:{roomCodeInput:{type:String,required:!0},isWaiting:{type:Boolean,required:!0},generatedCode:{type:String,required:!0},pendingDownloads:{type:Array,required:!0}},emits:["update-room-code","create-room","join-room","cancel-room"],setup(e,{emit:t}){const n=t;function s(i){n("update-room-code",i.target.value)}function r(){n("join-room")}return(i,a)=>(j(),mt(mn,{title:"远程直连"},{default:Yt(()=>[e.isWaiting?(j(),V("div",Su,[a[6]||(a[6]=y("p",{class:"waiting-subtitle"},"您的房间号码",-1)),y("div",Cu,te(e.generatedCode),1),a[7]||(a[7]=y("div",{class:"spinner"},null,-1)),a[8]||(a[8]=y("p",{class:"waiting-tip"},"等待对方加入...",-1)),y("button",{class:"btn-cancel",type:"button",onClick:a[2]||(a[2]=c=>i.$emit("cancel-room"))},"取消建房")])):(j(),V("div",mu,[y("button",{class:"btn-create",type:"button",onClick:a[0]||(a[0]=c=>i.$emit("create-room"))},[q(pe,{name:"add_circle",size:"22"}),a[3]||(a[3]=nn(" 创建专属传输房间 ",-1))]),a[5]||(a[5]=y("div",{class:"divider"},"或",-1)),y("div",gu,[y("input",{class:"room-code",inputmode:"numeric",maxlength:"4",pattern:"\\d*",placeholder:"输入4位房间号",type:"text",value:e.roomCodeInput,onInput:s,onKeyup:_o(r,["enter"])},null,40,vu),y("button",{class:"btn-primary",type:"button",onClick:a[1]||(a[1]=c=>i.$emit("join-room"))},"加入房间")]),e.pendingDownloads.length?(j(),V("div",yu,[y("div",_u,[a[4]||(a[4]=y("span",null,"待领取文件",-1)),y("span",null,te(e.pendingDownloads.length),1)]),(j(!0),V(fe,null,en(e.pendingDownloads,c=>(j(),V("a",{key:c.transfer_id,class:"pending-download-item",href:c.download_path,target:"_blank",rel:"noopener noreferrer"},[y("div",wu,[y("strong",{title:c.name},te(c.name),9,xu),y("p",null,te(c.size_label)+" · "+te(c.created_label),1)]),y("span",Iu,[q(pe,{name:"download",size:"18"})])],8,bu))),128))])):Be("",!0)]))]),_:1}))}},$u={class:"file-info"},ku=["title"],Mu={class:"file-info-right"},Ru=["download","href"],Au={key:0,class:"progress-bar-container"},Eu={__name:"TransferQueueItem",props:{item:{type:Object,required:!0}},emits:["remove","start-upload","copy"],setup(e){const t=e,n=xt(()=>t.item.tone==="success"?{color:"var(--success-green)"}:t.item.tone==="primary"?{color:"var(--accent-blue)"}:t.item.tone==="danger"?{color:"var(--danger-red)"}:{color:"var(--text-secondary)"}),s=xt(()=>t.item.kind==="text"?{color:"var(--success-green)",background:"rgba(48, 209, 88, 0.1)"}:{});return(r,i)=>(j(),V("div",{class:It(["batch-item",{"pending-file":e.item.kind==="file"&&e.item.pending}])},[y("div",$u,[y("div",{class:"file-info-left",style:Le(e.item.kind==="text"?{maxWidth:"70%"}:null)},[y("div",{class:"file-icon-wrapper",style:Le(s.value)},[q(pe,{name:e.item.kind==="text"?"chat_bubble":"draft",size:"18"},null,8,["name"])],4),y("span",{class:"file-name",title:e.item.kind==="text"?e.item.text:e.item.name},te(e.item.kind==="text"?e.item.text:e.item.name),9,ku)],4),y("div",Mu,[y("span",{class:"file-status",style:Le(n.value)},te(e.item.kind==="text"&&e.item.copied?"已复制":e.item.status),5),e.item.kind==="text"?(j(),V("button",{key:0,class:"action-btn",title:"复制文本",type:"button",onClick:i[0]||(i[0]=a=>r.$emit("copy",e.item.id))},[q(pe,{name:e.item.copied?"check":"content_copy",size:"16"},null,8,["name"])])):Be("",!0),e.item.kind==="file"&&e.item.pending?(j(),V("button",{key:1,class:"action-btn primary",title:"发送文件",type:"button",onClick:i[1]||(i[1]=a=>r.$emit("start-upload",e.item.id))},[q(pe,{name:"arrow_upward",size:"16"})])):Be("",!0),e.item.kind==="file"&&e.item.downloadUrl?(j(),V("a",{key:2,class:"action-btn primary",download:e.item.name,href:e.item.downloadUrl,title:"保存文件"},[q(pe,{name:"download",size:"16"})],8,Ru)):Be("",!0),y("button",{class:"action-btn danger",title:"移除记录",type:"button",onClick:i[2]||(i[2]=a=>r.$emit("remove",e.item.id))},[q(pe,{name:"close",size:"16"})])])]),e.item.kind==="file"?(j(),V("div",Au,[y("div",{class:It(["progress-bar-fill",{success:e.item.tone==="success"}]),style:Le({width:`${e.item.progress}%`})},null,6)])):Be("",!0)],2))}},Ou={class:"transfer-panel active"},Pu={class:"card"},Du={class:"transfer-head"},Nu={class:"connected-to"},Fu={key:0,class:"connection-hint"},Uu={class:"text-input-group"},Lu={__name:"TransferPanel",props:{peerName:{type:String,required:!0},connectionType:{type:String,required:!0},networkHint:{type:String,default:""},items:{type:Array,required:!0},hasPendingItems:{type:Boolean,required:!0}},emits:["close","send-text","files-selected","send-all-pending","remove-item","start-upload","copy-item"],setup(e,{emit:t}){const n=e,s=t,r=oe(""),i=oe(!1),a=oe(null),c=oe(null);Ft(()=>n.items.length,async()=>{await Di(),a.value&&(a.value.scrollTop=a.value.scrollHeight)});function f(){var T;(T=c.value)==null||T.click()}function h(){s("send-text",r.value),r.value=""}function p(T){const S=Array.from(T.target.files||[]);S.length&&s("files-selected",S),T.target.value=""}function _(T){var U;i.value=!1;const S=Array.from(((U=T.dataTransfer)==null?void 0:U.files)||[]);S.length&&s("files-selected",S)}return(T,S)=>(j(),V("div",Ou,[y("div",Pu,[y("div",Du,[y("div",Nu,[y("h2",null,te(e.peerName),1),y("p",null,te(e.connectionType),1),e.networkHint?(j(),V("small",Fu,te(e.networkHint),1)):Be("",!0)]),y("button",{class:"close-btn",type:"button",onClick:S[0]||(S[0]=U=>T.$emit("close"))},[q(pe,{name:"close",size:"20"})])]),y("div",{class:It(["drop-zone",{"drop-zone-active":i.value}]),onClick:f,onDragenter:S[1]||(S[1]=On(U=>i.value=!0,["prevent"])),onDragover:S[2]||(S[2]=On(U=>i.value=!0,["prevent"])),onDragleave:S[3]||(S[3]=On(U=>i.value=!1,["prevent"])),onDrop:On(_,["prevent"])},[q(pe,{class:"drop-zone-icon",name:"cloud_upload",size:"42"}),S[9]||(S[9]=y("p",{class:"drop-zone-text"},"点击或拖拽多个文件到这里",-1)),y("input",{ref_key:"fileInput",ref:c,class:"hidden",multiple:"",type:"file",onChange:p},null,544)],34),y("div",Uu,[Wl(y("input",{"onUpdate:modelValue":S[4]||(S[4]=U=>r.value=U),placeholder:"输入要发送的文本或链接...",type:"text",onKeyup:_o(h,["enter"])},null,544),[[bc,r.value]]),y("button",{title:"发送文本",type:"button",onClick:h},[q(pe,{name:"arrow_upward",size:"20"})])]),y("div",{class:It(["batch-actions",{active:e.hasPendingItems}])},[y("button",{class:"btn-small-primary",type:"button",onClick:S[5]||(S[5]=U=>T.$emit("send-all-pending"))},[q(pe,{name:"send_and_archive",size:"16"}),S[10]||(S[10]=nn(" 一键发送全部 ",-1))])],2),e.items.length?(j(),V("div",{key:0,ref_key:"batchContainer",ref:a,class:"batch-progress-container"},[(j(!0),V(fe,null,en(e.items,U=>(j(),mt(Eu,{key:U.id,item:U,onCopy:S[6]||(S[6]=N=>T.$emit("copy-item",N)),onRemove:S[7]||(S[7]=N=>T.$emit("remove-item",N)),onStartUpload:S[8]||(S[8]=N=>T.$emit("start-upload",N))},null,8,["item"]))),128))],512)):Be("",!0)])]))}};let Vt={deviceId:"",token:""};const Bu="filefast_device_id",ju="filefast_device_token";function bo(){return!Vt.deviceId||!Vt.token?{}:{"X-Device-ID":Vt.deviceId,"X-Device-Token":Vt.token}}function Hu(e={},t=!1){return{...t?{"Content-Type":"application/json"}:{},...bo(),...e}}function Ku(e,t){if(!t||Object.keys(t).length===0)return e;const n=new URLSearchParams;Object.entries(t).forEach(([r,i])=>{i!=null&&i!==""&&n.set(r,String(i))});const s=n.toString();return s?`${e}?${s}`:e}async function Pn(e,t={}){const n=t.body!==void 0,s=await fetch(Ku(e,t.query),{method:t.method||"GET",headers:Hu(t.headers,n),body:n?JSON.stringify(t.body):void 0}),r=await s.json().catch(()=>({}));if(!s.ok){const i=new Error(r.error||`Request failed: ${s.status}`);throw i.status=s.status,i}return r.data}const ve={get(e,t={}){return Pn(e,{...t,method:"GET"})},post(e,t,n={}){return Pn(e,{...n,method:"POST",body:t})},put(e,t,n={}){return Pn(e,{...n,method:"PUT",body:t})},patch(e,t,n={}){return Pn(e,{...n,method:"PATCH",body:t})}};function oi(e,t){Vt={deviceId:e||"",token:t||""},Vu(Vt)}function zu(){return bo()}function Wu(e){return{Authorization:`Bearer ${e}`}}function Vu(e){typeof document>"u"||(li(Bu,e.deviceId),li(ju,e.token))}function li(e,t){if(!t){document.cookie=`${e}=; Path=/; Max-Age=0; SameSite=Lax`;return}document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax`}function Dn(e){return{headers:Wu(e)}}const Kt={login(e,t){return ve.post("/api/admin/login",{username:e,password:t})},stats(e){return ve.get("/api/admin/stats",Dn(e))},config(e){return ve.get("/api/admin/config",Dn(e))},updateConfig(e,t){return ve.put("/api/admin/config",t,Dn(e))},recentTransfers(e){return ve.get("/api/admin/transfers/recent",Dn(e))}},Nn={register(e){return ve.post("/api/devices/register",e)},heartbeat(e){return ve.post("/api/devices/heartbeat",{device_id:e})},listCandidates(e){return ve.get("/api/devices/candidates",{query:{deviceId:e}})},listPendingDownloads(e){return ve.get(`/api/devices/${encodeURIComponent(e)}/pending-downloads`)}},Fn={create(e){return ve.post("/api/rooms",{creator_device_id:e})},get(e){return ve.get(`/api/rooms/${encodeURIComponent(e)}`)},join(e,t){return ve.post("/api/rooms/join",{code:e,joiner_device_id:t})},cancel(e,t){return ve.post(`/api/rooms/${encodeURIComponent(e)}/cancel`,{requester_id:t})}},qu={config(){return ve.get("/api/runtime/config")}},ge={create(e){return ve.post("/api/transfers",e)},presignFallback(e){return ve.post(`/api/transfers/${encodeURIComponent(e)}/fallback/presign`,{})},uploadFallback(e,t,n){return Gu(`/api/transfers/${encodeURIComponent(e)}/fallback/upload`,t,n)},updateStatus(e,t){return ve.patch(`/api/transfers/${encodeURIComponent(e)}/status`,t)}};function Gu(e,t,n){return new Promise((s,r)=>{const i=new XMLHttpRequest;i.open("PUT",e),i.responseType="json",i.setRequestHeader("Content-Type",t.type||"application/octet-stream"),Object.entries(zu()).forEach(([a,c])=>{i.setRequestHeader(a,c)}),i.upload.onprogress=a=>{!a.lengthComputable||typeof n!="function"||n(Math.round(a.loaded/a.total*100))},i.onload=()=>{const a=i.response||Ju(i.responseText);if(i.status>=200&&i.status<300){s(a.data);return}r(new Error((a==null?void 0:a.error)||`Upload failed: ${i.status}`))},i.onerror=()=>r(new Error("Upload failed")),i.send(t)})}function Ju(e){try{return JSON.parse(e)}catch{return null}}const Yu={class:"container"},Xu={key:0,class:"main-grid"},Ss="filefast-admin-token",Un="filefast-admin-view",Ln="filefast-device-id",ai="filefast-device-name",Cs="filefast-device-token",Zu=15e3,Qu=5e3,ef=2e3,tf=3e3,nf=4*1024*1024,sf=2e4,rf=16*1024,ci=512*1024,of={__name:"App",setup(e){const t=oe(localStorage.getItem("airshare-theme")||"light"),n=oe(localStorage.getItem(Un)==="admin"?"admin":"main"),s=oe(!0),r=oe([]),i=oe(""),a=oe(!1),c=oe("----"),f=oe([]),h=oe({name:"--",type:"等待连接",deviceId:"",networkGroupKey:""}),p=oe([]),_=oe("/ws"),T=oe(10240),S=oe(120),U=oe([]),N=oe([]),Y=oe(null),z=oe(localStorage.getItem(Ss)||""),A=oe({id:"",name:"",type:""}),Q=localStorage.getItem(Ln)||"",F=localStorage.getItem(Cs)||"";Q&&F&&oi(Q,F);const le=new Map,he=new Map,Te=new Map,$e=new Map;let vt=null,He=null,Je=null,Ke=null,yt=null,de=null,st=null,L=null,B=null,G="",_e="p2p",ze=!1,be=!1,ue=!1,_t=null,Ct=null;const Sn=xt(()=>p.value.filter(o=>o.kind==="file"&&o.pending)),Tt=xt(()=>Sn.value.length>0),Ut=xt(()=>!h.value.deviceId||ar(h.value.networkGroupKey)||Fo()?"":"当前是跨网络访问,未配置 TURN 时实时通道可能失败。文本和小文件可回退中转,大文件建议使用 MinIO。");Ft(t,o=>{document.body.setAttribute("data-theme",o),localStorage.setItem("airshare-theme",o)},{immediate:!0}),Ft(n,o=>{if(o==="admin"&&z.value){localStorage.setItem(Un,"admin");return}localStorage.removeItem(Un)}),Ft([n,z],([o,l])=>{Ke&&(window.clearInterval(Ke),Ke=null),!(o!=="admin"||!l)&&(Ke=window.setInterval(()=>{os().catch(u=>{console.error(u)})},5e3))}),Wi(async()=>{_.value=No(),await sn(),n.value==="admin"&&z.value&&os().catch(o=>{console.error(o)}),He=window.setInterval(()=>{w()},Zu),vt=window.setInterval(()=>{v()},Qu),yt=window.setInterval(()=>{I()},1e4)}),Qs(()=>{vt&&window.clearInterval(vt),He&&window.clearInterval(He),Ke&&window.clearInterval(Ke),yt&&window.clearInterval(yt),b(),it(),yr(),D()});async function sn(){try{await $t(),await g(),await v()}catch(o){window.alert(`后端连接失败:${o.message}`)}}function Cn(){t.value=t.value==="dark"?"light":"dark"}async function $t(){try{Tn(await qu.config())}catch(o){console.error(o)}}function Tn(o){o&&(Y.value=o,T.value=Math.round((o.max_minio_fallback_size_bytes||0)/1024/1024),S.value=Math.max(0,Math.round((o.minio_capacity_bytes||0)/1024/1024/1024)))}function d(o){i.value=o.replace(/\D/g,"").slice(0,4)}async function g(){const o=Ro(),l=Ao(o),u=Po(),m=await Nn.register({device_id:o,name:l,type:u,network_group_key:lr()});localStorage.setItem(Ln,m.id),m.auth_token&&(localStorage.setItem(Cs,m.auth_token),oi(m.id,m.auth_token)),A.value={id:m.id,name:m.name,type:m.type},await I(),vr()}async function v(){if(A.value.id)try{const o=await ge.create({kind:"text",name:"text-message",content:value,sender_device_id:A.value.id,receiver_device_id:h.value.deviceId});try{await rn(o,value)}catch(l){console.warn("realtime text send failed, fallback to relay",l),await rr(o,value)}p.value.push({id:Ue("text"),transferId:o.id,kind:"text",text:value,status:"已发送",tone:"success",copied:!1})}catch(o){window.alert(`发送文本失败:${o.message}`)}}async function I(){if(!A.value.id){f.value=[];return}try{const o=await Nn.listPendingDownloads(A.value.id);f.value=o.map(l=>({...l,name:bt(l.name),download_path:l.download_path||`/api/transfers/${encodeURIComponent(l.transfer_id)}/fallback/download`,size_label:jt(Number(l.size_bytes||0)),created_label:fs(l.created_at)}))}catch(o){if((o==null?void 0:o.status)===404){f.value=[];return}console.error(o)}}async function w(){if(A.value.id)try{await Nn.heartbeat(A.value.id)}catch(o){console.error(o)}}async function x(){if(!A.value.id){window.alert("当前设备尚未注册到后端");return}try{const o=await Fn.create(A.value.id);c.value=o.code,a.value=!0,C(o.code)}catch(o){window.alert(`创建房间失败:${o.message}`)}}async function R(){const o=c.value;b();try{a.value&&o!=="----"&&await Fn.cancel(o,A.value.id)}catch(l){console.error(l)}finally{a.value=!1,c.value="----"}}async function k(){if(!(i.value.length<4))try{const o=await Fn.join(i.value,A.value.id),l=Mt(o.creator_device_id);i.value="",P({deviceId:o.creator_device_id,name:(l==null?void 0:l.name)||`房间 ${o.code} 创建者`,type:"房间配对成功"})}catch(o){window.alert(`加入房间失败:${o.message}`)}}function C(o){b(),Je=window.setInterval(async()=>{try{const l=await Fn.get(o);if(l.status==="joined"&&l.joiner_device_id){const u=Mt(l.joiner_device_id);P({deviceId:l.joiner_device_id,name:(u==null?void 0:u.name)||`房间 ${o} 对端`,type:"房间配对成功"});return}(l.status==="expired"||l.status==="canceled")&&(b(),a.value=!1,c.value="----")}catch(l){console.error(l)}},ef)}function b(){Je&&(window.clearInterval(Je),Je=null)}function P(o){const l=o.deviceId||o.id||"",u=o.connectionType||o.type||"点对点传输";b(),h.value.deviceId!==l&&(it(),D()),h.value={name:o.name,type:o.connectionType||o.type||"点对点传输",deviceId:o.deviceId||o.id||"",networkGroupKey:o.network_group_key||""},a.value=!1,c.value="----",n.value="transfer",h.value.baseType=u,h.value.type=u,h.value.deviceId=l,We("正在建立实时通道"),rt(l,{initiate:!0})}function M(o,l=!1){const u=o.deviceId||o.id||"",m=o.connectionType||o.type||"点对点传输";h.value.deviceId===u&&n.value==="transfer"||(it(),l||D()),h.value={name:o.name,type:o.connectionType||o.type||"点对点传输",deviceId:u,networkGroupKey:o.network_group_key||""},a.value=!1,c.value="----",n.value="transfer",h.value.baseType=m,h.value.type=m,h.value.deviceId=u,We("正在建立实时通道"),rt(u)}function O(){it(),D(),h.value={name:"--",type:"等待连接",deviceId:"",networkGroupKey:""},n.value="main",h.value.baseType="等待连接",h.value.type="等待连接"}function D(){p.value.forEach(o=>Pe(o)),p.value=[],he.clear()}async function W(o){const l=o.trim();if(l){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}try{const u=await ge.create({kind:"text",name:"text-message",content:l,sender_device_id:A.value.id,receiver_device_id:h.value.deviceId});ce("transfer.created",h.value.deviceId,{transfer_id:u.id,kind:"text",name:"text-message",content:l,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type,receiver_device_id:h.value.deviceId,final_status:"completed",current_channel:"p2p",transport_options:ls()}),await ge.updateStatus(u.id,{current_channel:"p2p",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:u.id,final_status:"completed",current_channel:"p2p"}),p.value.push({id:Ue("text"),transferId:u.id,kind:"text",text:l,status:"已发送",tone:"success",copied:!1})}catch(u){window.alert(`发送文本失败:${u.message}`)}}}function ee(o){const l=o.filter(Boolean).map((u,m)=>({id:Ue(`file-${m}`),kind:"file",file:u,name:bt(u.name),size:jt(u.size),sizeBytes:u.size,status:"待发送",tone:"muted",progress:0,pending:!0,transferId:""}));l.length&&p.value.push(...l)}async function J(o){const l=p.value.find(u=>u.id===o);if(!(!l||l.kind!=="file"||!l.pending)){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}l.pending=!1,l.status="创建传输中...",l.tone="primary";try{const u=await ge.create({kind:"file",name:l.name,size_bytes:l.sizeBytes,sender_device_id:A.value.id,receiver_device_id:h.value.deviceId});if(l.transferId=u.id,l.sizeBytes>nf){await me(l,u);return}ce("transfer.created",h.value.deviceId,{transfer_id:u.id,kind:"file",name:l.name,size_bytes:l.sizeBytes,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type,receiver_device_id:h.value.deviceId,final_status:"connecting",current_channel:"p2p",transport_options:ls()});try{await ir(l,u)}catch(m){console.warn("realtime file send failed, fallback to relay",m),await or(l,u)}}catch(u){l.pending=!0,l.status=`发送失败:${u.message}`,l.tone="danger"}}}async function me(o,l){o.progress=0,o.status="上传准备中...";try{if(!l.fallback_allowed)throw new Error("当前文件过大,且未启用 MinIO 回退");await ge.presignFallback(o.transferId),ce("transfer.updated",h.value.deviceId,{transfer_id:o.transferId,final_status:"fallback_uploading",current_channel:"minio"}),o.status="上传中...";const u=await ge.uploadFallback(o.transferId,o.file,m=>{o.progress=Math.max(1,Math.min(m,99))});await ge.updateStatus(o.transferId,{current_channel:"minio",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:o.transferId,final_status:"completed",current_channel:"minio"}),ce("transfer.file",h.value.deviceId,{transfer_id:o.transferId,name:o.name,download_url:u.download_path||u.download_url}),o.progress=100,o.status="上传完成",o.tone="success"}catch(u){o.pending=!0,o.status=`上传失败:${u.message}`,o.tone="danger"}}async function we(){for(const o of Sn.value)await J(o.id)}async function Ne(o){const l=p.value.find(u=>u.id===o);if(l&&Pe(l),p.value=p.value.filter(u=>u.id!==o),!(!(l!=null&&l.transferId)||l.tone==="success"))try{await ge.updateStatus(l.transferId,{final_status:"cancelled"}),ce("transfer.updated",h.value.deviceId,{transfer_id:l.transferId,final_status:"cancelled"})}catch(u){console.error(u)}}async function Fe(o){const l=p.value.find(u=>u.id===o);if(!(!l||l.kind!=="text"))try{await kt(l.text),l.copied=!0,window.setTimeout(()=>{const u=p.value.find(m=>m.id===o);u&&u.kind==="text"&&(u.copied=!1)},2e3)}catch{window.alert("复制失败")}}async function kt(o){var u;if((u=navigator.clipboard)!=null&&u.writeText&&window.isSecureContext){await navigator.clipboard.writeText(o);return}const l=document.createElement("textarea");l.value=o,l.setAttribute("readonly","readonly"),l.style.position="fixed",l.style.top="0",l.style.left="-9999px",l.style.opacity="0",document.body.appendChild(l),l.focus(),l.select(),l.setSelectionRange(0,l.value.length);try{if(!document.execCommand("copy"))throw new Error("copy command failed")}finally{document.body.removeChild(l)}}function $n(o){const l=le.get(o);l&&(window.clearInterval(l),le.delete(o))}function ke(o){return new Promise((l,u)=>{const m=new FileReader;m.onload=()=>l(String(m.result||"")),m.onerror=()=>u(new Error("Failed to read file")),m.readAsDataURL(o)})}function Pe(o){if($n(o.id),o.ownedDownloadUrl&&o.downloadUrl)try{URL.revokeObjectURL(o.downloadUrl)}catch(l){console.error(l)}o.transferId&&he.delete(o.transferId)}function Lt(o,l,u=!1){if(o.ownedDownloadUrl&&o.downloadUrl&&o.downloadUrl!==l)try{URL.revokeObjectURL(o.downloadUrl)}catch(m){console.error(m)}o.downloadUrl=l,o.ownedDownloadUrl=u}async function rn(o,l){const u=await dr(h.value.deviceId);kn(u,{type:"text",transfer_id:o.id,text:l,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type});const m=gr();await ge.updateStatus(o.id,{current_channel:m,final_status:"completed"})}async function rr(o,l){ce("transfer.created",h.value.deviceId,{transfer_id:o.id,kind:"text",name:"text-message",content:l,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type,receiver_device_id:h.value.deviceId,final_status:"completed",current_channel:"p2p"}),await ge.updateStatus(o.id,{current_channel:"p2p",final_status:"completed"})}async function ir(o,l){var E;const u=await dr(h.value.deviceId);o.status="正在通过 WebRTC 发送...",o.progress=1,kn(u,{type:"file-meta",transfer_id:l.id,name:o.name,mime_type:((E=o.file)==null?void 0:E.type)||"application/octet-stream",size_bytes:o.sizeBytes,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type});let m=0;for(;mci;)await Co(20)}function Co(o){return new Promise(l=>{window.setTimeout(l,o)})}function To(o,l,u){return new Promise((m,$)=>{const E=window.setTimeout(()=>{$(new Error(u))},l);o.then(se=>{window.clearTimeout(E),m(se)}).catch(se=>{window.clearTimeout(E),$(se)})})}async function $o(){const o=window.prompt("管理员用户名","admin");if(o===null)return;const l=window.prompt("管理员密码");if(l!==null)try{const u=await Kt.login(o.trim()||"admin",l);z.value=u.token,localStorage.setItem(Ss,u.token),await os(),n.value="admin"}catch(u){window.alert(`管理员登录失败:${u.message}`)}}function ko(){n.value="main"}async function os(){if(z.value)try{const[o,l,u]=await Promise.all([Kt.stats(z.value),Kt.config(z.value),Kt.recentTransfers(z.value)]);Tn(l),U.value=xr(o.stats||{},o.minio||{}),N.value=u.map(m=>Zo(m))}catch(o){throw(o==null?void 0:o.status)===401&&(localStorage.removeItem(Ss),localStorage.removeItem(Un),z.value="",n.value="main"),o}}async function Mo(){if(!z.value||!Y.value){window.alert("当前没有可用的管理员会话");return}try{const o={...Y.value,max_minio_fallback_size_bytes:Math.max(0,T.value)*1024*1024,minio_capacity_bytes:Math.max(0,S.value)*1024*1024*1024},l=await Kt.updateConfig(z.value,o);Tn(l);{const u=await Kt.stats(z.value);U.value=xr(u.stats||{},u.minio||{})}window.alert("配置已保存")}catch(o){window.alert(`保存配置失败:${o.message}`)}}function Ro(){let o=localStorage.getItem(Ln);return o||(o=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`web-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,localStorage.setItem(Ln,o)),o}function Ao(o){let l=localStorage.getItem(ai);return(!l||Eo(l,o))&&(l=`${Oo()} ${o.slice(0,4)}`,localStorage.setItem(ai,l)),l}function Eo(o,l){const u=String(o||"").trim(),m=l.slice(0,4);return!u||!m||!u.endsWith(` ${m}`)?!1:/^(android|iphone|ipad|linux|macintel|macos|windows|win32|web)\s/i.test(u)}function Oo(){const o=`${navigator.userAgent} ${navigator.platform}`.toLowerCase();return o.includes("iphone")?"iPhone":o.includes("ipad")?"iPad":o.includes("android")?"Android":o.includes("windows")||o.includes("win32")?"Windows":o.includes("mac os")||o.includes("macintosh")||o.includes("macintel")?"macOS":o.includes("linux")?"Linux":"Web"}function Po(){const o=`${navigator.userAgent} ${navigator.platform}`.toLowerCase();return o.includes("iphone")||o.includes("android")||o.includes("mobile")?"phone":o.includes("ipad")||o.includes("tablet")?"tablet":"desktop"}function bt(o,l="file"){const u=String(o||"").trim();if(!u)return l;if(!/%[0-9A-Fa-f]{2}/.test(u))return u;try{return decodeURIComponent(u)}catch{return u}}function Do(o){return o==="phone"?"smartphone":o==="tablet"?"tablet_mac":"laptop_mac"}function Bt(o){return o==="phone"?"手机":o==="tablet"?"平板":"桌面端"}function No(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`}function Fo(){var o;return Array.isArray((o=Y.value)==null?void 0:o.turn_urls)&&Y.value.turn_urls.some(l=>String(l||"").trim())}function lr(){const o=String(window.location.hostname||"").trim().toLowerCase();return o?o==="localhost"||o==="127.0.0.1"||o==="::1"||o.endsWith(".local")||Uo(o)?o:"":"local"}function ar(o){const l=lr();return!!l&&o===l}function Uo(o){const l=o.split(".");if(l.length!==4||l.some($=>!/^\d+$/.test($)))return!1;const[u,m]=l.map($=>Number($));return u===10||u===127||u===192&&m===168?!0:u===172&&m>=16&&m<=31}function cr(o){const l=Array.isArray(o==null?void 0:o.turn_urls)?o.turn_urls.map(u=>String(u||"").trim()).filter(Boolean):[];return l.length?[{urls:l,username:(o==null?void 0:o.turn_username)||"",credential:(o==null?void 0:o.turn_password)||""}]:[]}function ls(){var o,l;return{ice_servers:cr(Y.value),p2p_connect_timeout_sec:((o=Y.value)==null?void 0:o.p2p_connect_timeout_sec)||15,turn_connect_timeout_sec:((l=Y.value)==null?void 0:l.turn_connect_timeout_sec)||20}}function ur(){return typeof RTCPeerConnection<"u"}function as(){_t=null,Ct=null}function Lo(){return _t||(_t=new Promise(o=>{Ct=o})),_t}function fr(o){Ct&&Ct(o),_t=Promise.resolve(o),Ct=null}function We(o=""){if(!h.value.deviceId)return;const l=h.value.baseType||h.value.type||"点对点传输";h.value={...h.value,type:o?`${l} · ${o}`:l}}function Bo(o){return!L||G!==o||L.signalingState==="closed"||["failed","disconnected","closed"].includes(L.connectionState)||["failed","disconnected","closed"].includes(L.iceConnectionState)?!0:!B||B.readyState==="closed"}async function rt(o,l={}){return!o||!ur()?null:(Bo(o)&&(it(),jo(o)),l.initiate&&L.signalingState==="stable"&&await Ho(o),L)}function jo(o){G=o,_e="p2p",ze=!1,be=!1,ue=!1,$e.delete(o),as(),L=new RTCPeerConnection({iceServers:cr(Y.value)}),B=L.createDataChannel("filefast-control",{negotiated:!0,id:0,ordered:!0}),Ko(B),L.onicecandidate=({candidate:l})=>{if(l)try{ce("webrtc.candidate",o,{candidate:l})}catch(u){console.error(u)}},L.onconnectionstatechange=()=>{if(L){if(cs(),L.connectionState==="connected"){We(_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接");return}if(L.connectionState==="connecting"){We("实时通道连接中");return}if(L.connectionState==="failed"){We("实时通道连接失败");return}(L.connectionState==="disconnected"||L.connectionState==="closed")&&We("实时通道已断开")}},L.oniceconnectionstatechange=()=>{cs()}}async function Ho(o){if(L)try{ze=!0,await L.setLocalDescription(),ce("webrtc.description",o,{description:L.localDescription})}finally{ze=!1}}function Ko(o){B=o,o.bufferedAmountLowThreshold=ci/2,o.onopen=()=>{fr(o),We(_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"),cs()},o.onclose=()=>{B===o&&(B=null,as(),We("实时通道已关闭"))},o.onerror=l=>{console.error(l)},o.onmessage=l=>{zo(l.data)},o.readyState==="open"&&fr(o)}function it(){he.clear(),G&&$e.delete(G),B&&(B.onopen=null,B.onclose=null,B.onerror=null,B.onmessage=null,B.close(),B=null),L&&(L.onicecandidate=null,L.onconnectionstatechange=null,L.oniceconnectionstatechange=null,L.close(),L=null),G="",_e="p2p",ze=!1,be=!1,ue=!1,as()}async function dr(o){if(!ur())throw new Error("当前浏览器不支持 WebRTC");if(await rt(o,{initiate:!0}),(B==null?void 0:B.readyState)==="open")return B;const l=await To(Lo(),sf,"WebRTC 连接超时");if(!l||l.readyState!=="open")throw new Error("实时通道未建立");return l}function kn(o,l){if(!o||o.readyState!=="open")throw new Error("实时通道未就绪");o.send(JSON.stringify(l))}function zo(o){try{const l=JSON.parse(String(o||"{}"));if(l.type==="text"){Wo(l);return}if(l.type==="file-meta"){Vo(l);return}if(l.type==="file-chunk"){qo(l);return}l.type==="file-complete"&&Go(l)}catch(l){console.error(l)}}function Wo(o){var $;const l=o.sender_device_id||G,u={id:l,name:o.sender_name||(($=Mt(l))==null?void 0:$.name)||`设备 ${Rt(l)}`,type:Bt(o.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0);const m=p.value.find(E=>E.transferId===o.transfer_id);if(m&&m.kind==="text"){m.text=o.text||"",m.status="已接收",m.tone="success";return}p.value.push({id:Ue("incoming-text"),transferId:o.transfer_id,kind:"text",text:o.text||"",status:"已接收",tone:"success",copied:!1})}function Vo(o){var $;const l=o.sender_device_id||G,u={id:l,name:o.sender_name||(($=Mt(l))==null?void 0:$.name)||`设备 ${Rt(l)}`,type:Bt(o.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0),he.set(o.transfer_id,{name:bt(o.name,"file"),mimeType:o.mime_type||"application/octet-stream",sizeBytes:Number(o.size_bytes||0),receivedBytes:0,chunks:[]});let m=p.value.find(E=>E.transferId===o.transfer_id);m?(m.status="正在接收...",m.tone="primary",m.progress=0):(m={id:Ue("incoming-file"),transferId:o.transfer_id,kind:"file",name:bt(o.name,"file"),size:jt(Number(o.size_bytes||0)),sizeBytes:Number(o.size_bytes||0),status:"正在接收...",tone:"primary",progress:0,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(m))}function qo(o){const l=he.get(o.transfer_id);if(!l)return;const u=Io(String(o.chunk_base64||""));l.receivedBytes+=Number(o.chunk_size||u.byteLength||0),l.chunks.push(u);const m=p.value.find($=>$.transferId===o.transfer_id);if(m){const $=l.sizeBytes>0?l.receivedBytes/l.sizeBytes*100:0;m.progress=Math.max(1,Math.min(99,Math.round($))),m.status="正在接收...",m.tone="primary"}}function Go(o){const l=he.get(o.transfer_id);if(!l)return;const u=p.value.find(E=>E.transferId===o.transfer_id);if(!u){he.delete(o.transfer_id);return}const m=new Blob(l.chunks,{type:l.mimeType||"application/octet-stream"}),$=URL.createObjectURL(m);Lt(u,$,!0),u.progress=100,u.status="可保存",u.tone="success",he.delete(o.transfer_id)}function pr(o){return A.value.id.localeCompare(o)>0}function Mn(o,l="等待实时数据"){const u=Mt(o);return{id:o,deviceId:o,name:(u==null?void 0:u.name)||`设备 ${Rt(o)}`,type:Bt((u==null?void 0:u.type)||"desktop"),connectionType:l,network_group_key:(u==null?void 0:u.network_group_key)||""}}async function hr(o){const u=(o.payload||{}).description,m=o.device_id||"";if(!u||!m)return;M(Mn(m),!0);const $=await rt(m);if(!$)return;const E=pr(m),se=!ze&&($.signalingState==="stable"||ue),At=u.type==="offer"&&!se;be=!E&&At,!be&&(ue=u.type==="answer",await $.setRemoteDescription(u),ue=!1,u.type==="offer"&&(await $.setLocalDescription(),ce("webrtc.description",m,{description:$.localDescription})))}async function mr(o){const l=o.payload||{},u=o.device_id||"";if(!l.candidate||!u)return;(n.value!=="transfer"||h.value.deviceId!==u)&&M(Mn(u),!0);const m=await rt(u);if(m)try{await m.addIceCandidate(l.candidate)}catch($){be||console.error($)}}async function cs(){if(!(!L||L.connectionState!=="connected"))try{const o=await L.getStats();let l=null;if(o.forEach(E=>{E.type==="transport"&&E.selectedCandidatePairId&&(l=o.get(E.selectedCandidatePairId)||l)}),l||o.forEach(E=>{E.type==="candidate-pair"&&E.state==="succeeded"&&(E.nominated||E.selected)&&(l=E)}),!l)return;const u=o.get(l.localCandidateId),m=o.get(l.remoteCandidateId),$=(u==null?void 0:u.candidateType)==="relay"||(m==null?void 0:m.candidateType)==="relay";_e=$?"turn":"p2p",(B==null?void 0:B.readyState)==="open"&&We($?"TURN 中继已连接":"WebRTC 直连已连接")}catch(o){console.error(o)}}function gr(){return _e==="turn"?"turn":"p2p"}function vr(){if(!A.value.id)return;const o=localStorage.getItem(Cs)||"";o&&(yr(),de=new WebSocket(`${_.value}?deviceId=${encodeURIComponent(A.value.id)}&deviceToken=${encodeURIComponent(o)}`),de.addEventListener("message",l=>{Yo(l.data)}),de.addEventListener("close",()=>{de=null,Jo()}),de.addEventListener("error",()=>{de==null||de.close()}))}function yr(){if(st&&(window.clearTimeout(st),st=null),!de)return;const o=de;de=null,o.onclose=null,o.close()}function Jo(){st||!A.value.id||(st=window.setTimeout(()=>{st=null,vr()},tf))}function ce(o,l,u){!de||de.readyState!==WebSocket.OPEN||!l||de.send(JSON.stringify({type:o,target_device_id:l,payload:u}))}function Yo(o){try{const l=JSON.parse(o);if(l.type==="presence.update"){v();return}if(l.type==="webrtc.description"){hr(l);return}if(l.type==="webrtc.candidate"){mr(l);return}if(l.type==="transfer.created"){_r(l);return}if(l.type==="transfer.updated"){br(l);return}if(l.type==="transfer.file"){wr(l);return}l.type==="peer.session.closed"&&Xo(l)}catch(l){console.error(l)}}function Xo(o){const l=o.device_id||"";!l||h.value.deviceId!==l||(it(),D(),h.value={name:"--",type:"绛夊緟杩炴帴",baseType:"绛夊緟杩炴帴",deviceId:"",networkGroupKey:""},n.value="main")}function _r(o){var E;const l=o.payload||{},u=o.device_id||l.sender_device_id||"",m={id:u,name:l.sender_name||((E=Mt(u))==null?void 0:E.name)||`Device ${Rt(u)}`,type:Bt(l.sender_type||"desktop")};if(m.connectionType="等待实时数据",M(m,!0),!p.value.find(se=>se.transferId===l.transfer_id)){if(l.kind==="text"){p.value.push({id:Ue("incoming-text"),transferId:l.transfer_id,kind:"text",text:l.content||"",status:"已接收",tone:"success",copied:!1});return}p.value.push({id:Ue("incoming-file"),transferId:l.transfer_id,kind:"file",name:bt(l.name,"file"),size:jt(Number(l.size_bytes||0)),sizeBytes:Number(l.size_bytes||0),status:"接收中...",tone:"primary",progress:35,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}}function br(o){const l=o.payload||{},u=p.value.find(m=>m.transferId===l.transfer_id);if(u&&u.kind==="file"){if(l.final_status==="completed"){u.progress=100,u.status="已接收",u.tone="success",u.downloadUrl&&(u.status="可保存");return}l.final_status==="cancelled"&&(u.status="已取消",u.tone="danger")}}function wr(o){const l=o.payload||{};let u=p.value.find(m=>m.transferId===l.transfer_id);!u&&l.transfer_id&&(u={id:Ue("incoming-file"),transferId:l.transfer_id,kind:"file",name:bt(l.name,"file"),size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(u)),!(!u||u.kind!=="file")&&(Lt(u,l.download_url||l.data_url||"",!1),u.status="可保存",u.progress=100,u.tone="success")}function Mt(o){return r.value.find(l=>l.id===o)}function xr(o,l={}){return[{label:"在线设备",value:`${o.devices_online||0}`,tone:"blue"},{label:"待加入房间",value:`${o.rooms_waiting||0}`,tone:"cyan"},{label:"有效传输",value:`${o.transfers_total||0}`,tone:"default"},{label:"累计传输",value:`${o.transfers_cumulative||0}`,tone:"default"},{kind:"minio",label:"MinIO 剩余容量",value:us(l.remaining_bytes||0),tone:Number(l.usage_percent||0)>=85?"danger":Number(l.usage_percent||0)>=60?"cyan":"blue",percent:Math.max(0,100-Number(l.usage_percent||0)),detail:`已用 ${us(l.used_bytes||0)} / 总计 ${us(l.capacity_bytes||0)}`,kicker:`存档 ${l.object_count||0} 份`}]}function us(o){const l=Number(o||0);if(!l||l<=0)return"0 GB";const u=["B","KB","MB","GB","TB"],m=Math.min(Math.floor(Math.log(l)/Math.log(1024)),u.length-1),$=l/1024**m,E=m>=3?2:$>=10?1:2;return`${$.toFixed(E)} ${u[m]}`}function Zo(o){const l=o.final_status==="completed",u=o.final_status==="failed"||o.final_status==="cancelled";return{time:fs(o.created_at),peer:`${Rt(o.sender_device_id)} -> ${Rt(o.receiver_device_id)}`,type:o.kind==="text"?"文本消息":`文件 ${o.name}`,size:jt(Number(o.size_bytes||0)),status:l?`已完成 (${o.current_channel||"p2p"})`:u?`已结束 (${o.final_status})`:`进行中 (${o.final_status||"pending"})`,tone:l?"success":u?"danger":"primary"}}function Rt(o){return o?o.slice(0,8):"--"}function fs(o){if(!o)return"刚刚";const l=new Date(o),u=Date.now()-l.getTime();if(!Number.isFinite(u))return"刚刚";const m=Math.max(0,Math.floor(u/1e3));if(m<60)return`${m} 秒前`;const $=Math.floor(m/60);if($<60)return`${$} 分钟前`;const E=Math.floor($/60);return E<24?`${E} 小时前`:`${Math.floor(E/24)} 天前`}function Ue(o){return`${o}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function jt(o){if(!o||o<=0)return"0 B";const l=["B","KB","MB","GB","TB"],u=Math.min(Math.floor(Math.log(o)/Math.log(1024)),l.length-1),m=o/1024**u,$=m>=10||u===0?0:1;return`${m.toFixed($)} ${l[u]}`}v=async function(){return A.value.id?Nn.listCandidates(A.value.id).then(l=>{r.value=l.map(u=>({...u,description:`${Bt(u.type)} · 最近活跃 ${fs(u.last_seen_at)}`,icon:Do(u.type),connectionType:ar(u.network_group_key)?"局域网直连优先":"跨网络实时传输"})),s.value=r.value.length===0}).catch(l=>{s.value=!1,console.error(l)}):Promise.resolve()},P=function(l){const u=l.deviceId||l.id||"",m=l.connectionType||l.type||"点对点传输";b(),h.value.deviceId!==u&&(it(),D()),h.value={name:l.name,type:m,baseType:m,deviceId:u,networkGroupKey:l.network_group_key||""},a.value=!1,c.value="----",n.value="transfer",We("正在建立实时通道"),rt(u,{initiate:!0})},M=function(l,u=!1){const m=l.deviceId||l.id||"",$=l.connectionType||l.type||"点对点传输";h.value.deviceId===m&&n.value==="transfer"||(it(),u||D()),h.value={name:l.name,type:$,baseType:$,deviceId:m,networkGroupKey:l.network_group_key||""},a.value=!1,c.value="----",n.value="transfer",m&&(We("正在建立实时通道"),rt(m))},O=function(){h.value.deviceId&&ce("peer.session.closed",h.value.deviceId,{}),it(),D(),h.value={name:"--",type:"等待连接",baseType:"等待连接",deviceId:"",networkGroupKey:""},n.value="main"},W=async function(l){const u=l.trim();if(u){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}try{const m=await ge.create({kind:"text",name:"text-message",content:u,sender_device_id:A.value.id,receiver_device_id:h.value.deviceId});try{await rn(m,u)}catch($){console.warn("realtime text send failed, fallback to relay",$),await rr(m,u)}p.value.push({id:Ue("text"),transferId:m.id,kind:"text",text:u,status:"已发送",tone:"success",copied:!1})}catch(m){window.alert(`发送文本失败:${m.message}`)}}};function Ir(o,l){ce("transfer.file",h.value.deviceId,{transfer_id:o.transferId,name:o.name,download_url:l.download_path||l.download_url})}function Sr(o,l,{onProgress:u}={}){if(!(o!=null&&o.file))return Promise.reject(new Error("未找到待上传文件"));if(!(l!=null&&l.fallback_allowed))return Promise.reject(new Error("MinIO 存档未启用"));const m=l.id;if(Te.has(m))return Te.get(m);const $=(async()=>(await ge.presignFallback(m),ge.uploadFallback(m,o.file,E=>{typeof u=="function"&&u(E)})))().finally(()=>{Te.delete(m)});return Te.set(m,$),$}async function Cr(o,l,u){await ge.updateStatus(l.id,{current_channel:"minio",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:l.id,final_status:"completed",current_channel:"minio"}),Ir(o,u),o.progress=100,o.status="已上传到 MinIO,对方可直接领取",o.tone="success"}async function Qo(o,l){const u=$e.get(o);if(!(!(u!=null&&u.length)||!(l!=null&&l.remoteDescription))){$e.delete(o);for(const m of u)try{await l.addIceCandidate(m)}catch($){console.error($)}}}return me=async function(l,u){l.progress=Math.max(5,l.progress||0),l.status="正在切换到 MinIO...",l.tone="primary";try{ce("transfer.updated",h.value.deviceId,{transfer_id:l.transferId,final_status:"fallback_uploading",current_channel:"minio"});const m=await Sr(l,u,{onProgress:$=>{l.progress=Math.max(5,Math.min($,99))}});await Cr(l,u,m)}catch(m){l.pending=!0,l.status=`上传失败:${m.message}`,l.tone="danger"}},hr=async function(l){const m=(l.payload||{}).description,$=l.device_id||"";if(!m||!$)return;M(Mn($),!0);const E=await rt($);if(!E)return;const se=pr($),At=!ze&&(E.signalingState==="stable"||ue),el=m.type==="offer"&&!At;if(be=!se&&el,!be&&!(m.type==="answer"&&(E.signalingState!=="have-local-offer"||!E.localDescription))){try{ue=m.type==="answer",await E.setRemoteDescription(m),await Qo($,E)}catch(ds){console.error(ds)}finally{ue=!1}if(m.type==="offer")try{await E.setLocalDescription(),ce("webrtc.description",$,{description:E.localDescription})}catch(ds){console.error(ds)}}},mr=async function(l){const u=l.payload||{},m=l.device_id||"",$=u.candidate;if(!$||!m)return;(n.value!=="transfer"||h.value.deviceId!==m)&&M(Mn(m),!0);const E=await rt(m);if(E){if(!E.remoteDescription){const se=$e.get(m)||[];se.push($),$e.set(m,se);return}try{await E.addIceCandidate($)}catch(se){be||console.error(se)}}},J=async function(l){const u=p.value.find(m=>m.id===l);if(!(!u||u.kind!=="file"||!u.pending)){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}u.pending=!1,u.status="创建传输中...",u.tone="primary";try{const m=await ge.create({kind:"file",name:u.name,size_bytes:u.sizeBytes,sender_device_id:A.value.id,receiver_device_id:h.value.deviceId});u.transferId=m.id;const $=m.fallback_allowed?Sr(u,m).catch(E=>{throw console.warn("minio backup sync failed",E),E}):Promise.resolve(null);ce("transfer.created",h.value.deviceId,{transfer_id:m.id,kind:"file",name:u.name,size_bytes:u.sizeBytes,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type,receiver_device_id:h.value.deviceId,final_status:"connecting",current_channel:"p2p",transport_options:ls()});try{if(await ir(u,m),m.fallback_allowed){u.status="实时传输完成,正在同步云端备份...",u.tone="primary";try{const E=await $;E&&(Ir(u,E),u.status="已发送,2 小时内可离线领取")}catch(E){u.status=`实时传输成功,但 MinIO 备份失败:${E.message}`,u.tone="danger";return}u.tone="success"}}catch(E){console.warn("realtime file send failed, fallback to minio",E);try{const se=await $;if(se){await Cr(u,m,se);return}}catch(se){console.warn("minio backup sync failed after realtime failure",se)}await or(u,m)}}catch(m){u.pending=!0,u.status=`发送失败:${m.message}`,u.tone="danger"}}},_r=function(l){var se;const u=l.payload||{},m=l.device_id||u.sender_device_id||"",$={id:m,name:u.sender_name||((se=Mt(m))==null?void 0:se.name)||`设备 ${Rt(m)}`,type:Bt(u.sender_type||"desktop"),connectionType:"等待实时数据"};if(M($,!0),!p.value.find(At=>At.transferId===u.transfer_id)){if(u.kind==="text"){u.content&&p.value.push({id:Ue("incoming-text"),transferId:u.transfer_id,kind:"text",text:u.content||"",status:"已接收",tone:"success",copied:!1});return}p.value.push({id:Ue("incoming-file"),transferId:u.transfer_id,kind:"file",name:bt(u.name,"file"),size:jt(Number(u.size_bytes||0)),sizeBytes:Number(u.size_bytes||0),status:"等待接收...",tone:"primary",progress:5,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}},br=function(l){const u=l.payload||{},m=p.value.find($=>$.transferId===u.transfer_id);if(m&&m.kind==="file"){if(u.final_status==="completed"){m.progress=100,m.status=m.downloadUrl?"可保存":"传输完成",m.tone="success";return}if(u.final_status==="cancelled"){m.status="已取消",m.tone="danger";return}u.final_status==="fallback_uploading"&&(m.status="发送端正在上传回退文件...",m.tone="primary")}},wr=function(l){const u=l.payload||{};let m=p.value.find($=>$.transferId===u.transfer_id);!m&&u.transfer_id&&(m={id:Ue("incoming-file"),transferId:u.transfer_id,kind:"file",name:bt(u.name,"file"),size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(m)),!(!m||m.kind!=="file")&&(Lt(m,u.download_url||u.data_url||"",!1),m.status="可保存",m.progress=100,m.tone="success")},(o,l)=>(j(),V("div",null,[y("div",Yu,[q(Oc,{theme:t.value,onToggleTheme:Cn},null,8,["theme"]),n.value==="main"?(j(),V("div",Xu,[q(hu,{devices:r.value,"is-scanning":s.value,"local-device-name":A.value.name,onSelectDevice:P},null,8,["devices","is-scanning","local-device-name"]),q(Tu,{"generated-code":c.value,"is-waiting":a.value,"pending-downloads":f.value,"room-code-input":i.value,onCancelRoom:R,onCreateRoom:x,onJoinRoom:k,onUpdateRoomCode:d},null,8,["generated-code","is-waiting","pending-downloads","room-code-input"])])):Be("",!0),n.value==="transfer"?(j(),mt(Lu,{key:1,"connection-type":h.value.type,"has-pending-items":Tt.value,items:p.value,"network-hint":Ut.value,"peer-name":h.value.name,onClose:O,onCopyItem:Fe,onFilesSelected:ee,onRemoveItem:Ne,onSendAllPending:we,onSendText:W,onStartUpload:J},null,8,["connection-type","has-pending-items","items","network-hint","peer-name"])):Be("",!0),n.value==="admin"?(j(),mt(ru,{key:2,"file-limit":T.value,"minio-capacity":S.value,records:N.value,stats:U.value,onExit:ko,onSaveConfig:Mo,"onUpdate:fileLimit":l[0]||(l[0]=u=>T.value=u),"onUpdate:minioCapacity":l[1]||(l[1]=u=>S.value=u)},null,8,["file-limit","minio-capacity","records","stats"])):Be("",!0)]),q(Rc,{onRequestAdmin:$o})]))}};Tc(of).mount("#app"); diff --git a/frontend/dist/assets/index-DPzeYqvr.js b/frontend/dist/assets/index-DPzeYqvr.js deleted file mode 100644 index 39ef628..0000000 --- a/frontend/dist/assets/index-DPzeYqvr.js +++ /dev/null @@ -1,17 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&s(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/** -* @vue/shared v3.5.30 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Ns(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const re={},Vt=[],tt=()=>{},ci=()=>!1,Jn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fs=e=>e.startsWith("onUpdate:"),Ce=Object.assign,Us=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Zo=Object.prototype.hasOwnProperty,Z=(e,t)=>Zo.call(e,t),H=Array.isArray,qt=e=>bn(e)==="[object Map]",ui=e=>bn(e)==="[object Set]",Cr=e=>bn(e)==="[object Date]",K=e=>typeof e=="function",ae=e=>typeof e=="string",qe=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",fi=e=>(ne(e)||K(e))&&K(e.then)&&K(e.catch),di=Object.prototype.toString,bn=e=>di.call(e),Qo=e=>bn(e).slice(8,-1),pi=e=>bn(e)==="[object Object]",Bs=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,an=Ns(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Yn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},el=/-\w/g,Ee=Yn(e=>e.replace(el,t=>t.slice(1).toUpperCase())),tl=/\B([A-Z])/g,It=Yn(e=>e.replace(tl,"-$1").toLowerCase()),Xn=Yn(e=>e.charAt(0).toUpperCase()+e.slice(1)),ds=Yn(e=>e?`on${Xn(e)}`:""),et=(e,t)=>!Object.is(e,t),Bn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Ls=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Tr;const Zn=()=>Tr||(Tr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Be(e){if(H(e)){const t={};for(let n=0;n{if(n){const s=n.split(sl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function xt(e){let t="";if(ae(e))t=e;else if(H(e))for(let n=0;n!!(e&&e.__v_isRef===!0),te=e=>ae(e)?e:e==null?"":H(e)||ne(e)&&(e.toString===di||!K(e.toString))?gi(e)?te(e.value):JSON.stringify(e,vi,2):String(e),vi=(e,t)=>gi(t)?vi(e,t.value):qt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[ps(s,i)+" =>"]=r,n),{})}:ui(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ps(n))}:qe(t)?ps(t):ne(t)&&!H(t)&&!pi(t)?String(t):t,ps=(e,t="")=>{var n;return qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.30 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Oe;class cl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Oe=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(un){let t=un;for(un=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;cn;){let t=cn;for(cn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function wi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function xi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),zs(s),fl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Cs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ii(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ii(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===mn)||(e.globalVersion=mn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Cs(e))))return;e.flags|=2;const t=e.dep,n=ie,s=Ve;ie=e,Ve=!0;try{wi(e);const r=e.fn(e._value);(t.version===0||et(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ie=n,Ve=s,xi(e),e.flags&=-3}}function zs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)zs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function fl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ve=!0;const Si=[];function ft(){Si.push(Ve),Ve=!1}function dt(){const e=Si.pop();Ve=e===void 0?!0:e}function kr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ie;ie=void 0;try{t()}finally{ie=n}}}let mn=0;class dl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ws{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(!ie||!Ve||ie===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ie)n=this.activeLink=new dl(ie,this),ie.deps?(n.prevDep=ie.depsTail,ie.depsTail.nextDep=n,ie.depsTail=n):ie.deps=ie.depsTail=n,Ci(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ie.depsTail,n.nextDep=void 0,ie.depsTail.nextDep=n,ie.depsTail=n,ie.deps===n&&(ie.deps=s)}return n}trigger(t){this.version++,mn++,this.notify(t)}notify(t){Hs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ks()}}}function Ci(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ci(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Ts=new WeakMap,Pt=Symbol(""),ks=Symbol(""),gn=Symbol("");function xe(e,t,n){if(Ve&&ie){let s=Ts.get(e);s||Ts.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Ws),r.map=s,r.key=n),r.track()}}function ct(e,t,n,s,r,i){const l=Ts.get(e);if(!l){mn++;return}const c=f=>{f&&f.trigger()};if(Hs(),t==="clear")l.forEach(c);else{const f=H(e),h=f&&Bs(n);if(f&&n==="length"){const p=Number(s);l.forEach((_,T)=>{(T==="length"||T===gn||!qe(T)&&T>=p)&&c(_)})}else switch((n!==void 0||l.has(void 0))&&c(l.get(n)),h&&c(l.get(gn)),t){case"add":f?h&&c(l.get("length")):(c(l.get(Pt)),qt(e)&&c(l.get(ks)));break;case"delete":f||(c(l.get(Pt)),qt(e)&&c(l.get(ks)));break;case"set":qt(e)&&c(l.get(Pt));break}}Ks()}function jt(e){const t=X(e);return t===e?t:(xe(t,"iterate",gn),je(e)?t:t.map(Ge))}function Qn(e){return xe(e=X(e),"iterate",gn),e}function Ze(e,t){return pt(e)?Zt(Dt(e)?Ge(t):t):Ge(t)}const pl={__proto__:null,[Symbol.iterator](){return ms(this,Symbol.iterator,e=>Ze(this,e))},concat(...e){return jt(this).concat(...e.map(t=>H(t)?jt(t):t))},entries(){return ms(this,"entries",e=>(e[1]=Ze(this,e[1]),e))},every(e,t){return ot(this,"every",e,t,void 0,arguments)},filter(e,t){return ot(this,"filter",e,t,n=>n.map(s=>Ze(this,s)),arguments)},find(e,t){return ot(this,"find",e,t,n=>Ze(this,n),arguments)},findIndex(e,t){return ot(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ot(this,"findLast",e,t,n=>Ze(this,n),arguments)},findLastIndex(e,t){return ot(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ot(this,"forEach",e,t,void 0,arguments)},includes(...e){return gs(this,"includes",e)},indexOf(...e){return gs(this,"indexOf",e)},join(e){return jt(this).join(e)},lastIndexOf(...e){return gs(this,"lastIndexOf",e)},map(e,t){return ot(this,"map",e,t,void 0,arguments)},pop(){return rn(this,"pop")},push(...e){return rn(this,"push",e)},reduce(e,...t){return $r(this,"reduce",e,t)},reduceRight(e,...t){return $r(this,"reduceRight",e,t)},shift(){return rn(this,"shift")},some(e,t){return ot(this,"some",e,t,void 0,arguments)},splice(...e){return rn(this,"splice",e)},toReversed(){return jt(this).toReversed()},toSorted(e){return jt(this).toSorted(e)},toSpliced(...e){return jt(this).toSpliced(...e)},unshift(...e){return rn(this,"unshift",e)},values(){return ms(this,"values",e=>Ze(this,e))}};function ms(e,t,n){const s=Qn(e),r=s[t]();return s!==e&&!je(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const hl=Array.prototype;function ot(e,t,n,s,r,i){const l=Qn(e),c=l!==e&&!je(e),f=l[t];if(f!==hl[t]){const _=f.apply(e,i);return c?Ge(_):_}let h=n;l!==e&&(c?h=function(_,T){return n.call(this,Ze(e,_),T,e)}:n.length>2&&(h=function(_,T){return n.call(this,_,T,e)}));const p=f.call(l,h,s);return c&&r?r(p):p}function $r(e,t,n,s){const r=Qn(e),i=r!==e&&!je(e);let l=n,c=!1;r!==e&&(i?(c=s.length===0,l=function(h,p,_){return c&&(c=!1,h=Ze(e,h)),n.call(this,h,Ze(e,p),_,e)}):n.length>3&&(l=function(h,p,_){return n.call(this,h,p,_,e)}));const f=r[t](l,...s);return c?Ze(e,f):f}function gs(e,t,n){const s=X(e);xe(s,"iterate",gn);const r=s[t](...n);return(r===-1||r===!1)&&Js(n[0])?(n[0]=X(n[0]),s[t](...n)):r}function rn(e,t,n=[]){ft(),Hs();const s=X(e)[t].apply(e,n);return Ks(),dt(),s}const ml=Ns("__proto__,__v_isRef,__isVue"),Ti=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(qe));function gl(e){qe(e)||(e=String(e));const t=X(this);return xe(t,"has",e),t.hasOwnProperty(e)}class ki{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Tl:Ei:i?Ri:Mi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const l=H(t);if(!r){let f;if(l&&(f=pl[n]))return f;if(n==="hasOwnProperty")return gl}const c=Reflect.get(t,n,Se(t)?t:s);if((qe(n)?Ti.has(n):ml(n))||(r||xe(t,"get",n),i))return c;if(Se(c)){const f=l&&Bs(n)?c:c.value;return r&&ne(f)?Ms(f):f}return ne(c)?r?Ms(c):qs(c):c}}class $i extends ki{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const l=H(t)&&Bs(n);if(!this._isShallow){const h=pt(i);if(!je(s)&&!pt(s)&&(i=X(i),s=X(s)),!l&&Se(i)&&!Se(s))return h||(i.value=s),!0}const c=l?Number(n)e,Mn=e=>Reflect.getPrototypeOf(e);function wl(e,t,n){return function(...s){const r=this.__v_raw,i=X(r),l=qt(i),c=e==="entries"||e===Symbol.iterator&&l,f=e==="keys"&&l,h=r[e](...s),p=n?$s:t?Zt:Ge;return!t&&xe(i,"iterate",f?ks:Pt),Ce(Object.create(h),{next(){const{value:_,done:T}=h.next();return T?{value:_,done:T}:{value:c?[p(_[0]),p(_[1])]:p(_),done:T}}})}}function Rn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function xl(e,t){const n={get(r){const i=this.__v_raw,l=X(i),c=X(r);e||(et(r,c)&&xe(l,"get",r),xe(l,"get",c));const{has:f}=Mn(l),h=t?$s:e?Zt:Ge;if(f.call(l,r))return h(i.get(r));if(f.call(l,c))return h(i.get(c));i!==l&&i.get(r)},get size(){const r=this.__v_raw;return!e&&xe(X(r),"iterate",Pt),r.size},has(r){const i=this.__v_raw,l=X(i),c=X(r);return e||(et(r,c)&&xe(l,"has",r),xe(l,"has",c)),r===c?i.has(r):i.has(r)||i.has(c)},forEach(r,i){const l=this,c=l.__v_raw,f=X(c),h=t?$s:e?Zt:Ge;return!e&&xe(f,"iterate",Pt),c.forEach((p,_)=>r.call(i,h(p),h(_),l))}};return Ce(n,e?{add:Rn("add"),set:Rn("set"),delete:Rn("delete"),clear:Rn("clear")}:{add(r){const i=X(this),l=Mn(i),c=X(r),f=!t&&!je(r)&&!pt(r)?c:r;return l.has.call(i,f)||et(r,f)&&l.has.call(i,r)||et(c,f)&&l.has.call(i,c)||(i.add(f),ct(i,"add",f,f)),this},set(r,i){!t&&!je(i)&&!pt(i)&&(i=X(i));const l=X(this),{has:c,get:f}=Mn(l);let h=c.call(l,r);h||(r=X(r),h=c.call(l,r));const p=f.call(l,r);return l.set(r,i),h?et(i,p)&&ct(l,"set",r,i):ct(l,"add",r,i),this},delete(r){const i=X(this),{has:l,get:c}=Mn(i);let f=l.call(i,r);f||(r=X(r),f=l.call(i,r)),c&&c.call(i,r);const h=i.delete(r);return f&&ct(i,"delete",r,void 0),h},clear(){const r=X(this),i=r.size!==0,l=r.clear();return i&&ct(r,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=wl(r,e,t)}),n}function Vs(e,t){const n=xl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Il={get:Vs(!1,!1)},Sl={get:Vs(!1,!0)},Cl={get:Vs(!0,!1)};const Mi=new WeakMap,Ri=new WeakMap,Ei=new WeakMap,Tl=new WeakMap;function kl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function $l(e){return e.__v_skip||!Object.isExtensible(e)?0:kl(Qo(e))}function qs(e){return pt(e)?e:Gs(e,!1,yl,Il,Mi)}function Ml(e){return Gs(e,!1,bl,Sl,Ri)}function Ms(e){return Gs(e,!0,_l,Cl,Ei)}function Gs(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=$l(e);if(i===0)return e;const l=r.get(e);if(l)return l;const c=new Proxy(e,i===2?s:n);return r.set(e,c),c}function Dt(e){return pt(e)?Dt(e.__v_raw):!!(e&&e.__v_isReactive)}function pt(e){return!!(e&&e.__v_isReadonly)}function je(e){return!!(e&&e.__v_isShallow)}function Js(e){return e?!!e.__v_raw:!1}function X(e){const t=e&&e.__v_raw;return t?X(t):e}function Rl(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&hi(e,"__v_skip",!0),e}const Ge=e=>ne(e)?qs(e):e,Zt=e=>ne(e)?Ms(e):e;function Se(e){return e?e.__v_isRef===!0:!1}function oe(e){return El(e,!1)}function El(e,t){return Se(e)?e:new Al(e,t)}class Al{constructor(t,n){this.dep=new Ws,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:X(t),this._value=n?t:Ge(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||je(t)||pt(t);t=s?t:X(t),et(t,n)&&(this._rawValue=t,this._value=s?t:Ge(t),this.dep.trigger())}}function Ol(e){return Se(e)?e.value:e}const Pl={get:(e,t,n)=>t==="__v_raw"?e:Ol(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Se(r)&&!Se(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Ai(e){return Dt(e)?e:new Proxy(e,Pl)}class Dl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ws(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=mn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ie!==this)return bi(this,!0),!0}get value(){const t=this.dep.track();return Ii(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Nl(e,t,n=!1){let s,r;return K(e)?s=e:(s=e.get,r=e.set),new Dl(s,r,n)}const En={},Kn=new WeakMap;let Ot;function Fl(e,t=!1,n=Ot){if(n){let s=Kn.get(n);s||Kn.set(n,s=[]),s.push(e)}}function Ul(e,t,n=re){const{immediate:s,deep:r,once:i,scheduler:l,augmentJob:c,call:f}=n,h=F=>r?F:je(F)||r===!1||r===0?ut(F,1):ut(F);let p,_,T,S,U=!1,N=!1;if(Se(e)?(_=()=>e.value,U=je(e)):Dt(e)?(_=()=>h(e),U=!0):H(e)?(N=!0,U=e.some(F=>Dt(F)||je(F)),_=()=>e.map(F=>{if(Se(F))return F.value;if(Dt(F))return h(F);if(K(F))return f?f(F,2):F()})):K(e)?t?_=f?()=>f(e,2):e:_=()=>{if(T){ft();try{T()}finally{dt()}}const F=Ot;Ot=p;try{return f?f(e,3,[S]):e(S)}finally{Ot=F}}:_=tt,t&&r){const F=_,le=r===!0?1/0:r;_=()=>ut(F(),le)}const Y=ul(),z=()=>{p.stop(),Y&&Y.active&&Us(Y.effects,p)};if(i&&t){const F=t;t=(...le)=>{F(...le),z()}}let E=N?new Array(e.length).fill(En):En;const Q=F=>{if(!(!(p.flags&1)||!p.dirty&&!F))if(t){const le=p.run();if(r||U||(N?le.some((he,Te)=>et(he,E[Te])):et(le,E))){T&&T();const he=Ot;Ot=p;try{const Te=[le,E===En?void 0:N&&E[0]===En?[]:E,S];E=le,f?f(t,3,Te):t(...Te)}finally{Ot=he}}}else p.run()};return c&&c(Q),p=new yi(_),p.scheduler=l?()=>l(Q,!1):Q,S=F=>Fl(F,!1,p),T=p.onStop=()=>{const F=Kn.get(p);if(F){if(f)f(F,4);else for(const le of F)le();Kn.delete(p)}},t?s?Q(!0):E=p.run():l?l(Q.bind(null,!0),!0):p.run(),z.pause=p.pause.bind(p),z.resume=p.resume.bind(p),z.stop=z,z}function ut(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Se(e))ut(e.value,t,n);else if(H(e))for(let s=0;s{ut(s,t,n)});else if(pi(e)){for(const s in e)ut(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&ut(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.30 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function wn(e,t,n,s){try{return s?e(...s):e()}catch(r){es(r,t,n)}}function nt(e,t,n,s){if(K(e)){const r=wn(e,t,n,s);return r&&fi(r)&&r.catch(i=>{es(i,t,n)}),r}if(H(e)){const r=[];for(let i=0;i>>1,r=Re[s],i=vn(r);i=vn(n)?Re.push(e):Re.splice(Ll(t),0,e),e.flags|=1,Di()}}function Di(){zn||(zn=Oi.then(Fi))}function jl(e){H(e)?Gt.push(...e):bt&&e.id===-1?bt.splice(Kt+1,0,e):e.flags&1||(Gt.push(e),e.flags|=1),Di()}function Mr(e,t,n=Xe+1){for(;nvn(n)-vn(s));if(Gt.length=0,bt){bt.push(...t);return}for(bt=t,Kt=0;Kte.id==null?e.flags&2?-1:1/0:e.id;function Fi(e){try{for(Xe=0;Xe{s._d&&jr(-1);const i=Wn(t);let l;try{l=e(...r)}finally{Wn(i),s._d&&jr(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function Hl(e,t){if(ye===null)return e;const n=rs(ye),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&K(t)?t.call(s&&s.proxy):t}}const zl=Symbol.for("v-scx"),Wl=()=>Ln(zl);function Nt(e,t,n){return Bi(e,t,n)}function Bi(e,t,n=re){const{immediate:s,deep:r,flush:i,once:l}=n,c=Ce({},n),f=t&&s||!t&&i!=="post";let h;if(_n){if(i==="sync"){const S=Wl();h=S.__watcherHandles||(S.__watcherHandles=[])}else if(!f){const S=()=>{};return S.stop=tt,S.resume=tt,S.pause=tt,S}}const p=Ie;c.call=(S,U,N)=>nt(S,p,U,N);let _=!1;i==="post"?c.scheduler=S=>{Ae(S,p&&p.suspense)}:i!=="sync"&&(_=!0,c.scheduler=(S,U)=>{U?S():Ys(S)}),c.augmentJob=S=>{t&&(S.flags|=4),_&&(S.flags|=2,p&&(S.id=p.uid,S.i=p))};const T=Ul(e,t,c);return _n&&(h?h.push(T):f&&T()),T}function Vl(e,t,n){const s=this.proxy,r=ae(e)?e.includes(".")?Li(s,e):()=>s[e]:e.bind(s,s);let i;K(t)?i=t:(i=t.handler,n=t);const l=xn(this),c=Bi(r,i.bind(s),n);return l(),c}function Li(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Jl=Symbol("_leaveCb");function Xs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Xs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ji(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Rr(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const Vn=new WeakMap;function fn(e,t,n,s,r=!1){if(H(e)){e.forEach((N,Y)=>fn(N,t&&(H(t)?t[Y]:t),n,s,r));return}if(Yt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&fn(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?rs(s.component):s.el,l=r?null:i,{i:c,r:f}=e,h=t&&t.r,p=c.refs===re?c.refs={}:c.refs,_=c.setupState,T=X(_),S=_===re?ci:N=>Rr(p,N)?!1:Z(T,N),U=(N,Y)=>!(Y&&Rr(p,Y));if(h!=null&&h!==f){if(Er(t),ae(h))p[h]=null,S(h)&&(_[h]=null);else if(Se(h)){const N=t;U(h,N.k)&&(h.value=null),N.k&&(p[N.k]=null)}}if(K(f))wn(f,c,12,[l,p]);else{const N=ae(f),Y=Se(f);if(N||Y){const z=()=>{if(e.f){const E=N?S(f)?_[f]:p[f]:U()||!e.k?f.value:p[e.k];if(r)H(E)&&Us(E,i);else if(H(E))E.includes(i)||E.push(i);else if(N)p[f]=[i],S(f)&&(_[f]=p[f]);else{const Q=[i];U(f,e.k)&&(f.value=Q),e.k&&(p[e.k]=Q)}}else N?(p[f]=l,S(f)&&(_[f]=l)):Y&&(U(f,e.k)&&(f.value=l),e.k&&(p[e.k]=l))};if(l){const E=()=>{z(),Vn.delete(e)};E.id=-1,Vn.set(e,E),Ae(E,n)}else Er(e),z()}}}function Er(e){const t=Vn.get(e);t&&(t.flags|=8,Vn.delete(e))}Zn().requestIdleCallback;Zn().cancelIdleCallback;const Yt=e=>!!e.type.__asyncLoader,Hi=e=>e.type.__isKeepAlive;function Yl(e,t){Ki(e,"a",t)}function Xl(e,t){Ki(e,"da",t)}function Ki(e,t,n=Ie){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ts(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Hi(r.parent.vnode)&&Zl(s,t,n,r),r=r.parent}}function Zl(e,t,n,s){const r=ts(t,e,s,!0);Wi(()=>{Us(s[t],r)},n)}function ts(e,t,n=Ie,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{ft();const c=xn(n),f=nt(t,n,e,l);return c(),dt(),f});return s?r.unshift(i):r.push(i),i}}const gt=e=>(t,n=Ie)=>{(!_n||e==="sp")&&ts(e,(...s)=>t(...s),n)},Ql=gt("bm"),zi=gt("m"),ea=gt("bu"),ta=gt("u"),Zs=gt("bum"),Wi=gt("um"),na=gt("sp"),sa=gt("rtg"),ra=gt("rtc");function ia(e,t=Ie){ts("ec",e,t)}const oa="components",Vi=Symbol.for("v-ndc");function la(e){return ae(e)?aa(oa,e,!1)||e:e||Vi}function aa(e,t,n=!0,s=!1){const r=ye||Ie;if(r){const i=r.type;{const c=qa(i,!1);if(c&&(c===t||c===Ee(t)||c===Xn(Ee(t))))return i}const l=Ar(r[e]||i[e],t)||Ar(r.appContext[e],t);return!l&&s?i:l}}function Ar(e,t){return e&&(e[t]||e[Ee(t)]||e[Xn(Ee(t))])}function Qt(e,t,n,s){let r;const i=n,l=H(e);if(l||ae(e)){const c=l&&Dt(e);let f=!1,h=!1;c&&(f=!je(e),h=pt(e),e=Qn(e)),r=new Array(e.length);for(let p=0,_=e.length;p<_;p++)r[p]=t(f?h?Zt(Ge(e[p])):Ge(e[p]):e[p],p,void 0,i)}else if(typeof e=="number"){r=new Array(e);for(let c=0;ct(c,f,void 0,i));else{const c=Object.keys(e);r=new Array(c.length);for(let f=0,h=c.length;f0;return j(),mt(fe,null,[q("slot",n,s)],h?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),j();const l=i&&qi(i(n)),c=n.key||l&&l.key,f=mt(fe,{key:(c&&!qe(c)?c:`_${t}`)+(!l&&s?"_fb":"")},l||[],l&&e._===1?64:-2);return f.scopeId&&(f.slotScopeIds=[f.scopeId+"-s"]),i&&i._c&&(i._d=!0),f}function qi(e){return e.some(t=>tr(t)?!(t.type===ht||t.type===fe&&!qi(t.children)):!0)?e:null}const Rs=e=>e?mo(e)?rs(e):Rs(e.parent):null,dn=Ce(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=>Rs(e.parent),$root:e=>Rs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ji(e),$forceUpdate:e=>e.f||(e.f=()=>{Ys(e.update)}),$nextTick:e=>e.n||(e.n=Pi.bind(e.proxy)),$watch:e=>Vl.bind(e)}),vs=(e,t)=>e!==re&&!e.__isScriptSetup&&Z(e,t),ua={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:l,type:c,appContext:f}=e;if(t[0]!=="$"){const T=l[t];if(T!==void 0)switch(T){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(vs(s,t))return l[t]=1,s[t];if(r!==re&&Z(r,t))return l[t]=2,r[t];if(Z(i,t))return l[t]=3,i[t];if(n!==re&&Z(n,t))return l[t]=4,n[t];Es&&(l[t]=0)}}const h=dn[t];let p,_;if(h)return t==="$attrs"&&xe(e.attrs,"get",""),h(e);if((p=c.__cssModules)&&(p=p[t]))return p;if(n!==re&&Z(n,t))return l[t]=4,n[t];if(_=f.config.globalProperties,Z(_,t))return _[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return vs(r,t)?(r[t]=n,!0):s!==re&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:l}},c){let f;return!!(n[c]||e!==re&&c[0]!=="$"&&Z(e,c)||vs(t,c)||Z(i,c)||Z(s,c)||Z(dn,c)||Z(r.config.globalProperties,c)||(f=l.__cssModules)&&f[c])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Or(e){return H(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Es=!0;function fa(e){const t=Ji(e),n=e.proxy,s=e.ctx;Es=!1,t.beforeCreate&&Pr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:l,watch:c,provide:f,inject:h,created:p,beforeMount:_,mounted:T,beforeUpdate:S,updated:U,activated:N,deactivated:Y,beforeDestroy:z,beforeUnmount:E,destroyed:Q,unmounted:F,render:le,renderTracked:he,renderTriggered:Te,errorCaptured:ke,serverPrefetch:vt,expose:He,inheritAttrs:Je,components:Ke,directives:yt,filters:de}=t;if(h&&da(h,s,null),l)for(const L in l){const G=l[L];K(G)&&(s[L]=G.bind(n))}if(r){const L=r.call(n,n);ne(L)&&(e.data=qs(L))}if(Es=!0,i)for(const L in i){const G=i[L],_e=K(G)?G.bind(n,n):K(G.get)?G.get.bind(n,n):tt,ze=!K(G)&&K(G.set)?G.set.bind(n):tt,be=wt({get:_e,set:ze});Object.defineProperty(s,L,{enumerable:!0,configurable:!0,get:()=>be.value,set:ue=>be.value=ue})}if(c)for(const L in c)Gi(c[L],s,n,L);if(f){const L=K(f)?f.call(n):f;Reflect.ownKeys(L).forEach(G=>{Kl(G,L[G])})}p&&Pr(p,e,"c");function B(L,G){H(G)?G.forEach(_e=>L(_e.bind(n))):G&&L(G.bind(n))}if(B(Ql,_),B(zi,T),B(ea,S),B(ta,U),B(Yl,N),B(Xl,Y),B(ia,ke),B(ra,he),B(sa,Te),B(Zs,E),B(Wi,F),B(na,vt),H(He))if(He.length){const L=e.exposed||(e.exposed={});He.forEach(G=>{Object.defineProperty(L,G,{get:()=>n[G],set:_e=>n[G]=_e,enumerable:!0})})}else e.exposed||(e.exposed={});le&&e.render===tt&&(e.render=le),Je!=null&&(e.inheritAttrs=Je),Ke&&(e.components=Ke),yt&&(e.directives=yt),vt&&ji(e)}function da(e,t,n=tt){H(e)&&(e=As(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Ln(r.from||s,r.default,!0):i=Ln(r.from||s):i=Ln(r),Se(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[s]=i}}function Pr(e,t,n){nt(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Gi(e,t,n,s){let r=s.includes(".")?Li(n,s):()=>n[s];if(ae(e)){const i=t[e];K(i)&&Nt(r,i)}else if(K(e))Nt(r,e.bind(n));else if(ne(e))if(H(e))e.forEach(i=>Gi(i,t,n,s));else{const i=K(e.handler)?e.handler.bind(n):t[e.handler];K(i)&&Nt(r,i,e)}}function Ji(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:l}}=e.appContext,c=i.get(t);let f;return c?f=c:!r.length&&!n&&!s?f=t:(f={},r.length&&r.forEach(h=>qn(f,h,l,!0)),qn(f,t,l)),ne(t)&&i.set(t,f),f}function qn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&qn(e,i,n,!0),r&&r.forEach(l=>qn(e,l,n,!0));for(const l in t)if(!(s&&l==="expose")){const c=pa[l]||n&&n[l];e[l]=c?c(e[l],t[l]):t[l]}return e}const pa={data:Dr,props:Nr,emits:Nr,methods:ln,computed:ln,beforeCreate:Me,created:Me,beforeMount:Me,mounted:Me,beforeUpdate:Me,updated:Me,beforeDestroy:Me,beforeUnmount:Me,destroyed:Me,unmounted:Me,activated:Me,deactivated:Me,errorCaptured:Me,serverPrefetch:Me,components:ln,directives:ln,watch:ma,provide:Dr,inject:ha};function Dr(e,t){return t?e?function(){return Ce(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function ha(e,t){return ln(As(e),As(t))}function As(e){if(H(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ee(t)}Modifiers`]||e[`${It(t)}Modifiers`];function _a(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||re;let r=n;const i=t.startsWith("update:"),l=i&&ya(s,t.slice(7));l&&(l.trim&&(r=n.map(p=>ae(p)?p.trim():p)),l.number&&(r=n.map(Ls)));let c,f=s[c=ds(t)]||s[c=ds(Ee(t))];!f&&i&&(f=s[c=ds(It(t))]),f&&nt(f,e,6,r);const h=s[c+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,nt(h,e,6,r)}}const ba=new WeakMap;function Xi(e,t,n=!1){const s=n?ba:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let l={},c=!1;if(!K(e)){const f=h=>{const p=Xi(h,t,!0);p&&(c=!0,Ce(l,p))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!i&&!c?(ne(e)&&s.set(e,null),null):(H(i)?i.forEach(f=>l[f]=null):Ce(l,i),ne(e)&&s.set(e,l),l)}function ns(e,t){return!e||!Jn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,It(t))||Z(e,t))}function Fr(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:l,attrs:c,emit:f,render:h,renderCache:p,props:_,data:T,setupState:S,ctx:U,inheritAttrs:N}=e,Y=Wn(e);let z,E;try{if(n.shapeFlag&4){const F=r||s,le=F;z=Qe(h.call(le,F,p,_,S,T,U)),E=c}else{const F=t;z=Qe(F.length>1?F(_,{attrs:c,slots:l,emit:f}):F(_,null)),E=t.props?c:wa(c)}}catch(F){pn.length=0,es(F,e,1),z=q(ht)}let Q=z;if(E&&N!==!1){const F=Object.keys(E),{shapeFlag:le}=Q;F.length&&le&7&&(i&&F.some(Fs)&&(E=xa(E,i)),Q=en(Q,E,!1,!0))}return n.dirs&&(Q=en(Q,null,!1,!0),Q.dirs=Q.dirs?Q.dirs.concat(n.dirs):n.dirs),n.transition&&Xs(Q,n.transition),z=Q,Wn(Y),z}const wa=e=>{let t;for(const n in e)(n==="class"||n==="style"||Jn(n))&&((t||(t={}))[n]=e[n]);return t},xa=(e,t)=>{const n={};for(const s in e)(!Fs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ia(e,t,n){const{props:s,children:r,component:i}=e,{props:l,children:c,patchFlag:f}=t,h=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Ur(s,l,h):!!l;if(f&8){const p=t.dynamicProps;for(let _=0;_Object.create(Qi),to=e=>Object.getPrototypeOf(e)===Qi;function Ca(e,t,n,s=!1){const r={},i=eo();e.propsDefaults=Object.create(null),no(e,t,r,i);for(const l in e.propsOptions[0])l in r||(r[l]=void 0);n?e.props=s?r:Ml(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Ta(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:l}}=e,c=X(r),[f]=e.propsOptions;let h=!1;if((s||l>0)&&!(l&16)){if(l&8){const p=e.vnode.dynamicProps;for(let _=0;_{f=!0;const[T,S]=so(_,t,!0);Ce(l,T),S&&c.push(...S)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!i&&!f)return ne(e)&&s.set(e,Vt),Vt;if(H(i))for(let p=0;pe==="_"||e==="_ctx"||e==="$stable",er=e=>H(e)?e.map(Qe):[Qe(e)],$a=(e,t,n)=>{if(t._n)return t;const s=Jt((...r)=>er(t(...r)),n);return s._c=!1,s},ro=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Qs(r))continue;const i=e[r];if(K(i))t[r]=$a(r,i,s);else if(i!=null){const l=er(i);t[r]=()=>l}}},io=(e,t)=>{const n=er(t);e.slots.default=()=>n},oo=(e,t,n)=>{for(const s in t)(n||!Qs(s))&&(e[s]=t[s])},Ma=(e,t,n)=>{const s=e.slots=eo();if(e.vnode.shapeFlag&32){const r=t._;r?(oo(s,t,n),n&&hi(s,"_",r,!0)):ro(t,s)}else t&&io(e,t)},Ra=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,l=re;if(s.shapeFlag&32){const c=t._;c?n&&c===1?i=!1:oo(r,t,n):(i=!t.$stable,ro(t,r)),l=t}else t&&(io(e,t),l={default:1});if(i)for(const c in r)!Qs(c)&&l[c]==null&&delete r[c]},Ae=Da;function Ea(e){return Aa(e)}function Aa(e,t){const n=Zn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:l,createText:c,createComment:f,setText:h,setElementText:p,parentNode:_,nextSibling:T,setScopeId:S=tt,insertStaticContent:U}=e,N=(d,m,v,I=null,w=null,x=null,R=void 0,$=null,C=!!m.dynamicChildren)=>{if(d===m)return;d&&!on(d,m)&&(I=Ft(d),ue(d,w,x,!0),d=null),m.patchFlag===-2&&(C=!1,m.dynamicChildren=null);const{type:b,ref:P,shapeFlag:M}=m;switch(b){case ss:Y(d,m,v,I);break;case ht:z(d,m,v,I);break;case _s:d==null&&E(m,v,I,R);break;case fe:Ke(d,m,v,I,w,x,R,$,C);break;default:M&1?le(d,m,v,I,w,x,R,$,C):M&6?yt(d,m,v,I,w,x,R,$,C):(M&64||M&128)&&b.process(d,m,v,I,w,x,R,$,C,Tt)}P!=null&&w?fn(P,d&&d.ref,x,m||d,!m):P==null&&d&&d.ref!=null&&fn(d.ref,null,x,d,!0)},Y=(d,m,v,I)=>{if(d==null)s(m.el=c(m.children),v,I);else{const w=m.el=d.el;m.children!==d.children&&h(w,m.children)}},z=(d,m,v,I)=>{d==null?s(m.el=f(m.children||""),v,I):m.el=d.el},E=(d,m,v,I)=>{[d.el,d.anchor]=U(d.children,m,v,I,d.el,d.anchor)},Q=({el:d,anchor:m},v,I)=>{let w;for(;d&&d!==m;)w=T(d),s(d,v,I),d=w;s(m,v,I)},F=({el:d,anchor:m})=>{let v;for(;d&&d!==m;)v=T(d),r(d),d=v;r(m)},le=(d,m,v,I,w,x,R,$,C)=>{if(m.type==="svg"?R="svg":m.type==="math"&&(R="mathml"),d==null)he(m,v,I,w,x,R,$,C);else{const b=d.el&&d.el._isVueCE?d.el:null;try{b&&b._beginPatch(),vt(d,m,w,x,R,$,C)}finally{b&&b._endPatch()}}},he=(d,m,v,I,w,x,R,$)=>{let C,b;const{props:P,shapeFlag:M,transition:O,dirs:D}=d;if(C=d.el=l(d.type,x,P&&P.is,P),M&8?p(C,d.children):M&16&&ke(d.children,C,null,I,w,ys(d,x),R,$),D&&Et(d,null,I,"created"),Te(C,d,d.scopeId,R,I),P){for(const ee in P)ee!=="value"&&!an(ee)&&i(C,ee,null,P[ee],x,I);"value"in P&&i(C,"value",null,P.value,x),(b=P.onVnodeBeforeMount)&&Ye(b,I,d)}D&&Et(d,null,I,"beforeMount");const W=Oa(w,O);W&&O.beforeEnter(C),s(C,m,v),((b=P&&P.onVnodeMounted)||W||D)&&Ae(()=>{b&&Ye(b,I,d),W&&O.enter(C),D&&Et(d,null,I,"mounted")},w)},Te=(d,m,v,I,w)=>{if(v&&S(d,v),I)for(let x=0;x{for(let b=C;b{const $=m.el=d.el;let{patchFlag:C,dynamicChildren:b,dirs:P}=m;C|=d.patchFlag&16;const M=d.props||re,O=m.props||re;let D;if(v&&At(v,!1),(D=O.onVnodeBeforeUpdate)&&Ye(D,v,m,d),P&&Et(m,d,v,"beforeUpdate"),v&&At(v,!0),(M.innerHTML&&O.innerHTML==null||M.textContent&&O.textContent==null)&&p($,""),b?He(d.dynamicChildren,b,$,v,I,ys(m,w),x):R||G(d,m,$,null,v,I,ys(m,w),x,!1),C>0){if(C&16)Je($,M,O,v,w);else if(C&2&&M.class!==O.class&&i($,"class",null,O.class,w),C&4&&i($,"style",M.style,O.style,w),C&8){const W=m.dynamicProps;for(let ee=0;ee{D&&Ye(D,v,m,d),P&&Et(m,d,v,"updated")},I)},He=(d,m,v,I,w,x,R)=>{for(let $=0;${if(m!==v){if(m!==re)for(const x in m)!an(x)&&!(x in v)&&i(d,x,m[x],null,w,I);for(const x in v){if(an(x))continue;const R=v[x],$=m[x];R!==$&&x!=="value"&&i(d,x,$,R,w,I)}"value"in v&&i(d,"value",m.value,v.value,w)}},Ke=(d,m,v,I,w,x,R,$,C)=>{const b=m.el=d?d.el:c(""),P=m.anchor=d?d.anchor:c("");let{patchFlag:M,dynamicChildren:O,slotScopeIds:D}=m;D&&($=$?$.concat(D):D),d==null?(s(b,v,I),s(P,v,I),ke(m.children||[],v,P,w,x,R,$,C)):M>0&&M&64&&O&&d.dynamicChildren&&d.dynamicChildren.length===O.length?(He(d.dynamicChildren,O,v,w,x,R,$),(m.key!=null||w&&m===w.subTree)&&lo(d,m,!0)):G(d,m,v,P,w,x,R,$,C)},yt=(d,m,v,I,w,x,R,$,C)=>{m.slotScopeIds=$,d==null?m.shapeFlag&512?w.ctx.activate(m,v,I,R,C):de(m,v,I,w,x,R,C):st(d,m,C)},de=(d,m,v,I,w,x,R)=>{const $=d.component=ja(d,I,w);if(Hi(d)&&($.ctx.renderer=Tt),Ka($,!1,R),$.asyncDep){if(w&&w.registerDep($,B,R),!d.el){const C=$.subTree=q(ht);z(null,C,m,v),d.placeholder=C.el}}else B($,d,m,v,w,x,R)},st=(d,m,v)=>{const I=m.component=d.component;if(Ia(d,m,v))if(I.asyncDep&&!I.asyncResolved){L(I,m,v);return}else I.next=m,I.update();else m.el=d.el,I.vnode=m},B=(d,m,v,I,w,x,R)=>{const $=()=>{if(d.isMounted){let{next:M,bu:O,u:D,parent:W,vnode:ee}=d;{const Fe=ao(d);if(Fe){M&&(M.el=ee.el,L(d,M,R)),Fe.asyncDep.then(()=>{Ae(()=>{d.isUnmounted||b()},w)});return}}let J=M,me;At(d,!1),M?(M.el=ee.el,L(d,M,R)):M=ee,O&&Bn(O),(me=M.props&&M.props.onVnodeBeforeUpdate)&&Ye(me,W,M,ee),At(d,!0);const we=Fr(d),Ne=d.subTree;d.subTree=we,N(Ne,we,_(Ne.el),Ft(Ne),d,w,x),M.el=we.el,J===null&&Sa(d,we.el),D&&Ae(D,w),(me=M.props&&M.props.onVnodeUpdated)&&Ae(()=>Ye(me,W,M,ee),w)}else{let M;const{el:O,props:D}=m,{bm:W,m:ee,parent:J,root:me,type:we}=d,Ne=Yt(m);At(d,!1),W&&Bn(W),!Ne&&(M=D&&D.onVnodeBeforeMount)&&Ye(M,J,m),At(d,!0);{me.ce&&me.ce._hasShadowRoot()&&me.ce._injectChildStyle(we,d.parent?d.parent.type:void 0);const Fe=d.subTree=Fr(d);N(null,Fe,v,I,d,w,x),m.el=Fe.el}if(ee&&Ae(ee,w),!Ne&&(M=D&&D.onVnodeMounted)){const Fe=m;Ae(()=>Ye(M,J,Fe),w)}(m.shapeFlag&256||J&&Yt(J.vnode)&&J.vnode.shapeFlag&256)&&d.a&&Ae(d.a,w),d.isMounted=!0,m=v=I=null}};d.scope.on();const C=d.effect=new yi($);d.scope.off();const b=d.update=C.run.bind(C),P=d.job=C.runIfDirty.bind(C);P.i=d,P.id=d.uid,C.scheduler=()=>Ys(P),At(d,!0),b()},L=(d,m,v)=>{m.component=d;const I=d.vnode.props;d.vnode=m,d.next=null,Ta(d,m.props,I,v),Ra(d,m.children,v),ft(),Mr(d),dt()},G=(d,m,v,I,w,x,R,$,C=!1)=>{const b=d&&d.children,P=d?d.shapeFlag:0,M=m.children,{patchFlag:O,shapeFlag:D}=m;if(O>0){if(O&128){ze(b,M,v,I,w,x,R,$,C);return}else if(O&256){_e(b,M,v,I,w,x,R,$,C);return}}D&8?(P&16&&Ct(b,w,x),M!==b&&p(v,M)):P&16?D&16?ze(b,M,v,I,w,x,R,$,C):Ct(b,w,x,!0):(P&8&&p(v,""),D&16&&ke(M,v,I,w,x,R,$,C))},_e=(d,m,v,I,w,x,R,$,C)=>{d=d||Vt,m=m||Vt;const b=d.length,P=m.length,M=Math.min(b,P);let O;for(O=0;OP?Ct(d,w,x,!0,!1,M):ke(m,v,I,w,x,R,$,C,M)},ze=(d,m,v,I,w,x,R,$,C)=>{let b=0;const P=m.length;let M=d.length-1,O=P-1;for(;b<=M&&b<=O;){const D=d[b],W=m[b]=C?at(m[b]):Qe(m[b]);if(on(D,W))N(D,W,v,null,w,x,R,$,C);else break;b++}for(;b<=M&&b<=O;){const D=d[M],W=m[O]=C?at(m[O]):Qe(m[O]);if(on(D,W))N(D,W,v,null,w,x,R,$,C);else break;M--,O--}if(b>M){if(b<=O){const D=O+1,W=DO)for(;b<=M;)ue(d[b],w,x,!0),b++;else{const D=b,W=b,ee=new Map;for(b=W;b<=O;b++){const $e=m[b]=C?at(m[b]):Qe(m[b]);$e.key!=null&&ee.set($e.key,b)}let J,me=0;const we=O-W+1;let Ne=!1,Fe=0;const kt=new Array(we);for(b=0;b=we){ue($e,w,x,!0);continue}let Pe;if($e.key!=null)Pe=ee.get($e.key);else for(J=W;J<=O;J++)if(kt[J-W]===0&&on($e,m[J])){Pe=J;break}Pe===void 0?ue($e,w,x,!0):(kt[Pe-W]=b+1,Pe>=Fe?Fe=Pe:Ne=!0,N($e,m[Pe],v,null,w,x,R,$,C),me++)}const Tn=Ne?Pa(kt):Vt;for(J=Tn.length-1,b=we-1;b>=0;b--){const $e=W+b,Pe=m[$e],Ut=m[$e+1],sn=$e+1{const{el:x,type:R,transition:$,children:C,shapeFlag:b}=d;if(b&6){be(d.component.subTree,m,v,I);return}if(b&128){d.suspense.move(m,v,I);return}if(b&64){R.move(d,m,v,Tt);return}if(R===fe){s(x,m,v);for(let M=0;M$.enter(x),w);else{const{leave:M,delayLeave:O,afterLeave:D}=$,W=()=>{d.ctx.isUnmounted?r(x):s(x,m,v)},ee=()=>{x._isLeaving&&x[Jl](!0),M(x,()=>{W(),D&&D()})};O?O(x,W,ee):ee()}else s(x,m,v)},ue=(d,m,v,I=!1,w=!1)=>{const{type:x,props:R,ref:$,children:C,dynamicChildren:b,shapeFlag:P,patchFlag:M,dirs:O,cacheIndex:D}=d;if(M===-2&&(w=!1),$!=null&&(ft(),fn($,null,v,d,!0),dt()),D!=null&&(m.renderCache[D]=void 0),P&256){m.ctx.deactivate(d);return}const W=P&1&&O,ee=!Yt(d);let J;if(ee&&(J=R&&R.onVnodeBeforeUnmount)&&Ye(J,m,d),P&6)In(d.component,v,I);else{if(P&128){d.suspense.unmount(v,I);return}W&&Et(d,null,m,"beforeUnmount"),P&64?d.type.remove(d,m,v,Tt,I):b&&!b.hasOnce&&(x!==fe||M>0&&M&64)?Ct(b,m,v,!1,!0):(x===fe&&M&384||!w&&P&16)&&Ct(C,m,v),I&&_t(d)}(ee&&(J=R&&R.onVnodeUnmounted)||W)&&Ae(()=>{J&&Ye(J,m,d),W&&Et(d,null,m,"unmounted")},v)},_t=d=>{const{type:m,el:v,anchor:I,transition:w}=d;if(m===fe){St(v,I);return}if(m===_s){F(d);return}const x=()=>{r(v),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(d.shapeFlag&1&&w&&!w.persisted){const{leave:R,delayLeave:$}=w,C=()=>R(v,x);$?$(d.el,x,C):C()}else x()},St=(d,m)=>{let v;for(;d!==m;)v=T(d),r(d),d=v;r(m)},In=(d,m,v)=>{const{bum:I,scope:w,job:x,subTree:R,um:$,m:C,a:b}=d;Lr(C),Lr(b),I&&Bn(I),w.stop(),x&&(x.flags|=8,ue(R,d,m,v)),$&&Ae($,m),Ae(()=>{d.isUnmounted=!0},m)},Ct=(d,m,v,I=!1,w=!1,x=0)=>{for(let R=x;R{if(d.shapeFlag&6)return Ft(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const m=T(d.anchor||d.el),v=m&&m[ql];return v?T(v):m};let nn=!1;const Sn=(d,m,v)=>{let I;d==null?m._vnode&&(ue(m._vnode,null,null,!0),I=m._vnode.component):N(m._vnode||null,d,m,null,null,null,v),m._vnode=d,nn||(nn=!0,Mr(I),Ni(),nn=!1)},Tt={p:N,um:ue,m:be,r:_t,mt:de,mc:ke,pc:G,pbc:He,n:Ft,o:e};return{render:Sn,hydrate:void 0,createApp:va(Sn)}}function ys({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function At({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Oa(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function lo(e,t,n=!1){const s=e.children,r=t.children;if(H(s)&&H(r))for(let i=0;i>1,e[n[c]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,l=n[i-1];i-- >0;)n[i]=l,l=t[l];return n}function ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ao(t)}function Lr(e){if(e)for(let t=0;te.__isSuspense;function Da(e,t){t&&t.pendingBranch?H(e)?t.effects.push(...e):t.effects.push(e):jl(e)}const fe=Symbol.for("v-fgt"),ss=Symbol.for("v-txt"),ht=Symbol.for("v-cmt"),_s=Symbol.for("v-stc"),pn=[];let De=null;function j(e=!1){pn.push(De=e?null:[])}function Na(){pn.pop(),De=pn[pn.length-1]||null}let yn=1;function jr(e,t=!1){yn+=e,e<0&&De&&t&&(De.hasOnce=!0)}function fo(e){return e.dynamicChildren=yn>0?De||Vt:null,Na(),yn>0&&De&&De.push(e),e}function V(e,t,n,s,r,i){return fo(y(e,t,n,s,r,i,!0))}function mt(e,t,n,s,r){return fo(q(e,t,n,s,r,!0))}function tr(e){return e?e.__v_isVNode===!0:!1}function on(e,t){return e.type===t.type&&e.key===t.key}const po=({key:e})=>e??null,jn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ae(e)||Se(e)||K(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function y(e,t=null,n=null,s=0,r=null,i=e===fe?0:1,l=!1,c=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&po(t),ref:t&&jn(t),scopeId:Ui,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ye};return c?(nr(f,n),i&128&&e.normalize(f)):n&&(f.shapeFlag|=ae(n)?8:16),yn>0&&!l&&De&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&&De.push(f),f}const q=Fa;function Fa(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Vi)&&(e=ht),tr(e)){const c=en(e,t,!0);return n&&nr(c,n),yn>0&&!i&&De&&(c.shapeFlag&6?De[De.indexOf(e)]=c:De.push(c)),c.patchFlag=-2,c}if(Ga(e)&&(e=e.__vccOpts),t){t=Ua(t);let{class:c,style:f}=t;c&&!ae(c)&&(t.class=xt(c)),ne(f)&&(Js(f)&&!H(f)&&(f=Ce({},f)),t.style=Be(f))}const l=ae(e)?1:uo(e)?128:Gl(e)?64:ne(e)?4:K(e)?2:0;return y(e,t,n,s,r,l,i,!0)}function Ua(e){return e?Js(e)||to(e)?Ce({},e):e:null}function en(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:l,children:c,transition:f}=e,h=t?ho(r||{},t):r,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&po(h),ref:t&&t.ref?n&&i?H(i)?i.concat(jn(t)):[i,jn(t)]:jn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:c,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&en(e.ssContent),ssFallback:e.ssFallback&&en(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return f&&s&&Xs(p,f.clone(p)),p}function tn(e=" ",t=0){return q(ss,null,e,t)}function Le(e="",t=!1){return t?(j(),mt(ht,null,e)):q(ht,null,e)}function Qe(e){return e==null||typeof e=="boolean"?q(ht):H(e)?q(fe,null,e.slice()):tr(e)?at(e):q(ss,null,String(e))}function at(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:en(e)}function nr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(H(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),nr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!to(t)?t._ctx=ye:r===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),s&64?(n=16,t=[tn(t)]):n=8);e.children=t,e.shapeFlag|=n}function ho(...e){const t={};for(let n=0;nIe||ye;let Gn,Ps;{const e=Zn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(l=>l(i)):r[0](i)}};Gn=t("__VUE_INSTANCE_SETTERS__",n=>Ie=n),Ps=t("__VUE_SSR_SETTERS__",n=>_n=n)}const xn=e=>{const t=Ie;return Gn(e),e.scope.on(),()=>{e.scope.off(),Gn(t)}},Hr=()=>{Ie&&Ie.scope.off(),Gn(null)};function mo(e){return e.vnode.shapeFlag&4}let _n=!1;function Ka(e,t=!1,n=!1){t&&Ps(t);const{props:s,children:r}=e.vnode,i=mo(e);Ca(e,s,i,t),Ma(e,r,n||t);const l=i?za(e,t):void 0;return t&&Ps(!1),l}function za(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ua);const{setup:s}=n;if(s){ft();const r=e.setupContext=s.length>1?Va(e):null,i=xn(e),l=wn(s,e,0,[e.props,r]),c=fi(l);if(dt(),i(),(c||e.sp)&&!Yt(e)&&ji(e),c){if(l.then(Hr,Hr),t)return l.then(f=>{Kr(e,f)}).catch(f=>{es(f,e,0)});e.asyncDep=l}else Kr(e,l)}else go(e)}function Kr(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Ai(t)),go(e)}function go(e,t,n){const s=e.type;e.render||(e.render=s.render||tt);{const r=xn(e);ft();try{fa(e)}finally{dt(),r()}}}const Wa={get(e,t){return xe(e,"get",""),e[t]}};function Va(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Wa),slots:e.slots,emit:e.emit,expose:t}}function rs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ai(Rl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in dn)return dn[n](e)},has(t,n){return n in t||n in dn}})):e.proxy}function qa(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Ga(e){return K(e)&&"__vccOpts"in e}const wt=(e,t)=>Nl(e,t,_n),Ja="3.5.30";/** -* @vue/runtime-dom v3.5.30 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Ds;const zr=typeof window<"u"&&window.trustedTypes;if(zr)try{Ds=zr.createPolicy("vue",{createHTML:e=>e})}catch{}const vo=Ds?e=>Ds.createHTML(e):e=>e,Ya="http://www.w3.org/2000/svg",Xa="http://www.w3.org/1998/Math/MathML",lt=typeof document<"u"?document:null,Wr=lt&<.createElement("template"),Za={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?lt.createElementNS(Ya,e):t==="mathml"?lt.createElementNS(Xa,e):n?lt.createElement(e,{is:n}):lt.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>lt.createTextNode(e),createComment:e=>lt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const l=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Wr.innerHTML=vo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const c=Wr.content;if(s==="svg"||s==="mathml"){const f=c.firstChild;for(;f.firstChild;)c.appendChild(f.firstChild);c.removeChild(f)}t.insertBefore(c,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Qa=Symbol("_vtc");function ec(e,t,n){const s=e[Qa];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Vr=Symbol("_vod"),tc=Symbol("_vsh"),nc=Symbol(""),sc=/(?:^|;)\s*display\s*:/;function rc(e,t,n){const s=e.style,r=ae(n);let i=!1;if(n&&!r){if(t)if(ae(t))for(const l of t.split(";")){const c=l.slice(0,l.indexOf(":")).trim();n[c]==null&&Hn(s,c,"")}else for(const l in t)n[l]==null&&Hn(s,l,"");for(const l in n)l==="display"&&(i=!0),Hn(s,l,n[l])}else if(r){if(t!==n){const l=s[nc];l&&(n+=";"+l),s.cssText=n,i=sc.test(n)}}else t&&e.removeAttribute("style");Vr in e&&(e[Vr]=i?s.display:"",e[tc]&&(s.display="none"))}const qr=/\s*!important$/;function Hn(e,t,n){if(H(n))n.forEach(s=>Hn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ic(e,t);qr.test(n)?e.setProperty(It(s),n.replace(qr,""),"important"):e[s]=n}}const Gr=["Webkit","Moz","ms"],bs={};function ic(e,t){const n=bs[t];if(n)return n;let s=Ee(t);if(s!=="filter"&&s in e)return bs[t]=s;s=Xn(s);for(let r=0;rws||(cc.then(()=>ws=0),ws=Date.now());function fc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;nt(dc(s,n.value),t,5,[s])};return n.value=e,n.attached=uc(),n}function dc(e,t){if(H(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ei=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,pc=(e,t,n,s,r,i)=>{const l=r==="svg";t==="class"?ec(e,s,l):t==="style"?rc(e,n,s):Jn(t)?Fs(t)||lc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):hc(e,t,s,l))?(Xr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Yr(e,t,s,l,i,t!=="value")):e._isVueCE&&(mc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(s)))?Xr(e,Ee(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Yr(e,t,s,l))};function hc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ei(t)&&K(n));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 r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ei(t)&&ae(n)?!1:t in e}function mc(e,t){const n=e._def.props;if(!n)return!1;const s=Ee(t);return Array.isArray(n)?n.some(r=>Ee(r)===s):Object.keys(n).some(r=>Ee(r)===s)}const ti=e=>{const t=e.props["onUpdate:modelValue"]||!1;return H(t)?n=>Bn(t,n):t};function gc(e){e.target.composing=!0}function ni(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const xs=Symbol("_assign");function si(e,t,n){return t&&(e=e.trim()),n&&(e=Ls(e)),e}const vc={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[xs]=ti(r);const i=s||r.props&&r.props.type==="number";zt(e,t?"change":"input",l=>{l.target.composing||e[xs](si(e.value,n,i))}),(n||i)&&zt(e,"change",()=>{e.value=si(e.value,n,i)}),t||(zt(e,"compositionstart",gc),zt(e,"compositionend",ni),zt(e,"change",ni))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},l){if(e[xs]=ti(l),e.composing)return;const c=(i||e.type==="number")&&!/^0\d/.test(e.value)?Ls(e.value):e.value,f=t??"";c!==f&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===f)||(e.value=f))}},yc=["ctrl","shift","alt","meta"],_c={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)=>yc.some(n=>e[`${n}Key`]&&!t.includes(n))},An=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let l=0;l{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=It(r.key);if(t.some(l=>l===i||bc[l]===i))return e(r)})},wc=Ce({patchProp:pc},Za);let ri;function xc(){return ri||(ri=Ea(wc))}const Ic=(...e)=>{const t=xc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Cc(s);if(!r)return;const i=t._component;!K(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const l=n(r,!1,Sc(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),l},t};function Sc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Cc(e){return ae(e)?document.querySelector(e):e}const Tc={class:"footer"},kc={__name:"AppFooter",emits:["request-admin"],setup(e,{emit:t}){const n=t,s=oe(0);let r=null;Zs(()=>{r&&window.clearTimeout(r)});function i(){s.value+=1,s.value===1&&(r=window.setTimeout(()=>{s.value=0,r=null},2e3)),s.value>=5&&(r&&(window.clearTimeout(r),r=null),s.value=0,n("request-admin"))}return(l,c)=>(j(),V("div",Tc,[y("div",null,[c[0]||(c[0]=tn(" © 2026 AirShare Pro. All rights reserved. ",-1)),c[1]||(c[1]=y("span",{class:"divider-line"},"|",-1)),y("span",{id:"admin-trigger",title:"点击 5 次进入后台",onClick:i},"V 1.0.0")]),c[2]||(c[2]=y("div",{style:{"font-size":"12px","margin-top":"4px"}},[y("a",{href:"https://beian.miit.gov.cn/",target:"_blank",rel:"noreferrer"}," 粤ICP备2026888888号-1 ")],-1))]))}},$c=["fill","stroke"],pe={__name:"LocalIcon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:24}},setup(e){const t=e,n={light_mode:{type:"stroke",shapes:[{tag:"circle",attrs:{cx:"12",cy:"12",r:"4"}},{tag:"path",attrs:{d:"M12 2v2.2"}},{tag:"path",attrs:{d:"M12 19.8V22"}},{tag:"path",attrs:{d:"M4.93 4.93 6.5 6.5"}},{tag:"path",attrs:{d:"m17.5 17.5 1.57 1.57"}},{tag:"path",attrs:{d:"M2 12h2.2"}},{tag:"path",attrs:{d:"M19.8 12H22"}},{tag:"path",attrs:{d:"m4.93 19.07 1.57-1.57"}},{tag:"path",attrs:{d:"M17.5 6.5 19.07 4.93"}}]},dark_mode:{type:"fill",shapes:[{tag:"path",attrs:{d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"}}]},add_circle:{type:"stroke",shapes:[{tag:"circle",attrs:{cx:"12",cy:"12",r:"9"}},{tag:"path",attrs:{d:"M12 8v8"}},{tag:"path",attrs:{d:"M8 12h8"}}]},sensors:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 12h.01"}},{tag:"path",attrs:{d:"M9.2 14.8a4 4 0 0 1 0-5.6"}},{tag:"path",attrs:{d:"M14.8 9.2a4 4 0 0 1 0 5.6"}},{tag:"path",attrs:{d:"M6.4 17.6a8 8 0 0 1 0-11.2"}},{tag:"path",attrs:{d:"M17.6 6.4a8 8 0 0 1 0 11.2"}}]},smartphone:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"7",y:"2.5",width:"10",height:"19",rx:"2.5"}},{tag:"path",attrs:{d:"M10 5h4"}},{tag:"circle",attrs:{cx:"12",cy:"18",r:"0.8"}}]},laptop_mac:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"5",y:"4",width:"14",height:"10",rx:"1.5"}},{tag:"path",attrs:{d:"M3 18h18"}},{tag:"path",attrs:{d:"M8 18a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2"}}]},close:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M6 6l12 12"}},{tag:"path",attrs:{d:"M18 6 6 18"}}]},cloud_upload:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M7 18a4 4 0 1 1 .7-7.94A5.5 5.5 0 0 1 18 11a3.5 3.5 0 1 1-.5 7"}},{tag:"path",attrs:{d:"M12 10v8"}},{tag:"path",attrs:{d:"m8.8 13.2 3.2-3.2 3.2 3.2"}}]},arrow_upward:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 19V6"}},{tag:"path",attrs:{d:"m6.5 11.5 5.5-5.5 5.5 5.5"}}]},send_and_archive:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M3 6h18l-2 4H5Z"}},{tag:"path",attrs:{d:"M5 10v8a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-8"}},{tag:"path",attrs:{d:"M12 11v5"}},{tag:"path",attrs:{d:"m9.5 13.5 2.5 2.5 2.5-2.5"}}]},chat_bubble:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M6 18.5 3.5 21v-5A7.5 7.5 0 0 1 11 4.5h2A7.5 7.5 0 0 1 20.5 12v.5A7.5 7.5 0 0 1 13 20H8.5"}}]},content_copy:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"9",y:"9",width:"10",height:"10",rx:"2"}},{tag:"path",attrs:{d:"M7 15H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v1"}}]},check:{type:"stroke",shapes:[{tag:"path",attrs:{d:"m5 12 4.2 4.2L19 7.5"}}]},draft:{type:"stroke",shapes:[{tag:"rect",attrs:{x:"4",y:"5",width:"16",height:"14",rx:"2"}},{tag:"path",attrs:{d:"m5 7 7 5 7-5"}}]},save:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M5 20h14a1 1 0 0 0 1-1V7.5L16.5 4H5a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1Z"}},{tag:"path",attrs:{d:"M8 4v5h7"}},{tag:"rect",attrs:{x:"8",y:"14",width:"8",height:"4",rx:"1"}}]},download:{type:"stroke",shapes:[{tag:"path",attrs:{d:"M12 5v10"}},{tag:"path",attrs:{d:"m7.5 10.5 4.5 4.5 4.5-4.5"}},{tag:"path",attrs:{d:"M5 19h14"}}]}},s=wt(()=>n[t.name]||n.close),r=wt(()=>typeof t.size=="number"?`${t.size}px`:/^\d+(\.\d+)?$/.test(t.size)?`${t.size}px`:t.size);return(i,l)=>(j(),V("span",{class:"app-icon",style:Be({width:r.value,height:r.value}),"aria-hidden":"true"},[(j(),V("svg",{viewBox:"0 0 24 24",fill:s.value.type==="fill"?"currentColor":"none",stroke:s.value.type==="stroke"?"currentColor":"none","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[(j(!0),V(fe,null,Qt(s.value.shapes,(c,f)=>(j(),mt(la(c.tag),ho({key:`${e.name}-${f}`},{ref_for:!0},c.attrs),null,16))),128))],8,$c))],4))}},Mc={class:"header"},Rc={__name:"AppHeader",props:{theme:{type:String,required:!0}},emits:["toggle-theme"],setup(e){return(t,n)=>(j(),V("div",Mc,[n[1]||(n[1]=y("h1",null,"AirShare Pro",-1)),n[2]||(n[2]=y("p",null,"跨端局域网 & P2P 传输中心",-1)),y("button",{class:"theme-toggle",title:"切换日夜模式",onClick:n[0]||(n[0]=s=>t.$emit("toggle-theme"))},[q(pe,{id:"theme-icon",name:e.theme==="dark"?"dark_mode":"light_mode",size:"22"},null,8,["name"])])]))}},Ec={class:"card"},Ac={key:0,class:"section-title"},hn={__name:"GlassCard",props:{title:{type:String,default:""}},setup(e){return(t,n)=>(j(),V("div",Ec,[e.title?(j(),V("div",Ac,te(e.title),1)):Le("",!0),ca(t.$slots,"default")]))}},Oc={class:"admin-panel active"},Pc={class:"card admin-header-card"},Dc={class:"transfer-head transfer-head-compact"},Nc={class:"main-grid admin-summary-grid"},Fc={class:"admin-stats-panel"},Uc={class:"admin-stats-row"},Bc={class:"admin-fluid-content"},Lc={class:"admin-fluid-icon"},jc={class:"admin-fluid-copy"},Hc={key:0,class:"stat-suffix"},Kc={class:"admin-config-stack"},zc={class:"text-input-group admin-config-row admin-config-row-field admin-config-row-last"},Wc={class:"admin-field-control-row"},Vc=["value"],qc={class:"text-input-group admin-config-row admin-config-row-field admin-config-row-last"},Gc={class:"admin-field-control-row"},Jc=["value"],Yc={class:"admin-config-insights"},Xc={class:"admin-config-highlight"},Zc={class:"admin-config-highlight"},Qc={class:"admin-table-wrapper"},eu={class:"admin-table"},tu={__name:"AdminPanel",props:{stats:{type:Array,required:!0},records:{type:Array,required:!0},fileLimit:{type:Number,required:!0},minioCapacity:{type:Number,required:!0}},emits:["exit","save-config","update:file-limit","update:minio-capacity"],setup(e){function t(l){const c=Number(l)||0;return c>=1024?`${(c/1024).toFixed(c%1024===0?0:1)} GB`:`${c} MB`}function n(l){const c=Number(l)||0;return c>=1024?`${(c/1024).toFixed(c%1024===0?0:1)} TB`:`${c} GB`}function s(l){return l==="blue"?{color:"var(--accent-blue)"}:l==="cyan"?{color:"var(--accent-cyan)"}:l==="success"?{color:"var(--success-green)"}:l==="danger"?{color:"var(--danger-red)"}:{color:"var(--text-main)"}}function r(l){return l==="success"?{color:"var(--success-green)",fontWeight:500}:l==="primary"?{color:"var(--accent-blue)",fontWeight:500}:{color:"var(--danger-red)",fontWeight:500}}function i(l){const c=Number(l)||0;return{"--fluid-level":`${Math.max(0,Math.min(c,100))}%`}}return(l,c)=>(j(),V("div",Oc,[y("div",Pc,[y("div",Dc,[c[5]||(c[5]=y("div",{class:"connected-to"},[y("h2",{class:"admin-title"},"管理控制台"),y("p",{class:"admin-subtitle"},"AirShare Pro System Dashboard")],-1)),y("button",{class:"btn-small-primary",type:"button",onClick:c[0]||(c[0]=f=>l.$emit("exit"))},"退出管理")])]),y("div",Nc,[q(hn,{class:"admin-stats-card",title:"系统运行状态"},{default:Jt(()=>[y("div",Fc,[y("div",Uc,[(j(!0),V(fe,null,Qt(e.stats,f=>(j(),V("div",{key:f.label,class:xt(["admin-stat-item",{"admin-stat-item-fluid":f.kind==="minio"}])},[f.kind==="minio"?(j(),V("div",{key:0,class:"admin-fluid-card",style:Be(i(f.percent))},[c[6]||(c[6]=y("div",{class:"admin-fluid-fill"},[y("span",{class:"admin-fluid-wave admin-fluid-wave-a"}),y("span",{class:"admin-fluid-wave admin-fluid-wave-b"})],-1)),y("div",Bc,[y("div",Lc,[q(pe,{name:"save",size:"18"})]),y("div",jc,[y("h3",{style:Be(s(f.tone))},te(f.value),5),y("p",null,te(f.label),1),y("small",null,te(f.detail),1)])])],4)):(j(),V(fe,{key:1},[c[7]||(c[7]=y("span",{class:"admin-stat-kicker"},"实时指标",-1)),y("h3",{style:Be(s(f.tone))},[tn(te(f.value),1),f.suffix?(j(),V("span",Hc,te(f.suffix),1)):Le("",!0)],4),y("p",null,te(f.label),1)],64))],2))),128))])])]),_:1}),q(hn,{class:"admin-config-card",title:"核心参数配置"},{default:Jt(()=>[y("div",Kc,[y("div",zc,[c[8]||(c[8]=y("div",{class:"admin-field-meta"},[y("label",{class:"admin-field-label",for:"admin-file-limit"},"单文件大小限制"),y("p",{class:"admin-field-hint"},"单位为 MB,超过该阈值的文件会按当前后端策略处理。")],-1)),y("div",Wc,[y("input",{id:"admin-file-limit",value:e.fileLimit,min:"1",placeholder:"10240",type:"number",onInput:c[1]||(c[1]=f=>l.$emit("update:file-limit",Number(f.target.value)||0))},null,40,Vc),y("button",{title:"保存配置",type:"button",onClick:c[2]||(c[2]=f=>l.$emit("save-config"))},[q(pe,{name:"save",size:"18"})])])]),y("div",qc,[c[9]||(c[9]=y("div",{class:"admin-field-meta"},[y("label",{class:"admin-field-label",for:"admin-minio-capacity"},"MinIO 总容量"),y("p",{class:"admin-field-hint"},"单位为 GB,用于容量卡和液位比例计算。")],-1)),y("div",Gc,[y("input",{id:"admin-minio-capacity",value:e.minioCapacity,min:"1",placeholder:"120",type:"number",onInput:c[3]||(c[3]=f=>l.$emit("update:minio-capacity",Number(f.target.value)||0))},null,40,Jc),y("button",{title:"保存配置",type:"button",onClick:c[4]||(c[4]=f=>l.$emit("save-config"))},[q(pe,{name:"save",size:"18"})])])]),y("div",Yc,[y("div",Xc,[c[10]||(c[10]=y("span",{class:"admin-config-badge"},"ACTIVE POLICY",-1)),y("h3",null,te(t(e.fileLimit)),1),c[11]||(c[11]=y("p",null,"当前单文件阈值。超过该体积后,文件会按后端已设定的传输与存档策略处理。",-1))]),y("div",Zc,[c[12]||(c[12]=y("span",{class:"admin-config-badge"},"MINIO CAPACITY",-1)),y("h3",null,te(n(e.minioCapacity)),1),c[13]||(c[13]=y("p",null,"当前 MinIO 总容量基线,用于后台容量展示与液位占比计算。",-1))])])])]),_:1})]),q(hn,{class:"admin-table-card",title:"最近传输记录(Top 5)"},{default:Jt(()=>[y("div",Qc,[y("table",eu,[c[14]||(c[14]=y("thead",null,[y("tr",null,[y("th",null,"时间"),y("th",null,"发送端特征"),y("th",null,"传输类型"),y("th",null,"数据量"),y("th",null,"状态")])],-1)),y("tbody",null,[(j(!0),V(fe,null,Qt(e.records,f=>(j(),V("tr",{key:`${f.time}-${f.peer}`},[y("td",null,te(f.time),1),y("td",null,te(f.peer),1),y("td",null,te(f.type),1),y("td",null,te(f.size),1),y("td",{style:Be(r(f.tone))},te(f.status),5)]))),128))])])])]),_:1})]))}},nu={class:"local-device-name"},su={key:0,class:"radar-container"},ru={class:"radar"},iu={key:1,class:"device-list"},ou=["onClick"],lu={class:"device-icon"},au={class:"device-info"},cu={key:2,class:"radar-container"},uu={class:"radar"},fu={__name:"DeviceDiscoveryCard",props:{isScanning:{type:Boolean,required:!0},localDeviceName:{type:String,default:""},devices:{type:Array,required:!0}},emits:["select-device"],setup(e,{emit:t}){const n=t;function s(r){n("select-device",r)}return(r,i)=>(j(),mt(hn,{title:"局域网自动发现"},{default:Jt(()=>[y("p",nu,[i[0]||(i[0]=tn(" 本机:",-1)),y("strong",null,te(e.localDeviceName||"识别中"),1)]),e.isScanning?(j(),V("div",su,[y("div",ru,[q(pe,{class:"radar-icon",name:"sensors",size:"36"})]),i[1]||(i[1]=y("p",{class:"scan-status"},"正在扫描附近设备...",-1))])):e.devices.length?(j(),V("div",iu,[(j(!0),V(fe,null,Qt(e.devices,l=>(j(),V("button",{key:l.id,class:"device-item",type:"button",onClick:c=>s(l)},[y("div",lu,[q(pe,{name:l.icon,size:"24"},null,8,["name"])]),y("div",au,[y("h4",null,te(l.name),1),y("p",null,te(l.description),1)]),i[2]||(i[2]=y("div",{class:"device-status-beacon","aria-hidden":"true"},[y("span",{class:"device-status-dot"}),y("span",{class:"device-status-ring"}),y("span",{class:"device-status-ring device-status-ring-delay"})],-1))],8,ou))),128))])):(j(),V("div",cu,[y("div",uu,[q(pe,{class:"radar-icon",name:"devices",size:"36"})]),i[3]||(i[3]=y("p",{class:"scan-status"},"暂未发现局域网设备,请保持页面开启后重试",-1))]))]),_:1}))}},du={key:0,class:"room-action-area"},pu={class:"room-input-group"},hu=["value"],mu={key:0,class:"pending-downloads"},gu={class:"pending-downloads-head"},vu=["href"],yu={class:"pending-download-copy"},_u=["title"],bu={class:"pending-download-icon","aria-hidden":"true"},wu={key:1,class:"waiting-area"},xu={class:"huge-code"},Iu={__name:"RemoteRoomCard",props:{roomCodeInput:{type:String,required:!0},isWaiting:{type:Boolean,required:!0},generatedCode:{type:String,required:!0},pendingDownloads:{type:Array,required:!0}},emits:["update-room-code","create-room","join-room","cancel-room"],setup(e,{emit:t}){const n=t;function s(i){n("update-room-code",i.target.value)}function r(){n("join-room")}return(i,l)=>(j(),mt(hn,{title:"远程直连"},{default:Jt(()=>[e.isWaiting?(j(),V("div",wu,[l[6]||(l[6]=y("p",{class:"waiting-subtitle"},"您的房间号码",-1)),y("div",xu,te(e.generatedCode),1),l[7]||(l[7]=y("div",{class:"spinner"},null,-1)),l[8]||(l[8]=y("p",{class:"waiting-tip"},"等待对方加入...",-1)),y("button",{class:"btn-cancel",type:"button",onClick:l[2]||(l[2]=c=>i.$emit("cancel-room"))},"取消建房")])):(j(),V("div",du,[y("button",{class:"btn-create",type:"button",onClick:l[0]||(l[0]=c=>i.$emit("create-room"))},[q(pe,{name:"add_circle",size:"22"}),l[3]||(l[3]=tn(" 创建专属传输房间 ",-1))]),l[5]||(l[5]=y("div",{class:"divider"},"或",-1)),y("div",pu,[y("input",{class:"room-code",inputmode:"numeric",maxlength:"4",pattern:"\\d*",placeholder:"输入4位房间号",type:"text",value:e.roomCodeInput,onInput:s,onKeyup:yo(r,["enter"])},null,40,hu),y("button",{class:"btn-primary",type:"button",onClick:l[1]||(l[1]=c=>i.$emit("join-room"))},"加入房间")]),e.pendingDownloads.length?(j(),V("div",mu,[y("div",gu,[l[4]||(l[4]=y("span",null,"待领取文件",-1)),y("span",null,te(e.pendingDownloads.length),1)]),(j(!0),V(fe,null,Qt(e.pendingDownloads,c=>(j(),V("a",{key:c.transfer_id,class:"pending-download-item",href:c.download_path,target:"_blank",rel:"noopener noreferrer"},[y("div",yu,[y("strong",{title:c.name},te(c.name),9,_u),y("p",null,te(c.size_label)+" · "+te(c.created_label),1)]),y("span",bu,[q(pe,{name:"download",size:"18"})])],8,vu))),128))])):Le("",!0)]))]),_:1}))}},Su={class:"file-info"},Cu=["title"],Tu={class:"file-info-right"},ku=["download","href"],$u={key:0,class:"progress-bar-container"},Mu={__name:"TransferQueueItem",props:{item:{type:Object,required:!0}},emits:["remove","start-upload","copy"],setup(e){const t=e,n=wt(()=>t.item.tone==="success"?{color:"var(--success-green)"}:t.item.tone==="primary"?{color:"var(--accent-blue)"}:t.item.tone==="danger"?{color:"var(--danger-red)"}:{color:"var(--text-secondary)"}),s=wt(()=>t.item.kind==="text"?{color:"var(--success-green)",background:"rgba(48, 209, 88, 0.1)"}:{});return(r,i)=>(j(),V("div",{class:xt(["batch-item",{"pending-file":e.item.kind==="file"&&e.item.pending}])},[y("div",Su,[y("div",{class:"file-info-left",style:Be(e.item.kind==="text"?{maxWidth:"70%"}:null)},[y("div",{class:"file-icon-wrapper",style:Be(s.value)},[q(pe,{name:e.item.kind==="text"?"chat_bubble":"draft",size:"18"},null,8,["name"])],4),y("span",{class:"file-name",title:e.item.kind==="text"?e.item.text:e.item.name},te(e.item.kind==="text"?e.item.text:e.item.name),9,Cu)],4),y("div",Tu,[y("span",{class:"file-status",style:Be(n.value)},te(e.item.kind==="text"&&e.item.copied?"已复制":e.item.status),5),e.item.kind==="text"?(j(),V("button",{key:0,class:"action-btn",title:"复制文本",type:"button",onClick:i[0]||(i[0]=l=>r.$emit("copy",e.item.id))},[q(pe,{name:e.item.copied?"check":"content_copy",size:"16"},null,8,["name"])])):Le("",!0),e.item.kind==="file"&&e.item.pending?(j(),V("button",{key:1,class:"action-btn primary",title:"发送文件",type:"button",onClick:i[1]||(i[1]=l=>r.$emit("start-upload",e.item.id))},[q(pe,{name:"arrow_upward",size:"16"})])):Le("",!0),e.item.kind==="file"&&e.item.downloadUrl?(j(),V("a",{key:2,class:"action-btn primary",download:e.item.name,href:e.item.downloadUrl,title:"保存文件"},[q(pe,{name:"download",size:"16"})],8,ku)):Le("",!0),y("button",{class:"action-btn danger",title:"移除记录",type:"button",onClick:i[2]||(i[2]=l=>r.$emit("remove",e.item.id))},[q(pe,{name:"close",size:"16"})])])]),e.item.kind==="file"?(j(),V("div",$u,[y("div",{class:xt(["progress-bar-fill",{success:e.item.tone==="success"}]),style:Be({width:`${e.item.progress}%`})},null,6)])):Le("",!0)],2))}},Ru={class:"transfer-panel active"},Eu={class:"card"},Au={class:"transfer-head"},Ou={class:"connected-to"},Pu={key:0,class:"connection-hint"},Du={class:"text-input-group"},Nu={__name:"TransferPanel",props:{peerName:{type:String,required:!0},connectionType:{type:String,required:!0},networkHint:{type:String,default:""},items:{type:Array,required:!0},hasPendingItems:{type:Boolean,required:!0}},emits:["close","send-text","files-selected","send-all-pending","remove-item","start-upload","copy-item"],setup(e,{emit:t}){const n=e,s=t,r=oe(""),i=oe(!1),l=oe(null),c=oe(null);Nt(()=>n.items.length,async()=>{await Pi(),l.value&&(l.value.scrollTop=l.value.scrollHeight)});function f(){var T;(T=c.value)==null||T.click()}function h(){s("send-text",r.value),r.value=""}function p(T){const S=Array.from(T.target.files||[]);S.length&&s("files-selected",S),T.target.value=""}function _(T){var U;i.value=!1;const S=Array.from(((U=T.dataTransfer)==null?void 0:U.files)||[]);S.length&&s("files-selected",S)}return(T,S)=>(j(),V("div",Ru,[y("div",Eu,[y("div",Au,[y("div",Ou,[y("h2",null,te(e.peerName),1),y("p",null,te(e.connectionType),1),e.networkHint?(j(),V("small",Pu,te(e.networkHint),1)):Le("",!0)]),y("button",{class:"close-btn",type:"button",onClick:S[0]||(S[0]=U=>T.$emit("close"))},[q(pe,{name:"close",size:"20"})])]),y("div",{class:xt(["drop-zone",{"drop-zone-active":i.value}]),onClick:f,onDragenter:S[1]||(S[1]=An(U=>i.value=!0,["prevent"])),onDragover:S[2]||(S[2]=An(U=>i.value=!0,["prevent"])),onDragleave:S[3]||(S[3]=An(U=>i.value=!1,["prevent"])),onDrop:An(_,["prevent"])},[q(pe,{class:"drop-zone-icon",name:"cloud_upload",size:"42"}),S[9]||(S[9]=y("p",{class:"drop-zone-text"},"点击或拖拽多个文件到这里",-1)),y("input",{ref_key:"fileInput",ref:c,class:"hidden",multiple:"",type:"file",onChange:p},null,544)],34),y("div",Du,[Hl(y("input",{"onUpdate:modelValue":S[4]||(S[4]=U=>r.value=U),placeholder:"输入要发送的文本或链接...",type:"text",onKeyup:yo(h,["enter"])},null,544),[[vc,r.value]]),y("button",{title:"发送文本",type:"button",onClick:h},[q(pe,{name:"arrow_upward",size:"20"})])]),y("div",{class:xt(["batch-actions",{active:e.hasPendingItems}])},[y("button",{class:"btn-small-primary",type:"button",onClick:S[5]||(S[5]=U=>T.$emit("send-all-pending"))},[q(pe,{name:"send_and_archive",size:"16"}),S[10]||(S[10]=tn(" 一键发送全部 ",-1))])],2),e.items.length?(j(),V("div",{key:0,ref_key:"batchContainer",ref:l,class:"batch-progress-container"},[(j(!0),V(fe,null,Qt(e.items,U=>(j(),mt(Mu,{key:U.id,item:U,onCopy:S[6]||(S[6]=N=>T.$emit("copy-item",N)),onRemove:S[7]||(S[7]=N=>T.$emit("remove-item",N)),onStartUpload:S[8]||(S[8]=N=>T.$emit("start-upload",N))},null,8,["item"]))),128))],512)):Le("",!0)])]))}};let Wt={deviceId:"",token:""};const Fu="filefast_device_id",Uu="filefast_device_token";function _o(){return!Wt.deviceId||!Wt.token?{}:{"X-Device-ID":Wt.deviceId,"X-Device-Token":Wt.token}}function Bu(e={},t=!1){return{...t?{"Content-Type":"application/json"}:{},..._o(),...e}}function Lu(e,t){if(!t||Object.keys(t).length===0)return e;const n=new URLSearchParams;Object.entries(t).forEach(([r,i])=>{i!=null&&i!==""&&n.set(r,String(i))});const s=n.toString();return s?`${e}?${s}`:e}async function On(e,t={}){const n=t.body!==void 0,s=await fetch(Lu(e,t.query),{method:t.method||"GET",headers:Bu(t.headers,n),body:n?JSON.stringify(t.body):void 0}),r=await s.json().catch(()=>({}));if(!s.ok){const i=new Error(r.error||`Request failed: ${s.status}`);throw i.status=s.status,i}return r.data}const ve={get(e,t={}){return On(e,{...t,method:"GET"})},post(e,t,n={}){return On(e,{...n,method:"POST",body:t})},put(e,t,n={}){return On(e,{...n,method:"PUT",body:t})},patch(e,t,n={}){return On(e,{...n,method:"PATCH",body:t})}};function ii(e,t){Wt={deviceId:e||"",token:t||""},Ku(Wt)}function ju(){return _o()}function Hu(e){return{Authorization:`Bearer ${e}`}}function Ku(e){typeof document>"u"||(oi(Fu,e.deviceId),oi(Uu,e.token))}function oi(e,t){if(!t){document.cookie=`${e}=; Path=/; Max-Age=0; SameSite=Lax`;return}document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax`}function Pn(e){return{headers:Hu(e)}}const Ht={login(e,t){return ve.post("/api/admin/login",{username:e,password:t})},stats(e){return ve.get("/api/admin/stats",Pn(e))},config(e){return ve.get("/api/admin/config",Pn(e))},updateConfig(e,t){return ve.put("/api/admin/config",t,Pn(e))},recentTransfers(e){return ve.get("/api/admin/transfers/recent",Pn(e))}},Dn={register(e){return ve.post("/api/devices/register",e)},heartbeat(e){return ve.post("/api/devices/heartbeat",{device_id:e})},listCandidates(e){return ve.get("/api/devices/candidates",{query:{deviceId:e}})},listPendingDownloads(e){return ve.get(`/api/devices/${encodeURIComponent(e)}/pending-downloads`)}},Nn={create(e){return ve.post("/api/rooms",{creator_device_id:e})},get(e){return ve.get(`/api/rooms/${encodeURIComponent(e)}`)},join(e,t){return ve.post("/api/rooms/join",{code:e,joiner_device_id:t})},cancel(e,t){return ve.post(`/api/rooms/${encodeURIComponent(e)}/cancel`,{requester_id:t})}},zu={config(){return ve.get("/api/runtime/config")}},ge={create(e){return ve.post("/api/transfers",e)},presignFallback(e){return ve.post(`/api/transfers/${encodeURIComponent(e)}/fallback/presign`,{})},uploadFallback(e,t,n){return Wu(`/api/transfers/${encodeURIComponent(e)}/fallback/upload`,t,n)},updateStatus(e,t){return ve.patch(`/api/transfers/${encodeURIComponent(e)}/status`,t)}};function Wu(e,t,n){return new Promise((s,r)=>{const i=new XMLHttpRequest;i.open("PUT",e),i.responseType="json",i.setRequestHeader("Content-Type",t.type||"application/octet-stream"),Object.entries(ju()).forEach(([l,c])=>{i.setRequestHeader(l,c)}),i.upload.onprogress=l=>{!l.lengthComputable||typeof n!="function"||n(Math.round(l.loaded/l.total*100))},i.onload=()=>{const l=i.response||Vu(i.responseText);if(i.status>=200&&i.status<300){s(l.data);return}r(new Error((l==null?void 0:l.error)||`Upload failed: ${i.status}`))},i.onerror=()=>r(new Error("Upload failed")),i.send(t)})}function Vu(e){try{return JSON.parse(e)}catch{return null}}const qu={class:"container"},Gu={key:0,class:"main-grid"},Is="filefast-admin-token",Fn="filefast-admin-view",Un="filefast-device-id",li="filefast-device-name",Ss="filefast-device-token",Ju=15e3,Yu=5e3,Xu=2e3,Zu=3e3,Qu=4*1024*1024,ef=2e4,tf=16*1024,ai=512*1024,nf={__name:"App",setup(e){const t=oe(localStorage.getItem("airshare-theme")||"light"),n=oe(localStorage.getItem(Fn)==="admin"?"admin":"main"),s=oe(!0),r=oe([]),i=oe(""),l=oe(!1),c=oe("----"),f=oe([]),h=oe({name:"--",type:"等待连接",deviceId:"",networkGroupKey:""}),p=oe([]),_=oe("/ws"),T=oe(10240),S=oe(120),U=oe([]),N=oe([]),Y=oe(null),z=oe(localStorage.getItem(Is)||""),E=oe({id:"",name:"",type:""}),Q=localStorage.getItem(Un)||"",F=localStorage.getItem(Ss)||"";Q&&F&&ii(Q,F);const le=new Map,he=new Map,Te=new Map,ke=new Map;let vt=null,He=null,Je=null,Ke=null,yt=null,de=null,st=null,B=null,L=null,G="",_e="p2p",ze=!1,be=!1,ue=!1,_t=null,St=null;const In=wt(()=>p.value.filter(o=>o.kind==="file"&&o.pending)),Ct=wt(()=>In.value.length>0),Ft=wt(()=>!h.value.deviceId||lr(h.value.networkGroupKey)||Po()?"":"当前是跨网络访问,未配置 TURN 时实时通道可能失败。文本和小文件可回退中转,大文件建议使用 MinIO。");Nt(t,o=>{document.body.setAttribute("data-theme",o),localStorage.setItem("airshare-theme",o)},{immediate:!0}),Nt(n,o=>{if(o==="admin"&&z.value){localStorage.setItem(Fn,"admin");return}localStorage.removeItem(Fn)}),Nt([n,z],([o,a])=>{Ke&&(window.clearInterval(Ke),Ke=null),!(o!=="admin"||!a)&&(Ke=window.setInterval(()=>{is().catch(u=>{console.error(u)})},5e3))}),zi(async()=>{_.value=Oo(),await nn(),n.value==="admin"&&z.value&&is().catch(o=>{console.error(o)}),He=window.setInterval(()=>{w()},Ju),vt=window.setInterval(()=>{v()},Yu),yt=window.setInterval(()=>{I()},1e4)}),Zs(()=>{vt&&window.clearInterval(vt),He&&window.clearInterval(He),Ke&&window.clearInterval(Ke),yt&&window.clearInterval(yt),b(),it(),vr(),D()});async function nn(){try{await Tt(),await m(),await v()}catch(o){window.alert(`后端连接失败:${o.message}`)}}function Sn(){t.value=t.value==="dark"?"light":"dark"}async function Tt(){try{Cn(await zu.config())}catch(o){console.error(o)}}function Cn(o){o&&(Y.value=o,T.value=Math.round((o.max_minio_fallback_size_bytes||0)/1024/1024),S.value=Math.max(0,Math.round((o.minio_capacity_bytes||0)/1024/1024/1024)))}function d(o){i.value=o.replace(/\D/g,"").slice(0,4)}async function m(){const o=Mo(),a=Ro(o),u=Eo(),g=await Dn.register({device_id:o,name:a,type:u,network_group_key:or()});localStorage.setItem(Un,g.id),g.auth_token&&(localStorage.setItem(Ss,g.auth_token),ii(g.id,g.auth_token)),E.value={id:g.id,name:g.name,type:g.type},await I(),gr()}async function v(){if(E.value.id)try{const o=await ge.create({kind:"text",name:"text-message",content:value,sender_device_id:E.value.id,receiver_device_id:h.value.deviceId});try{await sn(o,value)}catch(a){console.warn("realtime text send failed, fallback to relay",a),await sr(o,value)}p.value.push({id:Ue("text"),transferId:o.id,kind:"text",text:value,status:"已发送",tone:"success",copied:!1})}catch(o){window.alert(`发送文本失败:${o.message}`)}}async function I(){if(!E.value.id){f.value=[];return}try{const o=await Dn.listPendingDownloads(E.value.id);f.value=o.map(a=>({...a,download_path:a.download_path||`/api/transfers/${encodeURIComponent(a.transfer_id)}/fallback/download`,size_label:Lt(Number(a.size_bytes||0)),created_label:us(a.created_at)}))}catch(o){if((o==null?void 0:o.status)===404){f.value=[];return}console.error(o)}}async function w(){if(E.value.id)try{await Dn.heartbeat(E.value.id)}catch(o){console.error(o)}}async function x(){if(!E.value.id){window.alert("当前设备尚未注册到后端");return}try{const o=await Nn.create(E.value.id);c.value=o.code,l.value=!0,C(o.code)}catch(o){window.alert(`创建房间失败:${o.message}`)}}async function R(){const o=c.value;b();try{l.value&&o!=="----"&&await Nn.cancel(o,E.value.id)}catch(a){console.error(a)}finally{l.value=!1,c.value="----"}}async function $(){if(!(i.value.length<4))try{const o=await Nn.join(i.value,E.value.id),a=$t(o.creator_device_id);i.value="",P({deviceId:o.creator_device_id,name:(a==null?void 0:a.name)||`房间 ${o.code} 创建者`,type:"房间配对成功"})}catch(o){window.alert(`加入房间失败:${o.message}`)}}function C(o){b(),Je=window.setInterval(async()=>{try{const a=await Nn.get(o);if(a.status==="joined"&&a.joiner_device_id){const u=$t(a.joiner_device_id);P({deviceId:a.joiner_device_id,name:(u==null?void 0:u.name)||`房间 ${o} 对端`,type:"房间配对成功"});return}(a.status==="expired"||a.status==="canceled")&&(b(),l.value=!1,c.value="----")}catch(a){console.error(a)}},Xu)}function b(){Je&&(window.clearInterval(Je),Je=null)}function P(o){const a=o.deviceId||o.id||"",u=o.connectionType||o.type||"点对点传输";b(),h.value.deviceId!==a&&(it(),D()),h.value={name:o.name,type:o.connectionType||o.type||"点对点传输",deviceId:o.deviceId||o.id||"",networkGroupKey:o.network_group_key||""},l.value=!1,c.value="----",n.value="transfer",h.value.baseType=u,h.value.type=u,h.value.deviceId=a,We("正在建立实时通道"),rt(a,{initiate:!0})}function M(o,a=!1){const u=o.deviceId||o.id||"",g=o.connectionType||o.type||"点对点传输";h.value.deviceId===u&&n.value==="transfer"||(it(),a||D()),h.value={name:o.name,type:o.connectionType||o.type||"点对点传输",deviceId:u,networkGroupKey:o.network_group_key||""},l.value=!1,c.value="----",n.value="transfer",h.value.baseType=g,h.value.type=g,h.value.deviceId=u,We("正在建立实时通道"),rt(u)}function O(){it(),D(),h.value={name:"--",type:"等待连接",deviceId:"",networkGroupKey:""},n.value="main",h.value.baseType="等待连接",h.value.type="等待连接"}function D(){p.value.forEach(o=>Pe(o)),p.value=[],he.clear()}async function W(o){const a=o.trim();if(a){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}try{const u=await ge.create({kind:"text",name:"text-message",content:a,sender_device_id:E.value.id,receiver_device_id:h.value.deviceId});ce("transfer.created",h.value.deviceId,{transfer_id:u.id,kind:"text",name:"text-message",content:a,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type,receiver_device_id:h.value.deviceId,final_status:"completed",current_channel:"p2p",transport_options:os()}),await ge.updateStatus(u.id,{current_channel:"p2p",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:u.id,final_status:"completed",current_channel:"p2p"}),p.value.push({id:Ue("text"),transferId:u.id,kind:"text",text:a,status:"已发送",tone:"success",copied:!1})}catch(u){window.alert(`发送文本失败:${u.message}`)}}}function ee(o){const a=o.filter(Boolean).map((u,g)=>({id:Ue(`file-${g}`),kind:"file",file:u,name:u.name,size:Lt(u.size),sizeBytes:u.size,status:"待发送",tone:"muted",progress:0,pending:!0,transferId:""}));a.length&&p.value.push(...a)}async function J(o){const a=p.value.find(u=>u.id===o);if(!(!a||a.kind!=="file"||!a.pending)){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}a.pending=!1,a.status="创建传输中...",a.tone="primary";try{const u=await ge.create({kind:"file",name:a.name,size_bytes:a.sizeBytes,sender_device_id:E.value.id,receiver_device_id:h.value.deviceId});if(a.transferId=u.id,a.sizeBytes>Qu){await me(a,u);return}ce("transfer.created",h.value.deviceId,{transfer_id:u.id,kind:"file",name:a.name,size_bytes:a.sizeBytes,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type,receiver_device_id:h.value.deviceId,final_status:"connecting",current_channel:"p2p",transport_options:os()});try{await rr(a,u)}catch(g){console.warn("realtime file send failed, fallback to relay",g),await ir(a,u)}}catch(u){a.pending=!0,a.status=`发送失败:${u.message}`,a.tone="danger"}}}async function me(o,a){o.progress=0,o.status="上传准备中...";try{if(!a.fallback_allowed)throw new Error("当前文件过大,且未启用 MinIO 回退");await ge.presignFallback(o.transferId),ce("transfer.updated",h.value.deviceId,{transfer_id:o.transferId,final_status:"fallback_uploading",current_channel:"minio"}),o.status="上传中...";const u=await ge.uploadFallback(o.transferId,o.file,g=>{o.progress=Math.max(1,Math.min(g,99))});await ge.updateStatus(o.transferId,{current_channel:"minio",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:o.transferId,final_status:"completed",current_channel:"minio"}),ce("transfer.file",h.value.deviceId,{transfer_id:o.transferId,name:o.name,download_url:u.download_path||u.download_url}),o.progress=100,o.status="上传完成",o.tone="success"}catch(u){o.pending=!0,o.status=`上传失败:${u.message}`,o.tone="danger"}}async function we(){for(const o of In.value)await J(o.id)}async function Ne(o){const a=p.value.find(u=>u.id===o);if(a&&Pe(a),p.value=p.value.filter(u=>u.id!==o),!(!(a!=null&&a.transferId)||a.tone==="success"))try{await ge.updateStatus(a.transferId,{final_status:"cancelled"}),ce("transfer.updated",h.value.deviceId,{transfer_id:a.transferId,final_status:"cancelled"})}catch(u){console.error(u)}}async function Fe(o){const a=p.value.find(u=>u.id===o);if(!(!a||a.kind!=="text"))try{await kt(a.text),a.copied=!0,window.setTimeout(()=>{const u=p.value.find(g=>g.id===o);u&&u.kind==="text"&&(u.copied=!1)},2e3)}catch{window.alert("复制失败")}}async function kt(o){var u;if((u=navigator.clipboard)!=null&&u.writeText&&window.isSecureContext){await navigator.clipboard.writeText(o);return}const a=document.createElement("textarea");a.value=o,a.setAttribute("readonly","readonly"),a.style.position="fixed",a.style.top="0",a.style.left="-9999px",a.style.opacity="0",document.body.appendChild(a),a.focus(),a.select(),a.setSelectionRange(0,a.value.length);try{if(!document.execCommand("copy"))throw new Error("copy command failed")}finally{document.body.removeChild(a)}}function Tn(o){const a=le.get(o);a&&(window.clearInterval(a),le.delete(o))}function $e(o){return new Promise((a,u)=>{const g=new FileReader;g.onload=()=>a(String(g.result||"")),g.onerror=()=>u(new Error("Failed to read file")),g.readAsDataURL(o)})}function Pe(o){if(Tn(o.id),o.ownedDownloadUrl&&o.downloadUrl)try{URL.revokeObjectURL(o.downloadUrl)}catch(a){console.error(a)}o.transferId&&he.delete(o.transferId)}function Ut(o,a,u=!1){if(o.ownedDownloadUrl&&o.downloadUrl&&o.downloadUrl!==a)try{URL.revokeObjectURL(o.downloadUrl)}catch(g){console.error(g)}o.downloadUrl=a,o.ownedDownloadUrl=u}async function sn(o,a){const u=await fr(h.value.deviceId);kn(u,{type:"text",transfer_id:o.id,text:a,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type});const g=mr();await ge.updateStatus(o.id,{current_channel:g,final_status:"completed"})}async function sr(o,a){ce("transfer.created",h.value.deviceId,{transfer_id:o.id,kind:"text",name:"text-message",content:a,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type,receiver_device_id:h.value.deviceId,final_status:"completed",current_channel:"p2p"}),await ge.updateStatus(o.id,{current_channel:"p2p",final_status:"completed"})}async function rr(o,a){var A;const u=await fr(h.value.deviceId);o.status="正在通过 WebRTC 发送...",o.progress=1,kn(u,{type:"file-meta",transfer_id:a.id,name:o.name,mime_type:((A=o.file)==null?void 0:A.type)||"application/octet-stream",size_bytes:o.sizeBytes,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type});let g=0;for(;gai;)await So(20)}function So(o){return new Promise(a=>{window.setTimeout(a,o)})}function Co(o,a,u){return new Promise((g,k)=>{const A=window.setTimeout(()=>{k(new Error(u))},a);o.then(se=>{window.clearTimeout(A),g(se)}).catch(se=>{window.clearTimeout(A),k(se)})})}async function To(){const o=window.prompt("管理员用户名","admin");if(o===null)return;const a=window.prompt("管理员密码");if(a!==null)try{const u=await Ht.login(o.trim()||"admin",a);z.value=u.token,localStorage.setItem(Is,u.token),await is(),n.value="admin"}catch(u){window.alert(`管理员登录失败:${u.message}`)}}function ko(){n.value="main"}async function is(){if(z.value)try{const[o,a,u]=await Promise.all([Ht.stats(z.value),Ht.config(z.value),Ht.recentTransfers(z.value)]);Cn(a),U.value=wr(o.stats||{},o.minio||{}),N.value=u.map(g=>Jo(g))}catch(o){throw(o==null?void 0:o.status)===401&&(localStorage.removeItem(Is),localStorage.removeItem(Fn),z.value="",n.value="main"),o}}async function $o(){if(!z.value||!Y.value){window.alert("当前没有可用的管理员会话");return}try{const o={...Y.value,max_minio_fallback_size_bytes:Math.max(0,T.value)*1024*1024,minio_capacity_bytes:Math.max(0,S.value)*1024*1024*1024},a=await Ht.updateConfig(z.value,o);Cn(a);{const u=await Ht.stats(z.value);U.value=wr(u.stats||{},u.minio||{})}window.alert("配置已保存")}catch(o){window.alert(`保存配置失败:${o.message}`)}}function Mo(){let o=localStorage.getItem(Un);return o||(o=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`web-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,localStorage.setItem(Un,o)),o}function Ro(o){var u;let a=localStorage.getItem(li);return a||(a=`${((u=navigator.userAgentData)==null?void 0:u.platform)||navigator.platform||"Web"} ${o.slice(0,4)}`,localStorage.setItem(li,a)),a}function Eo(){const o=`${navigator.userAgent} ${navigator.platform}`.toLowerCase();return o.includes("iphone")||o.includes("android")||o.includes("mobile")?"phone":o.includes("ipad")||o.includes("tablet")?"tablet":"desktop"}function Ao(o){return o==="phone"?"smartphone":o==="tablet"?"tablet_mac":"laptop_mac"}function Bt(o){return o==="phone"?"手机":o==="tablet"?"平板":"桌面端"}function Oo(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`}function Po(){var o;return Array.isArray((o=Y.value)==null?void 0:o.turn_urls)&&Y.value.turn_urls.some(a=>String(a||"").trim())}function or(){const o=String(window.location.hostname||"").trim().toLowerCase();return o?o==="localhost"||o==="127.0.0.1"||o==="::1"||o.endsWith(".local")||Do(o)?o:"":"local"}function lr(o){const a=or();return!!a&&o===a}function Do(o){const a=o.split(".");if(a.length!==4||a.some(k=>!/^\d+$/.test(k)))return!1;const[u,g]=a.map(k=>Number(k));return u===10||u===127||u===192&&g===168?!0:u===172&&g>=16&&g<=31}function ar(o){const a=Array.isArray(o==null?void 0:o.turn_urls)?o.turn_urls.map(u=>String(u||"").trim()).filter(Boolean):[];return a.length?[{urls:a,username:(o==null?void 0:o.turn_username)||"",credential:(o==null?void 0:o.turn_password)||""}]:[]}function os(){var o,a;return{ice_servers:ar(Y.value),p2p_connect_timeout_sec:((o=Y.value)==null?void 0:o.p2p_connect_timeout_sec)||15,turn_connect_timeout_sec:((a=Y.value)==null?void 0:a.turn_connect_timeout_sec)||20}}function cr(){return typeof RTCPeerConnection<"u"}function ls(){_t=null,St=null}function No(){return _t||(_t=new Promise(o=>{St=o})),_t}function ur(o){St&&St(o),_t=Promise.resolve(o),St=null}function We(o=""){if(!h.value.deviceId)return;const a=h.value.baseType||h.value.type||"点对点传输";h.value={...h.value,type:o?`${a} · ${o}`:a}}function Fo(o){return!B||G!==o||B.signalingState==="closed"||["failed","disconnected","closed"].includes(B.connectionState)||["failed","disconnected","closed"].includes(B.iceConnectionState)?!0:!L||L.readyState==="closed"}async function rt(o,a={}){return!o||!cr()?null:(Fo(o)&&(it(),Uo(o)),a.initiate&&B.signalingState==="stable"&&await Bo(o),B)}function Uo(o){G=o,_e="p2p",ze=!1,be=!1,ue=!1,ke.delete(o),ls(),B=new RTCPeerConnection({iceServers:ar(Y.value)}),L=B.createDataChannel("filefast-control",{negotiated:!0,id:0,ordered:!0}),Lo(L),B.onicecandidate=({candidate:a})=>{if(a)try{ce("webrtc.candidate",o,{candidate:a})}catch(u){console.error(u)}},B.onconnectionstatechange=()=>{if(B){if(as(),B.connectionState==="connected"){We(_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接");return}if(B.connectionState==="connecting"){We("实时通道连接中");return}if(B.connectionState==="failed"){We("实时通道连接失败");return}(B.connectionState==="disconnected"||B.connectionState==="closed")&&We("实时通道已断开")}},B.oniceconnectionstatechange=()=>{as()}}async function Bo(o){if(B)try{ze=!0,await B.setLocalDescription(),ce("webrtc.description",o,{description:B.localDescription})}finally{ze=!1}}function Lo(o){L=o,o.bufferedAmountLowThreshold=ai/2,o.onopen=()=>{ur(o),We(_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"),as()},o.onclose=()=>{L===o&&(L=null,ls(),We("实时通道已关闭"))},o.onerror=a=>{console.error(a)},o.onmessage=a=>{jo(a.data)},o.readyState==="open"&&ur(o)}function it(){he.clear(),G&&ke.delete(G),L&&(L.onopen=null,L.onclose=null,L.onerror=null,L.onmessage=null,L.close(),L=null),B&&(B.onicecandidate=null,B.onconnectionstatechange=null,B.oniceconnectionstatechange=null,B.close(),B=null),G="",_e="p2p",ze=!1,be=!1,ue=!1,ls()}async function fr(o){if(!cr())throw new Error("当前浏览器不支持 WebRTC");if(await rt(o,{initiate:!0}),(L==null?void 0:L.readyState)==="open")return L;const a=await Co(No(),ef,"WebRTC 连接超时");if(!a||a.readyState!=="open")throw new Error("实时通道未建立");return a}function kn(o,a){if(!o||o.readyState!=="open")throw new Error("实时通道未就绪");o.send(JSON.stringify(a))}function jo(o){try{const a=JSON.parse(String(o||"{}"));if(a.type==="text"){Ho(a);return}if(a.type==="file-meta"){Ko(a);return}if(a.type==="file-chunk"){zo(a);return}a.type==="file-complete"&&Wo(a)}catch(a){console.error(a)}}function Ho(o){var k;const a=o.sender_device_id||G,u={id:a,name:o.sender_name||((k=$t(a))==null?void 0:k.name)||`设备 ${Mt(a)}`,type:Bt(o.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0);const g=p.value.find(A=>A.transferId===o.transfer_id);if(g&&g.kind==="text"){g.text=o.text||"",g.status="已接收",g.tone="success";return}p.value.push({id:Ue("incoming-text"),transferId:o.transfer_id,kind:"text",text:o.text||"",status:"已接收",tone:"success",copied:!1})}function Ko(o){var k;const a=o.sender_device_id||G,u={id:a,name:o.sender_name||((k=$t(a))==null?void 0:k.name)||`设备 ${Mt(a)}`,type:Bt(o.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0),he.set(o.transfer_id,{name:o.name||"file",mimeType:o.mime_type||"application/octet-stream",sizeBytes:Number(o.size_bytes||0),receivedBytes:0,chunks:[]});let g=p.value.find(A=>A.transferId===o.transfer_id);g?(g.status="正在接收...",g.tone="primary",g.progress=0):(g={id:Ue("incoming-file"),transferId:o.transfer_id,kind:"file",name:o.name||"file",size:Lt(Number(o.size_bytes||0)),sizeBytes:Number(o.size_bytes||0),status:"正在接收...",tone:"primary",progress:0,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(g))}function zo(o){const a=he.get(o.transfer_id);if(!a)return;const u=xo(String(o.chunk_base64||""));a.receivedBytes+=Number(o.chunk_size||u.byteLength||0),a.chunks.push(u);const g=p.value.find(k=>k.transferId===o.transfer_id);if(g){const k=a.sizeBytes>0?a.receivedBytes/a.sizeBytes*100:0;g.progress=Math.max(1,Math.min(99,Math.round(k))),g.status="正在接收...",g.tone="primary"}}function Wo(o){const a=he.get(o.transfer_id);if(!a)return;const u=p.value.find(A=>A.transferId===o.transfer_id);if(!u){he.delete(o.transfer_id);return}const g=new Blob(a.chunks,{type:a.mimeType||"application/octet-stream"}),k=URL.createObjectURL(g);Ut(u,k,!0),u.progress=100,u.status="可保存",u.tone="success",he.delete(o.transfer_id)}function dr(o){return E.value.id.localeCompare(o)>0}function $n(o,a="等待实时数据"){const u=$t(o);return{id:o,deviceId:o,name:(u==null?void 0:u.name)||`设备 ${Mt(o)}`,type:Bt((u==null?void 0:u.type)||"desktop"),connectionType:a,network_group_key:(u==null?void 0:u.network_group_key)||""}}async function pr(o){const u=(o.payload||{}).description,g=o.device_id||"";if(!u||!g)return;M($n(g),!0);const k=await rt(g);if(!k)return;const A=dr(g),se=!ze&&(k.signalingState==="stable"||ue),Rt=u.type==="offer"&&!se;be=!A&&Rt,!be&&(ue=u.type==="answer",await k.setRemoteDescription(u),ue=!1,u.type==="offer"&&(await k.setLocalDescription(),ce("webrtc.description",g,{description:k.localDescription})))}async function hr(o){const a=o.payload||{},u=o.device_id||"";if(!a.candidate||!u)return;(n.value!=="transfer"||h.value.deviceId!==u)&&M($n(u),!0);const g=await rt(u);if(g)try{await g.addIceCandidate(a.candidate)}catch(k){be||console.error(k)}}async function as(){if(!(!B||B.connectionState!=="connected"))try{const o=await B.getStats();let a=null;if(o.forEach(A=>{A.type==="transport"&&A.selectedCandidatePairId&&(a=o.get(A.selectedCandidatePairId)||a)}),a||o.forEach(A=>{A.type==="candidate-pair"&&A.state==="succeeded"&&(A.nominated||A.selected)&&(a=A)}),!a)return;const u=o.get(a.localCandidateId),g=o.get(a.remoteCandidateId),k=(u==null?void 0:u.candidateType)==="relay"||(g==null?void 0:g.candidateType)==="relay";_e=k?"turn":"p2p",(L==null?void 0:L.readyState)==="open"&&We(k?"TURN 中继已连接":"WebRTC 直连已连接")}catch(o){console.error(o)}}function mr(){return _e==="turn"?"turn":"p2p"}function gr(){if(!E.value.id)return;const o=localStorage.getItem(Ss)||"";o&&(vr(),de=new WebSocket(`${_.value}?deviceId=${encodeURIComponent(E.value.id)}&deviceToken=${encodeURIComponent(o)}`),de.addEventListener("message",a=>{qo(a.data)}),de.addEventListener("close",()=>{de=null,Vo()}),de.addEventListener("error",()=>{de==null||de.close()}))}function vr(){if(st&&(window.clearTimeout(st),st=null),!de)return;const o=de;de=null,o.onclose=null,o.close()}function Vo(){st||!E.value.id||(st=window.setTimeout(()=>{st=null,gr()},Zu))}function ce(o,a,u){!de||de.readyState!==WebSocket.OPEN||!a||de.send(JSON.stringify({type:o,target_device_id:a,payload:u}))}function qo(o){try{const a=JSON.parse(o);if(a.type==="presence.update"){v();return}if(a.type==="webrtc.description"){pr(a);return}if(a.type==="webrtc.candidate"){hr(a);return}if(a.type==="transfer.created"){yr(a);return}if(a.type==="transfer.updated"){_r(a);return}if(a.type==="transfer.file"){br(a);return}a.type==="peer.session.closed"&&Go(a)}catch(a){console.error(a)}}function Go(o){const a=o.device_id||"";!a||h.value.deviceId!==a||(it(),D(),h.value={name:"--",type:"绛夊緟杩炴帴",baseType:"绛夊緟杩炴帴",deviceId:"",networkGroupKey:""},n.value="main")}function yr(o){var A;const a=o.payload||{},u=o.device_id||a.sender_device_id||"",g={id:u,name:a.sender_name||((A=$t(u))==null?void 0:A.name)||`Device ${Mt(u)}`,type:Bt(a.sender_type||"desktop")};if(g.connectionType="等待实时数据",M(g,!0),!p.value.find(se=>se.transferId===a.transfer_id)){if(a.kind==="text"){p.value.push({id:Ue("incoming-text"),transferId:a.transfer_id,kind:"text",text:a.content||"",status:"已接收",tone:"success",copied:!1});return}p.value.push({id:Ue("incoming-file"),transferId:a.transfer_id,kind:"file",name:a.name||"file",size:Lt(Number(a.size_bytes||0)),sizeBytes:Number(a.size_bytes||0),status:"接收中...",tone:"primary",progress:35,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}}function _r(o){const a=o.payload||{},u=p.value.find(g=>g.transferId===a.transfer_id);if(u&&u.kind==="file"){if(a.final_status==="completed"){u.progress=100,u.status="已接收",u.tone="success",u.downloadUrl&&(u.status="可保存");return}a.final_status==="cancelled"&&(u.status="已取消",u.tone="danger")}}function br(o){const a=o.payload||{};let u=p.value.find(g=>g.transferId===a.transfer_id);!u&&a.transfer_id&&(u={id:Ue("incoming-file"),transferId:a.transfer_id,kind:"file",name:a.name||"file",size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(u)),!(!u||u.kind!=="file")&&(Ut(u,a.download_url||a.data_url||"",!1),u.status="可保存",u.progress=100,u.tone="success")}function $t(o){return r.value.find(a=>a.id===o)}function wr(o,a={}){return[{label:"在线设备",value:`${o.devices_online||0}`,tone:"blue"},{label:"待加入房间",value:`${o.rooms_waiting||0}`,tone:"cyan"},{label:"有效传输",value:`${o.transfers_total||0}`,tone:"default"},{label:"累计传输",value:`${o.transfers_cumulative||0}`,tone:"default"},{kind:"minio",label:"MinIO 剩余容量",value:cs(a.remaining_bytes||0),tone:Number(a.usage_percent||0)>=85?"danger":Number(a.usage_percent||0)>=60?"cyan":"blue",percent:Math.max(0,100-Number(a.usage_percent||0)),detail:`已用 ${cs(a.used_bytes||0)} / 总计 ${cs(a.capacity_bytes||0)}`,kicker:`存档 ${a.object_count||0} 份`}]}function cs(o){const a=Number(o||0);if(!a||a<=0)return"0 GB";const u=["B","KB","MB","GB","TB"],g=Math.min(Math.floor(Math.log(a)/Math.log(1024)),u.length-1),k=a/1024**g,A=g>=3?2:k>=10?1:2;return`${k.toFixed(A)} ${u[g]}`}function Jo(o){const a=o.final_status==="completed",u=o.final_status==="failed"||o.final_status==="cancelled";return{time:us(o.created_at),peer:`${Mt(o.sender_device_id)} -> ${Mt(o.receiver_device_id)}`,type:o.kind==="text"?"文本消息":`文件 ${o.name}`,size:Lt(Number(o.size_bytes||0)),status:a?`已完成 (${o.current_channel||"p2p"})`:u?`已结束 (${o.final_status})`:`进行中 (${o.final_status||"pending"})`,tone:a?"success":u?"danger":"primary"}}function Mt(o){return o?o.slice(0,8):"--"}function us(o){if(!o)return"刚刚";const a=new Date(o),u=Date.now()-a.getTime();if(!Number.isFinite(u))return"刚刚";const g=Math.max(0,Math.floor(u/1e3));if(g<60)return`${g} 秒前`;const k=Math.floor(g/60);if(k<60)return`${k} 分钟前`;const A=Math.floor(k/60);return A<24?`${A} 小时前`:`${Math.floor(A/24)} 天前`}function Ue(o){return`${o}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function Lt(o){if(!o||o<=0)return"0 B";const a=["B","KB","MB","GB","TB"],u=Math.min(Math.floor(Math.log(o)/Math.log(1024)),a.length-1),g=o/1024**u,k=g>=10||u===0?0:1;return`${g.toFixed(k)} ${a[u]}`}v=async function(){return E.value.id?Dn.listCandidates(E.value.id).then(a=>{r.value=a.map(u=>({...u,description:`${Bt(u.type)} · 最近活跃 ${us(u.last_seen_at)}`,icon:Ao(u.type),connectionType:lr(u.network_group_key)?"局域网直连优先":"跨网络实时传输"})),s.value=r.value.length===0}).catch(a=>{s.value=!1,console.error(a)}):Promise.resolve()},P=function(a){const u=a.deviceId||a.id||"",g=a.connectionType||a.type||"点对点传输";b(),h.value.deviceId!==u&&(it(),D()),h.value={name:a.name,type:g,baseType:g,deviceId:u,networkGroupKey:a.network_group_key||""},l.value=!1,c.value="----",n.value="transfer",We("正在建立实时通道"),rt(u,{initiate:!0})},M=function(a,u=!1){const g=a.deviceId||a.id||"",k=a.connectionType||a.type||"点对点传输";h.value.deviceId===g&&n.value==="transfer"||(it(),u||D()),h.value={name:a.name,type:k,baseType:k,deviceId:g,networkGroupKey:a.network_group_key||""},l.value=!1,c.value="----",n.value="transfer",g&&(We("正在建立实时通道"),rt(g))},O=function(){h.value.deviceId&&ce("peer.session.closed",h.value.deviceId,{}),it(),D(),h.value={name:"--",type:"等待连接",baseType:"等待连接",deviceId:"",networkGroupKey:""},n.value="main"},W=async function(a){const u=a.trim();if(u){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}try{const g=await ge.create({kind:"text",name:"text-message",content:u,sender_device_id:E.value.id,receiver_device_id:h.value.deviceId});try{await sn(g,u)}catch(k){console.warn("realtime text send failed, fallback to relay",k),await sr(g,u)}p.value.push({id:Ue("text"),transferId:g.id,kind:"text",text:u,status:"已发送",tone:"success",copied:!1})}catch(g){window.alert(`发送文本失败:${g.message}`)}}};function xr(o,a){ce("transfer.file",h.value.deviceId,{transfer_id:o.transferId,name:o.name,download_url:a.download_path||a.download_url})}function Ir(o,a,{onProgress:u}={}){if(!(o!=null&&o.file))return Promise.reject(new Error("未找到待上传文件"));if(!(a!=null&&a.fallback_allowed))return Promise.reject(new Error("MinIO 存档未启用"));const g=a.id;if(Te.has(g))return Te.get(g);const k=(async()=>(await ge.presignFallback(g),ge.uploadFallback(g,o.file,A=>{typeof u=="function"&&u(A)})))().finally(()=>{Te.delete(g)});return Te.set(g,k),k}async function Sr(o,a,u){await ge.updateStatus(a.id,{current_channel:"minio",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:a.id,final_status:"completed",current_channel:"minio"}),xr(o,u),o.progress=100,o.status="已上传到 MinIO,对方可直接领取",o.tone="success"}async function Yo(o,a){const u=ke.get(o);if(!(!(u!=null&&u.length)||!(a!=null&&a.remoteDescription))){ke.delete(o);for(const g of u)try{await a.addIceCandidate(g)}catch(k){console.error(k)}}}return me=async function(a,u){a.progress=Math.max(5,a.progress||0),a.status="正在切换到 MinIO...",a.tone="primary";try{ce("transfer.updated",h.value.deviceId,{transfer_id:a.transferId,final_status:"fallback_uploading",current_channel:"minio"});const g=await Ir(a,u,{onProgress:k=>{a.progress=Math.max(5,Math.min(k,99))}});await Sr(a,u,g)}catch(g){a.pending=!0,a.status=`上传失败:${g.message}`,a.tone="danger"}},pr=async function(a){const g=(a.payload||{}).description,k=a.device_id||"";if(!g||!k)return;M($n(k),!0);const A=await rt(k);if(!A)return;const se=dr(k),Rt=!ze&&(A.signalingState==="stable"||ue),Xo=g.type==="offer"&&!Rt;if(be=!se&&Xo,!be&&!(g.type==="answer"&&(A.signalingState!=="have-local-offer"||!A.localDescription))){try{ue=g.type==="answer",await A.setRemoteDescription(g),await Yo(k,A)}catch(fs){console.error(fs)}finally{ue=!1}if(g.type==="offer")try{await A.setLocalDescription(),ce("webrtc.description",k,{description:A.localDescription})}catch(fs){console.error(fs)}}},hr=async function(a){const u=a.payload||{},g=a.device_id||"",k=u.candidate;if(!k||!g)return;(n.value!=="transfer"||h.value.deviceId!==g)&&M($n(g),!0);const A=await rt(g);if(A){if(!A.remoteDescription){const se=ke.get(g)||[];se.push(k),ke.set(g,se);return}try{await A.addIceCandidate(k)}catch(se){be||console.error(se)}}},J=async function(a){const u=p.value.find(g=>g.id===a);if(!(!u||u.kind!=="file"||!u.pending)){if(!h.value.deviceId){window.alert("当前没有可用的接收端");return}u.pending=!1,u.status="创建传输中...",u.tone="primary";try{const g=await ge.create({kind:"file",name:u.name,size_bytes:u.sizeBytes,sender_device_id:E.value.id,receiver_device_id:h.value.deviceId});u.transferId=g.id;const k=g.fallback_allowed?Ir(u,g).catch(A=>{throw console.warn("minio backup sync failed",A),A}):Promise.resolve(null);ce("transfer.created",h.value.deviceId,{transfer_id:g.id,kind:"file",name:u.name,size_bytes:u.sizeBytes,sender_device_id:E.value.id,sender_name:E.value.name,sender_type:E.value.type,receiver_device_id:h.value.deviceId,final_status:"connecting",current_channel:"p2p",transport_options:os()});try{if(await rr(u,g),g.fallback_allowed){u.status="实时传输完成,正在同步云端备份...",u.tone="primary";try{const A=await k;A&&(xr(u,A),u.status="已发送,2 小时内可离线领取")}catch(A){u.status=`实时传输成功,但 MinIO 备份失败:${A.message}`,u.tone="danger";return}u.tone="success"}}catch(A){console.warn("realtime file send failed, fallback to minio",A);try{const se=await k;if(se){await Sr(u,g,se);return}}catch(se){console.warn("minio backup sync failed after realtime failure",se)}await ir(u,g)}}catch(g){u.pending=!0,u.status=`发送失败:${g.message}`,u.tone="danger"}}},yr=function(a){var se;const u=a.payload||{},g=a.device_id||u.sender_device_id||"",k={id:g,name:u.sender_name||((se=$t(g))==null?void 0:se.name)||`设备 ${Mt(g)}`,type:Bt(u.sender_type||"desktop"),connectionType:"等待实时数据"};if(M(k,!0),!p.value.find(Rt=>Rt.transferId===u.transfer_id)){if(u.kind==="text"){u.content&&p.value.push({id:Ue("incoming-text"),transferId:u.transfer_id,kind:"text",text:u.content||"",status:"已接收",tone:"success",copied:!1});return}p.value.push({id:Ue("incoming-file"),transferId:u.transfer_id,kind:"file",name:u.name||"file",size:Lt(Number(u.size_bytes||0)),sizeBytes:Number(u.size_bytes||0),status:"等待接收...",tone:"primary",progress:5,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}},_r=function(a){const u=a.payload||{},g=p.value.find(k=>k.transferId===u.transfer_id);if(g&&g.kind==="file"){if(u.final_status==="completed"){g.progress=100,g.status=g.downloadUrl?"可保存":"传输完成",g.tone="success";return}if(u.final_status==="cancelled"){g.status="已取消",g.tone="danger";return}u.final_status==="fallback_uploading"&&(g.status="发送端正在上传回退文件...",g.tone="primary")}},br=function(a){const u=a.payload||{};let g=p.value.find(k=>k.transferId===u.transfer_id);!g&&u.transfer_id&&(g={id:Ue("incoming-file"),transferId:u.transfer_id,kind:"file",name:u.name||"file",size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(g)),!(!g||g.kind!=="file")&&(Ut(g,u.download_url||u.data_url||"",!1),g.status="可保存",g.progress=100,g.tone="success")},(o,a)=>(j(),V("div",null,[y("div",qu,[q(Rc,{theme:t.value,onToggleTheme:Sn},null,8,["theme"]),n.value==="main"?(j(),V("div",Gu,[q(fu,{devices:r.value,"is-scanning":s.value,"local-device-name":E.value.name,onSelectDevice:P},null,8,["devices","is-scanning","local-device-name"]),q(Iu,{"generated-code":c.value,"is-waiting":l.value,"pending-downloads":f.value,"room-code-input":i.value,onCancelRoom:R,onCreateRoom:x,onJoinRoom:$,onUpdateRoomCode:d},null,8,["generated-code","is-waiting","pending-downloads","room-code-input"])])):Le("",!0),n.value==="transfer"?(j(),mt(Nu,{key:1,"connection-type":h.value.type,"has-pending-items":Ct.value,items:p.value,"network-hint":Ft.value,"peer-name":h.value.name,onClose:O,onCopyItem:Fe,onFilesSelected:ee,onRemoveItem:Ne,onSendAllPending:we,onSendText:W,onStartUpload:J},null,8,["connection-type","has-pending-items","items","network-hint","peer-name"])):Le("",!0),n.value==="admin"?(j(),mt(tu,{key:2,"file-limit":T.value,"minio-capacity":S.value,records:N.value,stats:U.value,onExit:ko,onSaveConfig:$o,"onUpdate:fileLimit":a[0]||(a[0]=u=>T.value=u),"onUpdate:minioCapacity":a[1]||(a[1]=u=>S.value=u)},null,8,["file-limit","minio-capacity","records","stats"])):Le("",!0)]),q(kc,{onRequestAdmin:To})]))}};Ic(nf).mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 6c8ad7f..8e2756f 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,7 +4,7 @@ AirShare Pro - + diff --git a/frontend/src/App.vue b/frontend/src/App.vue index fcb53bd..85fd5c7 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -302,6 +302,7 @@ async function loadPendingDownloads() { const downloads = await devicesApi.listPendingDownloads(localDevice.value.id) pendingDownloads.value = downloads.map((item) => ({ ...item, + name: normalizeDisplayName(item.name), download_path: item.download_path || `/api/transfers/${encodeURIComponent(item.transfer_id)}/fallback/download`, size_label: formatFileSize(Number(item.size_bytes || 0)), created_label: formatRelativeTime(item.created_at), @@ -551,7 +552,7 @@ function addFiles(files) { id: createId(`file-${index}`), kind: 'file', file, - name: file.name, + name: normalizeDisplayName(file.name), size: formatFileSize(file.size), sizeBytes: file.size, status: '待发送', @@ -1166,15 +1167,47 @@ function ensureDeviceId() { function ensureDeviceName(deviceId) { let deviceName = localStorage.getItem(DEVICE_NAME_KEY) - if (!deviceName) { - const platform = navigator.userAgentData?.platform || navigator.platform || 'Web' - deviceName = `${platform} ${deviceId.slice(0, 4)}` + if (!deviceName || isLegacyAutoDeviceName(deviceName, deviceId)) { + deviceName = `${detectDeviceLabel()} ${deviceId.slice(0, 4)}` localStorage.setItem(DEVICE_NAME_KEY, deviceName) } return deviceName } +function isLegacyAutoDeviceName(deviceName, deviceId) { + const value = String(deviceName || '').trim() + const suffix = deviceId.slice(0, 4) + if (!value || !suffix || !value.endsWith(` ${suffix}`)) { + return false + } + + return /^(android|iphone|ipad|linux|macintel|macos|windows|win32|web)\s/i.test(value) +} + +function detectDeviceLabel() { + const source = `${navigator.userAgent} ${navigator.platform}`.toLowerCase() + if (source.includes('iphone')) { + return 'iPhone' + } + if (source.includes('ipad')) { + return 'iPad' + } + if (source.includes('android')) { + return 'Android' + } + if (source.includes('windows') || source.includes('win32')) { + return 'Windows' + } + if (source.includes('mac os') || source.includes('macintosh') || source.includes('macintel')) { + return 'macOS' + } + if (source.includes('linux')) { + return 'Linux' + } + return 'Web' +} + function detectDeviceType() { const source = `${navigator.userAgent} ${navigator.platform}`.toLowerCase() if (source.includes('iphone') || source.includes('android') || source.includes('mobile')) { @@ -1186,6 +1219,23 @@ function detectDeviceType() { return 'desktop' } +function normalizeDisplayName(value, fallback = 'file') { + const raw = String(value || '').trim() + if (!raw) { + return fallback + } + + if (!/%[0-9A-Fa-f]{2}/.test(raw)) { + return raw + } + + try { + return decodeURIComponent(raw) + } catch { + return raw + } +} + function mapDeviceIcon(type) { if (type === 'phone') { return 'smartphone' @@ -1600,7 +1650,7 @@ function handleIncomingRealtimeFileMeta(payload) { ensurePeerSession(sender, true) incomingFileBuffers.set(payload.transfer_id, { - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), mimeType: payload.mime_type || 'application/octet-stream', sizeBytes: Number(payload.size_bytes || 0), receivedBytes: 0, @@ -1613,7 +1663,7 @@ function handleIncomingRealtimeFileMeta(payload) { id: createId('incoming-file'), transferId: payload.transfer_id, kind: 'file', - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), size: formatFileSize(Number(payload.size_bytes || 0)), sizeBytes: Number(payload.size_bytes || 0), status: '正在接收...', @@ -1965,7 +2015,7 @@ function handleIncomingTransferCreated(envelope) { id: createId('incoming-file'), transferId: payload.transfer_id, kind: 'file', - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), size: formatFileSize(Number(payload.size_bytes || 0)), sizeBytes: Number(payload.size_bytes || 0), status: '接收中...', @@ -2010,7 +2060,7 @@ function handleIncomingTransferFile(envelope) { id: createId('incoming-file'), transferId: payload.transfer_id, kind: 'file', - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), size: '', sizeBytes: 0, status: '可保存', @@ -2742,7 +2792,7 @@ handleIncomingTransferCreated = function handleIncomingTransferCreatedOverride(e id: createId('incoming-file'), transferId: payload.transfer_id, kind: 'file', - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), size: formatFileSize(Number(payload.size_bytes || 0)), sizeBytes: Number(payload.size_bytes || 0), status: '等待接收...', @@ -2791,7 +2841,7 @@ handleIncomingTransferFile = function handleIncomingTransferFileOverride(envelop id: createId('incoming-file'), transferId: payload.transfer_id, kind: 'file', - name: payload.name || 'file', + name: normalizeDisplayName(payload.name, 'file'), size: '', sizeBytes: 0, status: '可保存',