@serfab/cadre-host 1.14.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -4
- package/dist/bin/host.js +32 -20
- package/dist/bin/host.js.map +1 -1
- package/dist/bin/nat-output.d.ts +5 -0
- package/dist/bin/nat-output.js +12 -1
- package/dist/bin/nat-output.js.map +1 -1
- package/dist/bin/ui-access.d.ts +22 -0
- package/dist/bin/ui-access.js +44 -0
- package/dist/bin/ui-access.js.map +1 -0
- package/dist/hosted/claim-details.d.ts +25 -3
- package/dist/hosted/claim-details.js +31 -37
- package/dist/hosted/claim-details.js.map +1 -1
- package/dist/hosted/hosted-node-service.d.ts +7 -0
- package/dist/hosted/hosted-node-service.js +16 -4
- package/dist/hosted/hosted-node-service.js.map +1 -1
- package/dist/hosted/hosted-node-watcher.d.ts +16 -4
- package/dist/hosted/hosted-node-watcher.js +45 -9
- package/dist/hosted/hosted-node-watcher.js.map +1 -1
- package/dist/hosted/node-status.d.ts +19 -3
- package/dist/hosted/node-status.js +21 -5
- package/dist/hosted/node-status.js.map +1 -1
- package/dist/hosted/types.d.ts +12 -5
- package/dist/hosted/types.js.map +1 -1
- package/dist/installer/config.d.ts +23 -0
- package/dist/installer/config.js +46 -0
- package/dist/installer/config.js.map +1 -1
- package/dist/installer/index.d.ts +2 -0
- package/dist/installer/index.js +7 -16
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/wizard.d.ts +12 -2
- package/dist/installer/wizard.js +15 -7
- package/dist/installer/wizard.js.map +1 -1
- package/dist/nat/index.d.ts +2 -1
- package/dist/nat/index.js +1 -0
- package/dist/nat/index.js.map +1 -1
- package/dist/nat/nat-service.d.ts +22 -5
- package/dist/nat/nat-service.js +75 -26
- package/dist/nat/nat-service.js.map +1 -1
- package/dist/nat/nat-store.js +11 -0
- package/dist/nat/nat-store.js.map +1 -1
- package/dist/nat/network-mode.d.ts +19 -0
- package/dist/nat/network-mode.js +32 -0
- package/dist/nat/network-mode.js.map +1 -0
- package/dist/nat/reachability.d.ts +5 -4
- package/dist/nat/reachability.js +19 -6
- package/dist/nat/reachability.js.map +1 -1
- package/dist/nat/types.d.ts +26 -6
- package/dist/nat/types.js.map +1 -1
- package/dist/orchestrator/host-process-orchestrator.d.ts +3 -3
- package/dist/orchestrator/host-process-orchestrator.js +6 -15
- package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
- package/dist/package-version.d.ts +1 -0
- package/dist/package-version.js +4 -0
- package/dist/package-version.js.map +1 -0
- package/dist/server/routes/settings.d.ts +1 -0
- package/dist/server/routes/settings.js +15 -1
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/status.js +2 -32
- package/dist/server/routes/status.js.map +1 -1
- package/dist/ui/assets/index-BHd8CWZA.css +1 -0
- package/dist/ui/assets/index-Ccr2GjPT.js +23 -0
- package/dist/ui/assets/{index-4FWuU8ye.js.map → index-Ccr2GjPT.js.map} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +4 -5
- package/src/__tests__/cli.smoke.test.ts +1 -1
- package/src/__tests__/orchestrator-claim-secret.test.ts +1 -2
- package/src/__tests__/orchestrator-env-scrub.test.ts +160 -163
- package/src/__tests__/orchestrator-handle-contract.ts +1 -1
- package/src/__tests__/orchestrator-node-identity.test.ts +0 -5
- package/src/__tests__/orchestrator-push.test.ts +3 -3
- package/src/__tests__/orchestrator.test.ts +3 -5
- package/src/__tests__/ui-access.test.ts +30 -0
- package/src/bin/host.ts +30 -20
- package/src/bin/nat-output.ts +12 -1
- package/src/bin/ui-access.ts +50 -0
- package/src/hosted/__tests__/fake-orchestrator.test.ts +0 -1
- package/src/hosted/__tests__/fake-orchestrator.ts +263 -265
- package/src/hosted/__tests__/hosted-node-service.test.ts +708 -609
- package/src/hosted/__tests__/hosted-node-supervisor.test.ts +475 -474
- package/src/hosted/claim-details.ts +44 -37
- package/src/hosted/hosted-node-service.ts +23 -4
- package/src/hosted/hosted-node-watcher.ts +288 -250
- package/src/hosted/node-status.ts +31 -5
- package/src/hosted/types.ts +160 -153
- package/src/installer/__tests__/installer.smoke.test.ts +184 -182
- package/src/installer/__tests__/wizard.test.ts +76 -56
- package/src/installer/config.ts +66 -0
- package/src/installer/index.ts +252 -259
- package/src/installer/wizard.ts +101 -87
- package/src/nat/__tests__/nat-service.test.ts +608 -540
- package/src/nat/__tests__/nat-store.test.ts +130 -127
- package/src/nat/__tests__/network-mode.test.ts +38 -0
- package/src/nat/index.ts +91 -87
- package/src/nat/nat-service.ts +79 -26
- package/src/nat/nat-store.ts +249 -237
- package/src/nat/network-mode.ts +36 -0
- package/src/nat/reachability.ts +155 -143
- package/src/nat/types.ts +232 -209
- package/src/orchestrator/host-process-orchestrator.ts +1089 -1098
- package/src/package-version.ts +4 -0
- package/src/server/__tests__/fakes.ts +41 -40
- package/src/server/__tests__/hosted-nodes-route.test.ts +161 -160
- package/src/server/__tests__/settings-route.test.ts +31 -0
- package/src/server/routes/settings.ts +128 -115
- package/src/server/routes/status.ts +72 -102
- package/dist/ui/assets/index-4FWuU8ye.js +0 -19
- package/dist/ui/assets/index-Di9Q4d01.css +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(a){if(a.ep)return;a.ep=!0;const s=n(a);fetch(a.href,s)}})();const $i=!1;var ca=Array.isArray,Qi=Array.prototype.indexOf,kn=Array.prototype.includes,ur=Array.from,Xi=Object.defineProperty,jn=Object.getOwnPropertyDescriptor,Ts=Object.getOwnPropertyDescriptors,Zi=Object.prototype,eo=Array.prototype,da=Object.getPrototypeOf,Ia=Object.isExtensible;const ua=()=>{};function to(e){return e()}function Yr(e){for(var t=0;t<e.length;t++)e[t]()}function Ns(){var e,t,n=new Promise((r,a)=>{e=r,t=a});return{promise:n,resolve:e,reject:t}}const ze=2,Cn=4,Gn=8,Rs=1<<24,kt=16,gt=32,Wt=64,Gr=128,ot=512,De=1024,Fe=2048,St=4096,Ye=8192,lt=16384,pn=32768,Pa=1<<25,dn=65536,Wr=1<<17,no=1<<18,xn=1<<19,xs=1<<20,bt=1<<25,un=65536,ir=1<<21,Vn=1<<22,Kt=1<<23,an=Symbol("$state"),ro=Symbol(""),Lt=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ao=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml");function Is(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function so(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function io(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function oo(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function lo(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function co(e){throw new Error("https://svelte.dev/e/effect_orphan")}function uo(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function fo(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function vo(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function ho(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function po(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const go=1,_o=2,Ps=4,mo=8,wo=16,yo=1,bo=2,qe=Symbol(),Ms="http://www.w3.org/1999/xhtml",Eo="http://www.w3.org/2000/svg",ko="http://www.w3.org/1998/Math/MathML";function Co(){console.warn("https://svelte.dev/e/derived_inert")}function So(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Ao(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function Bs(e){return e===this.v}function To(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ls(e){return!To(e,this.v)}let Wn=!1,No=!1;function Ro(){Wn=!0}let Ae=null;function Sn(e){Ae=e}function Ge(e,t=!1,n){Ae={p:Ae,i:!1,c:null,e:null,s:e,x:null,r:ae,l:Wn&&!t?{s:null,u:null,$:[]}:null}}function We(e){var t=Ae,n=t.e;if(n!==null){t.e=null;for(var r of n)ti(r)}return t.i=!0,Ae=t.p,{}}function In(){return!Wn||Ae!==null&&Ae.l===null}let nn=[];function Ds(){var e=nn;nn=[],Yr(e)}function Ct(e){if(nn.length===0&&!On){var t=nn;queueMicrotask(()=>{t===nn&&Ds()})}nn.push(e)}function xo(){for(;nn.length>0;)Ds()}function qs(e){var t=ae;if(t===null)return ie.f|=Kt,e;if((t.f&pn)===0&&(t.f&Cn)===0)throw e;zt(e,t)}function zt(e,t){for(;t!==null;){if((t.f&Gr)!==0){if((t.f&pn)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const Io=-7169;function Ie(e,t){e.f=e.f&Io|t}function fa(e){(e.f&ot)!==0||e.deps===null?Ie(e,De):Ie(e,St)}function Us(e){if(e!==null)for(const t of e)(t.f&ze)===0||(t.f&un)===0||(t.f^=un,Us(t.deps))}function Fs(e,t,n){(e.f&Fe)!==0?t.add(e):(e.f&St)!==0&&n.add(e),Us(e.deps),Ie(e,De)}const tn=new Set;let ee=null,ht=null,$r=null,On=!1,wr=!1,bn=null,rr=null;var Ma=0;let Po=1;class $t{id=Po++;current=new Map;previous=new Map;#n=new Set;#l=new Set;#e=new Set;#a=new Map;#r=new Map;#s=null;#t=[];#i=[];#c=new Set;#d=new Set;#o=new Map;#f=new Set;is_fork=!1;#h=!1;#v=new Set;#u(){return this.is_fork||this.#r.size>0}#_(){for(const r of this.#v)for(const a of r.#r.keys()){for(var t=!1,n=a;n.parent!==null;){if(this.#o.has(n)){t=!0;break}n=n.parent}if(!t)return!0}return!1}skip_effect(t){this.#o.has(t)||this.#o.set(t,{d:[],m:[]}),this.#f.delete(t)}unskip_effect(t,n=r=>this.schedule(r)){var r=this.#o.get(t);if(r){this.#o.delete(t);for(var a of r.d)Ie(a,Fe),n(a);for(a of r.m)Ie(a,St),n(a)}this.#f.add(t)}#p(){if(Ma++>1e3&&(tn.delete(this),Bo()),!this.#u()){for(const o of this.#c)this.#d.delete(o),Ie(o,Fe),this.schedule(o);for(const o of this.#d)Ie(o,St),this.schedule(o)}const t=this.#t;this.#t=[],this.apply();var n=bn=[],r=[],a=rr=[];for(const o of t)try{this.#m(o,n,r)}catch(l){throw Hs(o),l}if(ee=null,a.length>0){var s=$t.ensure();for(const o of a)s.schedule(o)}if(bn=null,rr=null,this.#u()||this.#_()){this.#g(r),this.#g(n);for(const[o,l]of this.#o)Os(o,l)}else{this.#a.size===0&&tn.delete(this),this.#c.clear(),this.#d.clear();for(const o of this.#n)o(this);this.#n.clear(),Ba(r),Ba(n),this.#s?.resolve()}var i=ee;if(this.#t.length>0){const o=i??=this;o.#t.push(...this.#t.filter(l=>!o.#t.includes(l)))}i!==null&&(tn.add(i),i.#p())}#m(t,n,r){t.f^=De;for(var a=t.first;a!==null;){var s=a.f,i=(s&(gt|Wt))!==0,o=i&&(s&De)!==0,l=o||(s&Ye)!==0||this.#o.has(a);if(!l&&a.fn!==null){i?a.f^=De:(s&Cn)!==0?n.push(a):Xn(a)&&((s&kt)!==0&&this.#d.add(a),Tn(a));var f=a.first;if(f!==null){a=f;continue}}for(;a!==null;){var u=a.next;if(u!==null){a=u;break}a=a.parent}}}#g(t){for(var n=0;n<t.length;n+=1)Fs(t[n],this.#c,this.#d)}capture(t,n,r=!1){t.v!==qe&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Kt)===0&&(this.current.set(t,[n,r]),ht?.set(t,n)),this.is_fork||(t.v=n)}activate(){ee=this}deactivate(){ee=null,ht=null}flush(){try{wr=!0,ee=this,this.#p()}finally{Ma=0,$r=null,bn=null,rr=null,wr=!1,ee=null,ht=null,sn.clear()}}discard(){for(const t of this.#l)t(this);this.#l.clear(),this.#e.clear(),tn.delete(this)}register_created_effect(t){this.#i.push(t)}#w(){for(const u of tn){var t=u.id<this.id,n=[];for(const[p,[h,g]]of this.current){if(u.current.has(p)){var r=u.current.get(p)[0];if(t&&h!==r)u.current.set(p,[h,g]);else continue}n.push(p)}var a=[...u.current.keys()].filter(p=>!this.current.has(p));if(a.length===0)t&&u.discard();else if(n.length>0){if(t)for(const p of this.#f)u.unskip_effect(p,h=>{(h.f&(kt|Vn))!==0?u.schedule(h):u.#g([h])});u.activate();var s=new Set,i=new Map;for(var o of n)js(o,a,s,i);i=new Map;var l=[...u.current.keys()].filter(p=>this.current.has(p)?this.current.get(p)[0]!==p:!0);for(const p of this.#i)(p.f&(lt|Ye|Wr))===0&&va(p,l,i)&&((p.f&(Vn|kt))!==0?(Ie(p,Fe),u.schedule(p)):u.#c.add(p));if(u.#t.length>0){u.apply();for(var f of u.#t)u.#m(f,[],[]);u.#t=[]}u.deactivate()}}for(const u of tn)u.#v.has(this)&&(u.#v.delete(this),u.#v.size===0&&!u.#u()&&(u.activate(),u.#p()))}increment(t,n){let r=this.#a.get(n)??0;if(this.#a.set(n,r+1),t){let a=this.#r.get(n)??0;this.#r.set(n,a+1)}}decrement(t,n,r){let a=this.#a.get(n)??0;if(a===1?this.#a.delete(n):this.#a.set(n,a-1),t){let s=this.#r.get(n)??0;s===1?this.#r.delete(n):this.#r.set(n,s-1)}this.#h||r||(this.#h=!0,Ct(()=>{this.#h=!1,this.flush()}))}transfer_effects(t,n){for(const r of t)this.#c.add(r);for(const r of n)this.#d.add(r);t.clear(),n.clear()}oncommit(t){this.#n.add(t)}ondiscard(t){this.#l.add(t)}on_fork_commit(t){this.#e.add(t)}run_fork_commit_callbacks(){for(const t of this.#e)t(this);this.#e.clear()}settled(){return(this.#s??=Ns()).promise}static ensure(){if(ee===null){const t=ee=new $t;wr||(tn.add(ee),On||Ct(()=>{ee===t&&t.flush()}))}return ee}apply(){{ht=null;return}}schedule(t){if($r=t,t.b?.is_pending&&(t.f&(Cn|Gn|Rs))!==0&&(t.f&pn)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(bn!==null&&n===ae&&(ie===null||(ie.f&ze)===0))return;if((r&(Wt|gt))!==0){if((r&De)===0)return;n.f^=De}}this.#t.push(n)}}function Mo(e){var t=On;On=!0;try{for(var n;;){if(xo(),ee===null)return n;ee.flush()}}finally{On=t}}function Bo(){try{uo()}catch(e){zt(e,$r)}}let Bt=null;function Ba(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if((r.f&(lt|Ye))===0&&Xn(r)&&(Bt=new Set,Tn(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&ai(r),Bt?.size>0)){sn.clear();for(const a of Bt){if((a.f&(lt|Ye))!==0)continue;const s=[a];let i=a.parent;for(;i!==null;)Bt.has(i)&&(Bt.delete(i),s.push(i)),i=i.parent;for(let o=s.length-1;o>=0;o--){const l=s[o];(l.f&(lt|Ye))===0&&Tn(l)}}Bt.clear()}}Bt=null}}function js(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const a of e.reactions){const s=a.f;(s&ze)!==0?js(a,t,n,r):(s&(Vn|kt))!==0&&(s&Fe)===0&&va(a,t,r)&&(Ie(a,Fe),ha(a))}}function va(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const a of e.deps){if(kn.call(t,a))return!0;if((a.f&ze)!==0&&va(a,t,n))return n.set(a,!0),!0}return n.set(e,!1),!1}function ha(e){ee.schedule(e)}function Os(e,t){if(!((e.f>)!==0&&(e.f&De)!==0)){(e.f&Fe)!==0?t.d.push(e):(e.f&St)!==0&&t.m.push(e),Ie(e,De);for(var n=e.first;n!==null;)Os(n,t),n=n.next}}function Hs(e){Ie(e,De);for(var t=e.first;t!==null;)Hs(t),t=t.next}function Lo(e){let t=0,n=fn(0),r;return()=>{ga()&&(c(n),gr(()=>(t===0&&(r=gn(()=>e(()=>Hn(n)))),t+=1,()=>{Ct(()=>{t-=1,t===0&&(r?.(),r=void 0,Hn(n))})})))}}var Do=dn|xn;function qo(e,t,n,r){new Uo(e,t,n,r)}class Uo{parent;is_pending=!1;transform_error;#n;#l=null;#e;#a;#r;#s=null;#t=null;#i=null;#c=null;#d=0;#o=0;#f=!1;#h=new Set;#v=new Set;#u=null;#_=Lo(()=>(this.#u=fn(this.#d),()=>{this.#u=null}));constructor(t,n,r,a){this.#n=t,this.#e=n,this.#a=s=>{var i=ae;i.b=this,i.f|=Gr,r(s)},this.parent=ae.b,this.transform_error=a??this.parent?.transform_error??(s=>s),this.#r=Qn(()=>{this.#w()},Do)}#p(){try{this.#s=it(()=>this.#a(this.#n))}catch(t){this.error(t)}}#m(t){const n=this.#e.failed;n&&(this.#i=it(()=>{n(this.#n,()=>t,()=>()=>{})}))}#g(){const t=this.#e.pending;t&&(this.is_pending=!0,this.#t=it(()=>t(this.#n)),Ct(()=>{var n=this.#c=document.createDocumentFragment(),r=Dt();n.append(r),this.#s=this.#b(()=>it(()=>this.#a(r))),this.#o===0&&(this.#n.before(n),this.#c=null,on(this.#t,()=>{this.#t=null}),this.#y(ee))}))}#w(){try{if(this.is_pending=this.has_pending_snippet(),this.#o=0,this.#d=0,this.#s=it(()=>{this.#a(this.#n)}),this.#o>0){var t=this.#c=document.createDocumentFragment();wa(this.#s,t);const n=this.#e.pending;this.#t=it(()=>n(this.#n))}else this.#y(ee)}catch(n){this.error(n)}}#y(t){this.is_pending=!1,t.transfer_effects(this.#h,this.#v)}defer_effect(t){Fs(t,this.#h,this.#v)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#e.pending}#b(t){var n=ae,r=ie,a=Ae;Tt(this.#r),ut(this.#r),Sn(this.#r.ctx);try{return $t.ensure(),t()}catch(s){return qs(s),null}finally{Tt(n),ut(r),Sn(a)}}#E(t,n){if(!this.has_pending_snippet()){this.parent&&this.parent.#E(t,n);return}this.#o+=t,this.#o===0&&(this.#y(n),this.#t&&on(this.#t,()=>{this.#t=null}),this.#c&&(this.#n.before(this.#c),this.#c=null))}update_pending_count(t,n){this.#E(t,n),this.#d+=t,!(!this.#u||this.#f)&&(this.#f=!0,Ct(()=>{this.#f=!1,this.#u&&An(this.#u,this.#d)}))}get_effect_pending(){return this.#_(),c(this.#u)}error(t){if(!this.#e.onerror&&!this.#e.failed)throw t;ee?.is_fork?(this.#s&&ee.skip_effect(this.#s),this.#t&&ee.skip_effect(this.#t),this.#i&&ee.skip_effect(this.#i),ee.on_fork_commit(()=>{this.#k(t)})):this.#k(t)}#k(t){this.#s&&(et(this.#s),this.#s=null),this.#t&&(et(this.#t),this.#t=null),this.#i&&(et(this.#i),this.#i=null);var n=this.#e.onerror;let r=this.#e.failed;var a=!1,s=!1;const i=()=>{if(a){Ao();return}a=!0,s&&po(),this.#i!==null&&on(this.#i,()=>{this.#i=null}),this.#b(()=>{this.#w()})},o=l=>{try{s=!0,n?.(l,i),s=!1}catch(f){zt(f,this.#r&&this.#r.parent)}r&&(this.#i=this.#b(()=>{try{return it(()=>{var f=ae;f.b=this,f.f|=Gr,r(this.#n,()=>l,()=>i)})}catch(f){return zt(f,this.#r.parent),null}}))};Ct(()=>{var l;try{l=this.transform_error(t)}catch(f){zt(f,this.#r&&this.#r.parent);return}l!==null&&typeof l=="object"&&typeof l.then=="function"?l.then(o,f=>zt(f,this.#r&&this.#r.parent)):o(l)})}}function Fo(e,t,n,r){const a=In()?fr:lr;var s=e.filter(h=>!h.settled);if(n.length===0&&s.length===0){r(t.map(a));return}var i=ae,o=jo(),l=s.length===1?s[0].promise:s.length>1?Promise.all(s.map(h=>h.promise)):null;function f(h){o();try{r(h)}catch(g){(i.f<)===0&&zt(g,i)}or()}if(n.length===0){l.then(()=>f(t.map(a)));return}var u=zs();function p(){Promise.all(n.map(h=>Oo(h))).then(h=>f([...t.map(a),...h])).catch(h=>zt(h,i)).finally(()=>u())}l?l.then(()=>{o(),p(),or()}):p()}function jo(){var e=ae,t=ie,n=Ae,r=ee;return function(s=!0){Tt(e),ut(t),Sn(n),s&&(e.f<)===0&&(r?.activate(),r?.apply())}}function or(e=!0){Tt(null),ut(null),Sn(null),e&&ee?.deactivate()}function zs(){var e=ae,t=e.b,n=ee,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),(a=!1)=>{t.update_pending_count(-1,n),n.decrement(r,e,a)}}function fr(e){var t=ze|Fe;return ae!==null&&(ae.f|=xn),{ctx:Ae,deps:null,effects:null,equals:Bs,f:t,fn:e,reactions:null,rv:0,v:qe,wv:0,parent:ae,ac:null}}function Oo(e,t,n){let r=ae;r===null&&so();var a=void 0,s=fn(qe),i=!ie,o=new Map;return Zo(()=>{var l=ae,f=Ns();a=f.promise;try{Promise.resolve(e()).then(f.resolve,f.reject).finally(or)}catch(g){f.reject(g),or()}var u=ee;if(i){if((l.f&pn)!==0)var p=zs();if(r.b.is_rendered())o.get(u)?.reject(Lt),o.delete(u);else{for(const g of o.values())g.reject(Lt);o.clear()}o.set(u,f)}const h=(g,w=void 0)=>{if(p){var S=w===Lt;p(S)}if(!(w===Lt||(l.f<)!==0)){if(u.activate(),w)s.f|=Kt,An(s,w);else{(s.f&Kt)!==0&&(s.f^=Kt),An(s,g);for(const[b,m]of o){if(o.delete(b),b===u)break;m.reject(Lt)}}u.deactivate()}};f.promise.then(h,g=>h(null,g||"unknown"))}),pr(()=>{for(const l of o.values())l.reject(Lt)}),new Promise(l=>{function f(u){function p(){u===a?l(s):f(a)}u.then(p,p)}f(a)})}function $(e){const t=fr(e);return oi(t),t}function lr(e){const t=fr(e);return t.equals=Ls,t}function Ho(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)et(t[n])}}function pa(e){var t,n=ae,r=e.parent;if(!Qt&&r!==null&&(r.f&(lt|Ye))!==0)return Co(),e.v;Tt(r);try{e.f&=~un,Ho(e),t=ui(e)}finally{Tt(n)}return t}function Vs(e){var t=pa(e);if(!e.equals(t)&&(e.wv=ci(),(!ee?.is_fork||e.deps===null)&&(ee!==null?ee.capture(e,t,!0):e.v=t,e.deps===null))){Ie(e,De);return}Qt||(ht!==null?(ga()||ee?.is_fork)&&ht.set(e,t):fa(e))}function zo(e){if(e.effects!==null)for(const t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(Lt),t.teardown=ua,t.ac=null,Kn(t,0),_a(t))}function Ks(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&Tn(t)}let Qr=new Set;const sn=new Map;let Js=!1;function fn(e,t){var n={f:0,v:e,reactions:null,equals:Bs,rv:0,wv:0};return n}function Y(e,t){const n=fn(e);return oi(n),n}function Vo(e,t=!1,n=!0){const r=fn(e);return t||(r.equals=Ls),Wn&&n&&Ae!==null&&Ae.l!==null&&(Ae.l.s??=[]).push(r),r}function R(e,t,n=!1){ie!==null&&(!pt||(ie.f&Wr)!==0)&&In()&&(ie.f&(ze|kt|Vn|Wr))!==0&&(ct===null||!kn.call(ct,e))&&ho();let r=n?nt(t):t;return An(e,r,rr)}function An(e,t,n=null){if(!e.equals(t)){sn.set(e,Qt?t:e.v);var r=$t.ensure();if(r.capture(e,t),(e.f&ze)!==0){const a=e;(e.f&Fe)!==0&&pa(a),ht===null&&fa(a)}e.wv=ci(),Ys(e,Fe,n),In()&&ae!==null&&(ae.f&De)!==0&&(ae.f&(gt|Wt))===0&&(st===null?tl([e]):st.push(e)),!r.is_fork&&Qr.size>0&&!Js&&Ko()}return t}function Ko(){Js=!1;for(const e of Qr)(e.f&De)!==0&&Ie(e,St),Xn(e)&&Tn(e);Qr.clear()}function Hn(e){R(e,e.v+1)}function Ys(e,t,n){var r=e.reactions;if(r!==null)for(var a=In(),s=r.length,i=0;i<s;i++){var o=r[i],l=o.f;if(!(!a&&o===ae)){var f=(l&Fe)===0;if(f&&Ie(o,t),(l&ze)!==0){var u=o;ht?.delete(u),(l&un)===0&&(l&ot&&(ae===null||(ae.f&ir)===0)&&(o.f|=un),Ys(u,St,n))}else if(f){var p=o;(l&kt)!==0&&Bt!==null&&Bt.add(p),n!==null?n.push(p):ha(p)}}}}function nt(e){if(typeof e!="object"||e===null||an in e)return e;const t=da(e);if(t!==Zi&&t!==eo)return e;var n=new Map,r=ca(e),a=Y(0),s=ln,i=o=>{if(ln===s)return o();var l=ie,f=ln;ut(null),Fa(s);var u=o();return ut(l),Fa(f),u};return r&&n.set("length",Y(e.length)),new Proxy(e,{defineProperty(o,l,f){(!("value"in f)||f.configurable===!1||f.enumerable===!1||f.writable===!1)&&fo();var u=n.get(l);return u===void 0?i(()=>{var p=Y(f.value);return n.set(l,p),p}):R(u,f.value,!0),!0},deleteProperty(o,l){var f=n.get(l);if(f===void 0){if(l in o){const u=i(()=>Y(qe));n.set(l,u),Hn(a)}}else R(f,qe),Hn(a);return!0},get(o,l,f){if(l===an)return e;var u=n.get(l),p=l in o;if(u===void 0&&(!p||jn(o,l)?.writable)&&(u=i(()=>{var g=nt(p?o[l]:qe),w=Y(g);return w}),n.set(l,u)),u!==void 0){var h=c(u);return h===qe?void 0:h}return Reflect.get(o,l,f)},getOwnPropertyDescriptor(o,l){var f=Reflect.getOwnPropertyDescriptor(o,l);if(f&&"value"in f){var u=n.get(l);u&&(f.value=c(u))}else if(f===void 0){var p=n.get(l),h=p?.v;if(p!==void 0&&h!==qe)return{enumerable:!0,configurable:!0,value:h,writable:!0}}return f},has(o,l){if(l===an)return!0;var f=n.get(l),u=f!==void 0&&f.v!==qe||Reflect.has(o,l);if(f!==void 0||ae!==null&&(!u||jn(o,l)?.writable)){f===void 0&&(f=i(()=>{var h=u?nt(o[l]):qe,g=Y(h);return g}),n.set(l,f));var p=c(f);if(p===qe)return!1}return u},set(o,l,f,u){var p=n.get(l),h=l in o;if(r&&l==="length")for(var g=f;g<p.v;g+=1){var w=n.get(g+"");w!==void 0?R(w,qe):g in o&&(w=i(()=>Y(qe)),n.set(g+"",w))}if(p===void 0)(!h||jn(o,l)?.writable)&&(p=i(()=>Y(void 0)),R(p,nt(f)),n.set(l,p));else{h=p.v!==qe;var S=i(()=>nt(f));R(p,S)}var b=Reflect.getOwnPropertyDescriptor(o,l);if(b?.set&&b.set.call(u,f),!h){if(r&&typeof l=="string"){var m=n.get("length"),B=Number(l);Number.isInteger(B)&&B>=m.v&&R(m,B+1)}Hn(a)}return!0},ownKeys(o){c(a);var l=Reflect.ownKeys(o).filter(p=>{var h=n.get(p);return h===void 0||h.v!==qe});for(var[f,u]of n)u.v!==qe&&!(f in o)&&l.push(f);return l},setPrototypeOf(){vo()}})}function La(e){try{if(e!==null&&typeof e=="object"&&an in e)return e[an]}catch{}return e}function Gs(e,t){return Object.is(La(e),La(t))}var Da,Ws,$s,Qs;function Jo(){if(Da===void 0){Da=window,Ws=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;$s=jn(t,"firstChild").get,Qs=jn(t,"nextSibling").get,Ia(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Ia(n)&&(n.__t=void 0)}}function Dt(e=""){return document.createTextNode(e)}function Et(e){return $s.call(e)}function $n(e){return Qs.call(e)}function d(e,t){return Et(e)}function he(e,t=!1){{var n=Et(e);return n instanceof Comment&&n.data===""?$n(n):n}}function v(e,t=1,n=!1){let r=e;for(;t--;)r=$n(r);return r}function Yo(e){e.textContent=""}function Xs(){return!1}function Zs(e,t,n){return document.createElementNS(t??Ms,e,void 0)}let qa=!1;function Go(){qa||(qa=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function vr(e){var t=ie,n=ae;ut(null),Tt(null);try{return e()}finally{ut(t),Tt(n)}}function hr(e,t,n,r=n){e.addEventListener(t,()=>vr(n));const a=e.__on_r;a?e.__on_r=()=>{a(),r(!0)}:e.__on_r=()=>r(!0),Go()}function ei(e){ae===null&&(ie===null&&co(),lo()),Qt&&oo()}function Wo(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function Nt(e,t){var n=ae;n!==null&&(n.f&Ye)!==0&&(e|=Ye);var r={ctx:Ae,deps:null,nodes:null,f:e|Fe|ot,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};ee?.register_created_effect(r);var a=r;if((e&Cn)!==0)bn!==null?bn.push(r):$t.ensure().schedule(r);else if(t!==null){try{Tn(r)}catch(i){throw et(r),i}a.deps===null&&a.teardown===null&&a.nodes===null&&a.first===a.last&&(a.f&xn)===0&&(a=a.first,(e&kt)!==0&&(e&dn)!==0&&a!==null&&(a.f|=dn))}if(a!==null&&(a.parent=n,n!==null&&Wo(a,n),ie!==null&&(ie.f&ze)!==0&&(e&Wt)===0)){var s=ie;(s.effects??=[]).push(a)}return r}function ga(){return ie!==null&&!pt}function pr(e){const t=Nt(Gn,null);return Ie(t,De),t.teardown=e,t}function At(e){ei();var t=ae.f,n=!ie&&(t>)!==0&&(t&pn)===0;if(n){var r=Ae;(r.e??=[]).push(e)}else return ti(e)}function ti(e){return Nt(Cn|xs,e)}function $o(e){return ei(),Nt(Gn|xs,e)}function Qo(e){$t.ensure();const t=Nt(Wt|xn,e);return(n={})=>new Promise(r=>{n.outro?on(t,()=>{et(t),r(void 0)}):(et(t),r(void 0))})}function Xo(e){return Nt(Cn,e)}function Zo(e){return Nt(Vn|xn,e)}function gr(e,t=0){return Nt(Gn|t,e)}function j(e,t=[],n=[],r=[]){Fo(r,t,n,a=>{Nt(Gn,()=>e(...a.map(c)))})}function Qn(e,t=0){var n=Nt(kt|t,e);return n}function it(e){return Nt(gt|xn,e)}function ni(e){var t=e.teardown;if(t!==null){const n=Qt,r=ie;Ua(!0),ut(null);try{t.call(null)}finally{Ua(n),ut(r)}}}function _a(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const a=n.ac;a!==null&&vr(()=>{a.abort(Lt)});var r=n.next;(n.f&Wt)!==0?n.parent=null:et(n,t),n=r}}function el(e){for(var t=e.first;t!==null;){var n=t.next;(t.f>)===0&&et(t),t=n}}function et(e,t=!0){var n=!1;(t||(e.f&no)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(ri(e.nodes.start,e.nodes.end),n=!0),Ie(e,Pa),_a(e,t&&!n),Kn(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const s of r)s.stop();ni(e),e.f^=Pa,e.f|=lt;var a=e.parent;a!==null&&a.first!==null&&ai(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function ri(e,t){for(;e!==null;){var n=e===t?null:$n(e);e.remove(),e=n}}function ai(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function on(e,t,n=!0){var r=[];si(e,r,!0);var a=()=>{n&&et(e),t&&t()},s=r.length;if(s>0){var i=()=>--s||a();for(var o of r)o.out(i)}else a()}function si(e,t,n){if((e.f&Ye)===0){e.f^=Ye;var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||n)&&t.push(o);for(var a=e.first;a!==null;){var s=a.next;if((a.f&Wt)===0){var i=(a.f&dn)!==0||(a.f>)!==0&&(e.f&kt)!==0;si(a,t,i?n:!1)}a=s}}}function ma(e){ii(e,!0)}function ii(e,t){if((e.f&Ye)!==0){e.f^=Ye,(e.f&De)===0&&(Ie(e,Fe),$t.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,a=(n.f&dn)!==0||(n.f>)!==0;ii(n,a?t:!1),n=r}var s=e.nodes&&e.nodes.t;if(s!==null)for(const i of s)(i.is_global||t)&&i.in()}}function wa(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var a=n===r?null:$n(n);t.append(n),n=a}}let ar=!1,Qt=!1;function Ua(e){Qt=e}let ie=null,pt=!1;function ut(e){ie=e}let ae=null;function Tt(e){ae=e}let ct=null;function oi(e){ie!==null&&(ct===null?ct=[e]:ct.push(e))}let Xe=null,tt=0,st=null;function tl(e){st=e}let li=1,rn=0,ln=rn;function Fa(e){ln=e}function ci(){return++li}function Xn(e){var t=e.f;if((t&Fe)!==0)return!0;if(t&ze&&(e.f&=~un),(t&St)!==0){for(var n=e.deps,r=n.length,a=0;a<r;a++){var s=n[a];if(Xn(s)&&Vs(s),s.wv>e.wv)return!0}(t&ot)!==0&&ht===null&&Ie(e,De)}return!1}function di(e,t,n=!0){var r=e.reactions;if(r!==null&&!(ct!==null&&kn.call(ct,e)))for(var a=0;a<r.length;a++){var s=r[a];(s.f&ze)!==0?di(s,t,!1):t===s&&(n?Ie(s,Fe):(s.f&De)!==0&&Ie(s,St),ha(s))}}function ui(e){var t=Xe,n=tt,r=st,a=ie,s=ct,i=Ae,o=pt,l=ln,f=e.f;Xe=null,tt=0,st=null,ie=(f&(gt|Wt))===0?e:null,ct=null,Sn(e.ctx),pt=!1,ln=++rn,e.ac!==null&&(vr(()=>{e.ac.abort(Lt)}),e.ac=null);try{e.f|=ir;var u=e.fn,p=u();e.f|=pn;var h=e.deps,g=ee?.is_fork;if(Xe!==null){var w;if(g||Kn(e,tt),h!==null&&tt>0)for(h.length=tt+Xe.length,w=0;w<Xe.length;w++)h[tt+w]=Xe[w];else e.deps=h=Xe;if(ga()&&(e.f&ot)!==0)for(w=tt;w<h.length;w++)(h[w].reactions??=[]).push(e)}else!g&&h!==null&&tt<h.length&&(Kn(e,tt),h.length=tt);if(In()&&st!==null&&!pt&&h!==null&&(e.f&(ze|St|Fe))===0)for(w=0;w<st.length;w++)di(st[w],e);if(a!==null&&a!==e){if(rn++,a.deps!==null)for(let S=0;S<n;S+=1)a.deps[S].rv=rn;if(t!==null)for(const S of t)S.rv=rn;st!==null&&(r===null?r=st:r.push(...st))}return(e.f&Kt)!==0&&(e.f^=Kt),p}catch(S){return qs(S)}finally{e.f^=ir,Xe=t,tt=n,st=r,ie=a,ct=s,Sn(i),pt=o,ln=l}}function nl(e,t){let n=t.reactions;if(n!==null){var r=Qi.call(n,e);if(r!==-1){var a=n.length-1;a===0?n=t.reactions=null:(n[r]=n[a],n.pop())}}if(n===null&&(t.f&ze)!==0&&(Xe===null||!kn.call(Xe,t))){var s=t;(s.f&ot)!==0&&(s.f^=ot,s.f&=~un),s.v!==qe&&fa(s),zo(s),Kn(s,0)}}function Kn(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)nl(e,n[r])}function Tn(e){var t=e.f;if((t<)===0){Ie(e,De);var n=ae,r=ar;ae=e,ar=!0;try{(t&(kt|Rs))!==0?el(e):_a(e),ni(e);var a=ui(e);e.teardown=typeof a=="function"?a:null,e.wv=li;var s;$i&&No&&(e.f&Fe)!==0&&e.deps}finally{ar=r,ae=n}}}async function rl(){await Promise.resolve(),Mo()}function c(e){var t=e.f,n=(t&ze)!==0;if(ie!==null&&!pt){var r=ae!==null&&(ae.f<)!==0;if(!r&&(ct===null||!kn.call(ct,e))){var a=ie.deps;if((ie.f&ir)!==0)e.rv<rn&&(e.rv=rn,Xe===null&&a!==null&&a[tt]===e?tt++:Xe===null?Xe=[e]:Xe.push(e));else{(ie.deps??=[]).push(e);var s=e.reactions;s===null?e.reactions=[ie]:kn.call(s,ie)||s.push(ie)}}}if(Qt&&sn.has(e))return sn.get(e);if(n){var i=e;if(Qt){var o=i.v;return((i.f&De)===0&&i.reactions!==null||vi(i))&&(o=pa(i)),sn.set(i,o),o}var l=(i.f&ot)===0&&!pt&&ie!==null&&(ar||(ie.f&ot)!==0),f=(i.f&pn)===0;Xn(i)&&(l&&(i.f|=ot),Vs(i)),l&&!f&&(Ks(i),fi(i))}if(ht?.has(e))return ht.get(e);if((e.f&Kt)!==0)throw e.v;return e.v}function fi(e){if(e.f|=ot,e.deps!==null)for(const t of e.deps)(t.reactions??=[]).push(e),(t.f&ze)!==0&&(t.f&ot)===0&&(Ks(t),fi(t))}function vi(e){if(e.v===qe)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(sn.has(t)||(t.f&ze)!==0&&vi(t))return!0;return!1}function gn(e){var t=pt;try{return pt=!0,e()}finally{pt=t}}function al(e){if(!(typeof e!="object"||!e||e instanceof EventTarget)){if(an in e)Xr(e);else if(!Array.isArray(e))for(let t in e){const n=e[t];typeof n=="object"&&n&&an in n&&Xr(n)}}}function Xr(e,t=new Set){if(typeof e=="object"&&e!==null&&!(e instanceof EventTarget)&&!t.has(e)){t.add(e),e instanceof Date&&e.getTime();for(let r in e)try{Xr(e[r],t)}catch{}const n=da(e);if(n!==Object.prototype&&n!==Array.prototype&&n!==Map.prototype&&n!==Set.prototype&&n!==Date.prototype){const r=Ts(n);for(let a in r){const s=r[a].get;if(s)try{s.call(e)}catch{}}}}}const sl=["touchstart","touchmove"];function il(e){return sl.includes(e)}const qn=Symbol("events"),hi=new Set,Zr=new Set;function ol(e,t,n,r={}){function a(s){if(r.capture||ea.call(t,s),!s.cancelBubble)return vr(()=>n?.call(this,s))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?Ct(()=>{t.addEventListener(e,a,r)}):t.addEventListener(e,a,r),a}function Nn(e,t,n,r,a){var s={capture:r,passive:a},i=ol(e,t,n,s);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&pr(()=>{t.removeEventListener(e,i,s)})}function me(e,t,n){(t[qn]??={})[e]=n}function Rt(e){for(var t=0;t<e.length;t++)hi.add(e[t]);for(var n of Zr)n(e)}let ja=null;function ea(e){var t=this,n=t.ownerDocument,r=e.type,a=e.composedPath?.()||[],s=a[0]||e.target;ja=e;var i=0,o=ja===e&&e[qn];if(o){var l=a.indexOf(o);if(l!==-1&&(t===document||t===window)){e[qn]=t;return}var f=a.indexOf(t);if(f===-1)return;l<=f&&(i=l)}if(s=a[i]||e.target,s!==t){Xi(e,"currentTarget",{configurable:!0,get(){return s||n}});var u=ie,p=ae;ut(null),Tt(null);try{for(var h,g=[];s!==null;){var w=s.assignedSlot||s.parentNode||s.host||null;try{var S=s[qn]?.[r];S!=null&&(!s.disabled||e.target===s)&&S.call(s,e)}catch(b){h?g.push(b):h=b}if(e.cancelBubble||w===t||w===null)break;s=w}if(h){for(let b of g)queueMicrotask(()=>{throw b});throw h}}finally{e[qn]=t,delete e.currentTarget,ut(u),Tt(p)}}}const ll=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function cl(e){return ll?.createHTML(e)??e}function pi(e){var t=Zs("template");return t.innerHTML=cl(e.replaceAll("<!>","<!---->")),t.content}function vn(e,t){var n=ae;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function C(e,t){var n=(t&yo)!==0,r=(t&bo)!==0,a,s=!e.startsWith("<!>");return()=>{a===void 0&&(a=pi(s?e:"<!>"+e),n||(a=Et(a)));var i=r||Ws?document.importNode(a,!0):a.cloneNode(!0);if(n){var o=Et(i),l=i.lastChild;vn(o,l)}else vn(i,i);return i}}function dl(e,t,n="svg"){var r=!e.startsWith("<!>"),a=`<${n}>${r?e:"<!>"+e}</${n}>`,s;return()=>{if(!s){var i=pi(a),o=Et(i);s=Et(o)}var l=s.cloneNode(!0);return vn(l,l),l}}function gi(e,t){return dl(e,t,"svg")}function Un(e=""){{var t=Dt(e+"");return vn(t,t),t}}function Xt(){var e=document.createDocumentFragment(),t=document.createComment(""),n=Dt();return e.append(t,n),vn(t,n),e}function y(e,t){e!==null&&e.before(t)}function E(e,t){var n=t==null?"":typeof t=="object"?`${t}`:t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=`${n}`)}function ul(e,t){return fl(e,t)}const tr=new Map;function fl(e,{target:t,anchor:n,props:r={},events:a,context:s,intro:i=!0,transformError:o}){Jo();var l=void 0,f=Qo(()=>{var u=n??t.appendChild(Dt());qo(u,{pending:()=>{}},g=>{Ge({});var w=Ae;s&&(w.c=s),a&&(r.$$events=a),l=e(g,r)||{},We()},o);var p=new Set,h=g=>{for(var w=0;w<g.length;w++){var S=g[w];if(!p.has(S)){p.add(S);var b=il(S);for(const P of[t,document]){var m=tr.get(P);m===void 0&&(m=new Map,tr.set(P,m));var B=m.get(S);B===void 0?(P.addEventListener(S,ea,{passive:b}),m.set(S,1)):m.set(S,B+1)}}}};return h(ur(hi)),Zr.add(h),()=>{for(var g of p)for(const b of[t,document]){var w=tr.get(b),S=w.get(g);--S==0?(b.removeEventListener(g,ea),w.delete(g),w.size===0&&tr.delete(b)):w.set(g,S)}Zr.delete(h),u!==n&&u.parentNode?.removeChild(u)}});return vl.set(l,f),l}let vl=new WeakMap;class ya{anchor;#n=new Map;#l=new Map;#e=new Map;#a=new Set;#r=!0;constructor(t,n=!0){this.anchor=t,this.#r=n}#s=t=>{if(this.#n.has(t)){var n=this.#n.get(t),r=this.#l.get(n);if(r)ma(r),this.#a.delete(n);else{var a=this.#e.get(n);a&&(this.#l.set(n,a.effect),this.#e.delete(n),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),r=a.effect)}for(const[s,i]of this.#n){if(this.#n.delete(s),s===t)break;const o=this.#e.get(i);o&&(et(o.effect),this.#e.delete(i))}for(const[s,i]of this.#l){if(s===n||this.#a.has(s))continue;const o=()=>{if(Array.from(this.#n.values()).includes(s)){var f=document.createDocumentFragment();wa(i,f),f.append(Dt()),this.#e.set(s,{effect:i,fragment:f})}else et(i);this.#a.delete(s),this.#l.delete(s)};this.#r||!r?(this.#a.add(s),on(i,o,!1)):o()}}};#t=t=>{this.#n.delete(t);const n=Array.from(this.#n.values());for(const[r,a]of this.#e)n.includes(r)||(et(a.effect),this.#e.delete(r))};ensure(t,n){var r=ee,a=Xs();if(n&&!this.#l.has(t)&&!this.#e.has(t))if(a){var s=document.createDocumentFragment(),i=Dt();s.append(i),this.#e.set(t,{effect:it(()=>n(i)),fragment:s})}else this.#l.set(t,it(()=>n(this.anchor)));if(this.#n.set(r,t),a){for(const[o,l]of this.#l)o===t?r.unskip_effect(l):r.skip_effect(l);for(const[o,l]of this.#e)o===t?r.unskip_effect(l.effect):r.skip_effect(l.effect);r.oncommit(this.#s),r.ondiscard(this.#t)}else this.#s(r)}}function z(e,t,n=!1){var r=new ya(e),a=n?dn:0;function s(i,o){r.ensure(i,o)}Qn(()=>{var i=!1;t((o,l=0)=>{i=!0,s(l,o)}),i||s(-1,null)},a)}const hl=Symbol("NaN");function pl(e,t,n){var r=new ya(e),a=!In();Qn(()=>{var s=t();s!==s&&(s=hl),a&&s!==null&&typeof s=="object"&&(s={}),r.ensure(s,n)})}function gl(e,t,n){for(var r=[],a=t.length,s,i=t.length,o=0;o<a;o++){let p=t[o];on(p,()=>{if(s){if(s.pending.delete(p),s.done.add(p),s.pending.size===0){var h=e.outrogroups;ta(e,ur(s.done)),h.delete(s),h.size===0&&(e.outrogroups=null)}}else i-=1},!1)}if(i===0){var l=r.length===0&&n!==null;if(l){var f=n,u=f.parentNode;Yo(u),u.append(f),e.items.clear()}ta(e,t,!l)}else s={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(s)}function ta(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(const i of e.pending.values())for(const o of i)r.add(e.items.get(o).e)}for(var a=0;a<t.length;a++){var s=t[a];if(r?.has(s)){s.f|=bt;const i=document.createDocumentFragment();wa(s,i)}else et(t[a],n)}}var Oa;function Jt(e,t,n,r,a,s=null){var i=e,o=new Map,l=(t&Ps)!==0;if(l){var f=e;i=f.appendChild(Dt())}var u=null,p=lr(()=>{var P=n();return ca(P)?P:P==null?[]:ur(P)}),h,g=new Map,w=!0;function S(P){(B.effect.f<)===0&&(B.pending.delete(P),B.fallback=u,_l(B,h,i,t,r),u!==null&&(h.length===0?(u.f&bt)===0?ma(u):(u.f^=bt,Fn(u,null,i)):on(u,()=>{u=null})))}function b(P){B.pending.delete(P)}var m=Qn(()=>{h=c(p);for(var P=h.length,N=new Set,M=ee,I=Xs(),T=0;T<P;T+=1){var L=h[T],A=r(L,T),U=w?null:o.get(A);U?(U.v&&An(U.v,L),U.i&&An(U.i,T),I&&M.unskip_effect(U.e)):(U=ml(o,w?i:Oa??=Dt(),L,A,T,a,t,n),w||(U.e.f|=bt),o.set(A,U)),N.add(A)}if(P===0&&s&&!u&&(w?u=it(()=>s(i)):(u=it(()=>s(Oa??=Dt())),u.f|=bt)),P>N.size&&io(),!w)if(g.set(M,N),I){for(const[F,k]of o)N.has(F)||M.skip_effect(k.e);M.oncommit(S),M.ondiscard(b)}else S(M);c(p)}),B={effect:m,items:o,pending:g,outrogroups:null,fallback:u};w=!1}function Ln(e){for(;e!==null&&(e.f>)===0;)e=e.next;return e}function _l(e,t,n,r,a){var s=(r&mo)!==0,i=t.length,o=e.items,l=Ln(e.effect.first),f,u=null,p,h=[],g=[],w,S,b,m;if(s)for(m=0;m<i;m+=1)w=t[m],S=a(w,m),b=o.get(S).e,(b.f&bt)===0&&(b.nodes?.a?.measure(),(p??=new Set).add(b));for(m=0;m<i;m+=1){if(w=t[m],S=a(w,m),b=o.get(S).e,e.outrogroups!==null)for(const U of e.outrogroups)U.pending.delete(b),U.done.delete(b);if((b.f&Ye)!==0&&(ma(b),s&&(b.nodes?.a?.unfix(),(p??=new Set).delete(b))),(b.f&bt)!==0)if(b.f^=bt,b===l)Fn(b,null,n);else{var B=u?u.next:l;b===e.effect.last&&(e.effect.last=b.prev),b.prev&&(b.prev.next=b.next),b.next&&(b.next.prev=b.prev),Ot(e,u,b),Ot(e,b,B),Fn(b,B,n),u=b,h=[],g=[],l=Ln(u.next);continue}if(b!==l){if(f!==void 0&&f.has(b)){if(h.length<g.length){var P=g[0],N;u=P.prev;var M=h[0],I=h[h.length-1];for(N=0;N<h.length;N+=1)Fn(h[N],P,n);for(N=0;N<g.length;N+=1)f.delete(g[N]);Ot(e,M.prev,I.next),Ot(e,u,M),Ot(e,I,P),l=P,u=I,m-=1,h=[],g=[]}else f.delete(b),Fn(b,l,n),Ot(e,b.prev,b.next),Ot(e,b,u===null?e.effect.first:u.next),Ot(e,u,b),u=b;continue}for(h=[],g=[];l!==null&&l!==b;)(f??=new Set).add(l),g.push(l),l=Ln(l.next);if(l===null)continue}(b.f&bt)===0&&h.push(b),u=b,l=Ln(b.next)}if(e.outrogroups!==null){for(const U of e.outrogroups)U.pending.size===0&&(ta(e,ur(U.done)),e.outrogroups?.delete(U));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||f!==void 0){var T=[];if(f!==void 0)for(b of f)(b.f&Ye)===0&&T.push(b);for(;l!==null;)(l.f&Ye)===0&&l!==e.fallback&&T.push(l),l=Ln(l.next);var L=T.length;if(L>0){var A=(r&Ps)!==0&&i===0?n:null;if(s){for(m=0;m<L;m+=1)T[m].nodes?.a?.measure();for(m=0;m<L;m+=1)T[m].nodes?.a?.fix()}gl(e,T,A)}}s&&Ct(()=>{if(p!==void 0)for(b of p)b.nodes?.a?.apply()})}function ml(e,t,n,r,a,s,i,o){var l=(i&go)!==0?(i&wo)===0?Vo(n,!1,!1):fn(n):null,f=(i&_o)!==0?fn(a):null;return{v:l,i:f,e:it(()=>(s(t,l??n,f??a,o),()=>{e.delete(r)}))}}function Fn(e,t,n){if(e.nodes)for(var r=e.nodes.start,a=e.nodes.end,s=t&&(t.f&bt)===0?t.nodes.start:n;r!==null;){var i=$n(r);if(s.before(r),r===a)return;r=i}}function Ot(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function wl(e,t,n=!1,r=!1,a=!1,s=!1){var i=e,o="";if(n)var l=e;j(()=>{var f=ae;if(o!==(o=t()??"")){if(n){f.nodes=null,l.innerHTML=o,o!==""&&vn(Et(l),l.lastChild);return}if(f.nodes!==null&&(ri(f.nodes.start,f.nodes.end),f.nodes=null),o!==""){var u=r?Eo:a?ko:void 0,p=Zs(r?"svg":a?"math":"template",u);p.innerHTML=o;var h=r||a?p:p.content;if(vn(Et(h),h.lastChild),r||a)for(;Et(h);)i.before(Et(h));else i.before(h)}}})}function _i(e,t,...n){var r=new ya(e);Qn(()=>{const a=t()??null;r.ensure(a,a&&(s=>a(s,...n)))},dn)}function mi(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=mi(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}function yl(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=mi(e))&&(r&&(r+=" "),r+=t);return r}function bl(e){return typeof e=="object"?yl(e):e??""}const Ha=[...`
|
|
2
|
+
\r\f \v\uFEFF`];function El(e,t,n){var r=e==null?"":""+e;if(t&&(r=r?r+" "+t:t),n){for(var a of Object.keys(n))if(n[a])r=r?r+" "+a:a;else if(r.length)for(var s=a.length,i=0;(i=r.indexOf(a,i))>=0;){var o=i+s;(i===0||Ha.includes(r[i-1]))&&(o===r.length||Ha.includes(r[o]))?r=(i===0?"":r.substring(0,i))+r.substring(o+1):i=o}}return r===""?null:r}function kl(e,t){return e==null?null:String(e)}function dt(e,t,n,r,a,s){var i=e.__className;if(i!==n||i===void 0){var o=El(n,r,s);o==null?e.removeAttribute("class"):e.className=o,e.__className=n}else if(s&&a!==s)for(var l in s){var f=!!s[l];(a==null||f!==!!a[l])&&e.classList.toggle(l,f)}return s}function na(e,t,n,r){var a=e.__style;if(a!==t){var s=kl(t);s==null?e.removeAttribute("style"):e.style.cssText=s,e.__style=t}return r}function wi(e,t,n=!1){if(e.multiple){if(t==null)return;if(!ca(t))return So();for(var r of e.options)r.selected=t.includes(zn(r));return}for(r of e.options){var a=zn(r);if(Gs(a,t)){r.selected=!0;return}}(!n||t!==void 0)&&(e.selectedIndex=-1)}function Cl(e){var t=new MutationObserver(()=>{wi(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),pr(()=>{t.disconnect()})}function Sl(e,t,n=t){var r=new WeakSet,a=!0;hr(e,"change",s=>{var i=s?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(i),zn);else{var l=e.querySelector(i)??e.querySelector("option:not([disabled])");o=l&&zn(l)}n(o),e.__value=o,ee!==null&&r.add(ee)}),Xo(()=>{var s=t();if(e===document.activeElement){var i=ee;if(r.has(i))return}if(wi(e,s,a),a&&s===void 0){var o=e.querySelector(":checked");o!==null&&(s=zn(o),n(s))}e.__value=s,a=!1}),Cl(e)}function zn(e){return"__value"in e?e.__value:e.value}const Al=Symbol("is custom element"),Tl=Symbol("is html"),Nl=ao?"progress":"PROGRESS";function yi(e,t){var n=bi(e);n.value===(n.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==Nl)||(e.value=t??"")}function oe(e,t,n,r){var a=bi(e);a[t]!==(a[t]=n)&&(t==="loading"&&(e[ro]=n),n==null?e.removeAttribute(t):typeof n!="string"&&Rl(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function bi(e){return e.__attributes??={[Al]:e.nodeName.includes("-"),[Tl]:e.namespaceURI===Ms}}var za=new Map;function Rl(e){var t=e.getAttribute("is")||e.nodeName,n=za.get(t);if(n)return n;za.set(t,n=[]);for(var r,a=e,s=Element.prototype;s!==a;){r=Ts(a);for(var i in r)r[i].set&&n.push(i);a=da(a)}return n}function cn(e,t,n=t){var r=new WeakSet;hr(e,"input",async a=>{var s=a?e.defaultValue:e.value;if(s=br(e)?Er(s):s,n(s),ee!==null&&r.add(ee),await rl(),s!==(s=t())){var i=e.selectionStart,o=e.selectionEnd,l=e.value.length;if(e.value=s??"",o!==null){var f=e.value.length;i===o&&o===l&&f>l?(e.selectionStart=f,e.selectionEnd=f):(e.selectionStart=i,e.selectionEnd=Math.min(o,f))}}}),gn(t)==null&&e.value&&(n(br(e)?Er(e.value):e.value),ee!==null&&r.add(ee)),gr(()=>{var a=t();if(e===document.activeElement){var s=ee;if(r.has(s))return}br(e)&&a===Er(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}const yr=new Set;function En(e,t,n,r,a=r){var s=n.getAttribute("type")==="checkbox",i=e;if(t!==null)for(var o of t)i=i[o]??=[];i.push(n),hr(n,"change",()=>{var l=n.__value;s&&(l=xl(i,l,n.checked)),a(l)},()=>a(s?[]:null)),gr(()=>{var l=r();s?(l=l||[],n.checked=l.includes(n.__value)):n.checked=Gs(n.__value,l)}),pr(()=>{var l=i.indexOf(n);l!==-1&&i.splice(l,1)}),yr.has(i)||(yr.add(i),Ct(()=>{i.sort((l,f)=>l.compareDocumentPosition(f)===4?-1:1),yr.delete(i)})),Ct(()=>{})}function ra(e,t,n=t){hr(e,"change",r=>{var a=r?e.defaultChecked:e.checked;n(a)}),gn(t)==null&&n(e.checked),gr(()=>{var r=t();e.checked=!!r})}function xl(e,t,n){for(var r=new Set,a=0;a<e.length;a+=1)e[a].checked&&r.add(e[a].__value);return n||r.delete(t),Array.from(r)}function br(e){var t=e.type;return t==="number"||t==="range"}function Er(e){return e===""?null:+e}function Ei(e=!1){const t=Ae,n=t.l.u;if(!n)return;let r=()=>al(t.s);if(e){let a=0,s={};const i=fr(()=>{let o=!1;const l=t.s;for(const f in l)l[f]!==s[f]&&(s[f]=l[f],o=!0);return o&&a++,a});r=()=>c(i)}n.b.length&&$o(()=>{Va(t,r),Yr(n.b)}),At(()=>{const a=gn(()=>n.m.map(to));return()=>{for(const s of a)typeof s=="function"&&s()}}),n.a.length&&At(()=>{Va(t,r),Yr(n.a)})}function Va(e,t){if(e.l.s)for(const n of e.l.s)c(n);t()}function Yt(e,t,n,r){var a=r,s=!0,i=()=>(s&&(s=!1,a=r),a),o;o=e[t],o===void 0&&r!==void 0&&(o=i());var l;return l=()=>{var f=e[t];return f===void 0?i():(s=!0,f)},l}function Zt(e){Ae===null&&Is(),Wn&&Ae.l!==null?Pl(Ae).m.push(e):At(()=>{const t=gn(e);if(typeof t=="function")return t})}function Il(e){Ae===null&&Is(),Zt(()=>()=>gn(e))}function Pl(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const Ml="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(Ml);Ro();class Je extends Error{code;status;constructor(t,n,r=0){super(n),this.name="ApiError",this.code=t,this.status=r}}async function at(e,t={}){let n;try{n=await fetch(e,{...t,headers:{accept:"application/json",...t.body!==void 0&&t.body!==null?{"content-type":"application/json"}:{},...t.headers??{}}})}catch(i){throw new Je("network",i.message||"Network request failed",0)}const s=(n.headers.get("content-type")??"").includes("application/json")?await n.json().catch(()=>null):null;if(!n.ok){const i=s;throw i&&i.ok===!1&&i.error?new Je(i.error.code,i.error.message,n.status):new Je(`http_${n.status}`,n.statusText||"Request failed",n.status)}if(s&&typeof s=="object"){const i=s;if(i.ok===!1&&i.error)throw new Je(i.error.code,i.error.message,n.status);if(i.ok===!0&&"data"in i)return i.data}return s}function Zn(e,t){const n=t===void 0?{method:"POST"}:{method:"POST",body:JSON.stringify(t)};return at(e,n)}function Jn(e,t){const n=t===void 0?{method:"PUT"}:{method:"PUT",body:JSON.stringify(t)};return at(e,n)}function Bl(e){return at(e,{method:"DELETE"})}function Ll(e,t,n){if(!e)return"loading";const r=e.directReachability;return r==="unreachable"||r==="cgnat"||t.some(a=>a.status!=="running")||n?.lastError?"warn":"ok"}const se=nt({status:"loading",service:null,nodes:[],nodeStats:{},hostedNodes:{list:[],loaded:!1,error:null},connectivity:null,update:null,settings:null,toasts:[]});function qt(){return se}const Ka=6e3;let Dl=0;function Ee(e,t){const n=`t${++Dl}`,r={id:n,kind:e,text:t,expiresAt:Date.now()+Ka};se.toasts.push(r),setTimeout(()=>ki(n),Ka)}function ki(e){se.toasts=se.toasts.filter(t=>t.id!==e)}async function ba(e){try{await navigator.clipboard.writeText(e),Ee("success","Copied to clipboard")}catch(t){Ee("error",`Copy failed: ${t.message}`)}}function rt(e,t){const n=t instanceof Je?t.code:"error",r=t instanceof Error?t.message:String(t);console.error(`[cadre-host-ui] ${e}:`,t),Ee("error",`${e}: ${r} (${n})`)}function hn(){se.status=Ll(se.connectivity,se.nodes,se.update)}async function Ci(){try{const e=await at("/api/status");se.service=e.service,se.connectivity=e.connectivity,se.nodes.length===0&&(se.nodes=e.nodes.map(t=>({id:t.id,dockerId:"",partyId:t.partyId,profile:t.profile,status:t.status,spawnedAt:"",workdir:"",ports:{health:0,metrics:0,p2p:0,ws:0}}))),hn()}catch(e){rt("status",e),se.status="error"}}async function Ea(){try{const e=await at("/api/nodes");se.nodes=e.nodes,hn()}catch(e){rt("nodes",e)}}async function Ja(e){try{const t=await at(`/api/nodes/${encodeURIComponent(e)}`);return se.nodes=se.nodes.some(n=>n.id===e)?se.nodes.map(n=>n.id===e?t.node:n):[...se.nodes,t.node],se.nodeStats={...se.nodeStats,[e]:t.stats},t}catch(t){return t instanceof Je&&t.status===404?se.nodes=se.nodes.filter(n=>n.id!==e):rt(`node ${e}`,t),null}}let ql=0,kr=0;async function Ut(){const e=++ql;try{const t=await at("/api/hosted-nodes");if(e<kr)return;kr=e,se.hostedNodes={list:t.nodes,loaded:!0,error:null}}catch(t){if(rt("hosted nodes",t),e<kr)return;se.hostedNodes={...se.hostedNodes,error:t instanceof Error?t.message:String(t)}}}function er(){return Promise.all([Ut(),Ea(),Vt()])}async function Ya(e){const t=await Zn("/api/hosted-nodes",e===void 0?void 0:{invitation:e});return await er(),t.node}async function Si(e){const t=await Zn(`/api/hosted-nodes/${encodeURIComponent(e)}/retry`);return await er(),t.node}async function Ai(e){await Bl(`/api/hosted-nodes/${encodeURIComponent(e)}`),await er()}async function Ul(e){const t=await Zn(`/api/hosted-nodes/${encodeURIComponent(e)}/reset`);return await er(),t.node}function Fl(e){return at(`/api/hosted-nodes/${encodeURIComponent(e)}/claim`)}async function Vt(){try{const e=await at("/nat/status");se.connectivity=e,hn()}catch(e){rt("connectivity",e)}}async function jl(e,t){se.connectivity=await Jn(`/nat/nodes/${encodeURIComponent(e)}/forward`,t),hn()}async function cr(){try{const e=await at("/update");se.update=e,hn()}catch{se.update=null}}async function sr(){try{const e=await at("/api/settings");se.settings=e}catch(e){rt("settings",e)}}function Ol(e){let t;try{t=JSON.parse(e.data)}catch{return}switch(e.type){case"node-state-changed":{const n=t.nodeId,r=t.status;n&&r&&(se.nodes=se.nodes.map(a=>a.id===n?{...a,status:r}:a),hn()),Ut();break}case"connectivity-changed":Vt();break;case"hosted-nodes-changed":er();break;case"update-available":{const n=t.version,r=t.releaseNotesUrl;n&&(se.update={...se.update??{version:1},available:{version:n,publishedAt:se.update?.available?.publishedAt??new Date().toISOString(),...r?{releaseNotesUrl:r}:{}}},hn());break}}}const aa={name:"home",params:{}};function Ti(e){const t=e.startsWith("#")?e.slice(1):e,n=t.startsWith("/")?t.slice(1):t;if(!n)return aa;const r=n.split("/").filter(Boolean);switch(r[0]){case"connectivity":return{name:"connectivity",params:{}};case"nodes":return r.length>=2&&r[1]?{name:"node-detail",params:{id:decodeURIComponent(r[1])}}:{name:"nodes",params:{}};case"join":return{name:"join",params:{}};case"settings":return{name:"settings",params:{}};default:return aa}}function Ze(e,t={}){switch(e){case"home":return"#/";case"connectivity":return"#/connectivity";case"nodes":return"#/nodes";case"node-detail":return`#/nodes/${encodeURIComponent(t.id??"")}`;case"join":return"#/join";case"settings":return"#/settings"}}function Ga(e){if(typeof window>"u")return;const t=e.startsWith("#")?e:`#${e.startsWith("/")?e:`/${e}`}`;window.location.hash!==t&&(window.location.hash=t)}const Ni=nt({route:typeof window>"u"?aa:Ti(window.location.hash)});let dr=!1;function sa(){Ni.route=Ti(window.location.hash)}function Hl(){return Ni}function zl(){dr||typeof window>"u"||(dr=!0,window.addEventListener("hashchange",sa),sa())}function Vl(){!dr||typeof window>"u"||(dr=!1,window.removeEventListener("hashchange",sa))}const Kl=["node-state-changed","hosted-nodes-changed","connectivity-changed","update-available"],Jl=[2e3,4e3,8e3,16e3,3e4];function Yl(e,t={}){const n=t.url??"/api/events",r=t.eventSourceCtor??(typeof EventSource<"u"?EventSource:void 0);if(!r)return{close(){}};const a=r,s=t.backoffSchedule??Jl;let i=!1,o=0,l,f;function u(h){const g=Math.min(h,s.length-1);return s[g]??s[s.length-1]}function p(){if(i)return;f=new a(n);const h=f;h.onopen=()=>{i||(o=0,t.onOpen?.())};for(const g of Kl)h.addEventListener(g,w=>{e({type:g,data:w.data??""})});h.onerror=()=>{if(i)return;try{h.close()}catch{}const g=u(o);t.onError?.(o,g),o+=1,l=setTimeout(p,g)}}return p(),{close(){if(i=!0,l&&clearTimeout(l),f)try{f.close()}catch{}}}}function ka(e){return e.join.kind==="claim"&&(e.status==="spawning"||e.status==="unclaimed")}function Yn(e){return e.status==="spawning"||e.status==="unclaimed"||e.status==="joining"}function ia(e){return e.status==="error"&&e.retryable===!0}const Ri="If this is the cadre's first always-on node, no member can be reached yet: remove this node, use Join a cadre and scan the code from the phone instead. Otherwise, retry once a member of the cadre is online.";function Ca(e){return e?e.slice(0,8):"—"}function Sa(e){return e.ownerKey?e.partyId:null}function xi(e){return e.status!=="joined"?"—":e.connected?"yes":"no"}function Ii(e){switch(e.status){case"spawning":return"Starting the node…";case"unclaimed":return"Waiting for a phone to claim this node";case"joining":return`Joining cadre ${e.partyId}…`;case"joined":return e.connected?"Connected to the cadre":e.join.kind==="invitation"?`Joined cadre ${e.partyId} at member ${e.memberPeerId??"(unnamed)"}`:`Claimed by owner ${Ca(e.ownerKey)} into cadre ${e.partyId}`;case"error":return e.removedByOwner?`Removed from cadre ${e.partyId} by an owner; Remove deletes it from this machine`:e.join.kind==="invitation"&&e.error?`Could not join: ${e.error}`:`Stopped after a failure: ${e.error??"no detail recorded"}`}}const Rn={spawning:{text:"starting",tone:"info"},unclaimed:{text:"waiting",tone:"info"},joining:{text:"joining",tone:"info"},joined:{text:"joined",tone:"ok"},error:{text:"failed",tone:"err"}};function Gl(e){if(!e)return"hosted node";const t=Sa(e);return t?`hosted node for cadre ${t}`:ka(e)?"waiting to be claimed":Yn(e)?`joining cadre ${e.partyId}`:"hosted node"}function Wl(e,t){const n=new Map(t.map(s=>[s.id,s])),r=[...e].sort((s,i)=>s.createdAt.localeCompare(i.createdAt)).map(s=>({id:s.id,hosted:s,handle:n.get(s.id)??null})),a=new Set(e.map(s=>s.id));for(const s of t)a.has(s.id)||r.push({id:s.id,hosted:null,handle:s});return r}const Pi=1e3,oa=60*Pi,la=60*oa,Wa=24*la;function Gt(e,t=Date.now()){if(!e)return"—";const n=Date.parse(e);if(!Number.isFinite(n))return"—";const r=t-n;return r<0?"just now":`${$l(r)} ago`}function $l(e){return e<oa?`${Math.floor(e/Pi)}s`:e<la?`${Math.floor(e/oa)}m`:e<Wa?`${Math.floor(e/la)}h`:`${Math.floor(e/Wa)}d`}function Ql(e){if(e==null||!Number.isFinite(e))return"—";if(e<1024)return`${e} B`;const t=["KB","MB","GB","TB"];let n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(n<10?2:1)} ${t[r]}`}function Xl(e){if(e==null||!Number.isFinite(e)||e<0)return"—";const t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h`:n>0?`${n}h ${r}m`:`${r}m`}function Zl(e){return e?e.length<=12?e:`${e.slice(0,6)}…${e.slice(-4)}`:"—"}var ec=C('<span role="status"><span class="bulb svelte-1qa2kn2" aria-hidden="true"></span> <span> </span></span>');function Mi(e,t){const n=Yt(t,"size",3,14),r=$(()=>{switch(t.status){case"ok":return"ok";case"warn":return"warn";case"error":return"err";default:return"muted"}}),a=$(()=>t.label??s(t.status));function s(u){switch(u){case"ok":return"Healthy";case"warn":return"Attention needed";case"error":return"Error";default:return"Loading…"}}var i=ec(),o=d(i),l=v(o,2),f=d(l);j(()=>{dt(i,1,`dot dot-${c(r)??""}`,"svelte-1qa2kn2"),na(o,`width: ${n()??""}px; height: ${n()??""}px;`),E(f,c(a))}),y(e,i)}var tc=C("<span> </span>");function Bi(e,t){const n=$(()=>{switch(t.reachability){case"reachable":return"Reachable";case"unreachable":return"Unreachable";case"cgnat":return"Behind CGNAT";default:return"Unknown"}}),r=$(()=>{switch(t.reachability){case"reachable":return"ok";case"unreachable":case"cgnat":return"warn";default:return"info"}});var a=tc(),s=d(a);j(()=>{dt(a,1,`badge ${c(r)??""}`),E(s,c(n))}),y(e,a)}var nc=C('<div class="banner info svelte-15mtls8"><div><strong>Update available</strong> <span class="muted"> </span></div> <a class="link svelte-15mtls8">View update</a></div>'),rc=C('<p class="muted">No nodes are running yet.</p>'),ac=C('<p class="none svelte-15mtls8"> </p>'),sc=C('<p class="big svelte-15mtls8"> <span class="muted svelte-15mtls8"> </span></p>'),ic=C('<!> <!> <dl class="kv svelte-15mtls8"><div class="svelte-15mtls8"><dt class="svelte-15mtls8">External IP</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Last tested</dt><dd class="svelte-15mtls8"> </dd></div></dl> <a class="link svelte-15mtls8"> </a>',1),oc=C('<p class="muted">Loading connectivity…</p>'),lc=C('<p class="none svelte-15mtls8"> <a>see Nodes</a></p>'),cc=C('<p class="big svelte-15mtls8"> <span class="muted svelte-15mtls8"> </span></p> <!>',1),dc=C('<p class="muted">This machine runs cadre nodes for the cadres that claim them.</p>'),uc=C('<section class="stack"><!> <div class="grid summary svelte-15mtls8"><div class="card"><h3>Overall</h3> <!> <dl class="kv svelte-15mtls8"><div class="svelte-15mtls8"><dt class="svelte-15mtls8">Service</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Version</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Uptime</dt><dd class="svelte-15mtls8"> </dd></div></dl></div> <div class="card"><h3>Connectivity</h3> <!></div> <div class="card"><h3>Hosted nodes</h3> <!> <a class="link svelte-15mtls8">Join a cadre →</a></div> <div class="card"><h3>Nodes</h3> <p class="big svelte-15mtls8"> <span class="muted svelte-15mtls8"> </span></p> <a class="link svelte-15mtls8">Details →</a></div></div></section>');function fc(e,t){Ge(t,!0);const n=qt();Zt(()=>{Ci(),cr(),Ut()});const r=$(()=>n.update?.available?.version??null),a=$(()=>n.nodes.filter(G=>G.status==="running").length),s=$(()=>(n.connectivity?.nodes??[]).filter(G=>G.running)),i=$(()=>c(s).filter(G=>G.verdict!=="unreachable").length),o=$(()=>c(i)===c(s).length),l=$(()=>n.hostedNodes.list.filter(G=>G.status==="joined").length),f=$(()=>n.hostedNodes.list.filter(G=>Yn(G)).length),u=$(()=>n.hostedNodes.list.filter(G=>G.status==="error").length);var p=uc(),h=d(p);{var g=G=>{var x=nc(),O=d(x),J=v(d(O),2),de=d(J),H=v(O,2);j(K=>{E(de,`— version ${c(r)??""}`),oe(H,"href",K)},[()=>Ze("settings")]),y(G,x)};z(h,G=>{c(r)&&G(g)})}var w=v(h,2),S=d(w),b=v(d(S),2);Mi(b,{get status(){return n.status}});var m=v(b,2),B=d(m),P=v(d(B)),N=d(P),M=v(B,2),I=v(d(M)),T=d(I),L=v(M,2),A=v(d(L)),U=d(A),F=v(S,2),k=v(d(F),2);{var _=G=>{var x=ic(),O=he(x);Bi(O,{get reachability(){return n.connectivity.directReachability}});var J=v(O,2);{var de=ue=>{var Z=rc();y(ue,Z)},H=ue=>{var Z=ac(),le=d(Z);j(()=>E(le,`${c(s).length===1?"The running node cannot":`None of the ${c(s).length} running nodes can`}
|
|
3
|
+
be reached from outside your home network.`)),y(ue,Z)},K=ue=>{var Z=sc(),le=d(Z),xe=v(le),we=d(xe);j(()=>{E(le,`${c(i)??""} `),E(we,`of ${c(s).length??""} nodes reachable from outside`)}),y(ue,Z)};z(J,ue=>{c(s).length===0?ue(de):c(i)===0?ue(H,1):ue(K,-1)})}var W=v(J,2),X=d(W),fe=v(d(X)),Se=d(fe),Re=v(X,2),V=v(d(Re)),te=d(V),ne=v(W,2),ve=d(ne);j((ue,Z)=>{E(Se,n.connectivity.externalIp??"—"),E(te,ue),oe(ne,"href",Z),E(ve,c(o)?"Details →":"Resolve →")},[()=>Gt(n.connectivity.lastTestedAt),()=>Ze("connectivity")]),y(G,x)},q=G=>{var x=oc();y(G,x)};z(k,G=>{n.connectivity?G(_):G(q,-1)})}var re=v(F,2),ce=v(d(re),2);{var pe=G=>{var x=cc(),O=he(x),J=d(O),de=v(J),H=d(de),K=v(O,2);{var W=X=>{var fe=lc(),Se=d(fe),Re=v(Se);j(V=>{E(Se,`${c(u)??""} failed; `),oe(Re,"href",V)},[()=>Ze("nodes")]),y(X,fe)};z(K,X=>{c(u)>0&&X(W)})}j(()=>{E(J,`${c(l)??""} `),E(H,`joined, ${c(f)??""} waiting`)}),y(G,x)},ye=G=>{var x=dc();y(G,x)};z(ce,G=>{n.hostedNodes.loaded?G(pe):G(ye,-1)})}var Ue=v(ce,2),Te=v(re,2),ke=v(d(Te),2),Ce=d(ke),Ne=v(Ce),je=d(Ne),Pe=v(ke,2);j((G,x,O)=>{E(N,n.service?.name??"cadre-host"),E(T,n.service?.version??"—"),E(U,G),oe(Ue,"href",x),E(Ce,c(a)),E(je,`/ ${n.nodes.length??""} running`),oe(Pe,"href",O)},[()=>Xl(n.service?.uptimeSeconds),()=>Ze("join"),()=>Ze("nodes")]),y(e,p),We()}const vc={tcp:"TCP",ws:"WebSocket"},hc={mapped:"reachable (UPnP)",manual:"reachable (forwarded by hand)",direct:"reachable (public IP)",unreachable:"not reachable from outside"};function pc(e){return e==="unreachable"?"warn":"ok"}function $a(e){return e?e.externalPort===null?`${e.internalPort} → not mapped`:e.source==="direct"?`${e.internalPort} (public, as-is)`:`${e.internalPort} → ${e.externalPort} (${e.source==="manual"?"forwarded by hand":"UPnP"})`:"not available"}function gc(e){const t=[{kind:"tcp",route:e.tcp}];return e.ws&&t.push({kind:"ws",route:e.ws}),t}function _c(e,t){if(e.verdict!=="unreachable"||t.cgnatDetected)return null;const n=gc(e).filter(({route:s})=>s.externalPort===null);if(n.length===0)return null;const r=t.gateway.lanAddress;return`On your router, forward ${n.map(({kind:s,route:i})=>{const o=i.internalPort;return`${vc[s]} port ${o} to ${r?`${r}:${o}`:`port ${o} on this machine's LAN address`}`}).join(" and ")}, then enter the external ${n.length===1?"port":"ports"} below.`}function Qa(e){return e?.source==="manual"&&e.externalPort!==null?String(e.externalPort):""}function Xa(e){const t=e.trim();if(t==="")return null;if(!/^\d+$/.test(t))return;const n=Number(t);return n>=1&&n<=65535?n:void 0}var mc=gi('<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="5" width="9" height="9" rx="1.5"></rect><path d="M11 3.5V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h.5"></path></svg>');function Aa(e,t){const n=Yt(t,"size",3,16);var r=mc();j(()=>{oe(r,"width",n()),oe(r,"height",n())}),y(e,r)}var wc=C('<span class="badge">stopped</span>'),yc=C('<span class="muted">none</span>'),bc=C('<li class="svelte-io9f1k"><code class="svelte-io9f1k"> </code> <button type="button" class="ghost"><!></button></li>'),Ec=C('<ul class="addrs svelte-io9f1k"></ul>'),kc=C('<p class="small svelte-io9f1k"> </p>'),Cc=C('<p class="small svelte-io9f1k">cadre-host cannot reserve a relay for its nodes yet. If the carrier-grade NAT detection is wrong and you did forward ports, enter them below.</p>'),Sc=C('<p class="small instruction svelte-io9f1k"> </p>'),Ac=C('<div><label> </label> <input type="text" inputmode="numeric" autocomplete="off"/></div>'),Tc=C('<p class="error small svelte-io9f1k"> </p>'),Nc=C(`<details><summary class="svelte-io9f1k">I forwarded these ports</summary> <form class="forward svelte-io9f1k"><div class="fields svelte-io9f1k"><div><label> </label> <input type="text" inputmode="numeric" autocomplete="off"/></div> <!></div> <!> <div class="actions svelte-io9f1k"><button type="button">Clear</button> <button type="submit" class="primary"> </button></div> <p class="muted small svelte-io9f1k">A blank field means no forward for that port. If the node's public addresses change, it restarts to announce them, at most once every 10 minutes.</p></form></details>`),Rc=C('<div class="reach stack svelte-io9f1k"><div class="row svelte-io9f1k"><!> <span> </span> <!></div> <dl class="kv svelte-io9f1k"><div class="svelte-io9f1k"><dt class="svelte-io9f1k">TCP</dt><dd class="svelte-io9f1k"> </dd></div> <div class="svelte-io9f1k"><dt class="svelte-io9f1k">WebSocket</dt><dd class="svelte-io9f1k"> </dd></div> <div class="svelte-io9f1k"><dt class="svelte-io9f1k">Public addresses</dt> <dd class="svelte-io9f1k"><!></dd></div></dl> <!> <!> <!> <!></div>');function Ta(e,t){Ge(t,!0);let n=Y(""),r=Y(""),a=Y(!1),s=Y(!1),i=Y(null);const o=$(()=>Qa(t.node.tcp)),l=$(()=>Qa(t.node.ws)),f=$(()=>_c(t.node,t.connectivity)),u=$(()=>t.connectivity.cgnatDetected&&t.node.verdict==="unreachable"),p=$(()=>c(o)!==""||c(l)!=="");At(()=>{const x=c(o),O=c(l);c(a)||(R(n,x,!0),R(r,O,!0))});function h(x){x.preventDefault();const O=Xa(c(n)),J=t.node.ws?Xa(c(r)):null;if(O===void 0||J===void 0){R(i,"Enter each port as a whole number from 1 to 65535, or leave it blank.");return}w({tcp:O,ws:J},"Saved the forwarded ports")}function g(){w({tcp:null,ws:null},"Cleared the forwarded ports")}async function w(x,O){R(s,!0),R(i,null);try{await jl(t.node.nodeId,x),R(a,!1),Ee("success",`${O} for ${t.node.nodeId}`)}catch(J){S(J)}finally{R(s,!1)}}function S(x){if(x instanceof Je&&x.code==="unknown_node"){Ee("error",`Node ${t.node.nodeId} is no longer running on this machine.`),Vt();return}if(x instanceof Je&&x.code==="invalid_config"){R(i,x.message,!0);return}const O=x instanceof Je?x.code:"error";Ee("error",`Save failed: ${x.message} (${O})`)}var b=Rc(),m=d(b),B=d(m);_i(B,()=>t.header??ua);var P=v(B,2),N=d(P),M=v(P,2);{var I=x=>{var O=wc();y(x,O)};z(M,x=>{t.node.running||x(I)})}var T=v(m,2),L=d(T),A=v(d(L)),U=d(A),F=v(L,2),k=v(d(F)),_=d(k),q=v(F,2),re=v(d(q),2),ce=d(re);{var pe=x=>{var O=yc();y(x,O)},ye=x=>{var O=Ec();Jt(O,20,()=>t.node.publicAddrs,J=>J,(J,de)=>{var H=bc(),K=d(H),W=d(K),X=v(K,2),fe=d(X);Aa(fe,{}),j(()=>{E(W,de),oe(X,"aria-label",`Copy ${de}`)}),me("click",X,()=>ba(de)),y(J,H)}),y(x,O)};z(ce,x=>{t.node.publicAddrs.length===0?x(pe):x(ye,-1)})}var Ue=v(T,2);{var Te=x=>{var O=kc(),J=d(O);j(()=>E(J,t.node.reason)),y(x,O)};z(Ue,x=>{t.node.reason&&x(Te)})}var ke=v(Ue,2);{var Ce=x=>{var O=Cc();y(x,O)};z(ke,x=>{c(u)&&x(Ce)})}var Ne=v(ke,2);{var je=x=>{var O=Sc(),J=d(O);j(()=>E(J,c(f))),y(x,O)};z(Ne,x=>{c(f)&&x(je)})}var Pe=v(Ne,2);{var G=x=>{var O=Nc(),J=v(d(O),2),de=d(J),H=d(de),K=d(H),W=d(K),X=v(K,2),fe=v(H,2);{var Se=Z=>{var le=Ac(),xe=d(le),we=d(xe),Me=v(xe,2);j($e=>{oe(xe,"for",`fwd-ws-${t.node.nodeId}`),E(we,`External WebSocket port (to ${t.node.ws.internalPort??""})`),oe(Me,"id",`fwd-ws-${t.node.nodeId}`),oe(Me,"placeholder",$e)},[()=>String(t.node.ws.internalPort)]),me("input",Me,()=>R(a,!0)),cn(Me,()=>c(r),$e=>R(r,$e)),y(Z,le)};z(fe,Z=>{t.node.ws&&Z(Se)})}var Re=v(de,2);{var V=Z=>{var le=Tc(),xe=d(le);j(()=>E(xe,c(i))),y(Z,le)};z(Re,Z=>{c(i)&&Z(V)})}var te=v(Re,2),ne=d(te),ve=v(ne,2),ue=d(ve);j(Z=>{O.open=t.node.verdict==="unreachable"||c(p),oe(K,"for",`fwd-tcp-${t.node.nodeId}`),E(W,`External TCP port (to ${t.node.tcp.internalPort??""})`),oe(X,"id",`fwd-tcp-${t.node.nodeId}`),oe(X,"placeholder",Z),ne.disabled=c(s)||!c(p),ve.disabled=c(s),E(ue,c(s)?"Saving…":"Save")},[()=>String(t.node.tcp.internalPort)]),Nn("submit",J,h),me("input",X,()=>R(a,!0)),cn(X,()=>c(n),Z=>R(n,Z)),me("click",ne,g),y(x,O)};z(Pe,x=>{t.node.verdict!=="direct"&&x(G)})}j((x,O,J)=>{dt(P,1,`badge ${x??""}`,"svelte-io9f1k"),E(N,hc[t.node.verdict]),E(U,O),E(_,J)},[()=>pc(t.node.verdict),()=>$a(t.node.tcp),()=>$a(t.node.ws)]),y(e,b),We()}Rt(["click","input"]);var xc=C('<div class="svelte-hh3bto"><dt class="svelte-hh3bto">UPnP</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Router</dt> <dd class="svelte-hh3bto"><!></dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">External IP</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Router IP</dt><dd class="svelte-hh3bto"> </dd></div>',1),Ic=C('<!> <dl class="kv svelte-hh3bto"><div class="svelte-hh3bto"><dt class="svelte-hh3bto">Network</dt> <dd class="svelte-hh3bto"><!> <span class="muted"> </span></dd></div> <!> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Last tested</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">External IP detected</dt><dd class="svelte-hh3bto"> </dd></div></dl> <button> </button>',1),Pc=C('<p class="muted">Loading…</p>'),Mc=C(`<div class="card"><h3>Reached directly</h3> <p>This machine holds a public IP address, so there is no router to configure: each node is reached at its own ports.</p> <p>Allow those ports through any firewall on this machine (for example <code>sudo ufw allow</code>) and in your hosting provider's firewall. Each node below lists its ports.</p></div>`),Bc=C('<div class="card warning svelte-hh3bto"><h3>Behind carrier-grade NAT</h3> <p>Your ISP appears to use carrier-grade NAT (CGNAT), so a port forward on your router will not help. Ask your ISP for a public IP address.</p> <p>A relay would reach nodes behind CGNAT, but cadre-host cannot reserve one for its nodes yet.</p> <p class="muted small svelte-hh3bto">The detection can be wrong. If you did forward ports, enter them on each node below.</p></div>'),Lc=C('<div class="card warning svelte-hh3bto"><h3>Needs a port forward</h3> <p> </p> <p class="muted small svelte-hh3bto">See <a href="https://github.com/gotchoices/sereus/blob/master/docs/cadre-host.md#manual-port-forwarding" target="_blank" rel="noreferrer">docs/cadre-host.md</a> for how manual forwarding works.</p></div>'),Dc=C('<p class="muted">Loading…</p>'),qc=C('<p class="muted">No nodes are running on this machine yet.</p>'),Uc=C('<a><strong><code> </code></strong></a> <span class="muted small svelte-hh3bto"> </span>',1),Fc=C('<li class="svelte-hh3bto"><!></li>'),jc=C('<ul class="nodes svelte-hh3bto"></ul>'),Oc=C(`<label class="row inline svelte-hh3bto"><input type="checkbox" class="svelte-hh3bto"/> <span>Ask the router to map each node's ports automatically (UPnP)</span></label>`),Hc=C("<option> </option>"),zc=C('<span class="muted small svelte-hh3bto">(stored in OS keychain)</span>'),Vc=C('<div><label> <!></label> <input autocomplete="off"/></div>'),Kc=C('<p class="muted small svelte-hh3bto"> </p>'),Jc=C(`<section class="stack"><header><h2>Connectivity</h2> <p class="muted">How the outside world reaches the nodes this machine runs.</p></header> <div class="grid two svelte-hh3bto"><div class="card status-card"><h3>Current status</h3> <!></div> <!></div> <div class="card stack"><h3>Nodes</h3> <!></div> <form class="card stack"><h3>Network</h3> <fieldset class="stack svelte-hh3bto"><label class="row inline svelte-hh3bto"><input type="radio" class="svelte-hh3bto"/> <span>Automatic: public when this machine holds a public IP address</span></label> <label class="row inline svelte-hh3bto"><input type="radio" class="svelte-hh3bto"/> <span>Behind a router (home or office network)</span></label> <label class="row inline svelte-hh3bto"><input type="radio" class="svelte-hh3bto"/> <span>Public IP (a VPS or server reached directly)</span></label></fieldset> <!> <div class="actions svelte-hh3bto"><button type="submit" class="primary"> </button></div></form> <form class="card stack"><h3>Dynamic DNS</h3> <p class="muted">Publish a stable hostname so your friends don't need to track your IP.</p> <div><label for="ddns-provider">Provider</label> <select id="ddns-provider"><option>— none —</option><!></select></div> <div><label for="ddns-hostname">Hostname</label> <input id="ddns-hostname" type="text" placeholder="e.g. yourname.duckdns.org" autocomplete="off"/></div> <!> <label class="row inline svelte-hh3bto"><input type="checkbox" class="svelte-hh3bto"/> <span>I manage this DDNS record outside cadre-host (don't auto-update)</span></label> <div class="actions svelte-hh3bto"><button type="submit" class="primary"> </button></div> <!></form></section>`);function Yc(e,t){Ge(t,!0);const n=[],r=qt();let a=Y(nt([])),s=Y(""),i=Y(""),o=Y(!1),l=Y(nt({})),f=Y(!0),u=Y("auto"),p=Y(!1),h=Y(!1),g=Y(!1);const w=$(()=>c(a).find(D=>D.id===c(s))??null),S=$(()=>(r.connectivity?.nodes??[]).filter(D=>D.running)),b=$(()=>c(S).filter(D=>D.verdict==="unreachable").length),m=$(()=>r.connectivity?.cgnatDetected===!0),B=$(()=>r.connectivity?.network.mode==="public");Zt(()=>{Vt(),Ut(),P()}),At(()=>{const D=r.connectivity;D&&(c(s)===""&&D.ddns.providerId&&R(s,D.ddns.providerId,!0),c(i)===""&&D.ddns.hostname&&R(i,D.ddns.hostname,!0),R(o,D.ddns.externallyManaged,!0),R(f,D.upnpEnabled,!0),R(u,D.network.setting,!0))});async function P(){try{const D=await at("/nat/providers");R(a,D,!0)}catch(D){Ee("error",`Could not load DDNS providers: ${D.message}`)}}async function N(){R(p,!0);try{await Zn("/nat/test"),Ee("success","Reachability test complete"),await Vt()}catch(D){Ee("error",`Test failed: ${D.message}`)}finally{R(p,!1)}}async function M(D){D.preventDefault(),R(h,!0);try{await Jn("/nat/ddns",{providerId:c(s),hostname:c(i),config:{...c(l)},externallyManaged:c(o)}),Ee("success","DDNS settings saved"),R(l,{},!0),await Vt()}catch(Q){const ge=Q instanceof Je?Q.code:"error";Ee("error",`Save failed: ${Q.message} (${ge})`)}finally{R(h,!1)}}async function I(D){D.preventDefault(),R(g,!0);try{await Jn("/nat/settings",{network:c(u),upnpEnabled:c(f)}),Ee("success","Network settings saved"),await Vt()}catch(Q){Ee("error",`Save failed: ${Q.message}`)}finally{R(g,!1)}}var T=Jc(),L=v(d(T),2),A=d(L),U=v(d(A),2);{var F=D=>{var Q=Ic(),ge=he(Q);Bi(ge,{get reachability(){return r.connectivity.directReachability}});var be=v(ge,2),Be=d(be),_t=v(d(Be),2),ft=d(_t);{var mt=Qe=>{var _e=Un();j(()=>E(_e,`public IP ${r.connectivity.network.publicInterfaceIp??r.connectivity.externalIp??""??""} on this machine · no router`)),y(Qe,_e)},Ve=Qe=>{var _e=Un("behind a router");y(Qe,_e)};z(ft,Qe=>{c(B)?Qe(mt):Qe(Ve,-1)})}var Ke=v(ft,2),Oe=d(Ke),He=v(Be,2);{var It=Qe=>{var _e=xc(),Le=he(_e),Mt=v(d(Le)),en=d(Mt),Ra=v(Le,2),Oi=v(d(Ra),2),Hi=d(Oi);{var zi=wn=>{var Bn=Un();j(()=>E(Bn,`found · this machine is ${r.connectivity.gateway.lanAddress??"—"??""} on its network`)),y(wn,Bn)},Vi=wn=>{var Bn=Un();j(()=>E(Bn,`not found${r.connectivity.gateway.lastError?` · ${r.connectivity.gateway.lastError}`:""}`)),y(wn,Bn)};z(Hi,wn=>{r.connectivity.gateway.found?wn(zi):wn(Vi,-1)})}var xa=v(Ra,2),Ki=v(d(xa)),Ji=d(Ki),Yi=v(xa,2),Gi=v(d(Yi)),Wi=d(Gi);j(()=>{E(en,r.connectivity.upnpEnabled?"on":"off"),E(Ji,r.connectivity.externalIp??"—"),E(Wi,r.connectivity.gateway.routerExternalIp??"—")}),y(Qe,_e)};z(He,Qe=>{c(B)||Qe(It)})}var jt=v(He,2),wt=v(d(jt)),Pt=d(wt),vt=v(jt,2),_r=v(d(vt)),mr=d(_r),Pn=v(be,2),Mn=d(Pn);j((Qe,_e)=>{E(Oe,`(${r.connectivity.network.setting==="auto"?"detected":"set"})`),E(Pt,Qe),E(mr,_e),Pn.disabled=c(p),E(Mn,c(p)?"Testing…":"Test reachability")},[()=>Gt(r.connectivity.lastTestedAt),()=>Gt(r.connectivity.externalIpDetectedAt)]),me("click",Pn,N),y(D,Q)},k=D=>{var Q=Pc();y(D,Q)};z(U,D=>{r.connectivity?D(F):D(k,-1)})}var _=v(A,2);{var q=D=>{var Q=Mc();y(D,Q)},re=D=>{var Q=Bc();y(D,Q)},ce=D=>{var Q=Lc(),ge=v(d(Q),2),be=d(ge);j(()=>E(be,`${c(b)??""} of ${c(S).length??""} running ${c(S).length===1?"node":"nodes"} cannot be reached from outside your home network.
|
|
4
|
+
Each one below says which ports to forward on your router, and to which address.`)),y(D,Q)};z(_,D=>{c(B)?D(q):c(m)?D(re,1):c(b)>0&&D(ce,2)})}var pe=v(L,2),ye=v(d(pe),2);{var Ue=D=>{var Q=Dc();y(D,Q)},Te=D=>{var Q=qc();y(D,Q)},ke=D=>{var Q=jc();Jt(Q,21,()=>r.connectivity.nodes,ge=>ge.nodeId,(ge,be)=>{var Be=Fc(),_t=d(Be);Ta(_t,{get node(){return c(be)},get connectivity(){return r.connectivity},header:mt=>{var Ve=Uc(),Ke=he(Ve),Oe=d(Ke),He=d(Oe),It=d(He),jt=v(Ke,2),wt=d(jt);j((Pt,vt)=>{oe(Ke,"href",Pt),E(It,c(be).nodeId),E(wt,vt)},[()=>Ze("node-detail",{id:c(be).nodeId}),()=>Gl(r.hostedNodes.list.find(Pt=>Pt.id===c(be).nodeId))]),y(mt,Ve)},$$slots:{header:!0}}),y(ge,Be)}),y(D,Q)};z(ye,D=>{r.connectivity?r.connectivity.nodes.length===0?D(Te,1):D(ke,-1):D(Ue)})}var Ce=v(pe,2),Ne=v(d(Ce),2),je=d(Ne),Pe=d(je);Pe.value=Pe.__value="auto";var G=v(je,2),x=d(G);x.value=x.__value="lan";var O=v(G,2),J=d(O);J.value=J.__value="public";var de=v(Ne,2);{var H=D=>{var Q=Oc(),ge=d(Q);ra(ge,()=>c(f),be=>R(f,be)),y(D,Q)};z(de,D=>{(!c(B)||c(u)==="lan")&&D(H)})}var K=v(de,2),W=d(K),X=d(W),fe=v(Ce,2),Se=v(d(fe),4),Re=v(d(Se),2),V=d(Re);V.value=V.__value="";var te=v(V);Jt(te,17,()=>c(a),D=>D.id,(D,Q)=>{var ge=Hc(),be=d(ge),Be={};j(()=>{E(be,c(Q).displayName),Be!==(Be=c(Q).id)&&(ge.value=(ge.__value=c(Q).id)??"")}),y(D,ge)});var ne=v(Se,2),ve=v(d(ne),2),ue=v(ne,2);{var Z=D=>{var Q=Xt(),ge=he(Q);Jt(ge,17,()=>c(w).configFields,be=>be.key,(be,Be)=>{var _t=Vc(),ft=d(_t),mt=d(ft),Ve=v(mt);{var Ke=He=>{var It=zc();y(He,It)};z(Ve,He=>{c(Be).secret&&He(Ke)})}var Oe=v(ft,2);j(()=>{oe(ft,"for",`ddns-${c(Be).key}`),E(mt,`${c(Be).label??""} `),oe(Oe,"id",`ddns-${c(Be).key}`),oe(Oe,"type",c(Be).secret?"password":"text"),yi(Oe,c(l)[c(Be).key]??"")}),me("input",Oe,He=>R(l,{...c(l),[c(Be).key]:He.currentTarget.value},!0)),y(be,_t)}),y(D,Q)};z(ue,D=>{c(w)&&D(Z)})}var le=v(ue,2),xe=d(le),we=v(le,2),Me=d(we),$e=d(Me),Ft=v(we,2);{var xt=D=>{var Q=Kc(),ge=d(Q);j(be=>E(ge,`Last DDNS update ${be??""}
|
|
5
|
+
${r.connectivity.ddns.lastUpdateOk===!0?"· ok":r.connectivity.ddns.lastUpdateOk===!1?`· failed: ${r.connectivity.ddns.lastError??"error"}`:""}`),[()=>Gt(r.connectivity.ddns.lastUpdateAt)]),y(D,Q)};z(Ft,D=>{r.connectivity?.ddns.lastUpdateAt&&D(xt)})}j(()=>{W.disabled=c(g),E(X,c(g)?"Saving…":"Save"),Me.disabled=c(h)||c(s)==="",E($e,c(h)?"Saving…":"Save DDNS settings")}),Nn("submit",Ce,I),En(n,[],Pe,()=>c(u),D=>R(u,D)),En(n,[],x,()=>c(u),D=>R(u,D)),En(n,[],J,()=>c(u),D=>R(u,D)),Nn("submit",fe,M),Sl(Re,()=>c(s),D=>R(s,D)),cn(ve,()=>c(i),D=>R(i,D)),ra(xe,()=>c(o),D=>R(o,D)),y(e,T),We()}Rt(["click","input"]);var Gc=C('<p class="error svelte-7tcksg"> </p>'),Wc=C('<p class="muted">No nodes yet. <a>Join a cadre</a> to start one, then scan its code with the phone that owns the cadre.</p>'),$c=C('<p class="muted">Loading…</p>'),Qc=C("<span> </span>"),Xc=C('<span class="badge">no process</span>'),Zc=C('<span class="badge err"> </span>'),ed=C("<code> </code>"),td=C('<tr class="svelte-7tcksg"><td class="svelte-7tcksg"><code> </code></td><td class="svelte-7tcksg"><span class="badges svelte-7tcksg"><!> <!></span></td><td class="svelte-7tcksg"><!></td><td class="svelte-7tcksg"><code> </code></td><td class="svelte-7tcksg"> </td><td class="muted svelte-7tcksg"> </td><td class="svelte-7tcksg"><a>Details →</a></td></tr>'),nd=C('<div class="scroll svelte-7tcksg"><table class="svelte-7tcksg"><thead><tr><th scope="col" class="svelte-7tcksg">ID</th><th scope="col" class="svelte-7tcksg">Status</th><th scope="col" class="svelte-7tcksg">Cadre</th><th scope="col" class="svelte-7tcksg">Owner</th><th scope="col" class="svelte-7tcksg">Connected</th><th scope="col" class="svelte-7tcksg">Spawned</th><th scope="col" class="svelte-7tcksg"></th></tr></thead><tbody></tbody></table></div>'),rd=C('<section class="stack"><header><h2>Nodes</h2> <p class="muted">Cadre nodes this machine runs, and the cadre each one joined.</p></header> <div class="card"><!> <!></div></section>');function ad(e,t){Ge(t,!0);const n=qt(),r=$(()=>Wl(n.hostedNodes.list,n.nodes));Zt(()=>{Ea(),Ut()});var a=rd(),s=v(d(a),2),i=d(s);{var o=h=>{var g=Gc(),w=d(g);j(()=>E(w,`Couldn’t load hosted nodes: ${n.hostedNodes.error??""}`)),y(h,g)};z(i,h=>{n.hostedNodes.error&&h(o)})}var l=v(i,2);{var f=h=>{var g=Wc(),w=v(d(g));j(S=>oe(w,"href",S),[()=>Ze("join")]),y(h,g)},u=h=>{var g=Xt(),w=he(g);{var S=b=>{var m=$c();y(b,m)};z(w,b=>{n.hostedNodes.error||b(S)})}y(h,g)},p=h=>{var g=nd(),w=d(g),S=v(d(w));Jt(S,21,()=>c(r),b=>b.id,(b,m)=>{const B=$(()=>c(m).hosted?Sa(c(m).hosted):null);var P=td(),N=d(P),M=d(N),I=d(M),T=v(N),L=d(T),A=d(L);{var U=x=>{var O=Qc(),J=d(O);j(()=>{dt(O,1,`badge ${Rn[c(m).hosted.status].tone??""}`,"svelte-7tcksg"),E(J,Rn[c(m).hosted.status].text)}),y(x,O)};z(A,x=>{c(m).hosted&&x(U)})}var F=v(A,2);{var k=x=>{var O=Xc();y(x,O)},_=x=>{var O=Zc(),J=d(O);j(()=>E(J,c(m).handle.status)),y(x,O)};z(F,x=>{c(m).handle?c(m).handle.status!=="running"&&x(_,1):x(k)})}var q=v(T),re=d(q);{var ce=x=>{var O=ed(),J=d(O);j(de=>{oe(O,"title",c(B)),E(J,de)},[()=>Zl(c(B))]),y(x,O)},pe=x=>{var O=Un("—");y(x,O)};z(re,x=>{c(B)?x(ce):x(pe,-1)})}var ye=v(q),Ue=d(ye),Te=d(Ue),ke=v(ye),Ce=d(ke),Ne=v(ke),je=d(Ne),Pe=v(Ne),G=d(Pe);j((x,O,J,de)=>{E(I,c(m).id),oe(Ue,"title",c(m).hosted?.ownerKey),E(Te,x),E(Ce,O),E(je,J),oe(G,"href",de)},[()=>Ca(c(m).hosted?.ownerKey),()=>c(m).hosted?xi(c(m).hosted):"—",()=>Gt(c(m).handle?.spawnedAt??c(m).hosted?.createdAt),()=>Ze("node-detail",{id:c(m).id})]),y(b,P)}),y(h,g)};z(l,h=>{c(r).length===0&&n.hostedNodes.loaded?h(f):c(r).length===0?h(u,1):h(p,-1)})}y(e,a),We()}function sd(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var yn={},Cr,Za;function id(){return Za||(Za=1,Cr=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Cr}var Sr={},Ht={},es;function _n(){if(es)return Ht;es=1;let e;const t=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return Ht.getSymbolSize=function(r){if(!r)throw new Error('"version" cannot be null or undefined');if(r<1||r>40)throw new Error('"version" should be in range from 1 to 40');return r*4+17},Ht.getSymbolTotalCodewords=function(r){return t[r]},Ht.getBCHDigit=function(n){let r=0;for(;n!==0;)r++,n>>>=1;return r},Ht.setToSJISFunction=function(r){if(typeof r!="function")throw new Error('"toSJISFunc" is not a valid function.');e=r},Ht.isKanjiModeEnabled=function(){return typeof e<"u"},Ht.toSJIS=function(r){return e(r)},Ht}var Ar={},ts;function Na(){return ts||(ts=1,(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(n){if(typeof n!="string")throw new Error("Param is not a string");switch(n.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+n)}}e.isValid=function(r){return r&&typeof r.bit<"u"&&r.bit>=0&&r.bit<4},e.from=function(r,a){if(e.isValid(r))return r;try{return t(r)}catch{return a}}})(Ar)),Ar}var Tr,ns;function od(){if(ns)return Tr;ns=1;function e(){this.buffer=[],this.length=0}return e.prototype={get:function(t){const n=Math.floor(t/8);return(this.buffer[n]>>>7-t%8&1)===1},put:function(t,n){for(let r=0;r<n;r++)this.putBit((t>>>n-r-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){const n=Math.floor(this.length/8);this.buffer.length<=n&&this.buffer.push(0),t&&(this.buffer[n]|=128>>>this.length%8),this.length++}},Tr=e,Tr}var Nr,rs;function ld(){if(rs)return Nr;rs=1;function e(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}return e.prototype.set=function(t,n,r,a){const s=t*this.size+n;this.data[s]=r,a&&(this.reservedBit[s]=!0)},e.prototype.get=function(t,n){return this.data[t*this.size+n]},e.prototype.xor=function(t,n,r){this.data[t*this.size+n]^=r},e.prototype.isReserved=function(t,n){return this.reservedBit[t*this.size+n]},Nr=e,Nr}var Rr={},as;function cd(){return as||(as=1,(function(e){const t=_n().getSymbolSize;e.getRowColCoords=function(r){if(r===1)return[];const a=Math.floor(r/7)+2,s=t(r),i=s===145?26:Math.ceil((s-13)/(2*a-2))*2,o=[s-7];for(let l=1;l<a-1;l++)o[l]=o[l-1]-i;return o.push(6),o.reverse()},e.getPositions=function(r){const a=[],s=e.getRowColCoords(r),i=s.length;for(let o=0;o<i;o++)for(let l=0;l<i;l++)o===0&&l===0||o===0&&l===i-1||o===i-1&&l===0||a.push([s[o],s[l]]);return a}})(Rr)),Rr}var xr={},ss;function dd(){if(ss)return xr;ss=1;const e=_n().getSymbolSize,t=7;return xr.getPositions=function(r){const a=e(r);return[[0,0],[a-t,0],[0,a-t]]},xr}var Ir={},is;function ud(){return is||(is=1,(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(a){return a!=null&&a!==""&&!isNaN(a)&&a>=0&&a<=7},e.from=function(a){return e.isValid(a)?parseInt(a,10):void 0},e.getPenaltyN1=function(a){const s=a.size;let i=0,o=0,l=0,f=null,u=null;for(let p=0;p<s;p++){o=l=0,f=u=null;for(let h=0;h<s;h++){let g=a.get(p,h);g===f?o++:(o>=5&&(i+=t.N1+(o-5)),f=g,o=1),g=a.get(h,p),g===u?l++:(l>=5&&(i+=t.N1+(l-5)),u=g,l=1)}o>=5&&(i+=t.N1+(o-5)),l>=5&&(i+=t.N1+(l-5))}return i},e.getPenaltyN2=function(a){const s=a.size;let i=0;for(let o=0;o<s-1;o++)for(let l=0;l<s-1;l++){const f=a.get(o,l)+a.get(o,l+1)+a.get(o+1,l)+a.get(o+1,l+1);(f===4||f===0)&&i++}return i*t.N2},e.getPenaltyN3=function(a){const s=a.size;let i=0,o=0,l=0;for(let f=0;f<s;f++){o=l=0;for(let u=0;u<s;u++)o=o<<1&2047|a.get(f,u),u>=10&&(o===1488||o===93)&&i++,l=l<<1&2047|a.get(u,f),u>=10&&(l===1488||l===93)&&i++}return i*t.N3},e.getPenaltyN4=function(a){let s=0;const i=a.data.length;for(let l=0;l<i;l++)s+=a.data[l];return Math.abs(Math.ceil(s*100/i/5)-10)*t.N4};function n(r,a,s){switch(r){case e.Patterns.PATTERN000:return(a+s)%2===0;case e.Patterns.PATTERN001:return a%2===0;case e.Patterns.PATTERN010:return s%3===0;case e.Patterns.PATTERN011:return(a+s)%3===0;case e.Patterns.PATTERN100:return(Math.floor(a/2)+Math.floor(s/3))%2===0;case e.Patterns.PATTERN101:return a*s%2+a*s%3===0;case e.Patterns.PATTERN110:return(a*s%2+a*s%3)%2===0;case e.Patterns.PATTERN111:return(a*s%3+(a+s)%2)%2===0;default:throw new Error("bad maskPattern:"+r)}}e.applyMask=function(a,s){const i=s.size;for(let o=0;o<i;o++)for(let l=0;l<i;l++)s.isReserved(l,o)||s.xor(l,o,n(a,l,o))},e.getBestMask=function(a,s){const i=Object.keys(e.Patterns).length;let o=0,l=1/0;for(let f=0;f<i;f++){s(f),e.applyMask(f,a);const u=e.getPenaltyN1(a)+e.getPenaltyN2(a)+e.getPenaltyN3(a)+e.getPenaltyN4(a);e.applyMask(f,a),u<l&&(l=u,o=f)}return o}})(Ir)),Ir}var nr={},os;function Li(){if(os)return nr;os=1;const e=Na(),t=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],n=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return nr.getBlocksCount=function(a,s){switch(s){case e.L:return t[(a-1)*4+0];case e.M:return t[(a-1)*4+1];case e.Q:return t[(a-1)*4+2];case e.H:return t[(a-1)*4+3];default:return}},nr.getTotalCodewordsCount=function(a,s){switch(s){case e.L:return n[(a-1)*4+0];case e.M:return n[(a-1)*4+1];case e.Q:return n[(a-1)*4+2];case e.H:return n[(a-1)*4+3];default:return}},nr}var Pr={},Dn={},ls;function fd(){if(ls)return Dn;ls=1;const e=new Uint8Array(512),t=new Uint8Array(256);return(function(){let r=1;for(let a=0;a<255;a++)e[a]=r,t[r]=a,r<<=1,r&256&&(r^=285);for(let a=255;a<512;a++)e[a]=e[a-255]})(),Dn.log=function(r){if(r<1)throw new Error("log("+r+")");return t[r]},Dn.exp=function(r){return e[r]},Dn.mul=function(r,a){return r===0||a===0?0:e[t[r]+t[a]]},Dn}var cs;function vd(){return cs||(cs=1,(function(e){const t=fd();e.mul=function(r,a){const s=new Uint8Array(r.length+a.length-1);for(let i=0;i<r.length;i++)for(let o=0;o<a.length;o++)s[i+o]^=t.mul(r[i],a[o]);return s},e.mod=function(r,a){let s=new Uint8Array(r);for(;s.length-a.length>=0;){const i=s[0];for(let l=0;l<a.length;l++)s[l]^=t.mul(a[l],i);let o=0;for(;o<s.length&&s[o]===0;)o++;s=s.slice(o)}return s},e.generateECPolynomial=function(r){let a=new Uint8Array([1]);for(let s=0;s<r;s++)a=e.mul(a,new Uint8Array([1,t.exp(s)]));return a}})(Pr)),Pr}var Mr,ds;function hd(){if(ds)return Mr;ds=1;const e=vd();function t(n){this.genPoly=void 0,this.degree=n,this.degree&&this.initialize(this.degree)}return t.prototype.initialize=function(r){this.degree=r,this.genPoly=e.generateECPolynomial(this.degree)},t.prototype.encode=function(r){if(!this.genPoly)throw new Error("Encoder not initialized");const a=new Uint8Array(r.length+this.degree);a.set(r);const s=e.mod(a,this.genPoly),i=this.degree-s.length;if(i>0){const o=new Uint8Array(this.degree);return o.set(s,i),o}return s},Mr=t,Mr}var Br={},Lr={},Dr={},us;function Di(){return us||(us=1,Dr.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}),Dr}var yt={},fs;function qi(){if(fs)return yt;fs=1;const e="[0-9]+",t="[A-Z $%*+\\-./:]+";let n="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";n=n.replace(/u/g,"\\u");const r="(?:(?![A-Z0-9 $%*+\\-./:]|"+n+`)(?:.|[\r
|
|
6
|
+
]))+`;yt.KANJI=new RegExp(n,"g"),yt.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),yt.BYTE=new RegExp(r,"g"),yt.NUMERIC=new RegExp(e,"g"),yt.ALPHANUMERIC=new RegExp(t,"g");const a=new RegExp("^"+n+"$"),s=new RegExp("^"+e+"$"),i=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return yt.testKanji=function(l){return a.test(l)},yt.testNumeric=function(l){return s.test(l)},yt.testAlphanumeric=function(l){return i.test(l)},yt}var vs;function mn(){return vs||(vs=1,(function(e){const t=Di(),n=qi();e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(s,i){if(!s.ccBits)throw new Error("Invalid mode: "+s);if(!t.isValid(i))throw new Error("Invalid version: "+i);return i>=1&&i<10?s.ccBits[0]:i<27?s.ccBits[1]:s.ccBits[2]},e.getBestModeForData=function(s){return n.testNumeric(s)?e.NUMERIC:n.testAlphanumeric(s)?e.ALPHANUMERIC:n.testKanji(s)?e.KANJI:e.BYTE},e.toString=function(s){if(s&&s.id)return s.id;throw new Error("Invalid mode")},e.isValid=function(s){return s&&s.bit&&s.ccBits};function r(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+a)}}e.from=function(s,i){if(e.isValid(s))return s;try{return r(s)}catch{return i}}})(Lr)),Lr}var hs;function pd(){return hs||(hs=1,(function(e){const t=_n(),n=Li(),r=Na(),a=mn(),s=Di(),i=7973,o=t.getBCHDigit(i);function l(h,g,w){for(let S=1;S<=40;S++)if(g<=e.getCapacity(S,w,h))return S}function f(h,g){return a.getCharCountIndicator(h,g)+4}function u(h,g){let w=0;return h.forEach(function(S){const b=f(S.mode,g);w+=b+S.getBitsLength()}),w}function p(h,g){for(let w=1;w<=40;w++)if(u(h,w)<=e.getCapacity(w,g,a.MIXED))return w}e.from=function(g,w){return s.isValid(g)?parseInt(g,10):w},e.getCapacity=function(g,w,S){if(!s.isValid(g))throw new Error("Invalid QR Code version");typeof S>"u"&&(S=a.BYTE);const b=t.getSymbolTotalCodewords(g),m=n.getTotalCodewordsCount(g,w),B=(b-m)*8;if(S===a.MIXED)return B;const P=B-f(S,g);switch(S){case a.NUMERIC:return Math.floor(P/10*3);case a.ALPHANUMERIC:return Math.floor(P/11*2);case a.KANJI:return Math.floor(P/13);case a.BYTE:default:return Math.floor(P/8)}},e.getBestVersionForData=function(g,w){let S;const b=r.from(w,r.M);if(Array.isArray(g)){if(g.length>1)return p(g,b);if(g.length===0)return 1;S=g[0]}else S=g;return l(S.mode,S.getLength(),b)},e.getEncodedBits=function(g){if(!s.isValid(g)||g<7)throw new Error("Invalid QR Code version");let w=g<<12;for(;t.getBCHDigit(w)-o>=0;)w^=i<<t.getBCHDigit(w)-o;return g<<12|w}})(Br)),Br}var qr={},ps;function gd(){if(ps)return qr;ps=1;const e=_n(),t=1335,n=21522,r=e.getBCHDigit(t);return qr.getEncodedBits=function(s,i){const o=s.bit<<3|i;let l=o<<10;for(;e.getBCHDigit(l)-r>=0;)l^=t<<e.getBCHDigit(l)-r;return(o<<10|l)^n},qr}var Ur={},Fr,gs;function _d(){if(gs)return Fr;gs=1;const e=mn();function t(n){this.mode=e.NUMERIC,this.data=n.toString()}return t.getBitsLength=function(r){return 10*Math.floor(r/3)+(r%3?r%3*3+1:0)},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(r){let a,s,i;for(a=0;a+3<=this.data.length;a+=3)s=this.data.substr(a,3),i=parseInt(s,10),r.put(i,10);const o=this.data.length-a;o>0&&(s=this.data.substr(a),i=parseInt(s,10),r.put(i,o*3+1))},Fr=t,Fr}var jr,_s;function md(){if(_s)return jr;_s=1;const e=mn(),t=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function n(r){this.mode=e.ALPHANUMERIC,this.data=r}return n.getBitsLength=function(a){return 11*Math.floor(a/2)+6*(a%2)},n.prototype.getLength=function(){return this.data.length},n.prototype.getBitsLength=function(){return n.getBitsLength(this.data.length)},n.prototype.write=function(a){let s;for(s=0;s+2<=this.data.length;s+=2){let i=t.indexOf(this.data[s])*45;i+=t.indexOf(this.data[s+1]),a.put(i,11)}this.data.length%2&&a.put(t.indexOf(this.data[s]),6)},jr=n,jr}var Or,ms;function wd(){if(ms)return Or;ms=1;const e=mn();function t(n){this.mode=e.BYTE,typeof n=="string"?this.data=new TextEncoder().encode(n):this.data=new Uint8Array(n)}return t.getBitsLength=function(r){return r*8},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(n){for(let r=0,a=this.data.length;r<a;r++)n.put(this.data[r],8)},Or=t,Or}var Hr,ws;function yd(){if(ws)return Hr;ws=1;const e=mn(),t=_n();function n(r){this.mode=e.KANJI,this.data=r}return n.getBitsLength=function(a){return a*13},n.prototype.getLength=function(){return this.data.length},n.prototype.getBitsLength=function(){return n.getBitsLength(this.data.length)},n.prototype.write=function(r){let a;for(a=0;a<this.data.length;a++){let s=t.toSJIS(this.data[a]);if(s>=33088&&s<=40956)s-=33088;else if(s>=57408&&s<=60351)s-=49472;else throw new Error("Invalid SJIS character: "+this.data[a]+`
|
|
7
|
+
Make sure your charset is UTF-8`);s=(s>>>8&255)*192+(s&255),r.put(s,13)}},Hr=n,Hr}var zr={exports:{}},ys;function bd(){return ys||(ys=1,(function(e){var t={single_source_shortest_paths:function(n,r,a){var s={},i={};i[r]=0;var o=t.PriorityQueue.make();o.push(r,0);for(var l,f,u,p,h,g,w,S,b;!o.empty();){l=o.pop(),f=l.value,p=l.cost,h=n[f]||{};for(u in h)h.hasOwnProperty(u)&&(g=h[u],w=p+g,S=i[u],b=typeof i[u]>"u",(b||S>w)&&(i[u]=w,o.push(u,w),s[u]=f))}if(typeof a<"u"&&typeof i[a]>"u"){var m=["Could not find a path from ",r," to ",a,"."].join("");throw new Error(m)}return s},extract_shortest_path_from_predecessor_list:function(n,r){for(var a=[],s=r;s;)a.push(s),n[s],s=n[s];return a.reverse(),a},find_path:function(n,r,a){var s=t.single_source_shortest_paths(n,r,a);return t.extract_shortest_path_from_predecessor_list(s,a)},PriorityQueue:{make:function(n){var r=t.PriorityQueue,a={},s;n=n||{};for(s in r)r.hasOwnProperty(s)&&(a[s]=r[s]);return a.queue=[],a.sorter=n.sorter||r.default_sorter,a},default_sorter:function(n,r){return n.cost-r.cost},push:function(n,r){var a={value:n,cost:r};this.queue.push(a),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(zr)),zr.exports}var bs;function Ed(){return bs||(bs=1,(function(e){const t=mn(),n=_d(),r=md(),a=wd(),s=yd(),i=qi(),o=_n(),l=bd();function f(m){return unescape(encodeURIComponent(m)).length}function u(m,B,P){const N=[];let M;for(;(M=m.exec(P))!==null;)N.push({data:M[0],index:M.index,mode:B,length:M[0].length});return N}function p(m){const B=u(i.NUMERIC,t.NUMERIC,m),P=u(i.ALPHANUMERIC,t.ALPHANUMERIC,m);let N,M;return o.isKanjiModeEnabled()?(N=u(i.BYTE,t.BYTE,m),M=u(i.KANJI,t.KANJI,m)):(N=u(i.BYTE_KANJI,t.BYTE,m),M=[]),B.concat(P,N,M).sort(function(T,L){return T.index-L.index}).map(function(T){return{data:T.data,mode:T.mode,length:T.length}})}function h(m,B){switch(B){case t.NUMERIC:return n.getBitsLength(m);case t.ALPHANUMERIC:return r.getBitsLength(m);case t.KANJI:return s.getBitsLength(m);case t.BYTE:return a.getBitsLength(m)}}function g(m){return m.reduce(function(B,P){const N=B.length-1>=0?B[B.length-1]:null;return N&&N.mode===P.mode?(B[B.length-1].data+=P.data,B):(B.push(P),B)},[])}function w(m){const B=[];for(let P=0;P<m.length;P++){const N=m[P];switch(N.mode){case t.NUMERIC:B.push([N,{data:N.data,mode:t.ALPHANUMERIC,length:N.length},{data:N.data,mode:t.BYTE,length:N.length}]);break;case t.ALPHANUMERIC:B.push([N,{data:N.data,mode:t.BYTE,length:N.length}]);break;case t.KANJI:B.push([N,{data:N.data,mode:t.BYTE,length:f(N.data)}]);break;case t.BYTE:B.push([{data:N.data,mode:t.BYTE,length:f(N.data)}])}}return B}function S(m,B){const P={},N={start:{}};let M=["start"];for(let I=0;I<m.length;I++){const T=m[I],L=[];for(let A=0;A<T.length;A++){const U=T[A],F=""+I+A;L.push(F),P[F]={node:U,lastCount:0},N[F]={};for(let k=0;k<M.length;k++){const _=M[k];P[_]&&P[_].node.mode===U.mode?(N[_][F]=h(P[_].lastCount+U.length,U.mode)-h(P[_].lastCount,U.mode),P[_].lastCount+=U.length):(P[_]&&(P[_].lastCount=U.length),N[_][F]=h(U.length,U.mode)+4+t.getCharCountIndicator(U.mode,B))}}M=L}for(let I=0;I<M.length;I++)N[M[I]].end=0;return{map:N,table:P}}function b(m,B){let P;const N=t.getBestModeForData(m);if(P=t.from(B,N),P!==t.BYTE&&P.bit<N.bit)throw new Error('"'+m+'" cannot be encoded with mode '+t.toString(P)+`.
|
|
8
|
+
Suggested mode is: `+t.toString(N));switch(P===t.KANJI&&!o.isKanjiModeEnabled()&&(P=t.BYTE),P){case t.NUMERIC:return new n(m);case t.ALPHANUMERIC:return new r(m);case t.KANJI:return new s(m);case t.BYTE:return new a(m)}}e.fromArray=function(B){return B.reduce(function(P,N){return typeof N=="string"?P.push(b(N,null)):N.data&&P.push(b(N.data,N.mode)),P},[])},e.fromString=function(B,P){const N=p(B,o.isKanjiModeEnabled()),M=w(N),I=S(M,P),T=l.find_path(I.map,"start","end"),L=[];for(let A=1;A<T.length-1;A++)L.push(I.table[T[A]].node);return e.fromArray(g(L))},e.rawSplit=function(B){return e.fromArray(p(B,o.isKanjiModeEnabled()))}})(Ur)),Ur}var Es;function kd(){if(Es)return Sr;Es=1;const e=_n(),t=Na(),n=od(),r=ld(),a=cd(),s=dd(),i=ud(),o=Li(),l=hd(),f=pd(),u=gd(),p=mn(),h=Ed();function g(I,T){const L=I.size,A=s.getPositions(T);for(let U=0;U<A.length;U++){const F=A[U][0],k=A[U][1];for(let _=-1;_<=7;_++)if(!(F+_<=-1||L<=F+_))for(let q=-1;q<=7;q++)k+q<=-1||L<=k+q||(_>=0&&_<=6&&(q===0||q===6)||q>=0&&q<=6&&(_===0||_===6)||_>=2&&_<=4&&q>=2&&q<=4?I.set(F+_,k+q,!0,!0):I.set(F+_,k+q,!1,!0))}}function w(I){const T=I.size;for(let L=8;L<T-8;L++){const A=L%2===0;I.set(L,6,A,!0),I.set(6,L,A,!0)}}function S(I,T){const L=a.getPositions(T);for(let A=0;A<L.length;A++){const U=L[A][0],F=L[A][1];for(let k=-2;k<=2;k++)for(let _=-2;_<=2;_++)k===-2||k===2||_===-2||_===2||k===0&&_===0?I.set(U+k,F+_,!0,!0):I.set(U+k,F+_,!1,!0)}}function b(I,T){const L=I.size,A=f.getEncodedBits(T);let U,F,k;for(let _=0;_<18;_++)U=Math.floor(_/3),F=_%3+L-8-3,k=(A>>_&1)===1,I.set(U,F,k,!0),I.set(F,U,k,!0)}function m(I,T,L){const A=I.size,U=u.getEncodedBits(T,L);let F,k;for(F=0;F<15;F++)k=(U>>F&1)===1,F<6?I.set(F,8,k,!0):F<8?I.set(F+1,8,k,!0):I.set(A-15+F,8,k,!0),F<8?I.set(8,A-F-1,k,!0):F<9?I.set(8,15-F-1+1,k,!0):I.set(8,15-F-1,k,!0);I.set(A-8,8,1,!0)}function B(I,T){const L=I.size;let A=-1,U=L-1,F=7,k=0;for(let _=L-1;_>0;_-=2)for(_===6&&_--;;){for(let q=0;q<2;q++)if(!I.isReserved(U,_-q)){let re=!1;k<T.length&&(re=(T[k]>>>F&1)===1),I.set(U,_-q,re),F--,F===-1&&(k++,F=7)}if(U+=A,U<0||L<=U){U-=A,A=-A;break}}}function P(I,T,L){const A=new n;L.forEach(function(q){A.put(q.mode.bit,4),A.put(q.getLength(),p.getCharCountIndicator(q.mode,I)),q.write(A)});const U=e.getSymbolTotalCodewords(I),F=o.getTotalCodewordsCount(I,T),k=(U-F)*8;for(A.getLengthInBits()+4<=k&&A.put(0,4);A.getLengthInBits()%8!==0;)A.putBit(0);const _=(k-A.getLengthInBits())/8;for(let q=0;q<_;q++)A.put(q%2?17:236,8);return N(A,I,T)}function N(I,T,L){const A=e.getSymbolTotalCodewords(T),U=o.getTotalCodewordsCount(T,L),F=A-U,k=o.getBlocksCount(T,L),_=A%k,q=k-_,re=Math.floor(A/k),ce=Math.floor(F/k),pe=ce+1,ye=re-ce,Ue=new l(ye);let Te=0;const ke=new Array(k),Ce=new Array(k);let Ne=0;const je=new Uint8Array(I.buffer);for(let J=0;J<k;J++){const de=J<q?ce:pe;ke[J]=je.slice(Te,Te+de),Ce[J]=Ue.encode(ke[J]),Te+=de,Ne=Math.max(Ne,de)}const Pe=new Uint8Array(A);let G=0,x,O;for(x=0;x<Ne;x++)for(O=0;O<k;O++)x<ke[O].length&&(Pe[G++]=ke[O][x]);for(x=0;x<ye;x++)for(O=0;O<k;O++)Pe[G++]=Ce[O][x];return Pe}function M(I,T,L,A){let U;if(Array.isArray(I))U=h.fromArray(I);else if(typeof I=="string"){let re=T;if(!re){const ce=h.rawSplit(I);re=f.getBestVersionForData(ce,L)}U=h.fromString(I,re||40)}else throw new Error("Invalid data");const F=f.getBestVersionForData(U,L);if(!F)throw new Error("The amount of data is too big to be stored in a QR Code");if(!T)T=F;else if(T<F)throw new Error(`
|
|
9
|
+
The chosen QR Code version cannot contain this amount of data.
|
|
10
|
+
Minimum version required to store current data is: `+F+`.
|
|
11
|
+
`);const k=P(T,L,U),_=e.getSymbolSize(T),q=new r(_);return g(q,T),w(q),S(q,T),m(q,L,0),T>=7&&b(q,T),B(q,k),isNaN(A)&&(A=i.getBestMask(q,m.bind(null,q,L))),i.applyMask(A,q),m(q,L,A),{modules:q,version:T,errorCorrectionLevel:L,maskPattern:A,segments:U}}return Sr.create=function(T,L){if(typeof T>"u"||T==="")throw new Error("No input text");let A=t.M,U,F;return typeof L<"u"&&(A=t.from(L.errorCorrectionLevel,t.M),U=f.from(L.version),F=i.from(L.maskPattern),L.toSJISFunc&&e.setToSJISFunction(L.toSJISFunc)),M(T,U,A,F)},Sr}var Vr={},Kr={},ks;function Ui(){return ks||(ks=1,(function(e){function t(n){if(typeof n=="number"&&(n=n.toString()),typeof n!="string")throw new Error("Color should be defined as hex string");let r=n.slice().replace("#","").split("");if(r.length<3||r.length===5||r.length>8)throw new Error("Invalid hex color: "+n);(r.length===3||r.length===4)&&(r=Array.prototype.concat.apply([],r.map(function(s){return[s,s]}))),r.length===6&&r.push("F","F");const a=parseInt(r.join(""),16);return{r:a>>24&255,g:a>>16&255,b:a>>8&255,a:a&255,hex:"#"+r.slice(0,6).join("")}}e.getOptions=function(r){r||(r={}),r.color||(r.color={});const a=typeof r.margin>"u"||r.margin===null||r.margin<0?4:r.margin,s=r.width&&r.width>=21?r.width:void 0,i=r.scale||4;return{width:s,scale:s?4:i,margin:a,color:{dark:t(r.color.dark||"#000000ff"),light:t(r.color.light||"#ffffffff")},type:r.type,rendererOpts:r.rendererOpts||{}}},e.getScale=function(r,a){return a.width&&a.width>=r+a.margin*2?a.width/(r+a.margin*2):a.scale},e.getImageWidth=function(r,a){const s=e.getScale(r,a);return Math.floor((r+a.margin*2)*s)},e.qrToImageData=function(r,a,s){const i=a.modules.size,o=a.modules.data,l=e.getScale(i,s),f=Math.floor((i+s.margin*2)*l),u=s.margin*l,p=[s.color.light,s.color.dark];for(let h=0;h<f;h++)for(let g=0;g<f;g++){let w=(h*f+g)*4,S=s.color.light;if(h>=u&&g>=u&&h<f-u&&g<f-u){const b=Math.floor((h-u)/l),m=Math.floor((g-u)/l);S=p[o[b*i+m]?1:0]}r[w++]=S.r,r[w++]=S.g,r[w++]=S.b,r[w]=S.a}}})(Kr)),Kr}var Cs;function Cd(){return Cs||(Cs=1,(function(e){const t=Ui();function n(a,s,i){a.clearRect(0,0,s.width,s.height),s.style||(s.style={}),s.height=i,s.width=i,s.style.height=i+"px",s.style.width=i+"px"}function r(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}e.render=function(s,i,o){let l=o,f=i;typeof l>"u"&&(!i||!i.getContext)&&(l=i,i=void 0),i||(f=r()),l=t.getOptions(l);const u=t.getImageWidth(s.modules.size,l),p=f.getContext("2d"),h=p.createImageData(u,u);return t.qrToImageData(h.data,s,l),n(p,f,u),p.putImageData(h,0,0),f},e.renderToDataURL=function(s,i,o){let l=o;typeof l>"u"&&(!i||!i.getContext)&&(l=i,i=void 0),l||(l={});const f=e.render(s,i,l),u=l.type||"image/png",p=l.rendererOpts||{};return f.toDataURL(u,p.quality)}})(Vr)),Vr}var Jr={},Ss;function Sd(){if(Ss)return Jr;Ss=1;const e=Ui();function t(a,s){const i=a.a/255,o=s+'="'+a.hex+'"';return i<1?o+" "+s+'-opacity="'+i.toFixed(2).slice(1)+'"':o}function n(a,s,i){let o=a+s;return typeof i<"u"&&(o+=" "+i),o}function r(a,s,i){let o="",l=0,f=!1,u=0;for(let p=0;p<a.length;p++){const h=Math.floor(p%s),g=Math.floor(p/s);!h&&!f&&(f=!0),a[p]?(u++,p>0&&h>0&&a[p-1]||(o+=f?n("M",h+i,.5+g+i):n("m",l,0),l=0,f=!1),h+1<s&&a[p+1]||(o+=n("h",u),u=0)):l++}return o}return Jr.render=function(s,i,o){const l=e.getOptions(i),f=s.modules.size,u=s.modules.data,p=f+l.margin*2,h=l.color.light.a?"<path "+t(l.color.light,"fill")+' d="M0 0h'+p+"v"+p+'H0z"/>':"",g="<path "+t(l.color.dark,"stroke")+' d="'+r(u,f,l.margin)+'"/>',w='viewBox="0 0 '+p+" "+p+'"',b='<svg xmlns="http://www.w3.org/2000/svg" '+(l.width?'width="'+l.width+'" height="'+l.width+'" ':"")+w+' shape-rendering="crispEdges">'+h+g+`</svg>
|
|
12
|
+
`;return typeof o=="function"&&o(null,b),b},Jr}var As;function Ad(){if(As)return yn;As=1;const e=id(),t=kd(),n=Cd(),r=Sd();function a(s,i,o,l,f){const u=[].slice.call(arguments,1),p=u.length,h=typeof u[p-1]=="function";if(!h&&!e())throw new Error("Callback required as last argument");if(h){if(p<2)throw new Error("Too few arguments provided");p===2?(f=o,o=i,i=l=void 0):p===3&&(i.getContext&&typeof f>"u"?(f=l,l=void 0):(f=l,l=o,o=i,i=void 0))}else{if(p<1)throw new Error("Too few arguments provided");return p===1?(o=i,i=l=void 0):p===2&&!i.getContext&&(l=o,o=i,i=void 0),new Promise(function(g,w){try{const S=t.create(o,l);g(s(S,i,l))}catch(S){w(S)}})}try{const g=t.create(o,l);f(null,s(g,i,l))}catch(g){f(g)}}return yn.create=t.create,yn.toCanvas=a.bind(null,n.render),yn.toDataURL=a.bind(null,n.renderToDataURL),yn.toString=a.bind(null,function(s,i,o){return r.render(s,o)}),yn}var Td=Ad();const Nd=sd(Td);var Rd=C('<p class="muted"> </p>'),xd=C('<div class="qr svelte-1uqetyj"></div>'),Id=C('<div class="qr placeholder svelte-1uqetyj"></div>');function Pd(e,t){Ge(t,!0);const n=Yt(t,"size",3,192);let r=Y(""),a=Y(null);At(()=>{const u=t.value;if(!u){R(r,""),R(a,null);return}Nd.toString(u,{type:"svg",errorCorrectionLevel:"M",margin:1,width:n(),color:{dark:"#1d1f24",light:"#ffffff"}}).then(p=>{R(r,p,!0),R(a,null)}).catch(p=>{console.error("QR generation failed",p),R(a,p.message,!0)})});var s=Xt(),i=he(s);{var o=u=>{var p=Rd(),h=d(p);j(()=>E(h,`QR unavailable: ${c(a)??""}`)),y(u,p)},l=u=>{var p=xd();wl(p,()=>c(r),!0),j(()=>na(p,`width: ${n()??""}px; height: ${n()??""}px;`)),y(u,p)},f=u=>{var p=Id();j(()=>na(p,`width: ${n()??""}px; height: ${n()??""}px;`)),y(u,p)};z(i,u=>{c(a)?u(o):c(r)?u(l,1):u(f,-1)})}y(e,s),We()}var Md=C('<div class="qr-wrap svelte-sddtr9"><!></div> <div class="token svelte-sddtr9"><textarea readonly="" rows="3" class="svelte-sddtr9"></textarea> <button class="ghost svelte-sddtr9" type="button"><!> Copy</button></div>',1);function Bd(e,t){Ge(t,!0);var n=Md(),r=he(n),a=d(r);Pd(a,{get value(){return t.value},size:224});var s=v(r,2),i=d(s),o=v(i,2),l=d(o);Aa(l,{}),j(()=>{yi(i,t.value),oe(o,"aria-label",t.copyLabel)}),me("click",o,()=>ba(t.value)),y(e,n),We()}Rt(["click"]);var Ld=C('<div class="row"><p class="error small svelte-1jht8du"> </p> <button type="button">Try again</button></div>'),Dd=C('<p class="small warn svelte-1jht8du">Works from your home network now; forward the ports below for a phone elsewhere.</p>'),qd=C('<!> <p class="small svelte-1jht8du">Scan this with the Sereus app on the phone that owns the cadre, or paste the text into it.</p> <!>',1),Ud=C('<p class="muted svelte-1jht8du">Starting the node…</p>'),Fd=C("<!> <!>",1);function Fi(e,t){Ge(t,!0);const n=1e3,r=6e4,a=qt();let s=Y(null),i=Y(null),o=Y(0);const l=$(()=>t.node.id),f=$(()=>t.node.status==="unclaimed"),u=$(()=>a.connectivity?.nodes.find(N=>N.nodeId===t.node.id)??null),p=$(()=>c(u)?.publicAddrs.join(" ")??""),h=$(()=>(c(u)??c(s)?.reachability)?.verdict??null);At(()=>{if(c(o),c(p),!c(f)){R(s,null),R(i,null);return}return g(c(l))});function g(N){let M=!1,I;const T=Date.now()+r;async function L(){try{const A=await Fl(N);if(M)return;R(s,A,!0),R(i,null)}catch(A){if(M)return;if(A instanceof Je&&A.code==="node_unavailable"&&Date.now()<T){I=setTimeout(()=>void L(),n);return}if(A instanceof Je&&A.code==="invalid_state"){Ut();return}console.error(`[cadre-host-ui] claim details for ${N}:`,A),R(i,A instanceof Error?A.message:String(A),!0)}}return L(),()=>{M=!0,I&&clearTimeout(I)}}var w=Fd(),S=he(w);{var b=N=>{var M=Ld(),I=d(M),T=d(I),L=v(I,2);j(()=>E(T,`Could not read this node's code: ${c(i)??""}`)),me("click",L,()=>R(o,c(o)+1)),y(N,M)};z(S,N=>{c(i)&&N(b)})}var m=v(S,2);{var B=N=>{var M=qd(),I=he(M);Bd(I,{get value(){return c(s).payload},copyLabel:"Copy join details"});var T=v(I,4);{var L=A=>{var U=Dd();y(A,U)};z(T,A=>{c(h)==="unreachable"&&A(L)})}y(N,M)},P=N=>{var M=Ud();y(N,M)};z(m,N=>{c(s)?N(B):c(i)||N(P,1)})}y(e,w),We()}Rt(["click"]);var jd=C('<p class="note svelte-80vbit"> </p>'),Od=C('<div class="backdrop svelte-80vbit" role="presentation"></div> <div class="dialog svelte-80vbit" role="dialog" aria-modal="true" aria-labelledby="confirm-title" tabindex="-1"><h3 id="confirm-title"> </h3> <p class="muted"> </p> <!> <!> <div class="actions svelte-80vbit"><button> </button> <button> </button></div></div>',1);function Hd(e,t){Ge(t,!0);const n=Yt(t,"confirmLabel",3,"Confirm"),r=Yt(t,"cancelLabel",3,"Cancel"),a=Yt(t,"danger",3,!1);let s=Y(!1);async function i(){if(!c(s)){R(s,!0);try{await t.onConfirm()}finally{R(s,!1)}}}function o(p){p.key==="Escape"&&t.onCancel()}var l=Xt(),f=he(l);{var u=p=>{var h=Od(),g=he(h),w=v(g,2),S=d(w),b=d(S),m=v(S,2),B=d(m),P=v(m,2);{var N=F=>{var k=jd(),_=d(k);j(()=>E(_,`⚠ ${t.note??""}`)),y(F,k)};z(P,F=>{t.note&&F(N)})}var M=v(P,2);_i(M,()=>t.children??ua);var I=v(M,2),T=d(I),L=d(T),A=v(T,2),U=d(A);j(()=>{E(b,t.title),E(B,t.message),T.disabled=c(s),E(L,r()),dt(A,1,bl(a()?"danger":"primary")),A.disabled=c(s),E(U,c(s)?"Working…":n())}),me("click",g,function(...F){t.onCancel?.apply(this,F)}),me("keydown",w,o),me("click",T,function(...F){t.onCancel?.apply(this,F)}),me("click",A,i),y(p,h)};z(f,p=>{t.open&&p(u)})}y(e,l),We()}Rt(["click","keydown"]);var zd=gi('<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13.5 8a5.5 5.5 0 1 1-1.6-3.9"></path><path d="M14 2v3h-3"></path></svg>');function Vd(e,t){const n=Yt(t,"size",3,16);var r=zd();j(()=>{oe(r,"width",n()),oe(r,"height",n())}),y(e,r)}var Kd=C('<span class="muted small svelte-15ufwrh"> </span>'),Jd=C('<p class="muted"> </p>'),Yd=C('<pre class="logs svelte-15ufwrh"> </pre>'),Gd=C('<div class="card log-card svelte-15ufwrh"><div class="header svelte-15ufwrh"><h3>Recent logs</h3> <div class="row"><!> <button class="ghost svelte-15ufwrh" aria-label="Refresh logs"><!> Refresh</button></div></div> <!></div>');function Wd(e,t){Ge(t,!0);const n=Yt(t,"lines",3,200);let r=Y(nt([])),a=Y(!1),s=Y(null);async function i(){if(t.nodeId){R(a,!0);try{const m=await at(`/api/nodes/${encodeURIComponent(t.nodeId)}/logs?lines=${n()}`);R(r,m.lines,!0),R(s,new Date,!0)}catch(m){Ee("error",`Logs unavailable: ${m.message}`)}finally{R(a,!1)}}}At(()=>{i()});var o=Gd(),l=d(o),f=v(d(l),2),u=d(f);{var p=m=>{var B=Kd(),P=d(B);j(N=>E(P,`as of ${N??""}`),[()=>c(s).toLocaleTimeString()]),y(m,B)};z(u,m=>{c(s)&&m(p)})}var h=v(u,2),g=d(h);Vd(g,{});var w=v(l,2);{var S=m=>{var B=Jd(),P=d(B);j(()=>E(P,c(a)?"Loading…":"No log lines yet.")),y(m,B)},b=m=>{var B=Yd(),P=d(B);j(N=>E(P,N),[()=>c(r).join(`
|
|
13
|
+
`)]),y(m,B)};z(w,m=>{c(r).length===0?m(S):m(b,-1)})}j(()=>h.disabled=c(a)),me("click",h,i),y(e,o),We()}Rt(["click"]);var $d=C('<div class="card"><p class="muted"> </p></div>'),Qd=C('<div class="card"><p class="muted"> </p></div>'),Xd=C("<span> </span>"),Zd=C('<span class="badge">no process</span>'),eu=C('<dl class="kv svelte-1eq4g96"><div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Workdir</dt><dd class="svelte-1eq4g96"><code> </code></dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Spawned</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Ports</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">CPU</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Memory (RSS)</dt><dd class="svelte-1eq4g96"> </dd></div></dl>'),tu=C('<p class="muted">No process is running for this node on this machine.</p>'),nu=C("<span> </span>"),ru=C('<p class="muted">No hosted-node record names this node, so its cadre is unknown. Remove stops it and deletes its data on this machine.</p> <div class="actions svelte-1eq4g96"><button class="danger"> </button></div>',1),au=C('<p class="muted">Loading…</p>'),su=C('<!> <div class="actions svelte-1eq4g96"><button> </button></div>',1),iu=C('<p class="small svelte-1eq4g96"> </p>'),ou=C('<button class="primary"> </button>'),lu=C("<button> </button>"),cu=C("<button> </button>"),du=C('<!> <div class="actions svelte-1eq4g96"><!> <button class="danger"> </button></div>',1),uu=C('<p> </p> <dl class="kv svelte-1eq4g96"><div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Cadre ID</dt><dd class="svelte-1eq4g96"><code> </code></dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Owner</dt><dd class="svelte-1eq4g96"><code> </code></dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Connected</dt><dd class="svelte-1eq4g96"> </dd></div></dl> <!>',1),fu=C('<p class="muted">Loading…</p>'),vu=C('<p class="muted">The port mapping table has no entry for this node yet.</p>'),hu=C('<div class="card stack"><h3>Reachable from outside</h3> <!></div> <!>',1),pu=C('<div class="card"><div class="page-header svelte-1eq4g96"><div><h2 class="svelte-1eq4g96"><code class="svelte-1eq4g96"> </code></h2> <p class="muted"> </p></div> <!></div> <!></div> <div class="card stack"><div class="card-head svelte-1eq4g96"><h3 class="svelte-1eq4g96">Cadre</h3> <!></div> <!></div> <!>',1),gu=C('<section class="stack"><header class="row"><a class="back svelte-1eq4g96">← Back to nodes</a></header> <!></section> <!>',1);function _u(e,t){Ge(t,!0);const n={remove:{title:"Remove hosted node",label:"Remove",message:_=>`Remove ${_}? This stops the node and deletes its data on this machine. The cadre keeps the node's row until its owner removes it there.`},reset:{title:"Reset hosted node",label:"Reset",message:_=>`Reset ${_}? Use this if someone you did not intend claimed the node. The node is stopped, its data on this machine deleted, and a fresh node with a new code starts.`},retry:{title:"Retry hosted node",label:"Retry",message:_=>`Retry ${_}? The failed node is removed and its data on this machine deleted, and a fresh node with a new code starts for the phone that owns the cadre to scan.`}},r=qt();let a=Y(null),s=Y(null),i=Y(!1),o,l=!1;const f=$(()=>r.nodes.find(_=>_.id===t.id)??null),u=$(()=>r.hostedNodes.list.find(_=>_.id===t.id)??null),p=$(()=>r.nodeStats[t.id]??null),h=$(()=>r.connectivity?.nodes.find(_=>_.nodeId===t.id)??null),g=$(()=>!c(f)&&!c(u)&&c(i)&&r.hostedNodes.loaded);Zt(()=>{Ut(),Ja(t.id).then(()=>R(i,!0)),o=setInterval(()=>void Ja(t.id),5e3)}),Il(()=>{l=!0,o&&clearInterval(o)});async function w(_){R(s,_,!0);try{await Ai(t.id)}catch(q){rt(_==="cancel"?"Cancel":"Remove",q),R(s,null);return}Ee("success",`Removed hosted node ${t.id}`),l||Ga(Ze("nodes"))}async function S(_){R(s,_,!0);try{const q=await Ul(t.id);Ee("success",`Started ${q.id} in place of ${t.id}; show its code only to the person it is for`),l||Ga(Ze("node-detail",{id:q.id}))}catch(q){rt(_==="retry"?"Retry":"Reset",q),R(s,null)}}async function b(){R(s,"rejoin");try{await Si(t.id)}catch(_){rt("Retry",_)}finally{R(s,null)}}async function m(_){R(a,null),_==="remove"?await w("remove"):await S(_)}function B(_,q,re){return c(s)===_?re:q}var P=gu(),N=he(P),M=d(N),I=d(M),T=v(M,2);{var L=_=>{var q=$d(),re=d(q),ce=d(re);j(()=>E(ce,`There is no node ${t.id??""} on this machine. It may have been removed.`)),y(_,q)},A=_=>{var q=Qd(),re=d(q),ce=d(re);j(()=>E(ce,`Loading node ${t.id??""}…`)),y(_,q)},U=_=>{var q=pu(),re=he(q),ce=d(re),pe=d(ce),ye=d(pe),Ue=d(ye),Te=d(Ue),ke=v(ye,2),Ce=d(ke),Ne=v(pe,2);{var je=V=>{var te=Xd(),ne=d(te);j(()=>{dt(te,1,`badge ${c(f).status==="running"?"ok":"err"}`,"svelte-1eq4g96"),E(ne,c(f).status)}),y(V,te)},Pe=V=>{var te=Zd();y(V,te)};z(Ne,V=>{c(f)?V(je):V(Pe,-1)})}var G=v(ce,2);{var x=V=>{var te=eu(),ne=d(te),ve=v(d(ne)),ue=d(ve),Z=d(ue),le=v(ne,2),xe=v(d(le)),we=d(xe),Me=v(le,2),$e=v(d(Me)),Ft=d($e),xt=v(Me,2),D=v(d(xt)),Q=d(D),ge=v(xt,2),be=v(d(ge)),Be=d(be);j((_t,ft,mt)=>{E(Z,c(f).workdir||"—"),E(we,_t),E(Ft,`health ${c(f).ports.health??""} · metrics ${c(f).ports.metrics??""} · p2p ${c(f).ports.p2p??""} · ws ${c(f).ports.ws??""}`),E(Q,ft),E(Be,mt)},[()=>Gt(c(f).spawnedAt),()=>c(p)?c(p).cpuPercent.toFixed(1)+"%":"—",()=>Ql(c(p)?.memoryBytes)]),y(V,te)},O=V=>{var te=tu();y(V,te)};z(G,V=>{c(f)?V(x):V(O,-1)})}var J=v(re,2),de=d(J),H=v(d(de),2);{var K=V=>{var te=nu(),ne=d(te);j(()=>{dt(te,1,`badge ${Rn[c(u).status].tone??""}`,"svelte-1eq4g96"),E(ne,Rn[c(u).status].text)}),y(V,te)};z(H,V=>{c(u)&&V(K)})}var W=v(de,2);{var X=V=>{var te=Xt(),ne=he(te);{var ve=Z=>{var le=ru(),xe=v(he(le),2),we=d(xe),Me=d(we);j($e=>{we.disabled=c(s)!==null,E(Me,$e)},[()=>B("remove","Remove","Removing…")]),me("click",we,()=>R(a,"remove")),y(Z,le)},ue=Z=>{var le=au();y(Z,le)};z(ne,Z=>{r.hostedNodes.loaded?Z(ve):Z(ue,-1)})}y(V,te)},fe=V=>{var te=uu(),ne=he(te);let ve;var ue=d(ne),Z=v(ne,2),le=d(Z),xe=v(d(le)),we=d(xe),Me=d(we),$e=v(le,2),Ft=v(d($e)),xt=d(Ft),D=d(xt),Q=v($e,2),ge=v(d(Q)),be=d(ge),Be=v(Z,2);{var _t=Ve=>{var Ke=su(),Oe=he(Ke);{var He=vt=>{Fi(vt,{get node(){return c(u)}})},It=$(()=>ka(c(u)));z(Oe,vt=>{c(It)&&vt(He)})}var jt=v(Oe,2),wt=d(jt),Pt=d(wt);j(vt=>{wt.disabled=c(s)!==null,E(Pt,vt)},[()=>B("cancel","Cancel","Cancelling…")]),me("click",wt,()=>w("cancel")),y(Ve,Ke)},ft=$(()=>Yn(c(u))),mt=Ve=>{var Ke=du(),Oe=he(Ke);{var He=_e=>{var Le=iu(),Mt=d(Le);j(()=>E(Mt,Ri)),y(_e,Le)},It=$(()=>ia(c(u)));z(Oe,_e=>{c(It)&&_e(He)})}var jt=v(Oe,2),wt=d(jt);{var Pt=_e=>{var Le=ou(),Mt=d(Le);j(en=>{Le.disabled=c(s)!==null,E(Mt,en)},[()=>B("rejoin","Retry","Retrying…")]),me("click",Le,b),y(_e,Le)},vt=$(()=>ia(c(u))),_r=_e=>{},mr=_e=>{var Le=lu(),Mt=d(Le);j(en=>{Le.disabled=c(s)!==null,E(Mt,en)},[()=>B("retry","Retry","Retrying…")]),me("click",Le,()=>R(a,"retry")),y(_e,Le)},Pn=_e=>{var Le=cu(),Mt=d(Le);j(en=>{Le.disabled=c(s)!==null,E(Mt,en)},[()=>B("reset","Reset","Resetting…")]),me("click",Le,()=>R(a,"reset")),y(_e,Le)};z(wt,_e=>{c(vt)?_e(Pt):c(u).join.kind==="invitation"?_e(_r,1):c(u).status==="error"?_e(mr,2):_e(Pn,-1)})}var Mn=v(wt,2),Qe=d(Mn);j(_e=>{Mn.disabled=c(s)!==null,E(Qe,_e)},[()=>B("remove","Remove","Removing…")]),me("click",Mn,()=>R(a,"remove")),y(Ve,Ke)};z(Be,Ve=>{c(ft)?Ve(_t):Ve(mt,-1)})}j((Ve,Ke,Oe,He)=>{ve=dt(ne,1,"state svelte-1eq4g96",null,ve,{error:c(u).status==="error"}),E(ue,Ve),E(Me,Ke),oe(xt,"title",c(u).ownerKey),E(D,Oe),E(be,He)},[()=>Ii(c(u)),()=>Sa(c(u))??"—",()=>Ca(c(u).ownerKey),()=>xi(c(u))]),y(V,te)};z(W,V=>{c(u)?V(fe,-1):V(X)})}var Se=v(J,2);{var Re=V=>{var te=hu(),ne=he(te),ve=v(d(ne),2);{var ue=we=>{var Me=fu();y(we,Me)},Z=we=>{var Me=vu();y(we,Me)},le=we=>{Ta(we,{get node(){return c(h)},get connectivity(){return r.connectivity}})};z(ve,we=>{r.connectivity?c(h)?we(le,-1):we(Z,1):we(ue)})}var xe=v(ne,2);Wd(xe,{get nodeId(){return c(f).id}}),y(V,te)};z(Se,V=>{c(f)&&V(Re)})}j(()=>{E(Te,t.id),E(Ce,`Hosted node · ${c(f)?.profile??"storage"??""} profile`)}),y(_,q)};z(T,_=>{c(g)?_(L):!c(f)&&!c(u)?_(A,1):_(U,-1)})}var F=v(N,2);{var k=_=>{const q=$(()=>c(a));{let re=$(()=>n[c(q)].message(t.id));Hd(_,{open:!0,get title(){return n[c(q)].title},get message(){return c(re)},get confirmLabel(){return n[c(q)].label},danger:!0,onConfirm:()=>m(c(q)),onCancel:()=>R(a,null)})}};z(F,_=>{c(a)&&_(k)})}j(_=>oe(I,"href",_),[()=>Ze("nodes")]),y(e,P),We()}Rt(["click"]);var mu=C('<p class="error svelte-cshs6v"> </p>'),wu=C('<!> <!> <div class="actions svelte-cshs6v"><button> </button></div>',1),yu=C('<div class="actions svelte-cshs6v"><button> </button></div>'),bu=C('<p class="small svelte-cshs6v"> </p> <div class="actions svelte-cshs6v"><button> </button> <button class="primary"> </button></div>',1),Eu=C("<a>Open this node's page →</a>"),ku=C('<article class="card stack"><div class="node-head svelte-cshs6v"><a><code class="svelte-cshs6v"> </code></a> <span> </span></div> <p aria-live="polite"> </p> <!></article>'),Cu=C('<p class="muted">No node is waiting to join a cadre.</p>'),Su=C('<p class="muted">Loading…</p>'),Au=C(`<section class="stack"><header class="page-header svelte-cshs6v"><div class="svelte-cshs6v"><h2>Join a cadre</h2> <p class="muted">Start a node on this machine for someone's cadre. The phone that owns the cadre scans
|
|
14
|
+
the node's code, and the node joins that cadre. Anyone who scans the code claims the
|
|
15
|
+
node, so show it only to the person it is for.</p></div> <button class="primary"> </button></header> <form class="card stack invitation svelte-cshs6v"><label for="invitation"><strong>Or paste a cadre invitation</strong></label> <p class="muted small svelte-cshs6v">The invitation the owner's app copied. The node redeems it at a member of the cadre this
|
|
16
|
+
machine can reach, so it works once the cadre has an always-on node; for the cadre's first
|
|
17
|
+
one, use the button above and scan the code instead.</p> <textarea id="invitation" rows="3" spellcheck="false" autocomplete="off" class="svelte-cshs6v"></textarea> <div class="actions svelte-cshs6v"><button type="submit"> </button></div></form> <!> <!></section>`);function Tu(e,t){Ge(t,!0);const n=qt();let r=Y(!1),a=Y(!1),s=Y(""),i=Y(nt([])),o=Y(nt([])),l=Y(nt([]));const f=$(()=>n.hostedNodes.list.filter(k=>c(l).includes(k.id)).sort((k,_)=>_.createdAt.localeCompare(k.createdAt)));Zt(()=>{Ut()}),At(()=>{const k=n.hostedNodes.list.filter(_=>Yn(_)).map(_=>_.id);gn(()=>u(k))});function u(k){const _=k.filter(q=>!c(l).includes(q));_.length>0&&R(l,[...c(l),..._],!0)}async function p(){R(r,!0);try{const k=await Ya();u([k.id])}catch(k){rt("Join",k)}finally{R(r,!1)}}async function h(){R(a,!0);try{const k=await Ya(c(s).trim());R(s,""),u([k.id])}catch(k){rt("Join by invitation",k)}finally{R(a,!1)}}async function g(k){R(i,[...c(i),k.id],!0);try{await Ai(k.id)}catch(_){rt("Cancel",_)}finally{R(i,c(i).filter(_=>_!==k.id),!0)}}async function w(k){R(o,[...c(o),k.id],!0);try{await Si(k.id)}catch(_){rt("Retry",_)}finally{R(o,c(o).filter(_=>_!==k.id),!0)}}function S(k){return n.connectivity?.nodes.find(_=>_.nodeId===k)??null}var b=Au(),m=d(b),B=v(d(m),2),P=d(B),N=v(m,2),M=v(d(N),4),I=v(M,2),T=d(I),L=d(T),A=v(N,2);{var U=k=>{var _=mu(),q=d(_);j(()=>E(q,`Couldn’t load hosted nodes: ${n.hostedNodes.error??""}`)),y(k,_)};z(A,k=>{n.hostedNodes.error&&k(U)})}var F=v(A,2);Jt(F,17,()=>c(f),k=>k.id,(k,_)=>{const q=$(()=>S(c(_).id));var re=ku(),ce=d(re),pe=d(ce),ye=d(pe),Ue=d(ye),Te=v(pe,2),ke=d(Te),Ce=v(ce,2);let Ne;var je=d(Ce),Pe=v(Ce,2);{var G=W=>{var X=wu(),fe=he(X);Fi(fe,{get node(){return c(_)}});var Se=v(fe,2);{var Re=ve=>{Ta(ve,{get node(){return c(q)},get connectivity(){return n.connectivity}})};z(Se,ve=>{c(q)&&n.connectivity&&ve(Re)})}var V=v(Se,2),te=d(V),ne=d(te);j((ve,ue)=>{te.disabled=ve,E(ne,ue)},[()=>c(i).includes(c(_).id),()=>c(i).includes(c(_).id)?"Cancelling…":"Cancel"]),me("click",te,()=>g(c(_))),y(W,X)},x=$(()=>ka(c(_))),O=W=>{var X=yu(),fe=d(X),Se=d(fe);j((Re,V)=>{fe.disabled=Re,E(Se,V)},[()=>c(i).includes(c(_).id),()=>c(i).includes(c(_).id)?"Cancelling…":"Cancel"]),me("click",fe,()=>g(c(_))),y(W,X)},J=$(()=>Yn(c(_))),de=W=>{var X=bu(),fe=he(X),Se=d(fe),Re=v(fe,2),V=d(Re),te=d(V),ne=v(V,2),ve=d(ne);j((ue,Z,le,xe)=>{E(Se,Ri),V.disabled=ue,E(te,Z),ne.disabled=le,E(ve,xe)},[()=>c(i).includes(c(_).id),()=>c(i).includes(c(_).id)?"Removing…":"Remove",()=>c(o).includes(c(_).id),()=>c(o).includes(c(_).id)?"Retrying…":"Retry"]),me("click",V,()=>g(c(_))),me("click",ne,()=>w(c(_))),y(W,X)},H=$(()=>ia(c(_))),K=W=>{var X=Eu();j(fe=>oe(X,"href",fe),[()=>Ze("node-detail",{id:c(_).id})]),y(W,X)};z(Pe,W=>{c(x)?W(G):c(J)?W(O,1):c(H)?W(de,2):W(K,-1)})}j((W,X)=>{oe(pe,"href",W),E(Ue,c(_).id),dt(Te,1,`badge ${Rn[c(_).status].tone??""}`,"svelte-cshs6v"),E(ke,Rn[c(_).status].text),Ne=dt(Ce,1,"state svelte-cshs6v",null,Ne,{error:c(_).status==="error"}),E(je,X)},[()=>Ze("node-detail",{id:c(_).id}),()=>Ii(c(_))]),y(k,re)},k=>{var _=Xt(),q=he(_);{var re=pe=>{var ye=Cu();y(pe,ye)},ce=pe=>{var ye=Su();y(pe,ye)};z(q,pe=>{n.hostedNodes.loaded?pe(re):n.hostedNodes.error||pe(ce,1)})}y(k,_)}),j(k=>{B.disabled=c(r),E(P,c(r)?"Starting a node…":"Join a cadre"),T.disabled=k,E(L,c(a)?"Joining…":"Join")},[()=>c(a)||c(s).trim()===""]),me("click",B,p),Nn("submit",N,k=>{k.preventDefault(),h()}),cn(M,()=>c(s),k=>R(s,k)),y(e,b),We()}Rt(["click"]);var Nu=C('<a target="_blank" rel="noreferrer">Release notes</a>'),Ru=C('<div class="banner info svelte-1cl3wo6"><div><strong>Update available</strong> <span class="muted"> </span> <!></div> <button type="button" class="primary"> </button></div>'),xu=C('<p class="muted small svelte-1cl3wo6"> </p>'),Iu=C('<p class="error small svelte-1cl3wo6"> </p>'),Pu=C('<dl class="kv svelte-1cl3wo6"><div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Install ID</dt><dd class="svelte-1cl3wo6"><code> </code></dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Installed at</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Installer version</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">UI port</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Data dir</dt> <dd class="copy-row svelte-1cl3wo6"><code> </code> <button type="button" class="ghost" aria-label="Copy data dir"><!></button></dd></div></dl> <p class="muted small svelte-1cl3wo6">UI port and data dir are set at install time and can only be changed by editing <code>host.config.json</code> and restarting the service.</p>',1),Mu=C('<p class="muted">Loading…</p>'),Bu=C(`<section class="stack"><header><h2>Settings</h2> <p class="muted">Update preferences, claim code addresses and install metadata.</p></header> <form class="card stack"><h3>Updates</h3> <label class="row inline svelte-1cl3wo6"><input type="checkbox" class="svelte-1cl3wo6"/> <span>Apply updates automatically when available</span></label> <div><label for="manifest-url">Manifest URL (optional override)</label> <input id="manifest-url" type="url" placeholder="https://example.org/latest.json" autocomplete="off"/></div> <!> <!> <div class="actions svelte-1cl3wo6"><button type="submit" class="primary"> </button></div></form> <form class="card stack"><h3>Claim code addresses</h3> <p class="muted small svelte-1cl3wo6">The addresses a node's QR code carries. A phone tries each in turn, so only ones it can reach belong
|
|
18
|
+
there: public addresses (your DDNS name, when set) and one LAN address for phones at home. Docker
|
|
19
|
+
bridges, VPNs and TCP are always left out.</p> <fieldset class="stack svelte-1cl3wo6"><legend class="svelte-1cl3wo6">LAN address</legend> <label class="row inline svelte-1cl3wo6"><input type="radio" class="svelte-1cl3wo6"/> <span>Automatic (this machine's address on the router's network)</span></label> <label class="row inline svelte-1cl3wo6"><input type="radio" class="svelte-1cl3wo6"/> <span>None (phones reach nodes by the public address only)</span></label> <label class="row inline svelte-1cl3wo6"><input type="radio" class="svelte-1cl3wo6"/> <span>This address:</span> <input type="text" placeholder="192.168.1.20" autocomplete="off"/></label></fieldset> <div><label for="exact-addrs">Exact addresses (optional, one multiaddr per line, without /p2p/; replaces the automatic choice for every node)</label> <textarea id="exact-addrs" rows="3" placeholder="/dns4/node.example.org/tcp/443/wss"></textarea></div> <div class="actions svelte-1cl3wo6"><button type="submit" class="primary"> </button></div></form> <div class="card"><h3>Install</h3> <!></div> <div class="card"><h3>Uninstall</h3> <p class="muted">Stop the cadre-host service, then remove the data directory above and the
|
|
20
|
+
installed package:</p> <pre>npm uninstall -g @serfab/cadre-host</pre> <p class="muted small svelte-1cl3wo6">See the README under <a href="https://github.com/gotchoices/sereus/blob/master/packages/cadre-host/README.md" target="_blank" rel="noreferrer">Uninstall</a> for OS-specific service teardown.</p></div></section>`);function Lu(e,t){Ge(t,!0);const n=[],r=qt();let a=Y(!1),s=Y(""),i=Y(!1),o=Y("auto"),l=Y(""),f=Y(""),u=Y(!1),p=Y(!1);Zt(()=>{sr(),cr()}),At(()=>{const H=r.settings;if(!H)return;R(a,H.updates.autoApply,!0),R(s,H.updates.manifestUrl??"",!0);const K=H.claimAddresses?.lan??"auto";R(o,K==="auto"||K==="none"?K:"ip",!0),R(l,c(o)==="ip"?K:"",!0),R(f,(H.claimAddresses?.addrs??[]).join(`
|
|
21
|
+
`),!0)});async function h(H){H.preventDefault(),R(u,!0);try{const K=c(f).split(`
|
|
22
|
+
`).map(W=>W.trim()).filter(W=>W.length>0);await Jn("/api/settings",{claimAddresses:{lan:c(o)==="ip"?c(l).trim():c(o),addrs:K}}),Ee("success","Claim code addresses saved; the next code shown uses them"),await sr()}catch(K){const W=K instanceof Je?K.code:"error";Ee("error",`Save failed: ${K.message} (${W})`)}finally{R(u,!1)}}async function g(H){H.preventDefault(),R(i,!0);try{const K={updates:{autoApply:c(a)}};c(s).trim()&&(K.updates.manifestUrl=c(s).trim()),await Jn("/api/settings",K),Ee("success","Update preferences saved"),await sr()}catch(K){const W=K instanceof Je?K.code:"error";Ee("error",`Save failed: ${K.message} (${W})`)}finally{R(i,!1)}}async function w(){R(p,!0);try{const H=await Zn("/update/apply");Ee("success",`Applied ${H.fromVersion} → ${H.toVersion}`+(H.restarted?" (service restarting)":"")),await cr()}catch(H){const K=H instanceof Je?H.code:"error";Ee("error",`Apply failed: ${H.message} (${K})`)}finally{R(p,!1)}}var S=Bu(),b=v(d(S),2),m=v(d(b),2),B=d(m),P=v(m,2),N=v(d(P),2),M=v(P,2);{var I=H=>{var K=Ru(),W=d(K),X=v(d(W),2),fe=d(X),Se=v(X,2);{var Re=ne=>{var ve=Nu();j(()=>oe(ve,"href",r.update.available.releaseNotesUrl)),y(ne,ve)};z(Se,ne=>{r.update.available.releaseNotesUrl&&ne(Re)})}var V=v(W,2),te=d(V);j(()=>{E(fe,`→ version ${r.update.available.version??""}`),V.disabled=c(p),E(te,c(p)?"Applying…":"Apply now")}),me("click",V,w),y(H,K)},T=H=>{var K=xu(),W=d(K);j(X=>E(W,`No update available. Last checked ${X??""}.`),[()=>Gt(r.update.lastChecked)]),y(H,K)};z(M,H=>{r.update?.available?.version?H(I):r.update?.lastChecked&&H(T,1)})}var L=v(M,2);{var A=H=>{var K=Iu(),W=d(K);j(()=>E(W,`Last error: ${r.update.lastError.message??""} (${r.update.lastError.code??""})`)),y(H,K)};z(L,H=>{r.update?.lastError&&H(A)})}var U=v(L,2),F=d(U),k=d(F),_=v(b,2),q=v(d(_),4),re=v(d(q),2),ce=d(re);ce.value=ce.__value="auto";var pe=v(re,2),ye=d(pe);ye.value=ye.__value="none";var Ue=v(pe,2),Te=d(Ue);Te.value=Te.__value="ip";var ke=v(Te,4),Ce=v(q,2),Ne=v(d(Ce),2),je=v(Ce,2),Pe=d(je),G=d(Pe),x=v(_,2),O=v(d(x),2);{var J=H=>{var K=Pu(),W=he(K),X=d(W),fe=v(d(X)),Se=d(fe),Re=d(Se),V=v(X,2),te=v(d(V)),ne=d(te),ve=v(V,2),ue=v(d(ve)),Z=d(ue),le=v(ve,2),xe=v(d(le)),we=d(xe),Me=v(le,2),$e=v(d(Me),2),Ft=d($e),xt=d(Ft),D=v(Ft,2),Q=d(D);Aa(Q,{}),j(ge=>{E(Re,r.settings.installId),E(ne,ge),E(Z,r.settings.installerVersion??"—"),E(we,r.settings.uiPort),E(xt,r.settings.dataDir)},[()=>Gt(r.settings.installedAt)]),me("click",D,()=>ba(r.settings.dataDir)),y(H,K)},de=H=>{var K=Mu();y(H,K)};z(O,H=>{r.settings?H(J):H(de,-1)})}j(H=>{F.disabled=c(i),E(k,c(i)?"Saving…":"Save update preferences"),ke.disabled=c(o)!=="ip",Pe.disabled=H,E(G,c(u)?"Saving…":"Save addresses")},[()=>c(u)||c(o)==="ip"&&!c(l).trim()]),Nn("submit",b,g),ra(B,()=>c(a),H=>R(a,H)),cn(N,()=>c(s),H=>R(s,H)),Nn("submit",_,h),En(n,[],ce,()=>c(o),H=>R(o,H)),En(n,[],ye,()=>c(o),H=>R(o,H)),En(n,[],Te,()=>c(o),H=>R(o,H)),cn(ke,()=>c(l),H=>R(l,H)),cn(Ne,()=>c(f),H=>R(f,H)),y(e,S),We()}Rt(["click"]);var Du=C('<div role="status"><span class="text svelte-g7yjw8"> </span> <button class="ghost svelte-g7yjw8" aria-label="Dismiss">×</button></div>'),qu=C('<div class="toast-stack svelte-g7yjw8" aria-live="polite" aria-relevant="additions"></div>');function Uu(e,t){Ge(t,!1);const n=qt();Ei();var r=Xt(),a=he(r);{var s=i=>{var o=qu();Jt(o,5,()=>n.toasts,l=>l.id,(l,f)=>{var u=Du(),p=d(u),h=d(p),g=v(p,2);j(()=>{dt(u,1,`toast toast-${c(f).kind??""}`,"svelte-g7yjw8"),E(h,c(f).text)}),me("click",g,()=>ki(c(f).id)),y(l,u)}),y(i,o)};z(a,i=>{n.toasts.length>0&&i(s)})}y(e,r),We()}Rt(["click"]);var Fu=C("<a> </a>"),ju=C('<a class="visually-hidden" href="#main">Skip to content</a> <header class="topbar svelte-1r8vfx3"><div class="brand svelte-1r8vfx3"><span class="logo svelte-1r8vfx3" aria-hidden="true">●</span> <span>cadre-host</span> <!></div> <nav aria-label="Primary" class="svelte-1r8vfx3"></nav></header> <main id="main" class="svelte-1r8vfx3"><!></main> <!>',1);function Ou(e,t){Ge(t,!1);const n=Hl(),r=qt();function a(M){switch(M){case"ok":return"OK";case"warn":return"Attention";case"error":return"Error";default:return"…"}}const s=[{name:"home",label:"Home"},{name:"connectivity",label:"Connectivity"},{name:"nodes",label:"Nodes"},{name:"join",label:"Join"},{name:"settings",label:"Settings"}];function i(M){return M==="nodes"?n.route.name==="nodes"||n.route.name==="node-detail":n.route.name===M}Zt(()=>{zl(),Ci(),Ea(),Ut(),Vt(),cr(),sr();let M=!0;const I=Yl(T=>Ol(T),{onError(T,L){M&&(M=!1,Ee("error",`Lost realtime updates; retrying in ${Math.round(L/1e3)}s`))},onOpen(){M=!0}});return()=>{I.close(),Vl()}}),Ei();var o=ju(),l=v(he(o),2),f=d(l),u=v(d(f),4);{let M=lr(()=>a(r.status));Mi(u,{get status(){return r.status},get label(){return c(M)},size:10})}var p=v(f,2);Jt(p,5,()=>s,M=>M.name,(M,I)=>{var T=Fu();let L;var A=d(T);j((U,F,k)=>{oe(T,"href",U),oe(T,"aria-current",F),L=dt(T,1,"svelte-1r8vfx3",null,L,k),E(A,c(I).label)},[()=>Ze(c(I).name),()=>i(c(I).name)?"page":void 0,()=>({active:i(c(I).name)})]),y(M,T)});var h=v(l,2),g=d(h);{var w=M=>{Yc(M,{})},S=M=>{ad(M,{})},b=M=>{var I=Xt(),T=he(I);pl(T,()=>n.route.params.id,L=>{{let A=lr(()=>n.route.params.id??"");_u(L,{get id(){return c(A)}})}}),y(M,I)},m=M=>{Tu(M,{})},B=M=>{Lu(M,{})},P=M=>{fc(M,{})};z(g,M=>{n.route.name==="connectivity"?M(w):n.route.name==="nodes"?M(S,1):n.route.name==="node-detail"?M(b,2):n.route.name==="join"?M(m,3):n.route.name==="settings"?M(B,4):M(P,-1)})}var N=v(h,2);Uu(N,{}),y(e,o),We()}const ji=document.getElementById("app");if(!ji)throw new Error("Missing #app mount target");ul(Ou,{target:ji});
|
|
23
|
+
//# sourceMappingURL=index-Ccr2GjPT.js.map
|