diff --git a/frontend/dist/assets/index-BoiTbES-.js b/frontend/dist/assets/index-BoiTbES-.js deleted file mode 100644 index 4f7d958..0000000 --- a/frontend/dist/assets/index-BoiTbES-.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 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-C-7tVt-S.css b/frontend/dist/assets/index-qzWUgf-t.css similarity index 87% rename from frontend/dist/assets/index-C-7tVt-S.css rename to frontend/dist/assets/index-qzWUgf-t.css index 786ed78..159be52 100644 --- a/frontend/dist/assets/index-C-7tVt-S.css +++ b/frontend/dist/assets/index-qzWUgf-t.css @@ -1 +1 @@ -:root{--bg-color: #09090b;--card-bg: rgba(24, 24, 27, .65);--card-border: rgba(255, 255, 255, .08);--card-shadow: 0 20px 40px -10px rgba(0, 0, 0, .5), 0 0 2px rgba(255, 255, 255, .05) inset;--text-main: #f4f4f5;--text-secondary: #a1a1aa;--item-bg: rgba(255, 255, 255, .03);--item-bg-hover: rgba(255, 255, 255, .06);--item-border: rgba(255, 255, 255, .05);--icon-bg: rgba(255, 255, 255, .05);--input-bg: rgba(0, 0, 0, .3);--divider-color: rgba(255, 255, 255, .15);--divider-line: rgba(255, 255, 255, .08);--glow-1: rgba(0, 113, 227, .15);--glow-2: rgba(34, 211, 238, .12);--glow-3: rgba(168, 85, 247, .1);--accent-blue: #0a84ff;--accent-cyan: #30d158;--accent-cyan-light: rgba(10, 132, 255, .2);--success-green: #30d158;--danger-red: #ff453a;--border-radius-lg: 28px;--border-radius-sm: 18px;--transition-base: all .4s cubic-bezier(.2, .8, .2, 1);--font-stack: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", Roboto, sans-serif}body[data-theme=light]{--bg-color: #f2f4f8;--card-bg: rgba(255, 255, 255, .85);--card-border: rgba(255, 255, 255, 1);--card-shadow: 0 10px 30px -5px rgba(12, 43, 100, .08), 0 4px 10px -3px rgba(12, 43, 100, .04), 0 0 1px rgba(0, 0, 0, .05);--text-main: #1d1d1f;--text-secondary: #86868b;--item-bg: #ffffff;--item-bg-hover: #f8fafd;--item-border: rgba(0, 0, 0, .04);--icon-bg: #f5f5f7;--input-bg: #ffffff;--divider-color: #86868b;--divider-line: #e5e5ea;--glow-1: rgba(0, 113, 227, .05);--glow-2: rgba(34, 211, 238, .05);--glow-3: rgba(168, 85, 247, .03);--accent-blue: #0071e3;--accent-cyan: #0071e3;--accent-cyan-light: rgba(0, 113, 227, .1);--success-green: #34c759;--danger-red: #ff3b30}*{box-sizing:border-box;margin:0;padding:0;outline:none}html,body,#app{min-height:100%}body{font-family:var(--font-stack);background-color:var(--bg-color);color:var(--text-main);display:flex;justify-content:center;align-items:center;min-height:100vh;padding:20px 20px 100px;position:relative;overflow-x:hidden;overflow-y:auto;transition:background-color .5s ease,color .5s ease;-webkit-font-smoothing:antialiased}body:before{content:"";position:fixed;top:-25%;right:-25%;bottom:-25%;left:-25%;width:150%;height:150%;z-index:-1;background-image:radial-gradient(circle at 20% 20%,var(--glow-1) 0%,transparent 50%),radial-gradient(circle at 80% 20%,var(--glow-2) 0%,transparent 40%),radial-gradient(circle at 50% 80%,var(--glow-3) 0%,transparent 60%);animation:backgroundMove 25s infinite alternate ease-in-out}body,button,input{font:inherit}button{border:0;color:inherit}a{color:inherit}.app-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;line-height:1}.app-icon svg{width:100%;height:100%;overflow:visible}.container{width:100%;max-width:1000px;margin:auto;position:relative;z-index:1;transition:var(--transition-base)}.header{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:80px;margin-top:30px;margin-bottom:40px;text-align:center}.header h1{font-size:42px;font-weight:800;letter-spacing:-1px;margin-bottom:8px}.header p{color:var(--text-secondary);font-size:16px;font-weight:400;letter-spacing:.5px}.theme-toggle{position:absolute;top:50%;right:0;width:44px;height:44px;margin-top:-22px;border-radius:50%;background:var(--card-bg);border:1px solid var(--card-border);color:var(--text-main);box-shadow:var(--card-shadow);cursor:pointer;display:flex;justify-content:center;align-items:center;transition:var(--transition-base);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.theme-toggle:hover{transform:scale(1.08);box-shadow:0 8px 25px #0071e326}.main-grid{display:grid;grid-template-columns:1fr;gap:30px}.card{position:relative;display:flex;flex-direction:column;padding:40px 30px;background:var(--card-bg);border:1px solid var(--card-border);border-radius:var(--border-radius-lg);box-shadow:var(--card-shadow);transition:var(--transition-base);backdrop-filter:blur(40px) saturate(150%);-webkit-backdrop-filter:blur(40px) saturate(150%)}.card:before{content:"";position:absolute;inset:0 0 auto;height:1px;border-radius:var(--border-radius-lg) var(--border-radius-lg) 0 0;opacity:.5;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0)}.section-title{margin-bottom:25px;text-align:center;font-size:12px;font-weight:700;color:var(--text-secondary);text-transform:uppercase;letter-spacing:2px}.local-device-name{margin-top:-10px;margin-bottom:18px;text-align:center;font-size:13px;color:var(--text-secondary)}.local-device-name strong{color:var(--text-main);font-weight:600}.radar-container,.waiting-area{flex:1;min-height:200px;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.radar{position:relative;width:80px;height:80px;margin-bottom:25px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--accent-cyan-light);border:1px solid rgba(0,113,227,.1);box-shadow:0 0 20px var(--accent-cyan-light)}.radar:before,.radar:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;border:2px solid var(--accent-blue);opacity:0;animation:ripplePro 3s infinite cubic-bezier(.1,.8,.3,1)}.radar:before{animation-delay:1.5s}.radar-icon{font-size:36px;color:var(--accent-blue)}.scan-status,.waiting-subtitle{margin-top:10px;font-size:14px;color:var(--text-secondary)}.device-list{width:100%;flex:1;display:flex;flex-direction:column;gap:12px}.device-item{position:relative;width:100%;display:flex;align-items:center;padding:16px 20px;background:var(--item-bg);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;cursor:pointer;color:var(--text-main);text-align:left;transition:var(--transition-base)}.device-item:hover{background:var(--item-bg-hover);transform:translateY(-2px);border-color:#0071e34d;box-shadow:0 8px 20px -5px #0071e326,0 0 0 1px #0071e31a inset}.device-icon{width:48px;height:48px;margin-right:16px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--icon-bg);border:1px solid var(--item-border);transition:var(--transition-base)}.device-info{flex:1}.device-status-beacon{position:absolute;top:50%;right:22px;width:14px;height:14px;transform:translateY(-50%);pointer-events:none}.device-status-dot,.device-status-ring{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%}.device-status-dot{top:3px;right:3px;bottom:3px;left:3px;background:var(--accent-blue);box-shadow:0 0 0 1px #ffffffbf,0 0 14px #0a84ff47}.device-status-ring{border:2px solid rgba(10,132,255,.22);opacity:0;transform:scale(.7);animation:deviceBeaconPing 2s infinite cubic-bezier(.16,.84,.44,1)}.device-status-ring-delay{animation-delay:1s}.device-icon .app-icon{position:relative;z-index:1;color:var(--text-main)}.device-item:hover .device-icon{background:var(--accent-cyan-light);border-color:transparent}.device-item:hover .device-icon .app-icon{color:var(--accent-blue)}.device-item:hover .device-status-dot{box-shadow:0 0 0 1px #ffffffd9,0 0 18px #0a84ff5c}.device-item:hover .device-status-ring{border-color:#0a84ff4d;animation-duration:1.4s}.device-info h4{margin-bottom:4px;font-size:16px;font-weight:600;color:var(--text-main)}.device-info p{font-size:13px;color:var(--text-secondary)}.room-action-area{flex:1;display:flex;flex-direction:column;justify-content:center}.btn-create{width:100%;margin-bottom:25px;padding:18px;display:flex;align-items:center;justify-content:center;gap:8px;background:var(--item-bg);color:var(--accent-blue);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;font-size:16px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-create:hover{background:var(--item-bg-hover);border-color:#0071e34d;transform:translateY(-2px);box-shadow:0 8px 20px -5px #0071e326}.divider{position:relative;margin-bottom:25px;text-align:center;color:var(--divider-color);font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:1px}.divider:before,.divider:after{content:"";position:absolute;top:50%;width:35%;height:1px;background:var(--divider-line)}.divider:before{left:0}.divider:after{right:0}.room-input-group{display:flex;flex-direction:column;gap:12px}.pending-downloads{margin-top:22px;padding:16px 10px 16px 16px;border:1px solid var(--item-border);border-radius:var(--border-radius-sm);background:var(--item-bg);max-height:236px;overflow-y:auto}.pending-downloads::-webkit-scrollbar{width:6px}.pending-downloads::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:999px}.pending-downloads-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--text-secondary);position:sticky;top:0;z-index:1;background:var(--item-bg);padding-bottom:8px}.pending-download-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-width:0;box-sizing:border-box;padding:12px 14px;border-radius:16px;background:var(--input-bg);border:1px solid var(--item-border);text-decoration:none;transition:var(--transition-base)}.pending-download-item+.pending-download-item{margin-top:10px}.pending-download-item:hover{background:var(--item-bg-hover);border-color:#0071e340;color:var(--accent-blue)}.pending-download-copy{flex:1;min-width:0;overflow:hidden}.pending-download-copy strong{display:-webkit-box;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.35;max-height:2.7em;font-size:14px;font-weight:600;color:var(--text-main)}.pending-download-copy p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--text-secondary)}.pending-download-icon{flex:none}input.room-code,.text-input-group input,.text-input-group textarea{width:100%;min-width:0;padding:18px;border:1px solid var(--item-border);border-radius:var(--border-radius-sm);background:var(--input-bg);color:var(--text-main);box-shadow:inset 0 2px 4px #00000005;transition:var(--transition-base)}input.room-code{font-size:24px;font-weight:700;text-align:center;letter-spacing:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}input.room-code:focus,.text-input-group input:focus,.text-input-group textarea:focus{background:var(--item-bg);border-color:var(--accent-blue);box-shadow:0 0 0 3px var(--accent-cyan-light)}input.room-code::placeholder{letter-spacing:normal;font-size:16px;font-weight:400;color:var(--text-secondary);opacity:.6}.btn-primary{width:100%;padding:18px;background:var(--accent-blue);color:#fff;border-radius:var(--border-radius-sm);box-shadow:0 4px 12px #0071e34d;font-size:16px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-primary:hover,.text-input-group button:hover{background:#06c;transform:translateY(-2px);box-shadow:0 6px 16px #0071e366}.huge-code{margin:15px 0 25px;padding:15px 30px;font-size:56px;font-weight:800;color:var(--accent-blue);letter-spacing:10px;font-family:ui-monospace,monospace;border-radius:20px;border:1px solid rgba(0,113,227,.2);background:var(--accent-cyan-light)}.spinner{width:28px;height:28px;margin:0 auto 15px;border-radius:50%;border:3px solid var(--item-border);border-top-color:var(--accent-blue);animation:spin .8s linear infinite}.waiting-tip{font-size:14px;font-weight:500;color:var(--accent-blue)}.btn-cancel{margin-top:25px;background:none;color:var(--text-secondary);font-size:14px;cursor:pointer;transition:var(--transition-base)}.btn-cancel:hover{color:var(--text-main)}.transfer-panel,.admin-panel{width:100%;margin:0 auto;opacity:0;transform:scale(.95);animation:showPanelPro .5s forwards cubic-bezier(.2,.8,.2,1)}.transfer-panel{max-width:650px}.transfer-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid var(--divider-line)}.connected-to h2{margin-bottom:4px;font-size:20px;font-weight:700;color:var(--text-main)}.connected-to p{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:500;color:var(--success-green)}.connection-hint{display:block;margin-top:8px;max-width:42ch;font-size:12px;line-height:1.5;color:var(--text-secondary)}.close-btn{width:36px;height:36px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--icon-bg);border:1px solid var(--item-border);color:var(--text-secondary);cursor:pointer;transition:var(--transition-base)}.close-btn:hover{background:var(--item-bg-hover);color:var(--text-main);transform:rotate(90deg)}.drop-zone{padding:40px 30px;margin-bottom:20px;text-align:center;background:var(--input-bg);border:2px dashed var(--divider-color);border-radius:var(--border-radius-sm);cursor:pointer;transition:var(--transition-base)}.drop-zone:hover,.drop-zone-active{border-color:var(--accent-blue);background-color:var(--accent-cyan-light)}.drop-zone-icon{margin-bottom:12px;font-size:42px;color:var(--text-secondary);transition:var(--transition-base)}.drop-zone:hover .drop-zone-icon,.drop-zone-active .drop-zone-icon{transform:translateY(-5px);color:var(--accent-blue)}.drop-zone-text{font-size:15px;font-weight:500;color:var(--text-main)}.text-input-group{display:flex;gap:12px;margin-bottom:20px}.text-input-group input{flex:1;padding:16px 20px;font-size:15px}.text-input-group button{width:52px;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-sm);background:var(--accent-blue);color:#fff;box-shadow:0 4px 12px #0071e34d;cursor:pointer;transition:var(--transition-base)}.batch-actions{display:flex;justify-content:flex-end;margin-bottom:12px;height:0;overflow:hidden;opacity:0;pointer-events:none;transition:var(--transition-base)}.batch-actions.active{height:36px;overflow:visible;opacity:1;pointer-events:auto}.btn-small-primary{display:flex;align-items:center;gap:6px;padding:8px 16px;background:var(--item-bg);color:var(--text-main);border:1px solid var(--item-border);border-radius:12px;box-shadow:0 2px 6px #0000000a;font-size:13px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-small-primary:hover{background:var(--item-bg-hover);color:var(--accent-blue);border-color:#0071e34d;transform:translateY(-1px)}.batch-progress-container{max-height:280px;overflow-y:auto;padding-right:8px;padding-bottom:10px;text-align:left}.batch-progress-container::-webkit-scrollbar{width:6px}.batch-progress-container::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:4px}.batch-item{margin-bottom:12px;width:100%;min-width:0;box-sizing:border-box;padding:16px;background:var(--item-bg);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;transition:all .3s ease}.batch-item:hover{border-color:#00000014;box-shadow:0 4px 12px #0000000a}body[data-theme=dark] .batch-item:hover{border-color:#ffffff1a}.file-info{display:flex;justify-content:space-between;align-items:center;gap:10px;min-width:0;margin-bottom:12px;font-size:14px}.file-info-left{flex:1;min-width:0;max-width:60%;display:flex;align-items:center;gap:10px;overflow:hidden}.file-icon-wrapper{flex:none;width:32px;height:32px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:var(--icon-bg);color:var(--accent-blue)}.file-name{display:-webkit-box;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.35;max-height:2.7em;font-weight:500;color:var(--text-main)}.file-info-right{display:flex;flex:none;align-items:center;min-width:0;gap:8px}.file-status{margin-right:4px;white-space:nowrap;font-size:12px;font-weight:500;font-variant-numeric:tabular-nums}.action-btn{width:28px;height:28px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:transparent;border:1px solid transparent;color:var(--text-secondary);cursor:pointer;transition:var(--transition-base)}.action-btn:hover{color:var(--text-main);background:var(--icon-bg);border-color:var(--item-border)}.action-btn.primary:hover{color:var(--accent-blue);background:var(--accent-cyan-light)}.action-btn.danger:hover{color:var(--danger-red);background:#ff3b301a}.progress-bar-container{height:6px;overflow:hidden;background:var(--icon-bg);border-radius:4px}.progress-bar-fill{height:100%;width:0;background:var(--accent-blue);border-radius:4px;transition:width .1s linear}.progress-bar-fill.success{background:var(--success-green)}.admin-header-card{margin-bottom:30px;padding:30px}.transfer-head-compact{margin-bottom:0;padding-bottom:0;border-bottom:0}.admin-title{font-size:24px;color:var(--text-main)}.connected-to .admin-subtitle{display:block;margin-top:4px;color:var(--text-secondary)}.admin-summary-grid{margin-bottom:30px}.admin-stats-card{height:100%}.admin-stats-panel{display:flex;flex-direction:column;height:100%}.admin-stats-row{flex:1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:12px}.admin-stat-item{display:flex;flex-direction:column;justify-content:space-between;min-height:0;padding:16px 15px;text-align:left;border:1px solid var(--item-border);border-radius:20px;background:var(--item-bg);box-shadow:0 8px 24px -18px #0c2b6433}.admin-stat-item-fluid{grid-column:1 / -1;min-height:142px;padding:0;border:0;background:transparent;box-shadow:none}.admin-fluid-card{position:relative;isolation:isolate;display:flex;height:100%;min-height:0;overflow:hidden;padding:0;border:1px solid rgba(123,166,255,.5);border-radius:16px;background-color:#edf1f9;box-shadow:0 8px 24px #0000000a}.admin-fluid-fill{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}.admin-fluid-wave{position:absolute;left:50%;top:calc(100% - var(--fluid-level));width:2500px;height:2500px;transform:translate(-50%);transform-origin:50% 50%;transition:top .8s cubic-bezier(.4,0,.2,1)}.admin-fluid-wave-a{background-color:#afc8f599;border-radius:48.5%;animation:fluidSpin 20s linear infinite}.admin-fluid-wave-b{background-color:#91b2ebe0;border-radius:49%;animation:fluidSpin 25s linear infinite;animation-delay:-10s}.admin-fluid-content{position:relative;z-index:1;display:flex;align-items:center;gap:18px;width:100%;min-height:110px;padding:24px}.admin-fluid-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;flex:none;border-radius:14px;background-color:#d7e1f4;color:#3b60c4;box-shadow:none}.admin-fluid-copy{min-width:0;flex:1}.admin-fluid-copy h3{margin:0 0 8px;font-size:22px;font-weight:600;line-height:1.15;color:#333}.admin-fluid-copy p{margin:0;font-size:13px;color:#778299}.admin-fluid-copy small{display:block;margin-top:10px;font-size:12px;color:var(--text-secondary)}.admin-stat-kicker{font-size:11px;font-weight:700;letter-spacing:.08em;color:var(--text-secondary)}.admin-stat-item h3{margin-top:10px;margin-bottom:6px;font-size:34px;font-weight:800;font-family:ui-monospace,monospace;line-height:1}.admin-stat-item p{font-size:13px;font-weight:500;color:var(--text-secondary)}.stat-suffix{font-size:16px}.admin-config-stack{display:flex;flex-direction:column;height:100%;gap:15px}.admin-config-card{height:100%}.admin-config-row{margin-bottom:0}.admin-config-row-field{flex-direction:column;align-items:stretch}.admin-config-row-last{margin-bottom:0}.admin-field-meta{display:flex;flex-direction:column;gap:6px}.admin-field-label{font-size:13px;font-weight:700;letter-spacing:.04em;color:var(--text-main)}.admin-field-hint{font-size:12px;line-height:1.5;color:var(--text-secondary)}.admin-field-control-row{display:flex;gap:12px}.admin-field-control-row input{flex:1}.admin-config-insights{display:flex;flex:1;flex-direction:column;gap:14px}.admin-config-highlight{padding:18px 20px;border:1px solid var(--item-border);border-radius:22px;background:linear-gradient(145deg,var(--item-bg-hover),var(--item-bg));box-shadow:0 16px 30px -24px #0c2b6459}.admin-config-badge{display:inline-flex;align-items:center;padding:6px 10px;border-radius:999px;background:var(--accent-cyan-light);color:var(--accent-blue);font-size:11px;font-weight:700;letter-spacing:.12em}.admin-config-highlight h3{margin-top:14px;margin-bottom:8px;font-size:30px;font-weight:800;font-family:ui-monospace,monospace;color:var(--text-main)}.admin-config-highlight p{font-size:13px;line-height:1.7;color:var(--text-secondary)}.admin-table-card{min-height:0}.admin-table-wrapper{max-height:420px;overflow-x:auto;overflow-y:auto;border-radius:18px}.admin-table-wrapper::-webkit-scrollbar{width:8px;height:8px}.admin-table-wrapper::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:999px}.admin-table{width:100%;margin-top:10px;border-collapse:collapse;font-size:14px;text-align:left}.admin-table th{position:sticky;top:0;z-index:1;padding:14px 12px;color:var(--text-secondary);border-bottom:1px solid var(--divider-line);background:var(--card-bg);font-weight:600;white-space:nowrap}.admin-table td{padding:14px 12px;color:var(--text-main);border-bottom:1px solid var(--item-border)}.admin-table tbody tr:last-child td{border-bottom:0}.admin-table tr:hover td{background-color:var(--item-bg-hover)}.hidden{display:none!important}.footer{position:absolute;right:0;bottom:24px;left:0;text-align:center;font-size:13px;color:var(--text-secondary);opacity:.6;line-height:1.8;letter-spacing:.5px;transition:var(--transition-base)}.footer:hover{opacity:1}.footer .divider-line{margin:0 8px;opacity:.5}.footer a{text-decoration:none}.footer a:hover{color:var(--text-main)}#admin-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}@keyframes backgroundMove{0%{transform:scale(1) translate(0)}to{transform:scale(1.05) translate(2%,2%)}}@keyframes ripplePro{0%{transform:scale(.8);opacity:0}20%{opacity:.5}to{transform:scale(3);opacity:0}}@keyframes deviceBeaconPing{0%{opacity:0;transform:scale(.7)}22%{opacity:.9}to{opacity:0;transform:scale(2.8)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes showPanelPro{to{opacity:1;transform:scale(1)}}@keyframes fluidSpin{0%{transform:translate(-50%) rotate(0)}to{transform:translate(-50%) rotate(360deg)}}@media (min-width: 768px){.main-grid{grid-template-columns:1fr 1fr;gap:40px}}@media (min-width: 1024px){.container{max-width:1000px;padding:40px 0}.header h1{font-size:48px}.card{padding:40px}.btn-create,.btn-primary,input.room-code{padding:18px}.transfer-panel{max-width:700px}}@media (max-width: 767px){.admin-stats-row{grid-template-columns:1fr;grid-template-rows:none}.file-info,.file-info-right{align-items:flex-start}.file-info{flex-direction:column}.file-info-left,.file-info-right{max-width:100%;width:100%}.file-info-right{flex-wrap:wrap;row-gap:8px;justify-content:flex-end}.file-status{max-width:100%;overflow:hidden;text-overflow:ellipsis}}@media (max-width: 600px){body{padding-inline:16px}.theme-toggle{position:fixed;top:auto;right:20px;bottom:30px;width:50px;height:50px;margin-top:0;box-shadow:0 10px 30px #00000026}.card,.admin-header-card{padding:28px 22px}.header{margin-bottom:28px}.header h1{font-size:36px}.huge-code{width:100%;font-size:44px;letter-spacing:8px}.text-input-group{flex-direction:column}.text-input-group button{width:100%;min-height:52px}} +:root{--bg-color: #09090b;--card-bg: rgba(24, 24, 27, .65);--card-border: rgba(255, 255, 255, .08);--card-shadow: 0 20px 40px -10px rgba(0, 0, 0, .5), 0 0 2px rgba(255, 255, 255, .05) inset;--text-main: #f4f4f5;--text-secondary: #a1a1aa;--item-bg: rgba(255, 255, 255, .03);--item-bg-hover: rgba(255, 255, 255, .06);--item-border: rgba(255, 255, 255, .05);--icon-bg: rgba(255, 255, 255, .05);--input-bg: rgba(0, 0, 0, .3);--divider-color: rgba(255, 255, 255, .15);--divider-line: rgba(255, 255, 255, .08);--glow-1: rgba(0, 113, 227, .15);--glow-2: rgba(34, 211, 238, .12);--glow-3: rgba(168, 85, 247, .1);--accent-blue: #0a84ff;--accent-cyan: #30d158;--accent-cyan-light: rgba(10, 132, 255, .2);--success-green: #30d158;--danger-red: #ff453a;--border-radius-lg: 28px;--border-radius-sm: 18px;--transition-base: all .4s cubic-bezier(.2, .8, .2, 1);--font-stack: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", Roboto, sans-serif}body[data-theme=light]{--bg-color: #f2f4f8;--card-bg: rgba(255, 255, 255, .85);--card-border: rgba(255, 255, 255, 1);--card-shadow: 0 10px 30px -5px rgba(12, 43, 100, .08), 0 4px 10px -3px rgba(12, 43, 100, .04), 0 0 1px rgba(0, 0, 0, .05);--text-main: #1d1d1f;--text-secondary: #86868b;--item-bg: #ffffff;--item-bg-hover: #f8fafd;--item-border: rgba(0, 0, 0, .04);--icon-bg: #f5f5f7;--input-bg: #ffffff;--divider-color: #86868b;--divider-line: #e5e5ea;--glow-1: rgba(0, 113, 227, .05);--glow-2: rgba(34, 211, 238, .05);--glow-3: rgba(168, 85, 247, .03);--accent-blue: #0071e3;--accent-cyan: #0071e3;--accent-cyan-light: rgba(0, 113, 227, .1);--success-green: #34c759;--danger-red: #ff3b30}*{box-sizing:border-box;margin:0;padding:0;outline:none}html,body,#app{min-height:100%}body{font-family:var(--font-stack);background-color:var(--bg-color);color:var(--text-main);display:flex;justify-content:center;align-items:center;min-height:100vh;padding:20px 20px 100px;position:relative;overflow-x:hidden;overflow-y:auto;transition:background-color .5s ease,color .5s ease;-webkit-font-smoothing:antialiased}body:before{content:"";position:fixed;top:-25%;right:-25%;bottom:-25%;left:-25%;width:150%;height:150%;z-index:-1;background-image:radial-gradient(circle at 20% 20%,var(--glow-1) 0%,transparent 50%),radial-gradient(circle at 80% 20%,var(--glow-2) 0%,transparent 40%),radial-gradient(circle at 50% 80%,var(--glow-3) 0%,transparent 60%);animation:backgroundMove 25s infinite alternate ease-in-out}body,button,input{font:inherit}button{border:0;color:inherit}a{color:inherit}.app-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;line-height:1}.app-icon svg{width:100%;height:100%;overflow:visible}.container{width:100%;max-width:1000px;margin:auto;position:relative;z-index:1;transition:var(--transition-base)}.header{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:80px;margin-top:30px;margin-bottom:40px;text-align:center}.header h1{font-size:42px;font-weight:800;letter-spacing:-1px;margin-bottom:8px}.header p{color:var(--text-secondary);font-size:16px;font-weight:400;letter-spacing:.5px}.theme-toggle{position:absolute;top:50%;right:0;width:44px;height:44px;margin-top:-22px;border-radius:50%;background:var(--card-bg);border:1px solid var(--card-border);color:var(--text-main);box-shadow:var(--card-shadow);cursor:pointer;display:flex;justify-content:center;align-items:center;transition:var(--transition-base);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.theme-toggle:hover{transform:scale(1.08);box-shadow:0 8px 25px #0071e326}.main-grid{display:grid;grid-template-columns:1fr;gap:30px}.card{position:relative;display:flex;flex-direction:column;padding:40px 30px;background:var(--card-bg);border:1px solid var(--card-border);border-radius:var(--border-radius-lg);box-shadow:var(--card-shadow);transition:var(--transition-base);backdrop-filter:blur(40px) saturate(150%);-webkit-backdrop-filter:blur(40px) saturate(150%)}.card:before{content:"";position:absolute;inset:0 0 auto;height:1px;border-radius:var(--border-radius-lg) var(--border-radius-lg) 0 0;opacity:.5;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0)}.section-title{margin-bottom:25px;text-align:center;font-size:12px;font-weight:700;color:var(--text-secondary);text-transform:uppercase;letter-spacing:2px}.local-device-name{margin-top:-10px;margin-bottom:18px;text-align:center;font-size:13px;color:var(--text-secondary)}.local-device-name strong{color:var(--text-main);font-weight:600}.radar-container,.waiting-area{flex:1;min-height:200px;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.radar{position:relative;width:80px;height:80px;margin-bottom:25px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--accent-cyan-light);border:1px solid rgba(0,113,227,.1);box-shadow:0 0 20px var(--accent-cyan-light)}.radar:before,.radar:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;border:2px solid var(--accent-blue);opacity:0;animation:ripplePro 3s infinite cubic-bezier(.1,.8,.3,1)}.radar:before{animation-delay:1.5s}.radar-icon{font-size:36px;color:var(--accent-blue)}.scan-status,.waiting-subtitle{margin-top:10px;font-size:14px;color:var(--text-secondary)}.device-list{width:100%;flex:1;display:flex;flex-direction:column;gap:12px}.device-item{position:relative;width:100%;display:flex;align-items:center;padding:16px 20px;background:var(--item-bg);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;cursor:pointer;color:var(--text-main);text-align:left;transition:var(--transition-base)}.device-item:hover{background:var(--item-bg-hover);transform:translateY(-2px);border-color:#0071e34d;box-shadow:0 8px 20px -5px #0071e326,0 0 0 1px #0071e31a inset}.device-icon{width:48px;height:48px;margin-right:16px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--icon-bg);border:1px solid var(--item-border);transition:var(--transition-base)}.device-info{flex:1}.device-status-beacon{position:absolute;top:50%;right:22px;width:14px;height:14px;transform:translateY(-50%);pointer-events:none}.device-status-dot,.device-status-ring{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%}.device-status-dot{top:3px;right:3px;bottom:3px;left:3px;background:var(--accent-blue);box-shadow:0 0 0 1px #ffffffbf,0 0 14px #0a84ff47}.device-status-ring{border:2px solid rgba(10,132,255,.22);opacity:0;transform:scale(.7);animation:deviceBeaconPing 2s infinite cubic-bezier(.16,.84,.44,1)}.device-status-ring-delay{animation-delay:1s}.device-icon .app-icon{position:relative;z-index:1;color:var(--text-main)}.device-item:hover .device-icon{background:var(--accent-cyan-light);border-color:transparent}.device-item:hover .device-icon .app-icon{color:var(--accent-blue)}.device-item:hover .device-status-dot{box-shadow:0 0 0 1px #ffffffd9,0 0 18px #0a84ff5c}.device-item:hover .device-status-ring{border-color:#0a84ff4d;animation-duration:1.4s}.device-info h4{margin-bottom:4px;font-size:16px;font-weight:600;color:var(--text-main)}.device-info p{font-size:13px;color:var(--text-secondary)}.room-action-area{flex:1;display:flex;flex-direction:column;justify-content:center}.btn-create{width:100%;margin-bottom:25px;padding:18px;display:flex;align-items:center;justify-content:center;gap:8px;background:var(--item-bg);color:var(--accent-blue);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;font-size:16px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-create:hover{background:var(--item-bg-hover);border-color:#0071e34d;transform:translateY(-2px);box-shadow:0 8px 20px -5px #0071e326}.divider{position:relative;margin-bottom:25px;text-align:center;color:var(--divider-color);font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:1px}.divider:before,.divider:after{content:"";position:absolute;top:50%;width:35%;height:1px;background:var(--divider-line)}.divider:before{left:0}.divider:after{right:0}.room-input-group{display:flex;flex-direction:column;gap:12px}.pending-downloads{margin-top:22px;padding:16px 10px 16px 16px;border:1px solid var(--item-border);border-radius:var(--border-radius-sm);background:var(--item-bg);max-height:236px;overflow-y:auto}.pending-downloads::-webkit-scrollbar{width:6px}.pending-downloads::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:999px}.pending-downloads-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--text-secondary);position:sticky;top:0;z-index:1;background:var(--item-bg);padding-bottom:8px}.pending-download-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-width:0;box-sizing:border-box;padding:12px 14px;border-radius:16px;background:var(--input-bg);border:1px solid var(--item-border);text-decoration:none;transition:var(--transition-base)}.pending-download-item+.pending-download-item{margin-top:10px}.pending-download-item:hover{background:var(--item-bg-hover);border-color:#0071e340;color:var(--accent-blue)}.pending-download-copy{flex:1;min-width:0;overflow:hidden}.pending-download-copy strong{display:-webkit-box;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.35;max-height:2.7em;font-size:14px;font-weight:600;color:var(--text-main)}.pending-download-copy p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--text-secondary)}.pending-download-icon{flex:none}input.room-code,.text-input-group input,.text-input-group textarea{width:100%;min-width:0;padding:18px;border:1px solid var(--item-border);border-radius:var(--border-radius-sm);background:var(--input-bg);color:var(--text-main);box-shadow:inset 0 2px 4px #00000005;transition:var(--transition-base)}input.room-code{font-size:24px;font-weight:700;text-align:center;letter-spacing:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}input.room-code:focus,.text-input-group input:focus,.text-input-group textarea:focus{background:var(--item-bg);border-color:var(--accent-blue);box-shadow:0 0 0 3px var(--accent-cyan-light)}input.room-code::placeholder{letter-spacing:normal;font-size:16px;font-weight:400;color:var(--text-secondary);opacity:.6}.btn-primary{width:100%;padding:18px;background:var(--accent-blue);color:#fff;border-radius:var(--border-radius-sm);box-shadow:0 4px 12px #0071e34d;font-size:16px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-primary:hover,.text-input-group button:hover{background:#06c;transform:translateY(-2px);box-shadow:0 6px 16px #0071e366}.huge-code{margin:15px 0 25px;padding:15px 30px;font-size:56px;font-weight:800;color:var(--accent-blue);letter-spacing:10px;font-family:ui-monospace,monospace;border-radius:20px;border:1px solid rgba(0,113,227,.2);background:var(--accent-cyan-light)}.spinner{width:28px;height:28px;margin:0 auto 15px;border-radius:50%;border:3px solid var(--item-border);border-top-color:var(--accent-blue);animation:spin .8s linear infinite}.waiting-tip{font-size:14px;font-weight:500;color:var(--accent-blue)}.btn-cancel{margin-top:25px;background:none;color:var(--text-secondary);font-size:14px;cursor:pointer;transition:var(--transition-base)}.btn-cancel:hover{color:var(--text-main)}.transfer-panel,.admin-panel{width:100%;margin:0 auto;opacity:0;transform:scale(.95);animation:showPanelPro .5s forwards cubic-bezier(.2,.8,.2,1)}.transfer-panel{max-width:650px}.transfer-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid var(--divider-line)}.connected-to h2{margin-bottom:4px;font-size:20px;font-weight:700;color:var(--text-main)}.connected-to p{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:500;color:var(--success-green)}.connection-hint{display:block;margin-top:8px;max-width:42ch;font-size:12px;line-height:1.5;color:var(--text-secondary)}.close-btn{width:36px;height:36px;display:flex;justify-content:center;align-items:center;border-radius:50%;background:var(--icon-bg);border:1px solid var(--item-border);color:var(--text-secondary);cursor:pointer;transition:var(--transition-base)}.close-btn:hover{background:var(--item-bg-hover);color:var(--text-main);transform:rotate(90deg)}.drop-zone{padding:40px 30px;margin-bottom:20px;text-align:center;background:var(--input-bg);border:2px dashed var(--divider-color);border-radius:var(--border-radius-sm);cursor:pointer;transition:var(--transition-base)}.drop-zone:hover,.drop-zone-active{border-color:var(--accent-blue);background-color:var(--accent-cyan-light)}.drop-zone-icon{margin-bottom:12px;font-size:42px;color:var(--text-secondary);transition:var(--transition-base)}.drop-zone:hover .drop-zone-icon,.drop-zone-active .drop-zone-icon{transform:translateY(-5px);color:var(--accent-blue)}.drop-zone-text{font-size:15px;font-weight:500;color:var(--text-main)}.text-input-group{display:flex;gap:12px;margin-bottom:20px}.text-input-group input{flex:1;padding:16px 20px;font-size:15px}.text-input-group button{width:52px;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-sm);background:var(--accent-blue);color:#fff;box-shadow:0 4px 12px #0071e34d;cursor:pointer;transition:var(--transition-base)}.batch-actions{display:flex;justify-content:flex-end;margin-bottom:12px;height:0;overflow:hidden;opacity:0;pointer-events:none;transition:var(--transition-base)}.batch-actions.active{height:36px;overflow:visible;opacity:1;pointer-events:auto}.btn-small-primary{display:flex;align-items:center;gap:6px;padding:8px 16px;background:var(--item-bg);color:var(--text-main);border:1px solid var(--item-border);border-radius:12px;box-shadow:0 2px 6px #0000000a;font-size:13px;font-weight:600;cursor:pointer;transition:var(--transition-base)}.btn-small-primary:hover{background:var(--item-bg-hover);color:var(--accent-blue);border-color:#0071e34d;transform:translateY(-1px)}.batch-progress-container{max-height:280px;overflow-y:auto;padding-right:8px;padding-bottom:10px;text-align:left}.batch-progress-container::-webkit-scrollbar{width:6px}.batch-progress-container::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:4px}.batch-item{margin-bottom:12px;width:100%;min-width:0;box-sizing:border-box;padding:16px;background:var(--item-bg);border:1px solid var(--item-border);border-radius:var(--border-radius-sm);box-shadow:0 2px 8px #00000005;transition:all .3s ease}.batch-item:hover{border-color:#00000014;box-shadow:0 4px 12px #0000000a}body[data-theme=dark] .batch-item:hover{border-color:#ffffff1a}.file-info{display:flex;justify-content:space-between;align-items:center;gap:10px;min-width:0;margin-bottom:12px;font-size:14px}.file-info-left{flex:1;min-width:0;max-width:60%;display:flex;align-items:center;gap:10px;overflow:hidden}.file-icon-wrapper{flex:none;width:32px;height:32px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:var(--icon-bg);color:var(--accent-blue)}.file-name{display:-webkit-box;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.35;max-height:2.7em;font-weight:500;color:var(--text-main)}.file-info-right{display:flex;flex:none;align-items:center;min-width:0;gap:8px}.file-status{margin-right:4px;white-space:nowrap;font-size:12px;font-weight:500;font-variant-numeric:tabular-nums}.action-btn{width:28px;height:28px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:transparent;border:1px solid transparent;color:var(--text-secondary);cursor:pointer;transition:var(--transition-base)}.action-btn:hover{color:var(--text-main);background:var(--icon-bg);border-color:var(--item-border)}.action-btn.primary:hover{color:var(--accent-blue);background:var(--accent-cyan-light)}.action-btn.danger:hover{color:var(--danger-red);background:#ff3b301a}.progress-bar-container{height:6px;overflow:hidden;background:var(--icon-bg);border-radius:4px}.progress-bar-fill{height:100%;width:0;background:var(--accent-blue);border-radius:4px;transition:width .1s linear}.progress-bar-fill.success{background:var(--success-green)}.admin-header-card{margin-bottom:30px;padding:30px}.transfer-head-compact{margin-bottom:0;padding-bottom:0;border-bottom:0}.admin-title{font-size:24px;color:var(--text-main)}.connected-to .admin-subtitle{display:block;margin-top:4px;color:var(--text-secondary)}.admin-summary-grid{margin-bottom:30px}.admin-stats-card{height:100%}.admin-stats-panel{display:flex;flex-direction:column;height:100%}.admin-stats-row{flex:1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:12px}.admin-stat-item{display:flex;flex-direction:column;justify-content:space-between;min-height:0;padding:16px 15px;text-align:left;border:1px solid var(--item-border);border-radius:20px;background:var(--item-bg);box-shadow:0 8px 24px -18px #0c2b6433}.admin-stat-item-fluid{grid-column:1 / -1;min-height:142px;padding:0;border:0;background:transparent;box-shadow:none}.admin-fluid-card{position:relative;isolation:isolate;display:flex;height:100%;min-height:0;overflow:hidden;padding:0;border:1px solid rgba(123,166,255,.5);border-radius:16px;background-color:#edf1f9;box-shadow:0 8px 24px #0000000a}.admin-fluid-fill{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}.admin-fluid-wave{position:absolute;left:50%;top:calc(100% - var(--fluid-level));width:2500px;height:2500px;transform:translate(-50%);transform-origin:50% 50%;transition:top .8s cubic-bezier(.4,0,.2,1)}.admin-fluid-wave-a{background-color:#afc8f599;border-radius:48.5%;animation:fluidSpin 20s linear infinite}.admin-fluid-wave-b{background-color:#91b2ebe0;border-radius:49%;animation:fluidSpin 25s linear infinite;animation-delay:-10s}.admin-fluid-content{position:relative;z-index:1;display:flex;align-items:center;gap:18px;width:100%;min-height:110px;padding:24px}.admin-fluid-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;flex:none;border-radius:14px;background-color:#d7e1f4;color:#3b60c4;box-shadow:none}.admin-fluid-copy{min-width:0;flex:1}.admin-fluid-copy h3{margin:0 0 8px;font-size:22px;font-weight:600;line-height:1.15;color:#333}.admin-fluid-copy p{margin:0;font-size:13px;color:#778299}.admin-fluid-copy small{display:block;margin-top:10px;font-size:12px;color:var(--text-secondary)}.admin-stat-kicker{font-size:11px;font-weight:700;letter-spacing:.08em;color:var(--text-secondary)}.admin-stat-item h3{margin-top:10px;margin-bottom:6px;font-size:34px;font-weight:800;font-family:ui-monospace,monospace;line-height:1}.admin-stat-item p{font-size:13px;font-weight:500;color:var(--text-secondary)}.stat-suffix{font-size:16px}.admin-config-stack{display:flex;flex-direction:column;height:100%;gap:15px}.admin-config-card{height:100%}.admin-config-row{margin-bottom:0}.admin-config-row-field{flex-direction:column;align-items:stretch}.admin-config-row-last{margin-bottom:0}.admin-field-meta{display:flex;flex-direction:column;gap:6px}.admin-field-label{font-size:13px;font-weight:700;letter-spacing:.04em;color:var(--text-main)}.admin-field-hint{font-size:12px;line-height:1.5;color:var(--text-secondary)}.admin-field-control-row{display:flex;gap:12px}.admin-field-control-row input{flex:1}.admin-config-insights{display:flex;flex:1;flex-direction:column;gap:14px}.admin-config-highlight{padding:18px 20px;border:1px solid var(--item-border);border-radius:22px;background:linear-gradient(145deg,var(--item-bg-hover),var(--item-bg));box-shadow:0 16px 30px -24px #0c2b6459}.admin-config-badge{display:inline-flex;align-items:center;padding:6px 10px;border-radius:999px;background:var(--accent-cyan-light);color:var(--accent-blue);font-size:11px;font-weight:700;letter-spacing:.12em}.admin-config-highlight h3{margin-top:14px;margin-bottom:8px;font-size:30px;font-weight:800;font-family:ui-monospace,monospace;color:var(--text-main)}.admin-config-highlight p{font-size:13px;line-height:1.7;color:var(--text-secondary)}.admin-table-card{min-height:0}.admin-table-wrapper{max-height:420px;overflow-x:auto;overflow-y:auto;border-radius:18px}.admin-table-wrapper::-webkit-scrollbar{width:8px;height:8px}.admin-table-wrapper::-webkit-scrollbar-thumb{background:var(--divider-color);border-radius:999px}.admin-table{width:100%;min-width:0;table-layout:fixed;margin-top:10px;border-collapse:collapse;font-size:14px;text-align:left}.admin-table th{position:sticky;top:0;z-index:1;padding:14px 12px;color:var(--text-secondary);border-bottom:1px solid var(--divider-line);background:var(--card-bg);font-weight:600;white-space:nowrap}.admin-table td{padding:14px 12px;color:var(--text-main);border-bottom:1px solid var(--item-border);vertical-align:top}.admin-table tbody tr:last-child td{border-bottom:0}.admin-table tr:hover td{background-color:var(--item-bg-hover)}.admin-record-type-cell{width:42%}.admin-record-type{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.45;max-height:2.9em}.hidden{display:none!important}.footer{position:absolute;right:0;bottom:24px;left:0;text-align:center;font-size:13px;color:var(--text-secondary);opacity:.6;line-height:1.8;letter-spacing:.5px;transition:var(--transition-base)}.footer:hover{opacity:1}.footer .divider-line{margin:0 8px;opacity:.5}.footer a{text-decoration:none}.footer a:hover{color:var(--text-main)}#admin-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}@keyframes backgroundMove{0%{transform:scale(1) translate(0)}to{transform:scale(1.05) translate(2%,2%)}}@keyframes ripplePro{0%{transform:scale(.8);opacity:0}20%{opacity:.5}to{transform:scale(3);opacity:0}}@keyframes deviceBeaconPing{0%{opacity:0;transform:scale(.7)}22%{opacity:.9}to{opacity:0;transform:scale(2.8)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes showPanelPro{to{opacity:1;transform:scale(1)}}@keyframes fluidSpin{0%{transform:translate(-50%) rotate(0)}to{transform:translate(-50%) rotate(360deg)}}@media (min-width: 768px){.main-grid{grid-template-columns:1fr 1fr;gap:40px}}@media (min-width: 1024px){.container{max-width:1000px;padding:40px 0}.header h1{font-size:48px}.card{padding:40px}.btn-create,.btn-primary,input.room-code{padding:18px}.transfer-panel{max-width:700px}}@media (max-width: 767px){.admin-stats-row{grid-template-columns:1fr;grid-template-rows:none}.file-info,.file-info-right{align-items:flex-start}.file-info{flex-direction:column}.file-info-left,.file-info-right{max-width:100%;width:100%}.file-info-right{flex-wrap:wrap;row-gap:8px;justify-content:flex-end}.file-status{max-width:100%;overflow:hidden;text-overflow:ellipsis}}@media (max-width: 600px){body{padding-inline:16px}.theme-toggle{position:fixed;top:auto;right:20px;bottom:30px;width:50px;height:50px;margin-top:0;box-shadow:0 10px 30px #00000026}.card,.admin-header-card{padding:28px 22px}.header{margin-bottom:28px}.header h1{font-size:36px}.huge-code{width:100%;font-size:44px;letter-spacing:8px}.text-input-group{flex-direction:column}.text-input-group button{width:100%;min-height:52px}} diff --git a/frontend/dist/assets/index-sgHRZUw3.js b/frontend/dist/assets/index-sgHRZUw3.js new file mode 100644 index 0000000..e80a406 --- /dev/null +++ b/frontend/dist/assets/index-sgHRZUw3.js @@ -0,0 +1,17 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();/** +* @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 ie={},qt=[],tt=()=>{},fr=()=>!1,Xn=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]",dr=e=>wn(e)==="[object Set]",$i=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",pr=e=>(ne(e)||K(e))&&K(e.then)&&K(e.catch),hr=Object.prototype.toString,wn=e=>hr.call(e),nl=e=>wn(e).slice(8,-1),mr=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"),Zn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},sl=/-\w/g,Ae=Zn(e=>e.replace(sl,t=>t.slice(1).toUpperCase())),il=/\B([A-Z])/g,Ct=Zn(e=>e.replace(il,"-$1").toLowerCase()),Qn=Zn(e=>e.charAt(0).toUpperCase()+e.slice(1)),ps=Zn(e=>e?`on${Qn(e)}`:""),et=(e,t)=>!Object.is(e,t),jn=(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 ki;const es=()=>ki||(ki=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 St(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===hr||!K(e.toString))?yr(e)?te(e.value):JSON.stringify(e,_r,2):String(e),_r=(e,t)=>yr(t)?_r(e,t.value):Gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,i],o)=>(n[hs(s,o)+" =>"]=i,n),{})}:dr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>hs(n))}:qe(t)?hs(t):ne(t)&&!H(t)&&!mr(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 Ir(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Sr(e){let t,n=e.depsTail,s=n;for(;s;){const i=s.prevDep;s.version===-1?(s===n&&(n=i),Ws(s),hl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=i}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&&(Cr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Cr(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=re,s=Ve;re=e,Ve=!0;try{Ir(e);const i=e.fn(e._value);(t.version===0||et(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{re=n,Ve=s,Sr(e),e.flags&=-3}}function Ws(e,t=!1){const{dep:n,prevSub:s,nextSub:i}=e;if(s&&(s.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)Ws(o,!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 Tr=[];function pt(){Tr.push(Ve),Ve=!1}function ht(){const e=Tr.pop();Ve=e===void 0?!0:e}function Mi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=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(!re||!Ve||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new ml(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,$r(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=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.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 $r(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)$r(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const $s=new WeakMap,Nt=Symbol(""),ks=Symbol(""),vn=Symbol("");function xe(e,t,n){if(Ve&&re){let s=$s.get(e);s||$s.set(e,s=new Map);let i=s.get(n);i||(s.set(n,i=new Vs),i.map=s,i.key=n),i.track()}}function ft(e,t,n,s,i,o){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((_,$)=>{($==="length"||$===vn||!qe($)&&$>=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(Nt)),Gt(e)&&c(a.get(ks)));break;case"delete":f||(c(a.get(Nt)),Gt(e)&&c(a.get(ks)));break;case"set":Gt(e)&&c(a.get(Nt));break}}zs()}function Ht(e){const t=X(e);return t===e?t:(xe(t,"iterate",vn),je(e)?t:t.map(Ge))}function ts(e){return xe(e=X(e),"iterate",vn),e}function Ze(e,t){return mt(e)?Qt(Ft(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 at(this,"every",e,t,void 0,arguments)},filter(e,t){return at(this,"filter",e,t,n=>n.map(s=>Ze(this,s)),arguments)},find(e,t){return at(this,"find",e,t,n=>Ze(this,n),arguments)},findIndex(e,t){return at(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return at(this,"findLast",e,t,n=>Ze(this,n),arguments)},findLastIndex(e,t){return at(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return at(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 at(this,"map",e,t,void 0,arguments)},pop(){return on(this,"pop")},push(...e){return on(this,"push",e)},reduce(e,...t){return Ri(this,"reduce",e,t)},reduceRight(e,...t){return Ri(this,"reduceRight",e,t)},shift(){return on(this,"shift")},some(e,t){return at(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=ts(e),i=s[t]();return s!==e&&!je(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=n(o.value)),o}),i}const vl=Array.prototype;function at(e,t,n,s,i,o){const a=ts(e),c=a!==e&&!je(e),f=a[t];if(f!==vl[t]){const _=f.apply(e,o);return c?Ge(_):_}let h=n;a!==e&&(c?h=function(_,$){return n.call(this,Ze(e,_),$,e)}:n.length>2&&(h=function(_,$){return n.call(this,_,$,e)}));const p=f.call(a,h,s);return c&&i?i(p):p}function Ri(e,t,n,s){const i=ts(e),o=i!==e&&!je(e);let a=n,c=!1;i!==e&&(o?(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=i[t](a,...s);return c?Ze(e,f):f}function vs(e,t,n){const s=X(e);xe(s,"iterate",vn);const i=s[t](...n);return(i===-1||i===!1)&&Ys(n[0])?(n[0]=X(n[0]),s[t](...n)):i}function on(e,t,n=[]){pt(),Ks();const s=X(e)[t].apply(e,n);return zs(),ht(),s}const yl=Fs("__proto__,__v_isRef,__isVue"),kr=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 Mr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(i?o?Ml:Or:o?Er:Ar).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const a=H(t);if(!i){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)?kr.has(n):yl(n))||(i||xe(t,"get",n),o))return c;if(Se(c)){const f=a&&Bs(n)?c:c.value;return i&&ne(f)?Rs(f):f}return ne(c)?i?Rs(c):Gs(c):c}}class Rr extends Mr{constructor(t=!1){super(!1,t)}set(t,n,s,i){let o=t[n];const a=H(t)&&Bs(n);if(!this._isShallow){const h=mt(o);if(!je(s)&&!mt(s)&&(o=X(o),s=X(s)),!a&&Se(o)&&!Se(s))return h||(o.value=s),!0}const c=a?Number(n)e,An=e=>Reflect.getPrototypeOf(e);function Sl(e,t,n){return function(...s){const i=this.__v_raw,o=X(i),a=Gt(o),c=e==="entries"||e===Symbol.iterator&&a,f=e==="keys"&&a,h=i[e](...s),p=n?Ms:t?Qt:Ge;return!t&&xe(o,"iterate",f?ks:Nt),Ce(Object.create(h),{next(){const{value:_,done:$}=h.next();return $?{value:_,done:$}:{value:c?[p(_[0]),p(_[1])]:p(_),done:$}}})}}function En(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Cl(e,t){const n={get(i){const o=this.__v_raw,a=X(o),c=X(i);e||(et(i,c)&&xe(a,"get",i),xe(a,"get",c));const{has:f}=An(a),h=t?Ms:e?Qt:Ge;if(f.call(a,i))return h(o.get(i));if(f.call(a,c))return h(o.get(c));o!==a&&o.get(i)},get size(){const i=this.__v_raw;return!e&&xe(X(i),"iterate",Nt),i.size},has(i){const o=this.__v_raw,a=X(o),c=X(i);return e||(et(i,c)&&xe(a,"has",i),xe(a,"has",c)),i===c?o.has(i):o.has(i)||o.has(c)},forEach(i,o){const a=this,c=a.__v_raw,f=X(c),h=t?Ms:e?Qt:Ge;return!e&&xe(f,"iterate",Nt),c.forEach((p,_)=>i.call(o,h(p),h(_),a))}};return Ce(n,e?{add:En("add"),set:En("set"),delete:En("delete"),clear:En("clear")}:{add(i){const o=X(this),a=An(o),c=X(i),f=!t&&!je(i)&&!mt(i)?c:i;return a.has.call(o,f)||et(i,f)&&a.has.call(o,i)||et(c,f)&&a.has.call(o,c)||(o.add(f),ft(o,"add",f,f)),this},set(i,o){!t&&!je(o)&&!mt(o)&&(o=X(o));const a=X(this),{has:c,get:f}=An(a);let h=c.call(a,i);h||(i=X(i),h=c.call(a,i));const p=f.call(a,i);return a.set(i,o),h?et(o,p)&&ft(a,"set",i,o):ft(a,"add",i,o),this},delete(i){const o=X(this),{has:a,get:c}=An(o);let f=a.call(o,i);f||(i=X(i),f=a.call(o,i)),c&&c.call(o,i);const h=o.delete(i);return f&&ft(o,"delete",i,void 0),h},clear(){const i=X(this),o=i.size!==0,a=i.clear();return o&&ft(i,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=Sl(i,e,t)}),n}function qs(e,t){const n=Cl(e,t);return(s,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(Z(n,i)&&i in s?n:s,i,o)}const Tl={get:qs(!1,!1)},$l={get:qs(!1,!0)},kl={get:qs(!0,!1)};const Ar=new WeakMap,Er=new WeakMap,Or=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 mt(e)?e:Js(e,!1,wl,Tl,Ar)}function El(e){return Js(e,!1,Il,$l,Er)}function Rs(e){return Js(e,!0,xl,kl,Or)}function Js(e,t,n,s,i){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=Al(e);if(o===0)return e;const a=i.get(e);if(a)return a;const c=new Proxy(e,o===2?s:n);return i.set(e,c),c}function Ft(e){return mt(e)?Ft(e.__v_raw):!!(e&&e.__v_isReactive)}function mt(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)&&gr(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)||mt(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 i=e[t];return Se(i)&&!Se(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function Pr(e){return Ft(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)&&re!==this)return xr(this,!0),!0}get value(){const t=this.dep.track();return Cr(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,i;return K(e)?s=e:(s=e.get,i=e.set),new Ul(s,i,n)}const On={},Wn=new WeakMap;let Dt;function Bl(e,t=!1,n=Dt){if(n){let s=Wn.get(n);s||Wn.set(n,s=[]),s.push(e)}}function jl(e,t,n=ie){const{immediate:s,deep:i,once:o,scheduler:a,augmentJob:c,call:f}=n,h=F=>i?F:je(F)||i===!1||i===0?dt(F,1):dt(F);let p,_,$,S,U=!1,N=!1;if(Se(e)?(_=()=>e.value,U=je(e)):Ft(e)?(_=()=>h(e),U=!0):H(e)?(N=!0,U=e.some(F=>Ft(F)||je(F)),_=()=>e.map(F=>{if(Se(F))return F.value;if(Ft(F))return h(F);if(K(F))return f?f(F,2):F()})):K(e)?t?_=f?()=>f(e,2):e:_=()=>{if($){pt();try{$()}finally{ht()}}const F=Dt;Dt=p;try{return f?f(e,3,[S]):e(S)}finally{Dt=F}}:_=tt,t&&i){const F=_,le=i===!0?1/0:i;_=()=>dt(F(),le)}const Y=pl(),z=()=>{p.stop(),Y&&Y.active&&Ls(Y.effects,p)};if(o&&t){const F=t;t=(...le)=>{F(...le),z()}}let A=N?new Array(e.length).fill(On):On;const Q=F=>{if(!(!(p.flags&1)||!p.dirty&&!F))if(t){const le=p.run();if(i||U||(N?le.some((he,Te)=>et(he,A[Te])):et(le,A))){$&&$();const he=Dt;Dt=p;try{const Te=[le,A===On?void 0:N&&A[0]===On?[]:A,S];A=le,f?f(t,3,Te):t(...Te)}finally{Dt=he}}}else p.run()};return c&&c(Q),p=new br(_),p.scheduler=a?()=>a(Q,!1):Q,S=F=>Bl(F,!1,p),$=p.onStop=()=>{const F=Wn.get(p);if(F){if(f)f(F,4);else for(const le of F)le();Wn.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 dt(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))dt(e.value,t,n);else if(H(e))for(let s=0;s{dt(s,t,n)});else if(mr(e)){for(const s in e)dt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&dt(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(i){ns(i,t,n)}}function nt(e,t,n,s){if(K(e)){const i=xn(e,t,n,s);return i&&pr(i)&&i.catch(o=>{ns(o,t,n)}),i}if(H(e)){const i=[];for(let o=0;o>>1,i=Re[s],o=yn(i);o=yn(n)?Re.push(e):Re.splice(Kl(t),0,e),e.flags|=1,Fr()}}function Fr(){Vn||(Vn=Dr.then(Lr))}function zl(e){H(e)?Jt.push(...e):xt&&e.id===-1?xt.splice(zt+1,0,e):e.flags&1||(Jt.push(e),e.flags|=1),Fr()}function Ai(e,t,n=Xe+1){for(;nyn(n)-yn(s));if(Jt.length=0,xt){xt.push(...t);return}for(xt=t,zt=0;zte.id==null?e.flags&2?-1:1/0:e.id;function Lr(e){try{for(Xe=0;Xe{s._d&&Ki(-1);const o=qn(t);let a;try{a=e(...i)}finally{qn(o),s._d&&Ki(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=os(ye),s=e.dirs||(e.dirs=[]);for(let i=0;i1)return n&&K(t)?t.call(s&&s.proxy):t}}const ql=Symbol.for("v-scx"),Gl=()=>Hn(ql);function Ut(e,t,n){return jr(e,t,n)}function jr(e,t,n=ie){const{immediate:s,deep:i,flush:o,once:a}=n,c=Ce({},n),f=t&&s||!t&&o!=="post";let h;if(bn){if(o==="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;o==="post"?c.scheduler=S=>{Ee(S,p&&p.suspense)}:o!=="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 $=jl(e,t,c);return bn&&(h?h.push($):f&&$()),$}function Jl(e,t,n){const s=this.proxy,i=ae(e)?e.includes(".")?Hr(s,e):()=>s[e]:e.bind(s,s);let o;K(t)?o=t:(o=t.handler,n=t);const a=In(this),c=jr(i,o.bind(s),n);return a(),c}function Hr(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;ie.__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 Kr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ei(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const Gn=new WeakMap;function dn(e,t,n,s,i=!1){if(H(e)){e.forEach((N,Y)=>dn(N,t&&(H(t)?t[Y]:t),n,s,i));return}if(Xt(s)&&!i){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&dn(e,t,n,s.component.subTree);return}const o=s.shapeFlag&4?os(s.component):s.el,a=i?null:o,{i:c,r:f}=e,h=t&&t.r,p=c.refs===ie?c.refs={}:c.refs,_=c.setupState,$=X(_),S=_===ie?fr:N=>Ei(p,N)?!1:Z($,N),U=(N,Y)=>!(Y&&Ei(p,Y));if(h!=null&&h!==f){if(Oi(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(i)H(A)&&Ls(A,o);else if(H(A))A.includes(o)||A.push(o);else if(N)p[f]=[o],S(f)&&(_[f]=p[f]);else{const Q=[o];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(),Gn.delete(e)};A.id=-1,Gn.set(e,A),Ee(A,n)}else Oi(e),z()}}}function Oi(e){const t=Gn.get(e);t&&(t.flags|=8,Gn.delete(e))}es().requestIdleCallback;es().cancelIdleCallback;const Xt=e=>!!e.type.__asyncLoader,zr=e=>e.type.__isKeepAlive;function Ql(e,t){Wr(e,"a",t)}function ea(e,t){Wr(e,"da",t)}function Wr(e,t,n=Ie){const s=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(ss(t,s,n),n){let i=n.parent;for(;i&&i.parent;)zr(i.parent.vnode)&&ta(s,t,n,i),i=i.parent}}function ta(e,t,n,s){const i=ss(t,e,s,!0);qr(()=>{Ls(s[t],i)},n)}function ss(e,t,n=Ie,s=!1){if(n){const i=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...a)=>{pt();const c=In(n),f=nt(t,n,e,a);return c(),ht(),f});return s?i.unshift(o):i.push(o),o}}const yt=e=>(t,n=Ie)=>{(!bn||e==="sp")&&ss(e,(...s)=>t(...s),n)},na=yt("bm"),Vr=yt("m"),sa=yt("bu"),ia=yt("u"),Qs=yt("bum"),qr=yt("um"),ra=yt("sp"),oa=yt("rtg"),la=yt("rtc");function aa(e,t=Ie){ss("ec",e,t)}const ca="components",Gr=Symbol.for("v-ndc");function ua(e){return ae(e)?fa(ca,e,!1)||e:e||Gr}function fa(e,t,n=!0,s=!1){const i=ye||Ie;if(i){const o=i.type;{const c=Ya(o,!1);if(c&&(c===t||c===Ae(t)||c===Qn(Ae(t))))return o}const a=Pi(i[e]||o[e],t)||Pi(i.appContext[e],t);return!a&&s?o:a}}function Pi(e,t){return e&&(e[t]||e[Ae(t)]||e[Qn(Ae(t))])}function en(e,t,n,s){let i;const o=n,a=H(e);if(a||ae(e)){const c=a&&Ft(e);let f=!1,h=!1;c&&(f=!je(e),h=mt(e),e=ts(e)),i=new Array(e.length);for(let p=0,_=e.length;p<_;p++)i[p]=t(f?h?Qt(Ge(e[p])):Ge(e[p]):e[p],p,void 0,o)}else if(typeof e=="number"){i=new Array(e);for(let c=0;ct(c,f,void 0,o));else{const c=Object.keys(e);i=new Array(c.length);for(let f=0,h=c.length;f0;return j(),vt(fe,null,[q("slot",n,s)],h?-2:64)}let o=e[t];o&&o._c&&(o._d=!1),j();const a=o&&Jr(o(n)),c=n.key||a&&a.key,f=vt(fe,{key:(c&&!qe(c)?c:`_${t}`)+(!a&&s?"_fb":"")},a||[],a&&e._===1?64:-2);return f.scopeId&&(f.slotScopeIds=[f.scopeId+"-s"]),o&&o._c&&(o._d=!0),f}function Jr(e){return e.some(t=>ni(t)?!(t.type===gt||t.type===fe&&!Jr(t.children)):!0)?e:null}const As=e=>e?vo(e)?os(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=>Xr(e),$forceUpdate:e=>e.f||(e.f=()=>{Xs(e.update)}),$nextTick:e=>e.n||(e.n=Nr.bind(e.proxy)),$watch:e=>Jl.bind(e)}),ys=(e,t)=>e!==ie&&!e.__isScriptSetup&&Z(e,t),pa={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:i,props:o,accessCache:a,type:c,appContext:f}=e;if(t[0]!=="$"){const $=a[t];if($!==void 0)switch($){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return o[t]}else{if(ys(s,t))return a[t]=1,s[t];if(i!==ie&&Z(i,t))return a[t]=2,i[t];if(Z(o,t))return a[t]=3,o[t];if(n!==ie&&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!==ie&&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:i,ctx:o}=e;return ys(i,t)?(i[t]=n,!0):s!==ie&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,props:o,type:a}},c){let f;return!!(n[c]||e!==ie&&c[0]!=="$"&&Z(e,c)||ys(t,c)||Z(o,c)||Z(s,c)||Z(pn,c)||Z(i.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 Di(e){return H(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Es=!0;function ha(e){const t=Xr(e),n=e.proxy,s=e.ctx;Es=!1,t.beforeCreate&&Ni(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:a,watch:c,provide:f,inject:h,created:p,beforeMount:_,mounted:$,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:_t,expose:He,inheritAttrs:Je,components:Ke,directives:bt,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(i){const B=i.call(n,n);ne(B)&&(e.data=Gs(B))}if(Es=!0,o)for(const B in o){const G=o[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=It({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)Yr(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&&Ni(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(Vr,$),L(sa,S),L(ia,U),L(Ql,N),L(ea,Y),L(aa,$e),L(la,he),L(oa,Te),L(Qs,A),L(qr,F),L(ra,_t),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),bt&&(e.directives=bt),_t&&Kr(e)}function ma(e,t,n=tt){H(e)&&(e=Os(e));for(const s in e){const i=e[s];let o;ne(i)?"default"in i?o=Hn(i.from||s,i.default,!0):o=Hn(i.from||s):o=Hn(i),Se(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:a=>o.value=a}):t[s]=o}}function Ni(e,t,n){nt(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Yr(e,t,n,s){let i=s.includes(".")?Hr(n,s):()=>n[s];if(ae(e)){const o=t[e];K(o)&&Ut(i,o)}else if(K(e))Ut(i,e.bind(n));else if(ne(e))if(H(e))e.forEach(o=>Yr(o,t,n,s));else{const o=K(e.handler)?e.handler.bind(n):t[e.handler];K(o)&&Ut(i,o,e)}}function Xr(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:a}}=e.appContext,c=o.get(t);let f;return c?f=c:!i.length&&!n&&!s?f=t:(f={},i.length&&i.forEach(h=>Jn(f,h,a,!0)),Jn(f,t,a)),ne(t)&&o.set(t,f),f}function Jn(e,t,n,s=!1){const{mixins:i,extends:o}=t;o&&Jn(e,o,n,!0),i&&i.forEach(a=>Jn(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:Fi,props:Ui,emits:Ui,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:Fi,inject:va};function Fi(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[`${Ct(t)}Modifiers`];function xa(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ie;let i=n;const o=t.startsWith("update:"),a=o&&wa(s,t.slice(7));a&&(a.trim&&(i=n.map(p=>ae(p)?p.trim():p)),a.number&&(i=n.map(js)));let c,f=s[c=ps(t)]||s[c=ps(Ae(t))];!f&&o&&(f=s[c=ps(Ct(t))]),f&&nt(f,e,6,i);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,i)}}const Ia=new WeakMap;function Qr(e,t,n=!1){const s=n?Ia:t.emitsCache,i=s.get(e);if(i!==void 0)return i;const o=e.emits;let a={},c=!1;if(!K(e)){const f=h=>{const p=Qr(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!o&&!c?(ne(e)&&s.set(e,null),null):(H(o)?o.forEach(f=>a[f]=null):Ce(a,o),ne(e)&&s.set(e,a),a)}function is(e,t){return!e||!Xn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,Ct(t))||Z(e,t))}function Li(e){const{type:t,vnode:n,proxy:s,withProxy:i,propsOptions:[o],slots:a,attrs:c,emit:f,render:h,renderCache:p,props:_,data:$,setupState:S,ctx:U,inheritAttrs:N}=e,Y=qn(e);let z,A;try{if(n.shapeFlag&4){const F=i||s,le=F;z=Qe(h.call(le,F,p,_,S,$,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,ns(F,e,1),z=q(gt)}let Q=z;if(A&&N!==!1){const F=Object.keys(A),{shapeFlag:le}=Q;F.length&&le&7&&(o&&F.some(Us)&&(A=Ca(A,o)),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,qn(Y),z}const Sa=e=>{let t;for(const n in e)(n==="class"||n==="style"||Xn(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:i,component:o}=e,{props:a,children:c,patchFlag:f}=t,h=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Bi(s,a,h):!!a;if(f&8){const p=t.dynamicProps;for(let _=0;_Object.create(to),so=e=>Object.getPrototypeOf(e)===to;function ka(e,t,n,s=!1){const i={},o=no();e.propsDefaults=Object.create(null),io(e,t,i,o);for(const a in e.propsOptions[0])a in i||(i[a]=void 0);n?e.props=s?i:El(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Ma(e,t,n,s){const{props:i,attrs:o,vnode:{patchFlag:a}}=e,c=X(i),[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[$,S]=ro(_,t,!0);Ce(a,$),S&&c.push(...S)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!o&&!f)return ne(e)&&s.set(e,qt),qt;if(H(o))for(let p=0;pe==="_"||e==="_ctx"||e==="$stable",ti=e=>H(e)?e.map(Qe):[Qe(e)],Aa=(e,t,n)=>{if(t._n)return t;const s=Yt((...i)=>ti(t(...i)),n);return s._c=!1,s},oo=(e,t,n)=>{const s=e._ctx;for(const i in e){if(ei(i))continue;const o=e[i];if(K(o))t[i]=Aa(i,o,s);else if(o!=null){const a=ti(o);t[i]=()=>a}}},lo=(e,t)=>{const n=ti(t);e.slots.default=()=>n},ao=(e,t,n)=>{for(const s in t)(n||!ei(s))&&(e[s]=t[s])},Ea=(e,t,n)=>{const s=e.slots=no();if(e.vnode.shapeFlag&32){const i=t._;i?(ao(s,t,n),n&&gr(s,"_",i,!0)):oo(t,s)}else t&&lo(e,t)},Oa=(e,t,n)=>{const{vnode:s,slots:i}=e;let o=!0,a=ie;if(s.shapeFlag&32){const c=t._;c?n&&c===1?o=!1:ao(i,t,n):(o=!t.$stable,oo(t,i)),a=t}else t&&(lo(e,t),a={default:1});if(o)for(const c in i)!ei(c)&&a[c]==null&&delete i[c]},Ee=Ua;function Pa(e){return Da(e)}function Da(e,t){const n=es();n.__VUE__=!0;const{insert:s,remove:i,patchProp:o,createElement:a,createText:c,createComment:f,setText:h,setElementText:p,parentNode:_,nextSibling:$,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=Lt(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 gt: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?bt(d,g,v,I,w,x,R,k,C):(M&64||M&128)&&b.process(d,g,v,I,w,x,R,k,C,kt)}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=$(d),s(d,v,I),d=w;s(g,v,I)},F=({el:d,anchor:g})=>{let v;for(;d&&d!==g;)v=$(d),i(d),d=v;i(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(),_t(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&&Ot(d,null,I,"created"),Te(C,d,d.scopeId,R,I),P){for(const ee in P)ee!=="value"&&!cn(ee)&&o(C,ee,null,P[ee],x,I);"value"in P&&o(C,"value",null,P.value,x),(b=P.onVnodeBeforeMount)&&Ye(b,I,d)}D&&Ot(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&&Ot(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||ie,O=g.props||ie;let D;if(v&&Pt(v,!1),(D=O.onVnodeBeforeUpdate)&&Ye(D,v,g,d),P&&Ot(g,d,v,"beforeUpdate"),v&&Pt(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&&o(k,"class",null,O.class,w),C&4&&o(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&&Ot(g,d,v,"updated")},I)},He=(d,g,v,I,w,x,R)=>{for(let k=0;k{if(g!==v){if(g!==ie)for(const x in g)!cn(x)&&!(x in v)&&o(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"&&o(d,x,k,R,w,I)}"value"in v&&o(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)&&co(d,g,!0)):G(d,g,v,P,w,x,R,k,C)},bt=(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(zr(d)&&(k.ctx.renderer=kt),Va(k,!1,R),k.asyncDep){if(w&&w.registerDep(k,L,R),!d.el){const C=k.subTree=q(gt);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=uo(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;Pt(d,!1),M?(M.el=ee.el,B(d,M,R)):M=ee,O&&jn(O),(me=M.props&&M.props.onVnodeBeforeUpdate)&&Ye(me,W,M,ee),Pt(d,!0);const we=Li(d),Ne=d.subTree;d.subTree=we,N(Ne,we,_(Ne.el),Lt(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);Pt(d,!1),W&&jn(W),!Ne&&(M=D&&D.onVnodeBeforeMount)&&Ye(M,J,g),Pt(d,!0);{me.ce&&me.ce._hasShadowRoot()&&me.ce._injectChildStyle(we,d.parent?d.parent.type:void 0);const Fe=d.subTree=Li(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 br(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),Pt(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),pt(),Ai(d),ht()},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&&$t(b,w,x),M!==b&&p(v,M)):P&16?D&16?ze(b,M,v,I,w,x,R,k,C):$t(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?$t(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?ut(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?ut(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?ut(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 Mt=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(Mt[J-W]===0&&ln(ke,g[J])){Pe=J;break}Pe===void 0?ue(ke,w,x,!0):(Mt[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(Mt):qt;for(J=$n.length-1,b=we-1;b>=0;b--){const ke=W+b,Pe=g[ke],Bt=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,kt);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?i(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&&(pt(),dn(k,null,v,d,!0),ht()),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&&Ot(d,null,g,"beforeUnmount"),P&64?d.type.remove(d,g,v,kt,I):b&&!b.hasOnce&&(x!==fe||M>0&&M&64)?$t(b,g,v,!1,!0):(x===fe&&M&384||!w&&P&16)&&$t(C,g,v),I&&wt(d)}(ee&&(J=R&&R.onVnodeUnmounted)||W)&&Ee(()=>{J&&Ye(J,g,d),W&&Ot(d,null,g,"unmounted")},v)},wt=d=>{const{type:g,el:v,anchor:I,transition:w}=d;if(g===fe){Tt(v,I);return}if(g===bs){F(d);return}const x=()=>{i(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()},Tt=(d,g)=>{let v;for(;d!==g;)v=$(d),i(d),d=v;i(g)},Sn=(d,g,v)=>{const{bum:I,scope:w,job:x,subTree:R,um:k,m:C,a:b}=d;Hi(C),Hi(b),I&&jn(I),w.stop(),x&&(x.flags|=8,ue(R,d,g,v)),k&&Ee(k,g),Ee(()=>{d.isUnmounted=!0},g)},$t=(d,g,v,I=!1,w=!1,x=0)=>{for(let R=x;R{if(d.shapeFlag&6)return Lt(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const g=$(d.anchor||d.el),v=g&&g[Yl];return v?$(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,Ai(I),Ur(),sn=!1)},kt={p:N,um:ue,m:be,r:wt,mt:de,mc:$e,pc:G,pbc:He,n:Lt,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 Pt({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 co(e,t,n=!1){const s=e.children,i=t.children;if(H(s)&&H(i))for(let o=0;o>1,e[n[c]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,a=n[o-1];o-- >0;)n[o]=a,a=t[a];return n}function uo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:uo(t)}function Hi(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"),gt=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 Ki(e,t=!1){_n+=e,e<0&&De&&t&&(De.hasOnce=!0)}function ho(e){return e.dynamicChildren=_n>0?De||qt:null,La(),_n>0&&De&&De.push(e),e}function V(e,t,n,s,i,o){return ho(y(e,t,n,s,i,o,!0))}function vt(e,t,n,s,i){return ho(q(e,t,n,s,i,!0))}function ni(e){return e?e.__v_isVNode===!0:!1}function ln(e,t){return e.type===t.type&&e.key===t.key}const mo=({key:e})=>e??null,Kn=({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,i=null,o=e===fe?0:1,a=!1,c=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mo(t),ref:t&&Kn(t),scopeId:Br,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:o,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:ye};return c?(si(f,n),o&128&&e.normalize(f)):n&&(f.shapeFlag|=ae(n)?8:16),_n>0&&!a&&De&&(f.patchFlag>0||o&6)&&f.patchFlag!==32&&De.push(f),f}const q=Ba;function Ba(e,t=null,n=null,s=0,i=null,o=!1){if((!e||e===Gr)&&(e=gt),ni(e)){const c=tn(e,t,!0);return n&&si(c,n),_n>0&&!o&&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=St(c)),ne(f)&&(Ys(f)&&!H(f)&&(f=Ce({},f)),t.style=Le(f))}const a=ae(e)?1:po(e)?128:Xl(e)?64:ne(e)?4:K(e)?2:0;return y(e,t,n,s,i,a,o,!0)}function ja(e){return e?Ys(e)||so(e)?Ce({},e):e:null}function tn(e,t,n=!1,s=!1){const{props:i,ref:o,patchFlag:a,children:c,transition:f}=e,h=t?go(i||{},t):i,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&mo(h),ref:t&&t.ref?n&&o?H(o)?o.concat(Kn(t)):[o,Kn(t)]:Kn(t):o,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(),vt(gt,null,e)):q(gt,null,e)}function Qe(e){return e==null||typeof e=="boolean"?q(gt):H(e)?q(fe,null,e.slice()):ni(e)?ut(e):q(rs,null,String(e))}function ut(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:tn(e)}function si(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 i=t.default;i&&(i._c&&(i._d=!1),si(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!so(t)?t._ctx=ye:i===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 go(...e){const t={};for(let n=0;nIe||ye;let Yn,Ds;{const e=es(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),o=>{i.length>1?i.forEach(a=>a(o)):i[0](o)}};Yn=t("__VUE_INSTANCE_SETTERS__",n=>Ie=n),Ds=t("__VUE_SSR_SETTERS__",n=>bn=n)}const In=e=>{const t=Ie;return Yn(e),e.scope.on(),()=>{e.scope.off(),Yn(t)}},zi=()=>{Ie&&Ie.scope.off(),Yn(null)};function vo(e){return e.vnode.shapeFlag&4}let bn=!1;function Va(e,t=!1,n=!1){t&&Ds(t);const{props:s,children:i}=e.vnode,o=vo(e);ka(e,s,o,t),Ea(e,i,n||t);const a=o?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){pt();const i=e.setupContext=s.length>1?Ja(e):null,o=In(e),a=xn(s,e,0,[e.props,i]),c=pr(a);if(ht(),o(),(c||e.sp)&&!Xt(e)&&Kr(e),c){if(a.then(zi,zi),t)return a.then(f=>{Wi(e,f)}).catch(f=>{ns(f,e,0)});e.asyncDep=a}else Wi(e,a)}else yo(e)}function Wi(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Pr(t)),yo(e)}function yo(e,t,n){const s=e.type;e.render||(e.render=s.render||tt);{const i=In(e);pt();try{ha(e)}finally{ht(),i()}}}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 os(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Pr(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 It=(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 Vi=typeof window<"u"&&window.trustedTypes;if(Vi)try{Ns=Vi.createPolicy("vue",{createHTML:e=>e})}catch{}const _o=Ns?e=>Ns.createHTML(e):e=>e,Qa="http://www.w3.org/2000/svg",ec="http://www.w3.org/1998/Math/MathML",ct=typeof document<"u"?document:null,qi=ct&&ct.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 i=t==="svg"?ct.createElementNS(Qa,e):t==="mathml"?ct.createElementNS(ec,e):n?ct.createElement(e,{is:n}):ct.createElement(e);return e==="select"&&s&&s.multiple!=null&&i.setAttribute("multiple",s.multiple),i},createText:e=>ct.createTextNode(e),createComment:e=>ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,i,o){const a=n?n.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===o||!(i=i.nextSibling)););else{qi.innerHTML=_o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const c=qi.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 Gi=Symbol("_vod"),ic=Symbol("_vsh"),rc=Symbol(""),oc=/(?:^|;)\s*display\s*:/;function lc(e,t,n){const s=e.style,i=ae(n);let o=!1;if(n&&!i){if(t)if(ae(t))for(const a of t.split(";")){const c=a.slice(0,a.indexOf(":")).trim();n[c]==null&&zn(s,c,"")}else for(const a in t)n[a]==null&&zn(s,a,"");for(const a in n)a==="display"&&(o=!0),zn(s,a,n[a])}else if(i){if(t!==n){const a=s[rc];a&&(n+=";"+a),s.cssText=n,o=oc.test(n)}}else t&&e.removeAttribute("style");Gi in e&&(e[Gi]=o?s.display:"",e[ic]&&(s.display="none"))}const Ji=/\s*!important$/;function zn(e,t,n){if(H(n))n.forEach(s=>zn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ac(e,t);Ji.test(n)?e.setProperty(Ct(s),n.replace(Ji,""),"important"):e[s]=n}}const Yi=["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=Qn(s);for(let i=0;ixs||(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=>i=>!i._stopped&&s&&s(i))}else return t}const nr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gc=(e,t,n,s,i,o)=>{const a=i==="svg";t==="class"?sc(e,s,a):t==="style"?lc(e,n,s):Xn(t)?Us(t)||uc(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):vc(e,t,s,a))?(Qi(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Zi(e,t,s,a,o,t!=="value")):e._isVueCE&&(yc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(s)))?Qi(e,Ae(t),s,o,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zi(e,t,s,a))};function vc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&nr(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 i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return nr(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(i=>Ae(i)===s):Object.keys(n).some(i=>Ae(i)===s)}const sr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return H(t)?n=>jn(t,n):t};function _c(e){e.target.composing=!0}function ir(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Is=Symbol("_assign");function rr(e,t,n){return t&&(e=e.trim()),n&&(e=js(e)),e}const bc={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e[Is]=sr(i);const o=s||i.props&&i.props.type==="number";Wt(e,t?"change":"input",a=>{a.target.composing||e[Is](rr(e.value,n,o))}),(n||o)&&Wt(e,"change",()=>{e.value=rr(e.value,n,o)}),t||(Wt(e,"compositionstart",_c),Wt(e,"compositionend",ir),Wt(e,"change",ir))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:i,number:o}},a){if(e[Is]=sr(a),e.composing)return;const c=(o||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||i&&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))},Pn=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(i,...o)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=i=>{if(!("key"in i))return;const o=Ct(i.key);if(t.some(a=>a===o||Ic[a]===o))return e(i)})},Sc=Ce({patchProp:gc},tc);let or;function Cc(){return or||(or=Pa(Sc))}const Tc=(...e)=>{const t=Cc().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=kc(s);if(!i)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const a=n(i,!1,$c(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.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 i=null;Qs(()=>{i&&window.clearTimeout(i)});function o(){s.value+=1,s.value===1&&(i=window.setTimeout(()=>{s.value=0,i=null},2e3)),s.value>=5&&(i&&(window.clearTimeout(i),i=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:o},"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=It(()=>n[t.name]||n.close),i=It(()=>typeof t.size=="number"?`${t.size}px`:/^\d+(\.\d+)?$/.test(t.size)?`${t.size}px`:t.size);return(o,a)=>(j(),V("span",{class:"app-icon",style:Le({width:i.value,height:i.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(),vt(ua(c.tag),go({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"},iu={class:"admin-record-type-cell"},ru=["title"],ou={__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 i(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 o(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:St(["admin-stat-item",{"admin-stat-item-fluid":f.kind==="minio"}])},[f.kind==="minio"?(j(),V("div",{key:0,class:"admin-fluid-card",style:Le(o(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",iu,[y("span",{class:"admin-record-type",title:f.type},te(f.type),9,ru)]),y("td",null,te(f.size),1),y("td",{style:Le(i(f.tone))},te(f.status),5)]))),128))])])])]),_:1})]))}},lu={class:"local-device-name"},au={key:0,class:"radar-container"},cu={class:"radar"},uu={key:1,class:"device-list"},fu=["onClick"],du={class:"device-icon"},pu={class:"device-info"},hu={key:2,class:"radar-container"},mu={class:"radar"},gu={__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(i){n("select-device",i)}return(i,o)=>(j(),vt(mn,{title:"局域网自动发现"},{default:Yt(()=>[y("p",lu,[o[0]||(o[0]=nn(" 本机:",-1)),y("strong",null,te(e.localDeviceName||"识别中"),1)]),e.isScanning?(j(),V("div",au,[y("div",cu,[q(pe,{class:"radar-icon",name:"sensors",size:"36"})]),o[1]||(o[1]=y("p",{class:"scan-status"},"正在扫描附近设备...",-1))])):e.devices.length?(j(),V("div",uu,[(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",du,[q(pe,{name:a.icon,size:"24"},null,8,["name"])]),y("div",pu,[y("h4",null,te(a.name),1),y("p",null,te(a.description),1)]),o[2]||(o[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,fu))),128))])):(j(),V("div",hu,[y("div",mu,[q(pe,{class:"radar-icon",name:"devices",size:"36"})]),o[3]||(o[3]=y("p",{class:"scan-status"},"暂未发现局域网设备,请保持页面开启后重试",-1))]))]),_:1}))}},vu={key:0,class:"room-action-area"},yu={class:"room-input-group"},_u=["value"],bu={key:0,class:"pending-downloads"},wu={class:"pending-downloads-head"},xu=["href"],Iu={class:"pending-download-copy"},Su=["title"],Cu={class:"pending-download-icon","aria-hidden":"true"},Tu={key:1,class:"waiting-area"},$u={class:"huge-code"},ku={__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(o){n("update-room-code",o.target.value)}function i(){n("join-room")}return(o,a)=>(j(),vt(mn,{title:"远程直连"},{default:Yt(()=>[e.isWaiting?(j(),V("div",Tu,[a[6]||(a[6]=y("p",{class:"waiting-subtitle"},"您的房间号码",-1)),y("div",$u,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=>o.$emit("cancel-room"))},"取消建房")])):(j(),V("div",vu,[y("button",{class:"btn-create",type:"button",onClick:a[0]||(a[0]=c=>o.$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",yu,[y("input",{class:"room-code",inputmode:"numeric",maxlength:"4",pattern:"\\d*",placeholder:"输入4位房间号",type:"text",value:e.roomCodeInput,onInput:s,onKeyup:bo(i,["enter"])},null,40,_u),y("button",{class:"btn-primary",type:"button",onClick:a[1]||(a[1]=c=>o.$emit("join-room"))},"加入房间")]),e.pendingDownloads.length?(j(),V("div",bu,[y("div",wu,[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",Iu,[y("strong",{title:c.name},te(c.name),9,Su),y("p",null,te(c.size_label)+" · "+te(c.created_label),1)]),y("span",Cu,[q(pe,{name:"download",size:"18"})])],8,xu))),128))])):Be("",!0)]))]),_:1}))}},Mu={class:"file-info"},Ru=["title"],Au={class:"file-info-right"},Eu=["download","href"],Ou={key:0,class:"progress-bar-container"},Pu={__name:"TransferQueueItem",props:{item:{type:Object,required:!0}},emits:["remove","start-upload","copy"],setup(e){const t=e,n=It(()=>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=It(()=>t.item.kind==="text"?{color:"var(--success-green)",background:"rgba(48, 209, 88, 0.1)"}:{});return(i,o)=>(j(),V("div",{class:St(["batch-item",{"pending-file":e.item.kind==="file"&&e.item.pending}])},[y("div",Mu,[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,Ru)],4),y("div",Au,[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:o[0]||(o[0]=a=>i.$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:o[1]||(o[1]=a=>i.$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,Eu)):Be("",!0),y("button",{class:"action-btn danger",title:"移除记录",type:"button",onClick:o[2]||(o[2]=a=>i.$emit("remove",e.item.id))},[q(pe,{name:"close",size:"16"})])])]),e.item.kind==="file"?(j(),V("div",Ou,[y("div",{class:St(["progress-bar-fill",{success:e.item.tone==="success"}]),style:Le({width:`${e.item.progress}%`})},null,6)])):Be("",!0)],2))}},Du={class:"transfer-panel active"},Nu={class:"card"},Fu={class:"transfer-head"},Uu={class:"connected-to"},Lu={key:0,class:"connection-hint"},Bu={class:"text-input-group"},ju={__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,i=oe(""),o=oe(!1),a=oe(null),c=oe(null);Ut(()=>n.items.length,async()=>{await Nr(),a.value&&(a.value.scrollTop=a.value.scrollHeight)});function f(){var $;($=c.value)==null||$.click()}function h(){s("send-text",i.value),i.value=""}function p($){const S=Array.from($.target.files||[]);S.length&&s("files-selected",S),$.target.value=""}function _($){var U;o.value=!1;const S=Array.from(((U=$.dataTransfer)==null?void 0:U.files)||[]);S.length&&s("files-selected",S)}return($,S)=>(j(),V("div",Du,[y("div",Nu,[y("div",Fu,[y("div",Uu,[y("h2",null,te(e.peerName),1),y("p",null,te(e.connectionType),1),e.networkHint?(j(),V("small",Lu,te(e.networkHint),1)):Be("",!0)]),y("button",{class:"close-btn",type:"button",onClick:S[0]||(S[0]=U=>$.$emit("close"))},[q(pe,{name:"close",size:"20"})])]),y("div",{class:St(["drop-zone",{"drop-zone-active":o.value}]),onClick:f,onDragenter:S[1]||(S[1]=Pn(U=>o.value=!0,["prevent"])),onDragover:S[2]||(S[2]=Pn(U=>o.value=!0,["prevent"])),onDragleave:S[3]||(S[3]=Pn(U=>o.value=!1,["prevent"])),onDrop:Pn(_,["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",Bu,[Wl(y("input",{"onUpdate:modelValue":S[4]||(S[4]=U=>i.value=U),placeholder:"输入要发送的文本或链接...",type:"text",onKeyup:bo(h,["enter"])},null,544),[[bc,i.value]]),y("button",{title:"发送文本",type:"button",onClick:h},[q(pe,{name:"arrow_upward",size:"20"})])]),y("div",{class:St(["batch-actions",{active:e.hasPendingItems}])},[y("button",{class:"btn-small-primary",type:"button",onClick:S[5]||(S[5]=U=>$.$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(),vt(Pu,{key:U.id,item:U,onCopy:S[6]||(S[6]=N=>$.$emit("copy-item",N)),onRemove:S[7]||(S[7]=N=>$.$emit("remove-item",N)),onStartUpload:S[8]||(S[8]=N=>$.$emit("start-upload",N))},null,8,["item"]))),128))],512)):Be("",!0)])]))}};let Vt={deviceId:"",token:""};const Hu="filefast_device_id",Ku="filefast_device_token";function wo(){return!Vt.deviceId||!Vt.token?{}:{"X-Device-ID":Vt.deviceId,"X-Device-Token":Vt.token}}function zu(e={},t=!1){return{...t?{"Content-Type":"application/json"}:{},...wo(),...e}}function Wu(e,t){if(!t||Object.keys(t).length===0)return e;const n=new URLSearchParams;Object.entries(t).forEach(([i,o])=>{o!=null&&o!==""&&n.set(i,String(o))});const s=n.toString();return s?`${e}?${s}`:e}async function Dn(e,t={}){const n=t.body!==void 0,s=await fetch(Wu(e,t.query),{method:t.method||"GET",headers:zu(t.headers,n),body:n?JSON.stringify(t.body):void 0}),i=await s.json().catch(()=>({}));if(!s.ok){const o=new Error(i.error||`Request failed: ${s.status}`);throw o.status=s.status,o}return i.data}const ve={get(e,t={}){return Dn(e,{...t,method:"GET"})},post(e,t,n={}){return Dn(e,{...n,method:"POST",body:t})},put(e,t,n={}){return Dn(e,{...n,method:"PUT",body:t})},patch(e,t,n={}){return Dn(e,{...n,method:"PATCH",body:t})}};function lr(e,t){Vt={deviceId:e||"",token:t||""},Gu(Vt)}function Vu(){return wo()}function qu(e){return{Authorization:`Bearer ${e}`}}function Gu(e){typeof document>"u"||(ar(Hu,e.deviceId),ar(Ku,e.token))}function ar(e,t){if(!t){document.cookie=`${e}=; Path=/; Max-Age=0; SameSite=Lax`;return}document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax`}function Nn(e){return{headers:qu(e)}}const Kt={login(e,t){return ve.post("/api/admin/login",{username:e,password:t})},stats(e){return ve.get("/api/admin/stats",Nn(e))},config(e){return ve.get("/api/admin/config",Nn(e))},updateConfig(e,t){return ve.put("/api/admin/config",t,Nn(e))},recentTransfers(e){return ve.get("/api/admin/transfers/recent",Nn(e))}},Fn={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`)}},Un={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})}},Ju={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 Yu(`/api/transfers/${encodeURIComponent(e)}/fallback/upload`,t,n)},updateStatus(e,t){return ve.patch(`/api/transfers/${encodeURIComponent(e)}/status`,t)}};function Yu(e,t,n){return new Promise((s,i)=>{const o=new XMLHttpRequest;o.open("PUT",e),o.responseType="json",o.setRequestHeader("Content-Type",t.type||"application/octet-stream"),Object.entries(Vu()).forEach(([a,c])=>{o.setRequestHeader(a,c)}),o.upload.onprogress=a=>{!a.lengthComputable||typeof n!="function"||n(Math.round(a.loaded/a.total*100))},o.onload=()=>{const a=o.response||Xu(o.responseText);if(o.status>=200&&o.status<300){s(a.data);return}i(new Error((a==null?void 0:a.error)||`Upload failed: ${o.status}`))},o.onerror=()=>i(new Error("Upload failed")),o.send(t)})}function Xu(e){try{return JSON.parse(e)}catch{return null}}const Zu={class:"container"},Qu={key:0,class:"main-grid"},Ss="filefast-admin-token",Ln="filefast-admin-view",Bn="filefast-device-id",cr="filefast-device-name",Cs="filefast-device-token",ef=15e3,tf=5e3,nf=2e3,sf=3e3,rf=4*1024*1024,of=2e4,lf=16*1024,ur=512*1024,af={__name:"App",setup(e){const t=oe(localStorage.getItem("airshare-theme")||"light"),n=oe(localStorage.getItem(Ln)==="admin"?"admin":"main"),s=oe(!0),i=oe([]),o=oe(""),a=oe(!1),c=oe("----"),f=oe([]),h=oe({name:"--",type:"等待连接",deviceId:"",networkGroupKey:""}),p=oe([]),_=oe("/ws"),$=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(Bn)||"",F=localStorage.getItem(Cs)||"";Q&&F&&lr(Q,F);const le=new Map,he=new Map,Te=new Map,$e=new Map;let _t=null,He=null,Je=null,Ke=null,bt=null,de=null,st=null,L=null,B=null,G="",_e="p2p",ze=!1,be=!1,ue=!1,wt=null,Tt=null;const Sn=It(()=>p.value.filter(r=>r.kind==="file"&&r.pending)),$t=It(()=>Sn.value.length>0),Lt=It(()=>!h.value.deviceId||ai(h.value.networkGroupKey)||Uo()?"":"当前是跨网络访问,未配置 TURN 时实时通道可能失败。文本和小文件可回退中转,大文件建议使用 MinIO。");Ut(t,r=>{document.body.setAttribute("data-theme",r),localStorage.setItem("airshare-theme",r)},{immediate:!0}),Ut(n,r=>{if(r==="admin"&&z.value){localStorage.setItem(Ln,"admin");return}localStorage.removeItem(Ln)}),Ut([n,z],([r,l])=>{Ke&&(window.clearInterval(Ke),Ke=null),!(r!=="admin"||!l)&&(Ke=window.setInterval(()=>{ls().catch(u=>{console.error(u)})},5e3))}),Vr(async()=>{_.value=Fo(),await sn(),n.value==="admin"&&z.value&&ls().catch(r=>{console.error(r)}),He=window.setInterval(()=>{w()},ef),_t=window.setInterval(()=>{v()},tf),bt=window.setInterval(()=>{I()},1e4)}),Qs(()=>{_t&&window.clearInterval(_t),He&&window.clearInterval(He),Ke&&window.clearInterval(Ke),bt&&window.clearInterval(bt),b(),ot(),yi(),D()});async function sn(){try{await kt(),await g(),await v()}catch(r){window.alert(`后端连接失败:${r.message}`)}}function Cn(){t.value=t.value==="dark"?"light":"dark"}async function kt(){try{Tn(await Ju.config())}catch(r){console.error(r)}}function Tn(r){r&&(Y.value=r,$.value=Math.round((r.max_minio_fallback_size_bytes||0)/1024/1024),S.value=Math.max(0,Math.round((r.minio_capacity_bytes||0)/1024/1024/1024)))}function d(r){o.value=r.replace(/\D/g,"").slice(0,4)}async function g(){const r=Ao(),l=Eo(r),u=Do(),m=await Fn.register({device_id:r,name:l,type:u,network_group_key:li()});localStorage.setItem(Bn,m.id),m.auth_token&&(localStorage.setItem(Cs,m.auth_token),lr(m.id,m.auth_token)),A.value={id:m.id,name:m.name,type:m.type},await I(),vi()}async function v(){if(A.value.id)try{const r=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(r,value)}catch(l){console.warn("realtime text send failed, fallback to relay",l),await ii(r,value)}p.value.push({id:Ue("text"),transferId:r.id,kind:"text",text:value,status:"已发送",tone:"success",copied:!1})}catch(r){window.alert(`发送文本失败:${r.message}`)}}async function I(){if(!A.value.id){f.value=[];return}try{const r=await Fn.listPendingDownloads(A.value.id);f.value=r.map(l=>({...l,name:it(l.name),download_path:l.download_path||`/api/transfers/${encodeURIComponent(l.transfer_id)}/fallback/download`,size_label:At(Number(l.size_bytes||0)),created_label:Rn(l.created_at)}))}catch(r){if((r==null?void 0:r.status)===404){f.value=[];return}console.error(r)}}async function w(){if(A.value.id)try{await Fn.heartbeat(A.value.id)}catch(r){console.error(r)}}async function x(){if(!A.value.id){window.alert("当前设备尚未注册到后端");return}try{const r=await Un.create(A.value.id);c.value=r.code,a.value=!0,C(r.code)}catch(r){window.alert(`创建房间失败:${r.message}`)}}async function R(){const r=c.value;b();try{a.value&&r!=="----"&&await Un.cancel(r,A.value.id)}catch(l){console.error(l)}finally{a.value=!1,c.value="----"}}async function k(){if(!(o.value.length<4))try{const r=await Un.join(o.value,A.value.id),l=Rt(r.creator_device_id);o.value="",P({deviceId:r.creator_device_id,name:(l==null?void 0:l.name)||`房间 ${r.code} 创建者`,type:"房间配对成功"})}catch(r){window.alert(`加入房间失败:${r.message}`)}}function C(r){b(),Je=window.setInterval(async()=>{try{const l=await Un.get(r);if(l.status==="joined"&&l.joiner_device_id){const u=Rt(l.joiner_device_id);P({deviceId:l.joiner_device_id,name:(u==null?void 0:u.name)||`房间 ${r} 对端`,type:"房间配对成功"});return}(l.status==="expired"||l.status==="canceled")&&(b(),a.value=!1,c.value="----")}catch(l){console.error(l)}},nf)}function b(){Je&&(window.clearInterval(Je),Je=null)}function P(r){const l=r.deviceId||r.id||"",u=r.connectionType||r.type||"点对点传输";b(),h.value.deviceId!==l&&(ot(),D()),h.value={name:r.name,type:r.connectionType||r.type||"点对点传输",deviceId:r.deviceId||r.id||"",networkGroupKey:r.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(r,l=!1){const u=r.deviceId||r.id||"",m=r.connectionType||r.type||"点对点传输";h.value.deviceId===u&&n.value==="transfer"||(ot(),l||D()),h.value={name:r.name,type:r.connectionType||r.type||"点对点传输",deviceId:u,networkGroupKey:r.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(){ot(),D(),h.value={name:"--",type:"等待连接",deviceId:"",networkGroupKey:""},n.value="main",h.value.baseType="等待连接",h.value.type="等待连接"}function D(){p.value.forEach(r=>Pe(r)),p.value=[],he.clear()}async function W(r){const l=r.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:as()}),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(r){const l=r.filter(Boolean).map((u,m)=>({id:Ue(`file-${m}`),kind:"file",file:u,name:it(u.name),size:At(u.size),sizeBytes:u.size,status:"待发送",tone:"muted",progress:0,pending:!0,transferId:""}));l.length&&p.value.push(...l)}async function J(r){const l=p.value.find(u=>u.id===r);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>rf){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:as()});try{await ri(l,u)}catch(m){console.warn("realtime file send failed, fallback to relay",m),await oi(l,u)}}catch(u){l.pending=!0,l.status=`发送失败:${u.message}`,l.tone="danger"}}}async function me(r,l){r.progress=0,r.status="上传准备中...";try{if(!l.fallback_allowed)throw new Error("当前文件过大,且未启用 MinIO 回退");await ge.presignFallback(r.transferId),ce("transfer.updated",h.value.deviceId,{transfer_id:r.transferId,final_status:"fallback_uploading",current_channel:"minio"}),r.status="上传中...";const u=await ge.uploadFallback(r.transferId,r.file,m=>{r.progress=Math.max(1,Math.min(m,99))});await ge.updateStatus(r.transferId,{current_channel:"minio",final_status:"completed"}),ce("transfer.updated",h.value.deviceId,{transfer_id:r.transferId,final_status:"completed",current_channel:"minio"}),ce("transfer.file",h.value.deviceId,{transfer_id:r.transferId,name:r.name,download_url:u.download_path||u.download_url}),r.progress=100,r.status="上传完成",r.tone="success"}catch(u){r.pending=!0,r.status=`上传失败:${u.message}`,r.tone="danger"}}async function we(){for(const r of Sn.value)await J(r.id)}async function Ne(r){const l=p.value.find(u=>u.id===r);if(l&&Pe(l),p.value=p.value.filter(u=>u.id!==r),!(!(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(r){const l=p.value.find(u=>u.id===r);if(!(!l||l.kind!=="text"))try{await Mt(l.text),l.copied=!0,window.setTimeout(()=>{const u=p.value.find(m=>m.id===r);u&&u.kind==="text"&&(u.copied=!1)},2e3)}catch{window.alert("复制失败")}}async function Mt(r){var u;if((u=navigator.clipboard)!=null&&u.writeText&&window.isSecureContext){await navigator.clipboard.writeText(r);return}const l=document.createElement("textarea");l.value=r,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(r){const l=le.get(r);l&&(window.clearInterval(l),le.delete(r))}function ke(r){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(r)})}function Pe(r){if($n(r.id),r.ownedDownloadUrl&&r.downloadUrl)try{URL.revokeObjectURL(r.downloadUrl)}catch(l){console.error(l)}r.transferId&&he.delete(r.transferId)}function Bt(r,l,u=!1){if(r.ownedDownloadUrl&&r.downloadUrl&&r.downloadUrl!==l)try{URL.revokeObjectURL(r.downloadUrl)}catch(m){console.error(m)}r.downloadUrl=l,r.ownedDownloadUrl=u}async function rn(r,l){const u=await di(h.value.deviceId);kn(u,{type:"text",transfer_id:r.id,text:l,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type});const m=gi();await ge.updateStatus(r.id,{current_channel:m,final_status:"completed"})}async function ii(r,l){ce("transfer.created",h.value.deviceId,{transfer_id:r.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(r.id,{current_channel:"p2p",final_status:"completed"})}async function ri(r,l){var E;const u=await di(h.value.deviceId);r.status="正在通过 WebRTC 发送...",r.progress=1,kn(u,{type:"file-meta",transfer_id:l.id,name:r.name,mime_type:((E=r.file)==null?void 0:E.type)||"application/octet-stream",size_bytes:r.sizeBytes,sender_device_id:A.value.id,sender_name:A.value.name,sender_type:A.value.type});let m=0;for(;mur;)await To(20)}function To(r){return new Promise(l=>{window.setTimeout(l,r)})}function $o(r,l,u){return new Promise((m,T)=>{const E=window.setTimeout(()=>{T(new Error(u))},l);r.then(se=>{window.clearTimeout(E),m(se)}).catch(se=>{window.clearTimeout(E),T(se)})})}async function ko(){const r=window.prompt("管理员用户名","admin");if(r===null)return;const l=window.prompt("管理员密码");if(l!==null)try{const u=await Kt.login(r.trim()||"admin",l);z.value=u.token,localStorage.setItem(Ss,u.token),await ls(),n.value="admin"}catch(u){window.alert(`管理员登录失败:${u.message}`)}}function Mo(){n.value="main"}async function ls(){if(z.value)try{const[r,l,u]=await Promise.all([Kt.stats(z.value),Kt.config(z.value),Kt.recentTransfers(z.value)]);Tn(l),U.value=xi(r.stats||{},r.minio||{}),N.value=u.map(m=>Ii(m))}catch(r){throw(r==null?void 0:r.status)===401&&(localStorage.removeItem(Ss),localStorage.removeItem(Ln),z.value="",n.value="main"),r}}async function Ro(){if(!z.value||!Y.value){window.alert("当前没有可用的管理员会话");return}try{const r={...Y.value,max_minio_fallback_size_bytes:Math.max(0,$.value)*1024*1024,minio_capacity_bytes:Math.max(0,S.value)*1024*1024*1024},l=await Kt.updateConfig(z.value,r);Tn(l);{const u=await Kt.stats(z.value);U.value=xi(u.stats||{},u.minio||{})}window.alert("配置已保存")}catch(r){window.alert(`保存配置失败:${r.message}`)}}function Ao(){let r=localStorage.getItem(Bn);return r||(r=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`web-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,localStorage.setItem(Bn,r)),r}function Eo(r){let l=localStorage.getItem(cr);return(!l||Oo(l,r))&&(l=`${Po()} ${r.slice(0,4)}`,localStorage.setItem(cr,l)),l}function Oo(r,l){const u=String(r||"").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 Po(){const r=`${navigator.userAgent} ${navigator.platform}`.toLowerCase();return r.includes("iphone")?"iPhone":r.includes("ipad")?"iPad":r.includes("android")?"Android":r.includes("windows")||r.includes("win32")?"Windows":r.includes("mac os")||r.includes("macintosh")||r.includes("macintel")?"macOS":r.includes("linux")?"Linux":"Web"}function Do(){const r=`${navigator.userAgent} ${navigator.platform}`.toLowerCase();return r.includes("iphone")||r.includes("android")||r.includes("mobile")?"phone":r.includes("ipad")||r.includes("tablet")?"tablet":"desktop"}function it(r,l="file"){const u=String(r||"").trim();if(!u)return l;if(!/%[0-9A-Fa-f]{2}/.test(u))return u;try{return decodeURIComponent(u)}catch{return u}}function No(r){return r==="phone"?"smartphone":r==="tablet"?"tablet_mac":"laptop_mac"}function jt(r){return r==="phone"?"手机":r==="tablet"?"平板":"桌面端"}function Fo(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`}function Uo(){var r;return Array.isArray((r=Y.value)==null?void 0:r.turn_urls)&&Y.value.turn_urls.some(l=>String(l||"").trim())}function li(){const r=String(window.location.hostname||"").trim().toLowerCase();return r?r==="localhost"||r==="127.0.0.1"||r==="::1"||r.endsWith(".local")||Lo(r)?r:"":"local"}function ai(r){const l=li();return!!l&&r===l}function Lo(r){const l=r.split(".");if(l.length!==4||l.some(T=>!/^\d+$/.test(T)))return!1;const[u,m]=l.map(T=>Number(T));return u===10||u===127||u===192&&m===168?!0:u===172&&m>=16&&m<=31}function ci(r){const l=Array.isArray(r==null?void 0:r.turn_urls)?r.turn_urls.map(u=>String(u||"").trim()).filter(Boolean):[];return l.length?[{urls:l,username:(r==null?void 0:r.turn_username)||"",credential:(r==null?void 0:r.turn_password)||""}]:[]}function as(){var r,l;return{ice_servers:ci(Y.value),p2p_connect_timeout_sec:((r=Y.value)==null?void 0:r.p2p_connect_timeout_sec)||15,turn_connect_timeout_sec:((l=Y.value)==null?void 0:l.turn_connect_timeout_sec)||20}}function ui(){return typeof RTCPeerConnection<"u"}function cs(){wt=null,Tt=null}function Bo(){return wt||(wt=new Promise(r=>{Tt=r})),wt}function fi(r){Tt&&Tt(r),wt=Promise.resolve(r),Tt=null}function We(r=""){if(!h.value.deviceId)return;const l=h.value.baseType||h.value.type||"点对点传输";h.value={...h.value,type:r?`${l} · ${r}`:l}}function jo(r){return!L||G!==r||L.signalingState==="closed"||["failed","disconnected","closed"].includes(L.connectionState)||["failed","disconnected","closed"].includes(L.iceConnectionState)?!0:!B||B.readyState==="closed"}async function rt(r,l={}){return!r||!ui()?null:(jo(r)&&(ot(),Ho(r)),l.initiate&&L.signalingState==="stable"&&await Ko(r),L)}function Ho(r){G=r,_e="p2p",ze=!1,be=!1,ue=!1,$e.delete(r),cs(),L=new RTCPeerConnection({iceServers:ci(Y.value)}),B=L.createDataChannel("filefast-control",{negotiated:!0,id:0,ordered:!0}),zo(B),L.onicecandidate=({candidate:l})=>{if(l)try{ce("webrtc.candidate",r,{candidate:l})}catch(u){console.error(u)}},L.onconnectionstatechange=()=>{if(L){if(us(),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=()=>{us()}}async function Ko(r){if(L)try{ze=!0,await L.setLocalDescription(),ce("webrtc.description",r,{description:L.localDescription})}finally{ze=!1}}function zo(r){B=r,r.bufferedAmountLowThreshold=ur/2,r.onopen=()=>{fi(r),We(_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"),us()},r.onclose=()=>{B===r&&(B=null,cs(),We("实时通道已关闭"))},r.onerror=l=>{console.error(l)},r.onmessage=l=>{Wo(l.data)},r.readyState==="open"&&fi(r)}function ot(){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,cs()}async function di(r){if(!ui())throw new Error("当前浏览器不支持 WebRTC");if(await rt(r,{initiate:!0}),(B==null?void 0:B.readyState)==="open")return B;const l=await $o(Bo(),of,"WebRTC 连接超时");if(!l||l.readyState!=="open")throw new Error("实时通道未建立");return l}function kn(r,l){if(!r||r.readyState!=="open")throw new Error("实时通道未就绪");r.send(JSON.stringify(l))}function Wo(r){try{const l=JSON.parse(String(r||"{}"));if(l.type==="text"){Vo(l);return}if(l.type==="file-meta"){qo(l);return}if(l.type==="file-chunk"){Go(l);return}l.type==="file-complete"&&Jo(l)}catch(l){console.error(l)}}function Vo(r){var T;const l=r.sender_device_id||G,u={id:l,name:r.sender_name||((T=Rt(l))==null?void 0:T.name)||`设备 ${lt(l)}`,type:jt(r.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0);const m=p.value.find(E=>E.transferId===r.transfer_id);if(m&&m.kind==="text"){m.text=r.text||"",m.status="已接收",m.tone="success";return}p.value.push({id:Ue("incoming-text"),transferId:r.transfer_id,kind:"text",text:r.text||"",status:"已接收",tone:"success",copied:!1})}function qo(r){var T;const l=r.sender_device_id||G,u={id:l,name:r.sender_name||((T=Rt(l))==null?void 0:T.name)||`设备 ${lt(l)}`,type:jt(r.sender_type||"desktop"),connectionType:_e==="turn"?"TURN 中继已连接":"WebRTC 直连已连接"};M(u,!0),he.set(r.transfer_id,{name:it(r.name,"file"),mimeType:r.mime_type||"application/octet-stream",sizeBytes:Number(r.size_bytes||0),receivedBytes:0,chunks:[]});let m=p.value.find(E=>E.transferId===r.transfer_id);m?(m.status="正在接收...",m.tone="primary",m.progress=0):(m={id:Ue("incoming-file"),transferId:r.transfer_id,kind:"file",name:it(r.name,"file"),size:At(Number(r.size_bytes||0)),sizeBytes:Number(r.size_bytes||0),status:"正在接收...",tone:"primary",progress:0,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(m))}function Go(r){const l=he.get(r.transfer_id);if(!l)return;const u=So(String(r.chunk_base64||""));l.receivedBytes+=Number(r.chunk_size||u.byteLength||0),l.chunks.push(u);const m=p.value.find(T=>T.transferId===r.transfer_id);if(m){const T=l.sizeBytes>0?l.receivedBytes/l.sizeBytes*100:0;m.progress=Math.max(1,Math.min(99,Math.round(T))),m.status="正在接收...",m.tone="primary"}}function Jo(r){const l=he.get(r.transfer_id);if(!l)return;const u=p.value.find(E=>E.transferId===r.transfer_id);if(!u){he.delete(r.transfer_id);return}const m=new Blob(l.chunks,{type:l.mimeType||"application/octet-stream"}),T=URL.createObjectURL(m);Bt(u,T,!0),u.progress=100,u.status="可保存",u.tone="success",he.delete(r.transfer_id)}function pi(r){return A.value.id.localeCompare(r)>0}function Mn(r,l="等待实时数据"){const u=Rt(r);return{id:r,deviceId:r,name:(u==null?void 0:u.name)||`设备 ${lt(r)}`,type:jt((u==null?void 0:u.type)||"desktop"),connectionType:l,network_group_key:(u==null?void 0:u.network_group_key)||""}}async function hi(r){const u=(r.payload||{}).description,m=r.device_id||"";if(!u||!m)return;M(Mn(m),!0);const T=await rt(m);if(!T)return;const E=pi(m),se=!ze&&(T.signalingState==="stable"||ue),Et=u.type==="offer"&&!se;be=!E&&Et,!be&&(ue=u.type==="answer",await T.setRemoteDescription(u),ue=!1,u.type==="offer"&&(await T.setLocalDescription(),ce("webrtc.description",m,{description:T.localDescription})))}async function mi(r){const l=r.payload||{},u=r.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(T){be||console.error(T)}}async function us(){if(!(!L||L.connectionState!=="connected"))try{const r=await L.getStats();let l=null;if(r.forEach(E=>{E.type==="transport"&&E.selectedCandidatePairId&&(l=r.get(E.selectedCandidatePairId)||l)}),l||r.forEach(E=>{E.type==="candidate-pair"&&E.state==="succeeded"&&(E.nominated||E.selected)&&(l=E)}),!l)return;const u=r.get(l.localCandidateId),m=r.get(l.remoteCandidateId),T=(u==null?void 0:u.candidateType)==="relay"||(m==null?void 0:m.candidateType)==="relay";_e=T?"turn":"p2p",(B==null?void 0:B.readyState)==="open"&&We(T?"TURN 中继已连接":"WebRTC 直连已连接")}catch(r){console.error(r)}}function gi(){return _e==="turn"?"turn":"p2p"}function vi(){if(!A.value.id)return;const r=localStorage.getItem(Cs)||"";r&&(yi(),de=new WebSocket(`${_.value}?deviceId=${encodeURIComponent(A.value.id)}&deviceToken=${encodeURIComponent(r)}`),de.addEventListener("message",l=>{Xo(l.data)}),de.addEventListener("close",()=>{de=null,Yo()}),de.addEventListener("error",()=>{de==null||de.close()}))}function yi(){if(st&&(window.clearTimeout(st),st=null),!de)return;const r=de;de=null,r.onclose=null,r.close()}function Yo(){st||!A.value.id||(st=window.setTimeout(()=>{st=null,vi()},sf))}function ce(r,l,u){!de||de.readyState!==WebSocket.OPEN||!l||de.send(JSON.stringify({type:r,target_device_id:l,payload:u}))}function Xo(r){try{const l=JSON.parse(r);if(l.type==="presence.update"){v();return}if(l.type==="webrtc.description"){hi(l);return}if(l.type==="webrtc.candidate"){mi(l);return}if(l.type==="transfer.created"){_i(l);return}if(l.type==="transfer.updated"){bi(l);return}if(l.type==="transfer.file"){wi(l);return}l.type==="peer.session.closed"&&Zo(l)}catch(l){console.error(l)}}function Zo(r){const l=r.device_id||"";!l||h.value.deviceId!==l||(ot(),D(),h.value={name:"--",type:"绛夊緟杩炴帴",baseType:"绛夊緟杩炴帴",deviceId:"",networkGroupKey:""},n.value="main")}function _i(r){var E;const l=r.payload||{},u=r.device_id||l.sender_device_id||"",m={id:u,name:l.sender_name||((E=Rt(u))==null?void 0:E.name)||`Device ${lt(u)}`,type:jt(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:it(l.name,"file"),size:At(Number(l.size_bytes||0)),sizeBytes:Number(l.size_bytes||0),status:"接收中...",tone:"primary",progress:35,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}}function bi(r){const l=r.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 wi(r){const l=r.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:it(l.name,"file"),size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(u)),!(!u||u.kind!=="file")&&(Bt(u,l.download_url||l.data_url||"",!1),u.status="可保存",u.progress=100,u.tone="success")}function Rt(r){return i.value.find(l=>l.id===r)}function xi(r,l={}){return[{label:"在线设备",value:`${r.devices_online||0}`,tone:"blue"},{label:"待加入房间",value:`${r.rooms_waiting||0}`,tone:"cyan"},{label:"有效传输",value:`${r.transfers_total||0}`,tone:"default"},{label:"累计传输",value:`${r.transfers_cumulative||0}`,tone:"default"},{kind:"minio",label:"MinIO 剩余容量",value:fs(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:`已用 ${fs(l.used_bytes||0)} / 总计 ${fs(l.capacity_bytes||0)}`,kicker:`存档 ${l.object_count||0} 份`}]}function fs(r){const l=Number(r||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),T=l/1024**m,E=m>=3?2:T>=10?1:2;return`${T.toFixed(E)} ${u[m]}`}function Ii(r){const l=r.final_status==="completed",u=r.final_status==="failed"||r.final_status==="cancelled";return{time:Rn(r.created_at),peer:`${lt(r.sender_device_id)} -> ${lt(r.receiver_device_id)}`,type:r.kind==="text"?"文本消息":`文件 ${r.name}`,size:At(Number(r.size_bytes||0)),status:l?`已完成 (${r.current_channel||"p2p"})`:u?`已结束 (${r.final_status})`:`进行中 (${r.final_status||"pending"})`,tone:l?"success":u?"danger":"primary"}}function lt(r){return r?r.slice(0,8):"--"}function Rn(r){if(!r)return"刚刚";const l=new Date(r),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 T=Math.floor(m/60);if(T<60)return`${T} 分钟前`;const E=Math.floor(T/60);return E<24?`${E} 小时前`:`${Math.floor(E/24)} 天前`}function Ue(r){return`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function At(r){if(!r||r<=0)return"0 B";const l=["B","KB","MB","GB","TB"],u=Math.min(Math.floor(Math.log(r)/Math.log(1024)),l.length-1),m=r/1024**u,T=m>=10||u===0?0:1;return`${m.toFixed(T)} ${l[u]}`}v=async function(){return A.value.id?Fn.listCandidates(A.value.id).then(l=>{i.value=l.map(u=>({...u,description:`${jt(u.type)} · 最近活跃 ${Rn(u.last_seen_at)}`,icon:No(u.type),connectionType:ai(u.network_group_key)?"局域网直连优先":"跨网络实时传输"})),s.value=i.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&&(ot(),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||"",T=l.connectionType||l.type||"点对点传输";h.value.deviceId===m&&n.value==="transfer"||(ot(),u||D()),h.value={name:l.name,type:T,baseType:T,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,{}),ot(),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(T){console.warn("realtime text send failed, fallback to relay",T),await ii(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 Si(r,l){ce("transfer.file",h.value.deviceId,{transfer_id:r.transferId,name:r.name,download_url:l.download_path||l.download_url})}function Ci(r,l,{onProgress:u}={}){if(!(r!=null&&r.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 T=(async()=>(await ge.presignFallback(m),ge.uploadFallback(m,r.file,E=>{typeof u=="function"&&u(E)})))().finally(()=>{Te.delete(m)});return Te.set(m,T),T}async function Ti(r,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"}),Si(r,u),r.progress=100,r.status="已上传到 MinIO,对方可直接领取",r.tone="success"}async function Qo(r,l){const u=$e.get(r);if(!(!(u!=null&&u.length)||!(l!=null&&l.remoteDescription))){$e.delete(r);for(const m of u)try{await l.addIceCandidate(m)}catch(T){console.error(T)}}}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 Ci(l,u,{onProgress:T=>{l.progress=Math.max(5,Math.min(T,99))}});await Ti(l,u,m)}catch(m){l.pending=!0,l.status=`上传失败:${m.message}`,l.tone="danger"}},hi=async function(l){const m=(l.payload||{}).description,T=l.device_id||"";if(!m||!T)return;M(Mn(T),!0);const E=await rt(T);if(!E)return;const se=pi(T),Et=!ze&&(E.signalingState==="stable"||ue),el=m.type==="offer"&&!Et;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(T,E)}catch(ds){console.error(ds)}finally{ue=!1}if(m.type==="offer")try{await E.setLocalDescription(),ce("webrtc.description",T,{description:E.localDescription})}catch(ds){console.error(ds)}}},mi=async function(l){const u=l.payload||{},m=l.device_id||"",T=u.candidate;if(!T||!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(T),$e.set(m,se);return}try{await E.addIceCandidate(T)}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 T=m.fallback_allowed?Ci(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:as()});try{if(await ri(u,m),m.fallback_allowed){u.status="实时传输完成,正在同步云端备份...",u.tone="primary";try{const E=await T;E&&(Si(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 T;if(se){await Ti(u,m,se);return}}catch(se){console.warn("minio backup sync failed after realtime failure",se)}await oi(u,m)}}catch(m){u.pending=!0,u.status=`发送失败:${m.message}`,u.tone="danger"}}},_i=function(l){var se;const u=l.payload||{},m=l.device_id||u.sender_device_id||"",T={id:m,name:u.sender_name||((se=Rt(m))==null?void 0:se.name)||`设备 ${lt(m)}`,type:jt(u.sender_type||"desktop"),connectionType:"等待实时数据"};if(M(T,!0),!p.value.find(Et=>Et.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:it(u.name,"file"),size:At(Number(u.size_bytes||0)),sizeBytes:Number(u.size_bytes||0),status:"等待接收...",tone:"primary",progress:5,pending:!1,downloadUrl:"",ownedDownloadUrl:!1})}},bi=function(l){const u=l.payload||{},m=p.value.find(T=>T.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")}},wi=function(l){const u=l.payload||{};let m=p.value.find(T=>T.transferId===u.transfer_id);!m&&u.transfer_id&&(m={id:Ue("incoming-file"),transferId:u.transfer_id,kind:"file",name:it(u.name,"file"),size:"",sizeBytes:0,status:"可保存",tone:"success",progress:100,pending:!1,downloadUrl:"",ownedDownloadUrl:!1},p.value.push(m)),!(!m||m.kind!=="file")&&(Bt(m,u.download_url||u.data_url||"",!1),m.status="可保存",m.progress=100,m.tone="success")},Ii=function(l){const u=l.final_status==="completed",m=l.final_status==="failed"||l.final_status==="cancelled",T=it(l.name,"file");return{time:Rn(l.created_at),peer:`${lt(l.sender_device_id)} -> ${lt(l.receiver_device_id)}`,type:l.kind==="text"?"鏂囨湰娑堟伅":`鏂囦欢 ${T}`,size:At(Number(l.size_bytes||0)),status:u?`宸插畬鎴?(${l.current_channel||"p2p"})`:m?`宸茬粨鏉?(${l.final_status})`:`杩涜涓?(${l.final_status||"pending"})`,tone:u?"success":m?"danger":"primary"}},(r,l)=>(j(),V("div",null,[y("div",Zu,[q(Oc,{theme:t.value,onToggleTheme:Cn},null,8,["theme"]),n.value==="main"?(j(),V("div",Qu,[q(gu,{devices:i.value,"is-scanning":s.value,"local-device-name":A.value.name,onSelectDevice:P},null,8,["devices","is-scanning","local-device-name"]),q(ku,{"generated-code":c.value,"is-waiting":a.value,"pending-downloads":f.value,"room-code-input":o.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(),vt(ju,{key:1,"connection-type":h.value.type,"has-pending-items":$t.value,items:p.value,"network-hint":Lt.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(),vt(ou,{key:2,"file-limit":$.value,"minio-capacity":S.value,records:N.value,stats:U.value,onExit:Mo,onSaveConfig:Ro,"onUpdate:fileLimit":l[0]||(l[0]=u=>$.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:ko})]))}};Tc(af).mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 8e2756f..047300a 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,8 +4,8 @@ AirShare Pro - - + +
diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 85fd5c7..2a3c76a 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -2863,6 +2863,24 @@ handleIncomingTransferFile = function handleIncomingTransferFileOverride(envelop item.progress = 100 item.tone = 'success' } +mapTransferRecord = function mapTransferRecordOverride(record) { + const isCompleted = record.final_status === 'completed' + const isFailed = record.final_status === 'failed' || record.final_status === 'cancelled' + const displayName = normalizeDisplayName(record.name, 'file') + + return { + time: formatRelativeTime(record.created_at), + peer: `${shortId(record.sender_device_id)} -> ${shortId(record.receiver_device_id)}`, + type: record.kind === 'text' ? '鏂囨湰娑堟伅' : `鏂囦欢 ${displayName}`, + size: formatFileSize(Number(record.size_bytes || 0)), + status: isCompleted + ? `宸插畬鎴?(${record.current_channel || 'p2p'})` + : isFailed + ? `宸茬粨鏉?(${record.final_status})` + : `杩涜涓?(${record.final_status || 'pending'})`, + tone: isCompleted ? 'success' : isFailed ? 'danger' : 'primary', + } +}