friend-assistant 0.1.43 → 0.1.44
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 +1 -1
- package/dist/BUILD.json +2 -2
- package/dist/friend.mjs +129 -20
- package/dist/web/assets/{index-CXlA46SS.js → index-D6qxQkPK.js} +4 -4
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
|
@@ -62,7 +62,7 @@ some-mcp-server`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(
|
|
|
62
62
|
|
|
63
63
|
`)}return o.write(`payload.value = newResult;`),o.write(`return payload;`),o.compile()},o,s=Lt,c=!Pn.jitless,l=c&&Rt.value,u=t.catchall,d;e._zod.parse=(i,f)=>{d??=r.value;let p=i.value;return s(p)?c&&l&&f?.async===!1&&f.jitless!==!0?(o||=a(t.shape),i=o(i,f),u?ua([],p,i,f,d,e,f?.abortEarly===!0):i):n(i,f):(i.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),i)}});function pa(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!rn(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>ln(e,r,Fn())))}),t)}var ma=G(`$ZodUnion`,(e,t)=>{ui.init(e,t),wn(e,`optin`,e=>e.def.options.some(e=>e._zod.optin===`defaulted`)?`defaulted`:e.def.options.some(e=>e._zod.optin!==void 0)?`optional`:void 0),wn(e,`optout`,e=>e.def.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),wn(e,`values`,e=>{if(e.def.options.every(e=>e._zod.values))return new Set(e.def.options.flatMap(e=>Array.from(e._zod.values)))}),wn(e,`pattern`,e=>{if(e.def.options.every(e=>e._zod.pattern)){let t=e.def.options.map(e=>e._zod.pattern);return RegExp(`^(${t.map(e=>wt(e.source)).join(`|`)})$`)}});let n=t.options.length===1?t.options[0]._zod.run:null;e._zod.parse=(r,i)=>{if(n)return n(r,i);let a=!1,o=[];for(let e of t.options){let t=e._zod.run({value:r.value,issues:[]},i);if(t instanceof Promise)o.push(t),a=!0;else{if(t.issues.length===0)return t;o.push(t)}}return a?Promise.all(o).then(t=>pa(t,r,e,i)):pa(o,r,e,i)}});function ha(e){let t=new Map;for(let n of e.options){let r=n._zod.propValues?.[e.discriminator];if(!r||r.size===0)throw Error(`Invalid discriminated union option at index "${e.options.indexOf(n)}"`);for(let e of r)if(t.has(e)){if(e!==void 0)throw Error(`Duplicate discriminator value "${String(e)}"`);t.set(e,null)}else t.set(e,n)}return t}var ga=G(`$ZodDiscriminatedUnion`,(e,t)=>{t.inclusive=!1,ma.init(e,t);let n=e._zod.parse;wn(e,`propValues`,e=>{let t={},n=0;for(let r of e.def.options){let i=r._zod.propValues;if(!i||Object.keys(i).length===0)throw Error(`Invalid discriminated union option at index "${e.def.options.indexOf(r)}"`);i[e.def.discriminator]?.has(void 0)&&n++;for(let[e,n]of Object.entries(i)){Object.prototype.hasOwnProperty.call(t,e)||Et(t,e,new Set);for(let r of n)t[e].add(r)}}return!e.def.unionFallback&&n>1&&t[e.def.discriminator]?.delete(void 0),t}),t.options.forEach((e,n)=>{let r=Dt(e._zod.def);if(r&&!Object.prototype.hasOwnProperty.call(r,t.discriminator))throw Error(`Invalid discriminated union option at index "${n}"`)});let r=St(()=>ha(t));e._zod.parse=(i,a)=>{let o=i.value;if(!Lt(o))return i.issues.push({code:`invalid_type`,expected:`object`,input:o,inst:e}),i;let s=o?.[t.discriminator],c=r.value.get(s);return c&&(s!==void 0||a.direction!==`backward`)?c._zod.run(i,a):t.unionFallback||a.direction===`backward`?n(i,a):(i.issues.push({code:`invalid_union`,errors:[],note:`No matching discriminator`,discriminator:t.discriminator,options:Array.from(r.value.keys()).filter(e=>r.value.get(e)!==null),input:o,path:[t.discriminator],inst:e}),i)}}),_a=G(`$ZodIntersection`,(e,t)=>{ui.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>ya(e,t,n)):ya(e,i,a)}});function va(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(zt(e)&&zt(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};Object.prototype.hasOwnProperty.call(i,`__proto__`)&&delete i.__proto__;for(let n of r){if(n===`__proto__`)continue;let r=va(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=va(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function ya(e,t,n){let r=new Map,i,a=new Map,o=(e,t)=>{let n;if(e.code===`unrecognized_keys`&&!e.path?.length)i??=e,n=e.keys;else if(e.code===`invalid_key`&&e.origin===`record`&&e.path?.length===1){let t=String(e.path[0]);a.has(t)||a.set(t,e),n=[t]}else return!1;for(let e of n)r.has(e)||r.set(e,{}),r.get(e)[t]=!0;return!0};for(let n of t.issues)o(n,`l`)||e.issues.push(n);for(let t of n.issues)o(t,`r`)||e.issues.push(t);let s=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(s.length){let t=i?s.filter(e=>i.keys.includes(e)):[];t.length&&e.issues.push({...i,keys:t});for(let n of s)!t.includes(n)&&a.has(n)&&e.issues.push(a.get(n))}let c=va(t.value,n.value);if(!c.valid){if(rn(e))return e;throw Error(`Unmergable intersection. Error path: ${JSON.stringify(c.mergeErrorPath)}`)}return e.value=c.data,e}var ba=G(`$ZodRecord`,(e,t)=>{ui.init(e,t);let n=Pn.memoizer;n?.attach(e),e._zod.parse=(r,i)=>{let a=r.value;if(!zt(a))return r.issues.push({expected:`record`,code:`invalid_type`,input:a,inst:e}),r;let o=[],s=t.keyType._zod.values;if(s&&!t.partial){r.value=n?n.alloc(e,r,{},i):{};let c=new Set;for(let n of s)if(typeof n==`string`||typeof n==`number`||typeof n==`symbol`){if(c.add(typeof n==`number`?n.toString():n),n===`__proto__`)continue;let s=t.keyType._zod.run({value:n,issues:[]},i);if(s instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);if(s.issues.length){r.issues.push({code:`invalid_key`,origin:`record`,issues:s.issues.map(e=>ln(e,i,Fn())),input:n,path:[n],inst:e});continue}let l=s.value;if(l===`__proto__`)continue;let u=t.valueType._zod.run({value:a[n],issues:[]},i);u instanceof Promise?o.push(u.then(e=>{e.issues.length&&r.issues.push(...on(n,e.issues)),r.value[l]=e.value})):(u.issues.length&&r.issues.push(...on(n,u.issues)),r.value[l]=u.value)}let l;for(let e in a)if(!c.has(e)){if(t.mode===`loose`){if(e===`__proto__`)continue;r.value[e]=a[e]}else l??=[],l.push(e)}l&&l.length>0&&r.issues.push({code:`unrecognized_keys`,input:a,inst:e,keys:l,continue:!0})}else{r.value=n?n.alloc(e,r,{},i):{};let c;for(let n of Reflect.ownKeys(a)){if(n===`__proto__`||!Object.prototype.propertyIsEnumerable.call(a,n))continue;let l=t.keyType._zod.run({value:n,issues:[]},i);if(l instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);if(typeof n==`string`&&Br.test(n)&&l.issues.length){let e=t.keyType._zod.run({value:Number(n),issues:[]},i);if(e instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);e.issues.length===0&&(l=e)}if(l.issues.length){t.mode===`loose`?r.value[n]=a[n]:s?(c??=[],c.push(n)):r.issues.push({code:`invalid_key`,origin:`record`,issues:l.issues.map(e=>ln(e,i,Fn())),input:n,path:[n],inst:e});continue}let u=l.value;if(u===`__proto__`)continue;let d=t.valueType._zod.run({value:a[n],issues:[]},i);d instanceof Promise?o.push(d.then(e=>{e.issues.length&&r.issues.push(...on(n,e.issues)),r.value[u]=e.value})):(d.issues.length&&r.issues.push(...on(n,d.issues)),r.value[u]=d.value)}c&&c.length>0&&r.issues.push({code:`unrecognized_keys`,input:a,inst:e,keys:c,continue:!0})}return o.length?Promise.all(o).then(()=>r):r}}),xa=G(`$ZodEnum`,(e,t)=>{ui.init(e,t);let n=vt(t.entries),r=new Set(n);e._zod.values=r,wn(e,`pattern`,e=>{let t=vt(e.def.entries).filter(e=>Vt.has(typeof e));return RegExp(t.length?`^(${t.map(e=>Ht(e.toString())).join(`|`)})$`:`^[^\\s\\S]$`)}),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),Sa=G(`$ZodLiteral`,(e,t)=>{ui.init(e,t);let n=new Set(t.values);e._zod.values=n,wn(e,`pattern`,e=>{let t=e.def.values;return RegExp(t.length?`^(${t.map(e=>typeof e==`string`?Ht(e):e?Ht(e.toString()):String(e)).join(`|`)})$`:`^[^\\s\\S]$`)}),e._zod.parse=(r,i)=>{let a=r.value;return n.has(a)||r.issues.push({code:`invalid_value`,values:t.values,input:a,inst:e}),r}}),Ca=G(`$ZodTransform`,(e,t)=>{ui.init(e,t),e._zod.optin=`optional`,Pn.memoizer?.guard(e),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Nn(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new Mn;return n.value=i,n}});function wa(e,t){return e.value=t.issues.length?void 0:t.value,e}var Ta=G(`$ZodOptional`,(e,t)=>{ui.init(e,t),wn(e,`optin`,e=>e.def.innerType._zod.optin===`defaulted`?`defaulted`:`optional`),e._zod.optout=`optional`,wn(e,`values`,e=>{let t=e.def.innerType._zod.values;return t?new Set([...t,void 0]):void 0}),wn(e,`pattern`,e=>{let t=e.def.innerType._zod.pattern;return t?RegExp(`^(${wt(t.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(e.value===void 0){if(t.innerType._zod.optin!==`defaulted`)return e;let r=t.innerType._zod.run({value:e.value,issues:[]},n);return r instanceof Promise?r.then(t=>wa(e,t)):wa(e,r)}return t.innerType._zod.run(e,n)}}),Ea=G(`$ZodExactOptional`,(e,t)=>{Ta.init(e,t),wn(e,`values`,e=>e.def.innerType._zod.values),wn(e,`pattern`,e=>e.def.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),Da=G(`$ZodNullable`,(e,t)=>{ui.init(e,t),wn(e,`optin`,e=>e.def.innerType._zod.optin),wn(e,`optout`,e=>e.def.innerType._zod.optout),wn(e,`pattern`,e=>{let t=e.def.innerType._zod.pattern;return t?RegExp(`^(${wt(t.source)}|null)$`):void 0}),wn(e,`values`,e=>e.def.innerType._zod.values?new Set([...e.def.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),Oa=G(`$ZodDefault`,(e,t)=>{ui.init(e,t),e._zod.optin=`defaulted`,wn(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>ka(e,t)):ka(r,t)}});function ka(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}var Aa=G(`$ZodPrefault`,(e,t)=>{ui.init(e,t),e._zod.optin=`defaulted`,wn(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),ja=G(`$ZodNonOptional`,(e,t)=>{ui.init(e,t),wn(e,`values`,e=>{let t=e.def.innerType._zod.values;return t?new Set([...t].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>Ma(t,e)):Ma(i,e)}});function Ma(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}function Na(e,t,n,r){return t.issues.length?(e.value=n.catchValue({...t,value:e.value,error:{issues:t.issues.map(e=>ln(e,r,Fn()))},input:e.value}),e):(e.value=t.value,t.memo&&(e.memo=!0),e)}var Pa=G(`$ZodCatch`,(e,t)=>{ui.init(e,t),wn(e,`optin`,e=>e.def.innerType._zod.optin===`defaulted`?`defaulted`:`optional`),wn(e,`optout`,e=>e.def.innerType._zod.optout),wn(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run({value:e.value,issues:[]},n);return r instanceof Promise?r.then(r=>Na(e,r,t,n)):Na(e,r,t,n)}}),Fa=G(`$ZodPipe`,(e,t)=>{ui.init(e,t),wn(e,`values`,e=>e.def.in._zod.values),wn(e,`optin`,e=>e.def.in._zod.optin),wn(e,`optout`,e=>e.def.out._zod.optout),wn(e,`propValues`,e=>e.def.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>Ia(e,t.in,n)):Ia(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Ia(e,t.out,n)):Ia(r,t.out,n)}});function Ia(e,t,n){return e.issues.some(e=>e.code!==`unrecognized_keys`)?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}var La=G(`$ZodReadonly`,(e,t)=>{ui.init(e,t),wn(e,`propValues`,e=>e.def.innerType._zod.propValues),wn(e,`values`,e=>e.def.innerType._zod.values),wn(e,`optin`,e=>e.def.innerType?._zod?.optin),wn(e,`optout`,e=>e.def.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(Ra):Ra(r)}});function Ra(e){return e.memo||(e.value=Object.freeze(e.value)),e}var za=G(`$ZodCustom`,(e,t)=>{Wr.init(e,t),ui.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Ba(t,n,r,e));Ba(i,n,r,e)}});function Ba(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(mn(e))}}var Va=class extends Error{constructor(){super(`Cannot parse a reference cycle that closes through a transform`),this.name=`ZodCyclicError`}},Ha=`~memo`,Ua=[];function Wa(e){return typeof e==`object`&&!!e}function Ga(e){return e.map(e=>e.path?{...e,path:e.path.slice()}:{...e})}var Ka=new WeakMap,qa=0,Ja=1,Ya=2;function Xa(e,t,n){let r=Ka.get(e);if(r!==void 0)return r?Ya:qa;if(t.has(e))return Ya;t.add(e);let i=qa,a=e=>{if(i!==Ya&&e?._zod){let r=Xa(e,t,n);r>i&&(i=r)}},o=(e,r)=>{let i=qa;for(let a of Reflect.ownKeys(e)){let o=Object.getOwnPropertyDescriptor(e,a);if(r&&!o.enumerable)continue;let s=o.get?Ja:o.value?._zod?Xa(o.value,t,n):qa;s>i&&(i=s)}return i},s=e=>{e>i&&(i=e)},c=e._zod.def;switch(c.type){case`object`:{let e=Dt(c);s(e?o(e,!0):Ja),a(c.catchall);break}case`array`:a(c.element);break;case`tuple`:for(let e of c.items)a(e);a(c.rest);break;case`record`:case`map`:a(c.keyType),a(c.valueType);break;case`set`:a(c.valueType);break;case`union`:for(let e of c.options)a(e);break;case`intersection`:a(c.left),a(c.right);break;case`optional`:case`nullable`:case`default`:case`prefault`:case`catch`:case`readonly`:case`nonoptional`:case`promise`:case`success`:a(c.innerType);break;case`pipe`:a(c.in),a(c.out);break;case`function`:a(c.input),a(c.output);break;case`lazy`:{let r=c._cachedInner??(n?e._zod.innerType:void 0);s(r?Xa(r,t,!1):Ja);break}case`template_literal`:case`string`:case`number`:case`int`:case`boolean`:case`bigint`:case`symbol`:case`undefined`:case`null`:case`void`:case`never`:case`any`:case`unknown`:case`date`:case`nan`:case`enum`:case`literal`:case`file`:case`transform`:case`custom`:break;default:for(let e in c){let t=Object.getOwnPropertyDescriptor(c,e);if(!t||t.get)continue;let n=t.value;if(n&&typeof n==`object`){if(n._zod)a(n);else if(Array.isArray(n))for(let e of n)a(e)}}}return t.delete(e),Za(e,i)}function Za(e,t){return t!==Ja&&Ka.set(e,t===Ya),t}function Qa(e,t){let n=e.buckets.get(t);return n||(n=new WeakMap,e.buckets.set(t,n)),n}var $a,eo=[],to={alloc(e,t,n){let r=$a;if(!r)return n;$a=void 0;let i={value:n,issues:null};return r.set(t.value,i),eo.push(i),n},guard(e){var t;(t=e._zod).deferred??(t.deferred=[]),e._zod.deferred.push(()=>{let t=e._zod.parse,n=(e,n)=>{if(n.direction!==`backward`&&ro(n,e.value))throw new Va;return t(e,n)};e._zod.parse=n,e._zod.run===t&&(e._zod.run=n)})},attach(e){var t;let n,r=!1,i,a;(t=e._zod).deferred??(t.deferred=[]),e._zod.deferred.push(()=>{let t=e._zod.parse,o=(s,c)=>{if(n===void 0){let i=Xa(e,new Set,!1);if(i===qa)return e._zod.parse=t,e._zod.run===o&&(e._zod.run=t),t(s,c);i===Ya||r?n=!0:r=!0}let l=s.value;if(!Wa(l))return t(s,c);let u=c[Ha];u||(u={buckets:new WeakMap,backEdges:void 0},c[Ha]=u);let d;i===c?d=a:(d=Qa(u,e),i=c,a=d);let f=d.get(l);if(f)return s.value=f.value,f.issues?f.issues.length&&s.issues.push(...Ga(f.issues)):(s.memo=!0,u.backEdges??(u.backEdges=new WeakSet),u.backEdges.add(f.value)),s;$a=d;let p=eo.length,m=t(s,c);$a=void 0;let h=eo.length>p?eo.pop():void 0;return m instanceof Promise?m.then(e=>(h&&(h.issues=e.issues.length?Ga(e.issues):Ua),e)):(h&&(h.issues=m.issues.length?Ga(m.issues):Ua),m)};e._zod.parse=o,e._zod.run===t&&(e._zod.run=o)})}};function no(){return to}function ro(e,t){let n=e[Ha]?.backEdges;return n!==void 0&&Wa(t)&&n.has(t)}var io=()=>{let e={string:{unit:`characters`,verb:`to have`},file:{unit:`bytes`,verb:`to have`},array:{unit:`items`,verb:`to have`},set:{unit:`items`,verb:`to have`},map:{unit:`entries`,verb:`to have`}};function t(t){return e[t]??null}let n={regex:`input`,email:`email address`,url:`URL`,emoji:`emoji`,uuid:`UUID`,uuidv4:`UUIDv4`,uuidv6:`UUIDv6`,nanoid:`nanoid`,guid:`GUID`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ULID`,xid:`XID`,ksuid:`KSUID`,datetime:`ISO datetime`,date:`ISO date`,time:`ISO time`,duration:`ISO duration`,ipv4:`IPv4 address`,ipv6:`IPv6 address`,mac:`MAC address`,cidrv4:`IPv4 range`,cidrv6:`IPv6 range`,base64:`base64-encoded string`,base64url:`base64url-encoded string`,json_string:`JSON string`,e164:`E.164 number`,currency_code:`currency code`,credit_card:`credit card number`,iban:`IBAN`,jwt:`JWT`,template_literal:`input`},r={nan:`NaN`};function i(e,t){return e===`number`&&typeof t==`number`&&!Number.isFinite(t)?String(t):r[e]??e}return e=>{switch(e.code){case`invalid_type`:return`Invalid input: expected ${i(e.expected)}, received ${i(pn(e.input),e.input)}`;case`invalid_value`:return e.values.length===1?`Invalid input: expected ${Wt(e.values[0])}`:`Invalid option: expected one of ${yt(e.values,`|`)}`;case`too_big`:{let n=e.exact?`exactly `:e.inclusive?`<=`:`<`,r=t(e.origin);return r?`Too big: expected ${e.origin??`value`} to have ${n}${e.maximum.toString()} ${r.unit??`elements`}`:`Too big: expected ${e.origin??`value`} to be ${n}${e.maximum.toString()}`}case`too_small`:{let n=e.exact?`exactly `:e.inclusive?`>=`:`>`,r=t(e.origin);return r?`Too small: expected ${e.origin} to have ${n}${e.minimum.toString()} ${r.unit}`:`Too small: expected ${e.origin} to be ${n}${e.minimum.toString()}`}case`invalid_format`:{let t=e;return t.format===`starts_with`?`Invalid string: must start with "${t.prefix}"`:t.format===`ends_with`?`Invalid string: must end with "${t.suffix}"`:t.format===`includes`?`Invalid string: must include "${t.includes}"`:t.format===`regex`?`Invalid string: must match pattern ${t.pattern}`:`Invalid ${n[t.format]??e.format}`}case`not_multiple_of`:return`Invalid number: must be a multiple of ${e.divisor}`;case`unrecognized_keys`:return`Unrecognized key${e.keys.length>1?`s`:``}: ${yt(e.keys,`, `)}`;case`invalid_key`:return`Invalid key in ${e.origin}`;case`invalid_union`:return e.options&&Array.isArray(e.options)&&e.options.length>0?`Invalid discriminator value. Expected ${e.options.map(e=>`'${e}'`).join(` | `)}`:e.inclusive===!1?`Invalid input: more than one option matched`:`Invalid input`;case`invalid_element`:return`Invalid value in ${e.origin}`;default:return`Invalid input`}}};function ao(){return{localeError:io()}}var oo,so=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function co(){return new so}(oo=globalThis).__zod_globalRegistry??(oo.__zod_globalRegistry=co());var lo=globalThis.__zod_globalRegistry;function uo(e){return e.checks&&=[...e.checks],e}function fo(e,t){return new e(uo({type:`string`,...W(t)}))}function po(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function mo(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function ho(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function go(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function _o(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function vo(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function yo(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function bo(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function xo(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function So(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function Co(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function wo(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function To(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function Eo(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function Do(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function Oo(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function ko(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function Ao(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function jo(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function Mo(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function No(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function Po(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function Fo(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function Io(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function Lo(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function Ro(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function zo(e,t){return new e(uo({type:`number`,checks:[],...W(t)}))}function Bo(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function Vo(e,t){return new e({type:`boolean`,...W(t)})}function Ho(e){return new e({type:`unknown`})}function Uo(e,t){return new e({type:`never`,...W(t)})}function Wo(e,t){return new qr({check:`less_than`,...W(t),value:e,inclusive:!1})}function Go(e,t){return new qr({check:`less_than`,...W(t),value:e,inclusive:!0})}function Ko(e,t){return new Jr({check:`greater_than`,...W(t),value:e,inclusive:!1})}function qo(e,t){return new Jr({check:`greater_than`,...W(t),value:e,inclusive:!0})}function Jo(e,t){return new Yr({check:`multiple_of`,...W(t),value:e})}function Yo(e,t){return new Zr({check:`max_length`,...W(t),maximum:e})}function Xo(e,t){return new Qr({check:`min_length`,...W(t),minimum:e})}function Zo(e,t){return new $r({check:`length_equals`,...W(t),length:e})}function Qo(e,t){return new ti({check:`string_format`,format:`regex`,...W(t),pattern:e})}function $o(e){return new ni({check:`string_format`,format:`lowercase`,...W(e)})}function es(e){return new ri({check:`string_format`,format:`uppercase`,...W(e)})}function ts(e,t){return new ii({check:`string_format`,format:`includes`,...W(t),includes:e})}function ns(e,t){return new ai({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function rs(e,t){return new oi({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function is(e){return new si({check:`overwrite`,tx:e})}function as(e){return is(t=>t.normalize(e))}function os(){return is(e=>e.trim())}function ss(){return is(e=>e.toLowerCase())}function cs(){return is(e=>e.toUpperCase())}function ls(){return is(e=>Ft(e))}function us(e,t,n){return new e({type:`array`,element:t,...W(n)})}function ds(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function fs(e,t){let n=ps(t=>(t.addIssue=e=>{if(typeof e==`string`)t.issues.push(mn(e,t.value,n._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,`input`in r||(r.input=t.value),r.inst??=n,r.continue??=!n._zod.def.abort,t.issues.push(mn(r))}},e(t.value,t)),t);return n}function ps(e,t){let n=new Wr({check:`custom`,...W(t)});return n._zod.check=e,n}function ms(e,...t){for(let n of t)for(let t of Reflect.ownKeys(n))Object.prototype.propertyIsEnumerable.call(n,t)&&Et(e,t,n[t]);return e}function hs(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??lo,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,sharedDefsExtractedFor:void 0,sharedEmitDoneFor:void 0,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,intersections:[],deferred:[],external:e?.external??void 0}}function gs(e,t,n,r,i){let a=typeof t.unrepresentable==`function`?t.unrepresentable({zodSchema:e,path:r.path,message:i}):t.unrepresentable;if(a===`any`)return!1;if(a===void 0||a===`throw`)throw Error(i);return Object.assign(n,a),!0}function _s(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o),t.sharedDefsExtractedFor=void 0,t.sharedEmitDoneFor=void 0;let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,_s(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&ms(o.schema,c),t.io===`input`&&Ds(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&`_prefault`in o.schema&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function vs(e){return e.replace(/~/g,`~0`).replace(/\//g,`~1`)}function ys(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);if(e.external&&e.sharedDefsExtractedFor===e.external)return;let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${vs(a)}`}}let i=`#/${r}/`;if(t[1]===n&&!t[1].schema.id)return{ref:`#`};let a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+vs(a)}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
|
|
64
64
|
|
|
65
|
-
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}r.count>1&&e.reused===`ref`&&a(n)}e.external&&(e.sharedDefsExtractedFor=e.external)}function bs(e){let t=e.anyOf;if(!Array.isArray(t)||t.length===0||e.type!==void 0)return;let n=[];for(let e of t){if(!e||typeof e!=`object`)return;bs(e);let t=Object.keys(e);if(t.length!==1||t[0]!==`type`)return;let r=e.type;for(let e of Array.isArray(r)?r:[r]){if(typeof e!=`string`)return;n.includes(e)||n.push(e)}}delete e.anyOf,e.type=n.length===1?n[0]:n}var xs=new Set([`type`,`properties`,`required`,`additionalProperties`]),Ss=[`oneOf`,`anyOf`];function Cs(e){let t=e.additionalProperties;return t===void 0||t===!1||typeof t!=`object`||!t?null:Object.keys(t).length?t:null}function ws(e){let t=[];for(let n of e){if(typeof n!=`object`||n.type!==`object`)return null;for(let e in n)if(!xs.has(e))return null;t.push(n)}let n={},r=new Set;for(let e of t){for(let r in e.properties){if(Object.prototype.hasOwnProperty.call(n,r))continue;let e=[];for(let n of t){let t=n.properties?.[r]??Cs(n);t!=null&&(e.some(e=>JSON.stringify(e)===JSON.stringify(t))||e.push(t))}Et(n,r,e.length===1?e[0]:ws(e)??{allOf:e})}for(let t of e.required??[])r.add(t)}let i={type:`object`,properties:n};if(r.size&&(i.required=[...r]),t.every(e=>e.additionalProperties===!1))i.additionalProperties=!1;else{let e=[];for(let n of t){let t=Cs(n);t&&!e.some(e=>JSON.stringify(e)===JSON.stringify(t))&&e.push(t)}e.length===1?i.additionalProperties=e[0]:e.length>1&&(i.additionalProperties={allOf:e})}return i}function Ts(e){let t=e.allOf;if(!Array.isArray(t)||t.length<2)return;for(let t of xs)if(t in e)return;let n=t.filter(e=>Ss.some(t=>Array.isArray(e[t]))),r=null;if(!n.length)r=ws(t);else{let e=n[0],i=Ss.find(t=>Array.isArray(e[t]));if(Object.keys(e).length!==1)return;let a=t.filter(t=>t!==e),o=e[i].map(e=>ws([...a,e]));if(o.some(e=>!e))return;r={[i]:o}}r&&(delete e.allOf,ms(e,r))}function Es(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):ms(i,s),ms(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};if(!e.external||e.sharedEmitDoneFor!==e.external){for(let t of[...e.seen.entries()].reverse())r(t[0]);if(e.target!==`openapi-3.0`)for(let t of e.seen.entries())bs(t[1].def??t[1].schema);for(let t of e.deferred)t();if(e.intersections.length){let t=new Map;for(let n of e.seen.values())for(let e of[n.schema,n.def]){let n=e?.allOf;if(!Array.isArray(n))continue;let r=t.get(n);r?r.push(e):t.set(n,[e])}for(let n of e.intersections)for(let e of t.get(n)??[])Ts(e)}}let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}ms(i,n.defId?n.schema:n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};if(!e.external||e.sharedEmitDoneFor!==e.external)for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,Et(o,e.defId,e.def))}e.external&&(e.sharedEmitDoneFor=e.external),e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:ks(t,`input`,e.processors),output:ks(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Ds(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Ds(r.element,n);if(r.type===`set`)return Ds(r.valueType,n);if(r.type===`lazy`)return Ds(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`||r.type===`catch`)return Ds(r.innerType,n);if(r.type===`intersection`)return Ds(r.left,n)||Ds(r.right,n);if(r.type===`record`||r.type===`map`)return Ds(r.keyType,n)||Ds(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:Ds(r.in,n)||Ds(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Ds(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Ds(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Ds(e,n))return!0;return!!(r.rest&&Ds(r.rest,n))}return!1}var Os=(e,t={})=>n=>{let r=hs({...n,processors:t});return _s(e,r),ys(r,e),Es(r,e)},ks=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=hs({...i??{},target:a,io:t,processors:n});return _s(e,o),ys(o,e),Es(o,e)},As=(e,t,n)=>{(e[t]===void 0||n>e[t])&&(e[t]=n)},js=(e,t,n)=>{(e[t]===void 0||n<e[t])&&(e[t]=n)},Ms=(e,t)=>{As(e,`minimum`,t),js(e,`maximum`,t)},Ns=(e,t)=>{e.multipleOf??=[],e.multipleOf.includes(t)||e.multipleOf.push(t)},Ps=(e,t)=>{e.patterns??=new Set,e.patterns.add(t)},Fs=(e,t)=>{e.mime=e.mime?e.mime.filter(e=>t.includes(e)):[...t]},Is=(e,t)=>{e.format=t,t.includes(`int`)&&(e.isInt=!0)},Ls=(e,t)=>As(e,`minimum`,t.minimum),Rs=(e,t)=>js(e,`maximum`,t.maximum),zs=e=>(t,n)=>{Is(t,n.format);let[r,i]=e[n.format];As(t,`minimum`,r),js(t,`maximum`,i)},Bs={greater_than:(e,t)=>As(e,t.inclusive?`minimum`:`exclusiveMinimum`,t.value),less_than:(e,t)=>js(e,t.inclusive?`maximum`:`exclusiveMaximum`,t.value),multiple_of:(e,t)=>Ns(e,t.value),number_format:zs(Kt),bigint_format:zs(qt),min_length:Ls,max_length:Rs,length_equals:(e,t)=>Ms(e,t.length),min_size:Ls,max_size:Rs,size_equals:(e,t)=>Ms(e,t.size),string_format:(e,t)=>{Is(e,t.format),t.pattern&&Ps(e,t.pattern),(t.format===`base64`||t.format===`base64url`)&&(e.contentEncoding=t.format),(t.local||t.precision===-1)&&(e.laxFormat=!0)},mime_type:(e,t)=>Fs(e,t.mime)};function Vs(e){let t={},n=e._zod.def,r=e._zod.traits.has(`$ZodCheck`)?[e,...n.checks??[]]:n.checks??[];for(let e of r)Bs[e._zod.def.check]?.(t,e._zod.def);let i=e._zod.bag;i.minimum!==void 0&&As(t,`minimum`,i.minimum),i.exclusiveMinimum!==void 0&&As(t,`exclusiveMinimum`,i.exclusiveMinimum),i.maximum!==void 0&&js(t,`maximum`,i.maximum),i.exclusiveMaximum!==void 0&&js(t,`exclusiveMaximum`,i.exclusiveMaximum),i.multipleOf!==void 0&&Ns(t,i.multipleOf),i.format!==void 0&&(t.format??=i.format,i.format.includes(`int`)&&(t.isInt=!0)),i.mime&&Fs(t,i.mime);for(let e of i.patterns??[])Ps(t,e);return t}var Hs={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Us=new Map([[Ki,Or],[Ji,kr]]),Ws=e=>Us.get(e)??e,Gs=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l,laxFormat:u}=Vs(e);if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Hs[s]??s,i.format===``&&delete i.format,(s===`time`||u)&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c].map(Ws);e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},Ks=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,multipleOf:s,exclusiveMaximum:c,exclusiveMinimum:l,isInt:u}=Vs(e);i.type=u?`integer`:`number`;let d=typeof l==`number`&&l>=(a??-1/0),f=typeof c==`number`&&c<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;if(d?p?(i.minimum=l,i.exclusiveMinimum=!0):i.exclusiveMinimum=l:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=c,i.exclusiveMaximum=!0):i.exclusiveMaximum=c:typeof o==`number`&&(i.maximum=o),s){let n=new Set;for(let a of s)Number.isFinite(a)&&a!==0?n.add(Math.abs(a)):gs(e,t,i,r,`A multipleOf divisor of ${a} cannot be represented in JSON Schema`);let[a,...o]=n;a!==void 0&&(i.multipleOf=a),o.length&&(i.allOf=[...i.allOf??[],...o.map(e=>({multipleOf:e}))])}},qs=(e,t,n,r)=>{n.type=`boolean`},Js=(e,t,n,r)=>{n.not={}},Ys=(e,t,n,r)=>{let i=e._zod.def,a=vt(i.entries);if(a.length===0){n.not={};return}a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Xs=(e,t,n,r)=>{let i=e._zod.def;if(i.values.length===0){n.not={};return}let a=[];for(let o of i.values)if(o===void 0){if(gs(e,t,n,r,"Literal `undefined` cannot be represented in JSON Schema"))return}else if(typeof o==`bigint`){if(gs(e,t,n,r,`BigInt literals cannot be represented in JSON Schema`))return;a.push(Number(o))}else a.push(o);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},Zs=(e,t,n,r)=>{gs(e,t,n,r,`Custom types cannot be represented in JSON Schema`)},Qs=(e,t,n,r)=>{gs(e,t,n,r,`Transforms cannot be represented in JSON Schema`)},$s=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=Vs(e);typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=_s(a.element,t,{...r,path:[...r.path,`items`]})};function ec(e){let t=e._zod.def;return t.type===`pipe`&&t.in._zod.traits.has(`$ZodTransform`)?ec(t.out):t.type===`catch`?ec(t.innerType):e._zod.optin}var tc=(e,t,n,r)=>{let i=n,a=e._zod.def,o=a.shape;if(Object.getOwnPropertySymbols(o).length&&gs(e,t,i,r,`Symbol keys cannot be represented in JSON Schema`))return;i.type=`object`,i.properties={};for(let e in o)Et(i.properties,e,_s(o[e],t,{...r,path:[...r.path,`properties`,e]}));let s=[];for(let e of Object.keys(o)){let n=a.shape[e];(t.io===`input`?ec(n)===void 0:n._zod.optout===void 0)&&s.push(e)}s.length>0&&(i.required=s),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=_s(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},nc=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>_s(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},rc=(e,t,n,r)=>{let i=e._zod.def,a=_s(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=_s(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1,c=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]];n.allOf=c,t.intersections.push(c)};function ic(e,t,n){if(t.$ref){if(n.has(t))return t;n.add(t);let r=e.get(t)?.def;if(!r)return t;let i=ic(e,r,n);return i===r?t:i}for(let r of[`anyOf`,`oneOf`]){let i=t[r];if(!Array.isArray(i))continue;let a=i.map(t=>ic(e,t,n));a.some((e,t)=>e!==i[t])&&(t={...t,[r]:a})}let r=Array.isArray(t.type)?t.type:[t.type],i=!r.includes(`string`)&&r.some(e=>e===`number`||e===`integer`),a=t.enum??(t.const===void 0?void 0:[t.const]);if(!i&&!a?.some(e=>typeof e==`number`))return t;let{minimum:o,maximum:s,exclusiveMinimum:c,exclusiveMaximum:l,multipleOf:u,format:d,id:f,...p}=t;return p.enum?p.enum=p.enum.map(e=>typeof e==`number`?String(e):e):typeof p.const==`number`&&(p.const=String(p.const)),i?(p.type=`string`,a||(p.pattern=(r.includes(`number`)?Br:zr).source),p):p}var ac=new WeakMap;function oc(e){let t=new Map;for(let n of e.seen.values())n.def&&!t.has(n.schema)&&t.set(n.schema,n);let n=new Map;for(let r of ac.get(e)??[]){let i=e.seen.get(r),a=(i?.def??i?.schema)?.propertyNames;if(!a||a===!0||n.has(a))continue;let o=ic(t,a,new Set);o!==a&&n.set(a,o)}if(n.size)for(let t of e.seen.values())for(let e of[t.schema,t.def]){let t=e&&n.get(e.propertyNames);t&&(e.propertyNames=t)}}var sc=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=Vs(o).patterns;if(a.mode===`loose`&&s&&s.size>0){let e=_s(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)Et(i.patternProperties,Ws(t).source,e)}else{if(t.target===`draft-07`||t.target===`draft-2020-12`){i.propertyNames=_s(a.keyType,t,{...r,path:[...r.path,`propertyNames`]});let n=ac.get(t);n||(n=[],ac.set(t,n),t.deferred.push(()=>oc(t))),n.push(e)}i.additionalProperties=_s(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]})}let c=o._zod.values,l=t.io===`input`&&ec(a.valueType)!==void 0;if(c&&!a.partial&&!l){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e.map(String))}},cc=(e,t,n,r)=>{let i=e._zod.def,a=_s(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},lc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},uc=Symbol();function dc(e,t,n,r,i){let a=!1,o=JSON.stringify(e,(e,t)=>typeof t==`bigint`?(a=!0,null):t);return a?(gs(t,n,r,i,`BigInt defaults cannot be represented in JSON Schema`),uc):JSON.parse(o)}var fc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o=dc(i.defaultValue,e,t,n,r);o!==uc&&(n.default=o)},pc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);if(a.ref=i.innerType,t.io!==`input`)return;let o=dc(i.defaultValue,e,t,n,r);o!==uc&&(n._prefault=o)},mc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{gs(e,t,n,r,`Dynamic catch values are not supported in JSON Schema`);return}n.default=o},hc=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;_s(o,t,r);let s=t.seen.get(e);s.ref=o},gc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},_c=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},vc=new WeakSet([Object.prototype,Error.prototype]);function yc(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,get(){let e=n(this);return Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0})}})}var bc=G(`ZodError`,(e,t)=>{Hn.init(e,t),e.name=`ZodError`;let n=Object.getPrototypeOf(e);vc.has(n)||(vc.add(n),yc(n,`format`,e=>t=>Gn(e,t)),yc(n,`flatten`,e=>t=>Wn(e,t)),yc(n,`addIssue`,e=>t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,bt,2)}),yc(n,`addIssues`,e=>t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,bt,2)}),Object.defineProperty(n,"isEmpty",{configurable:!0,enumerable:!1,get(){return this.issues.length===0}}))},void 0,{Parent:Error}),xc=qn(bc),Sc=Jn(bc),Cc=Yn(bc),wc=Zn(bc),Tc=rr(bc),Ec=ir(bc),Dc=ar(bc),Oc=or(bc),kc=sr(bc),Ac=cr(bc),jc=lr(bc),Mc=ur(bc);function Nc(){Pn.localeError||Fn(ao())}function Pc(){Pn.memoizer||Fn({memoizer:no()})}var Fc=G(`ZodType`,(e,t)=>(Nc(),ui.init(e,t),e.def=t,e.type=t.type,e),{check(...e){let t=this.def;return this.clone(Nt(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return Ut(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(Ql(e,t))},superRefine(e,t){return this.check($l(e,t))},overwrite(e){return this.check(is(e))},optional(){return Pl(this)},exactOptional(){return Il(this)},nullable(){return Rl(this)},nullish(){return Pl(Rl(this))},nonoptional(e){return Wl(this,e)},array(){return yl(this)},or(e){return Sl([this,e])},and(e){return El(this,e)},transform(e){return Jl(this,Ml(e))},default(e){return Bl(this,e)},prefault(e){return Hl(this,e)},catch(e){return Kl(this,e)},pipe(e){return Jl(this,e)},readonly(){return Xl(this)},describe(e){let t=this.clone();return lo.add(t,{description:e}),t},meta(...e){if(e.length===0)return lo.get(this);let t=this.clone();return lo.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e,...t){return t.length===0?e(this):e(this,...t)},get"~standard"(){return _n(this,`~standard`,{...pi(this),jsonSchema:{input:ks(this,`input`),output:ks(this,`output`)}})},set"~standard"(e){gn(this,`~standard`,e)},parse:function e(t,n){return xc(this,t,n,{callee:e})},parseAsync:async function e(t,n){return await Sc(this,t,n,{callee:e})},safeParse(e,t){return Cc(this,e,t)},async safeParseAsync(e,t){return wc(this,e,t)},get spa(){return this?.safeParseAsync},set spa(e){gn(this,`spa`,e)},validate(e,t){return er(this,e,t)},validateAsync(e,t){return nr(this,e,t)},encode:function e(t,n){return Tc(this,t,n,{callee:e})},decode:function e(t,n){return Ec(this,t,n,{callee:e})},encodeAsync:async function e(t,n){return await Dc(this,t,n,{callee:e})},decodeAsync:async function e(t,n){return await Oc(this,t,n,{callee:e})},safeEncode(e,t){return kc(this,e,t)},safeDecode(e,t){return Ac(this,e,t)},async safeEncodeAsync(e,t){return jc(this,e,t)},async safeDecodeAsync(e,t){return Mc(this,e,t)},toJSONSchema(e){return Os(this,{})(e)},get description(){return lo.get(this)?.description},get _def(){return this._zod.def}}),Ic=G(`_ZodString`,(e,t)=>{mi.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gs(e,t,n,r)},vn({format:e=>Vs(e).format??null,minLength:e=>Vs(e).minimum??null,maxLength:e=>Vs(e).maximum??null},{regex(...e){return this.check(Qo(...e))},includes(...e){return this.check(ts(...e))},startsWith(...e){return this.check(ns(...e))},endsWith(...e){return this.check(rs(...e))},min(...e){return this.check(Xo(...e))},max(...e){return this.check(Yo(...e))},length(...e){return this.check(Zo(...e))},nonempty(...e){return this.check(Xo(1,...e))},lowercase(e){return this.check($o(e))},uppercase(e){return this.check(es(e))},trim(){return this.check(os())},normalize(...e){return this.check(as(...e))},toLowerCase(){return this.check(ss())},toUpperCase(){return this.check(cs())},slugify(){return this.check(ls())}})),Lc=G(`ZodString`,(e,t)=>{mi.init(e,t),Ic.init(e,t)},{email(e){return this.check(po(Uc,e))},url(e){return this.check(yo(Kc,e))},jwt(e){return this.check(Po(sl,e))},emoji(e){return this.check(bo(qc,e))},guid(e){return this.check(mo(Wc,e))},uuid(e){return this.check(ho(Gc,e))},uuidv4(e){return this.check(go(Gc,e))},uuidv6(e){return this.check(_o(Gc,e))},uuidv7(e){return this.check(vo(Gc,e))},nanoid(e){return this.check(xo(Jc,e))},cuid(e){return this.check(So(Yc,e))},cuid2(e){return this.check(Co(Xc,e))},ulid(e){return this.check(wo(Zc,e))},base64(e){return this.check(jo(il,e))},base64url(e){return this.check(Mo(al,e))},xid(e){return this.check(To(Qc,e))},ksuid(e){return this.check(Eo($c,e))},ipv4(e){return this.check(Do(el,e))},ipv6(e){return this.check(Oo(tl,e))},cidrv4(e){return this.check(ko(nl,e))},cidrv6(e){return this.check(Ao(rl,e))},e164(e){return this.check(No(ol,e))},datetime(e){return this.check(Fo(zc,e))},date(e){return this.check(Io(Bc,e))},time(e){return this.check(Lo(Vc,e))},duration(e){return this.check(Ro(Hc,e))}});function K(e){return fo(Lc,e)}var Rc=G(`ZodStringFormat`,(e,t)=>{hi.init(e,t),Ic.init(e,t)}),zc=G(`ZodISODateTime`,(e,t)=>{Pi.init(e,t),Rc.init(e,t)}),Bc=G(`ZodISODate`,(e,t)=>{Fi.init(e,t),Rc.init(e,t)}),Vc=G(`ZodISOTime`,(e,t)=>{Ii.init(e,t),Rc.init(e,t)}),Hc=G(`ZodISODuration`,(e,t)=>{Li.init(e,t),Rc.init(e,t)}),Uc=G(`ZodEmail`,(e,t)=>{vi.init(e,t),Rc.init(e,t)}),Wc=G(`ZodGUID`,(e,t)=>{gi.init(e,t),Rc.init(e,t)}),Gc=G(`ZodUUID`,(e,t)=>{_i.init(e,t),Rc.init(e,t)}),Kc=G(`ZodURL`,(e,t)=>{Ei.init(e,t),Rc.init(e,t)}),qc=G(`ZodEmoji`,(e,t)=>{Di.init(e,t),Rc.init(e,t)}),Jc=G(`ZodNanoID`,(e,t)=>{Oi.init(e,t),Rc.init(e,t)}),Yc=G(`ZodCUID`,(e,t)=>{ki.init(e,t),Rc.init(e,t)}),Xc=G(`ZodCUID2`,(e,t)=>{Ai.init(e,t),Rc.init(e,t)}),Zc=G(`ZodULID`,(e,t)=>{ji.init(e,t),Rc.init(e,t)}),Qc=G(`ZodXID`,(e,t)=>{Mi.init(e,t),Rc.init(e,t)}),$c=G(`ZodKSUID`,(e,t)=>{Ni.init(e,t),Rc.init(e,t)}),el=G(`ZodIPv4`,(e,t)=>{Ri.init(e,t),Rc.init(e,t)}),tl=G(`ZodIPv6`,(e,t)=>{Vi.init(e,t),Rc.init(e,t)}),nl=G(`ZodCIDRv4`,(e,t)=>{Hi.init(e,t),Rc.init(e,t)}),rl=G(`ZodCIDRv6`,(e,t)=>{Wi.init(e,t),Rc.init(e,t)}),il=G(`ZodBase64`,(e,t)=>{qi.init(e,t),Rc.init(e,t)}),al=G(`ZodBase64URL`,(e,t)=>{Xi.init(e,t),Rc.init(e,t)}),ol=G(`ZodE164`,(e,t)=>{Zi.init(e,t),Rc.init(e,t)}),sl=G(`ZodJWT`,(e,t)=>{$i.init(e,t),Rc.init(e,t)}),cl=G(`ZodNumber`,(e,t)=>{ea.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ks(e,t,n,r),e.isFinite=!0},vn({minValue:e=>{let{minimum:t,exclusiveMinimum:n}=Vs(e);return Math.max(t??-1/0,n??-1/0)},maxValue:e=>{let{maximum:t,exclusiveMaximum:n}=Vs(e);return Math.min(t??1/0,n??1/0)},isInt:e=>{let{isInt:t,multipleOf:n}=Vs(e);return!!t||!!n?.some(Number.isSafeInteger)},format:e=>Vs(e).format??null},{gt(e,t){return this.check(Ko(e,t))},gte(e,t){return this.check(qo(e,t))},min(e,t){return this.check(qo(e,t))},lt(e,t){return this.check(Wo(e,t))},lte(e,t){return this.check(Go(e,t))},max(e,t){return this.check(Go(e,t))},int(e){return this.check(dl(e))},safe(e){return this.check(dl(e))},positive(e){return this.check(Ko(0,e))},nonnegative(e){return this.check(qo(0,e))},negative(e){return this.check(Wo(0,e))},nonpositive(e){return this.check(Go(0,e))},multipleOf(e,t){return this.check(Jo(e,t))},step(e,t){return this.check(Jo(e,t))},finite(){return this}}));function ll(e){return zo(cl,e)}var ul=G(`ZodNumberFormat`,(e,t)=>{ta.init(e,t),cl.init(e,t)});function dl(e){return Bo(ul,e)}var fl=G(`ZodBoolean`,(e,t)=>{na.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qs(e,t,n,r)});function pl(e){return Vo(fl,e)}var ml=G(`ZodUnknown`,(e,t)=>{ra.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function hl(){return Ho(ml)}var gl=G(`ZodNever`,(e,t)=>{ia.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Js(e,t,n,r)});function _l(e){return Uo(gl,e)}var vl=G(`ZodArray`,(e,t)=>{Pc(),oa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$s(e,t,n,r),e.element=t.element},{min(e,t){return this.check(Xo(e,t))},nonempty(e){return this.check(Xo(1,e))},max(e,t){return this.check(Yo(e,t))},length(e,t){return this.check(Zo(e,t))},unwrap(){return this.element}});function yl(e,t){return us(vl,e,t)}var bl=G(`ZodObject`,(e,t)=>{Pc(),fa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>tc(e,t,n,r),Tn(e,`shape`,e=>e._zod.def.shape,!1)},{keyof(){return J(Object.keys(this._zod.def.shape))},catchall(e){return this.clone(Nt(this._zod.def,{catchall:e}))},passthrough(){return this.clone(Nt(this._zod.def,{catchall:hl()}))},loose(){return this.clone(Nt(this._zod.def,{catchall:hl()}))},strict(){return this.clone(Nt(this._zod.def,{catchall:_l()}))},strip(){return this.clone(Nt(this._zod.def,{catchall:void 0}))},extend(e){return Zt(this,e)},safeExtend(e){return $t(this,e)},merge(e){return en(this,e)},pick(e){return Jt(this,e)},omit(e){return Xt(this,e)},partial(...e){return tn(Nl,this,e[0])},exactPartial(...e){return tn(Fl,this,e[0],`exactPartial`)},required(...e){return nn(Ul,this,e[0])}});function q(e,t){return new bl({type:`object`,shape:e??{},...W(t)})}var xl=G(`ZodUnion`,(e,t)=>{ma.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>nc(e,t,n,r),e.options=t.options});function Sl(e,t){return new xl({type:`union`,options:e,...W(t)})}var Cl=G(`ZodDiscriminatedUnion`,(e,t)=>{xl.init(e,t),ga.init(e,t)});function wl(e,t,n){return new Cl({type:`union`,options:t,discriminator:e,...W(n)})}var Tl=G(`ZodIntersection`,(e,t)=>{_a.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>rc(e,t,n,r)});function El(e,t){return new Tl({type:`intersection`,left:e,right:t})}var Dl=G(`ZodRecord`,(e,t)=>{Pc(),ba.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>sc(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function Ol(e,t,n){return!t||!t._zod?new Dl({type:`record`,keyType:K(),valueType:e,...W(t)}):new Dl({type:`record`,keyType:e,valueType:t,...W(n)})}var kl=G(`ZodEnum`,(e,t)=>{xa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ys(e,t,n,r),e.enum=t.entries,e.options=[...e._zod.values];let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new kl({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new kl({...t,checks:[],...W(r),entries:i})}});function J(e,t){return new kl({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}var Al=G(`ZodLiteral`,(e,t)=>{Sa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xs(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function Y(e,t){return new Al({type:`literal`,values:Array.isArray(e)?e:[e],...W(t)})}var jl=G(`ZodTransform`,(e,t)=>{Pc(),Ca.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qs(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Nn(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(mn(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,`input`in t||(t.input=n.value),t.inst??=e,n.issues.push(mn(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Ml(e){return new jl({type:`transform`,transform:e})}var Nl=G(`ZodOptional`,(e,t)=>{Ta.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_c(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Pl(e){return new Nl({type:`optional`,innerType:e})}var Fl=G(`ZodExactOptional`,(e,t)=>{Ea.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_c(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Il(e){return new Fl({type:`optional`,innerType:e})}var Ll=G(`ZodNullable`,(e,t)=>{Da.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>cc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Rl(e){return new Ll({type:`nullable`,innerType:e})}var zl=G(`ZodDefault`,(e,t)=>{Oa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Bl(e,t){return new zl({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Bt(t)}})}var Vl=G(`ZodPrefault`,(e,t)=>{Aa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Hl(e,t){return new Vl({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Bt(t)}})}var Ul=G(`ZodNonOptional`,(e,t)=>{ja.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>lc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Wl(e,t){return new Ul({type:`nonoptional`,innerType:e,...W(t)})}var Gl=G(`ZodCatch`,(e,t)=>{Pa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Kl(e,t){return new Gl({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:Dn(t)})}var ql=G(`ZodPipe`,(e,t)=>{Fa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hc(e,t,n,r),e.in=t.in,e.out=t.out});function Jl(e,t){return new ql({type:`pipe`,in:e,out:t})}var Yl=G(`ZodReadonly`,(e,t)=>{La.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Xl(e){return new Yl({type:`readonly`,innerType:e})}var Zl=G(`ZodCustom`,(e,t)=>{za.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zs(e,t,n,r)});function Ql(e,t={}){return ds(Zl,e,t)}function $l(e,t){return fs(e,t)}var eu=J([`T0`,`T1`,`T2`,`T3`]);J([`owner`,`guest`,`member`,`voice-device`]);var tu=ll().min(0).max(1),nu=Sl([J([`auto`,`center`,`left`,`right`,`top`,`bottom`]),q({x:tu,y:tu,w:tu,h:tu})]),ru=J([`ambient`,`conversation`,`focus`,`multi`]),iu=J([`idle`,`listening`,`thinking`,`speaking`]),au=J([`sphere`,`orb`,`ring`]),ou=q({id:K().min(1).max(64),type:J([`card`,`stat`,`list`,`table`,`code`,`chart`,`gauge`,`timeline`,`graph`,`sandbox`,`markdown`,`image`,`video`,`pdf`,`gallery`,`group`,`tabs`,`progress`,`checklist`,`countdown`,`kv`]),props:Ol(K(),hl()),placement:nu,ttl:ll().positive().max(3600).optional(),style:J([`glass`,`alert`]).optional(),layer:J([`base`,`overlay`]).optional(),pinned:pl().optional()}),su=wl(`cmd`,[q({cmd:Y(`scene`),mode:ru}),q({cmd:Y(`show`),object:ou}),q({cmd:Y(`update`),id:K(),props:Ol(K(),hl())}),q({cmd:Y(`hide`),id:K()}),q({cmd:Y(`clear`)}),q({cmd:Y(`pin`),id:K()}),q({cmd:Y(`unpin`),id:K()}),q({cmd:Y(`place`),id:K(),placement:nu}),q({cmd:Y(`presence`),state:iu.optional(),style:au.optional()}),q({cmd:Y(`mood`),accent:K().max(16).optional(),intensity:tu.optional()})]),cu=q({scene:ru,objects:yl(ou),presence:q({state:iu,style:au}),mood:q({accent:K(),intensity:tu})}),lu={center:[20,18,60,58],left:[3,12,30,70],right:[67,12,30,70],top:[20,4,60,30],bottom:[20,62,60,30]};Object.keys(lu);var uu=[{id:`en_US-amy-medium`,name:`Amy`,gender:`female`,accent:`American`},{id:`en_US-kristin-medium`,name:`Kristin`,gender:`female`,accent:`American`},{id:`en_US-hfc_female-medium`,name:`Hannah`,gender:`female`,accent:`American`,note:`clear and steady`},{id:`en_GB-jenny_dioco-medium`,name:`Jenny`,gender:`female`,accent:`British`},{id:`en_GB-alba-medium`,name:`Alba`,gender:`female`,accent:`Scottish`},{id:`en_US-kathleen-low`,name:`Kathleen`,gender:`female`,accent:`American`,note:`smaller and faster`},{id:`en_US-ryan-medium`,name:`Ryan`,gender:`male`,accent:`American`},{id:`en_US-joe-medium`,name:`Joe`,gender:`male`,accent:`American`},{id:`en_US-norman-medium`,name:`Norman`,gender:`male`,accent:`American`},{id:`en_US-hfc_male-medium`,name:`Henry`,gender:`male`,accent:`American`,note:`clear and steady`},{id:`en_GB-alan-medium`,name:`Alan`,gender:`male`,accent:`British`},{id:`en_GB-northern_english_male-medium`,name:`Tom`,gender:`male`,accent:`Northern English`}],du=[{id:`hi_IN-priyamvada-medium`,name:`Priyamvada`,gender:`female`,accent:`Hindi`,note:`for personal use (non-commercial licence)`},{id:`hi_IN-pratham-medium`,name:`Pratham`,gender:`male`,accent:`Hindi`,note:`for personal use (non-commercial licence)`},{id:`hi_IN-rohan-medium`,name:`Rohan`,gender:`male`,accent:`Hindi`}],fu=[{id:`mr_IN-google-medium`,name:`Marathi`,gender:`female`,accent:`Marathi`}],pu={id:`en_US-lessac-medium`,name:`Lessac`,accent:`American`,note:`the original voice`},mu=e=>e===pu.id||uu.some(t=>t.id===e),hu=[{id:`tiny`,name:`Tiny`,mb:75,note:`fastest, mishears a lot`},{id:`base`,name:`Base`,mb:145,note:`fast, struggles with Hindi, Marathi and distance`},{id:`small`,name:`Small`,mb:480,note:`recommended: much better, still quick`},{id:`medium`,name:`Medium`,mb:1500,note:`better again, slow on a PC without a graphics card`},{id:`large-v3-turbo`,name:`Large (turbo)`,mb:1600,note:`most accurate for Marathi; needs a fast PC`}],gu=e=>`about ${e>=1e3?`${(e/1e3).toFixed(1)} GB`:`${e} MB`}`,_u=[{id:`aurora`,name:`Aurora`,style:`sphere`,accent:`#3fd8ff`,intensity:.6},{id:`ocean`,name:`Ocean`,style:`sphere`,accent:`#2b7bff`,intensity:.6},{id:`ember`,name:`Ember`,style:`orb`,accent:`#ff9b3d`,intensity:.7},{id:`violet`,name:`Violet storm`,style:`orb`,accent:`#a066ff`,intensity:.8},{id:`matrix`,name:`Matrix`,style:`ring`,accent:`#3dff8c`,intensity:.6},{id:`rose`,name:`Rose`,style:`ring`,accent:`#ff6fae`,intensity:.7},{id:`ghost`,name:`Ghost`,style:`sphere`,accent:`#e8f4ff`,intensity:.4}],vu=[`local`,`spotify`,`soundcloud`,`audius`],yu=/^[0-9a-f]{16}$/,bu=/^[0-9]{1,20}$/,xu=/^[A-Za-z0-9_-]{1,64}$/;function Su(e){if(typeof e!=`string`)return null;if(yu.test(e))return{source:`local`,id:e};let t=e.indexOf(`:`);if(t<1)return null;let n=e.slice(0,t),r=e.slice(t+1);return!vu.includes(n)||!(n===`local`?yu:n===`soundcloud`?bu:xu).test(r)?null:{source:n,id:r}}var Cu=J([`minimal`,`companion`,`workspace`]),wu=q({size:ll().min(.5).max(1.5),reactivity:ll().min(0).max(1),ambient:pl(),captions:pl(),captionSize:J([`small`,`medium`,`large`])}),Tu={width:ll().int().min(100).max(1e4),height:ll().int().min(100).max(1e4),kind:J([`phone`,`tablet`,`desktop`]),orientation:J([`portrait`,`landscape`]),touch:pl()};q(Tu);var Eu=q({id:K(),tool:K(),summary:K(),tier:eu,needsPin:pl()}),Du=q({id:K().refine(e=>Su(e)!==null,`A track id or a source:id ref`),title:K().max(200),artist:K().max(200),album:K().max(200),durationSec:ll().nullable()}),Ou=q({playing:pl(),trackId:K().max(80).nullable(),title:K().max(200),artist:K().max(200),album:K().max(200),position:ll().min(0),duration:ll().min(0),volume:ll().min(0).max(100),muted:pl(),shuffle:pl(),repeat:J([`off`,`all`,`one`]),view:J([`mini`,`full`,`hidden`]),queue:yl(q({id:K().max(80),title:K().max(200)})).max(50),index:ll().int().min(-1),active:pl()}),ku=q({action:J([`play`,`pause`,`resume`,`toggle`,`stop`,`next`,`previous`,`seek`,`volume`,`mute`,`shuffle`,`repeat`,`view`,`queue.remove`,`queue.clear`,`jump`]),tracks:yl(Du).max(500).optional(),mode:J([`replace`,`add`,`next`,`off`,`all`,`one`]).optional(),shuffle:pl().optional(),seconds:ll().min(0).optional(),percent:ll().min(0).max(100).optional(),level:ll().min(0).max(100).optional(),delta:ll().min(-100).max(100).optional(),on:pl().optional(),view:J([`mini`,`full`,`hidden`]).optional(),index:ll().int().min(0).optional()}),Au=q({terminalLabel:K().max(24),clock:q({hour12:pl(),seconds:pl(),locale:K().max(35)}),launcher:yl(q({id:K().max(20),label:K().max(24),icon:K().max(16),action:q({type:J([`url`,`prompt`,`panel`,`music`]),value:K().max(500)})})).max(12),animations:J([`full`,`reduced`,`off`])}),ju=q({folderSet:pl(),volume:ll().min(0).max(100),shuffle:pl(),repeat:J([`off`,`all`,`one`]),visualizer:pl(),startView:J([`mini`,`full`]),output:J([`screen`,`host`]).optional()}),Mu=wl(`type`,[q({type:Y(`music.command`)}).merge(ku),q({type:Y(`music.host`),state:Ou}),q({type:Y(`stage`),command:su}),q({type:Y(`caption.delta`),text:K()}),q({type:Y(`caption.end`)}),q({type:Y(`approval.request`)}).merge(Eu),q({type:Y(`approval.resolved`),id:K()}),q({type:Y(`alert`),level:J([`info`,`warn`,`error`]),text:K()}),q({type:Y(`chat.user`),text:K()}),q({type:Y(`ui`),view:Cu,look:wu.optional(),ownerName:K().max(40).optional(),assistantName:K().max(40).optional(),hud:Au.optional(),music:ju.optional()}),q({type:Y(`activity`),text:K().max(80).nullable()}),q({type:Y(`status`),busy:pl(),deviceOnline:pl(),voiceAvailable:pl().optional(),voiceEnrolled:pl().optional(),message:K().optional()}),q({type:Y(`voice.heard`),text:K(),trust:J([`owner`,`guest`,`unverified`,`member`]).optional(),speaker:K().max(60).optional()}),q({type:Y(`voice.challenge`),id:K(),text:K()}),q({type:Y(`voice.challenge.end`),id:K()}),q({type:Y(`audio.chunk`),id:K(),seq:ll().int().min(0),last:pl(),mime:K(),data:K()}),q({type:Y(`audio.stop`)}),q({type:Y(`camera.request`),id:K()}),q({type:Y(`camera.cancel`),id:K()}),q({type:Y(`ui.open`),panel:Y(`plugins`),integration:K().max(40).optional()}),q({type:Y(`screen.request`),id:K()}),q({type:Y(`screen.cancel`),id:K()}),q({type:Y(`snapshot`),stage:cu,pendingApproval:Eu.nullable().optional()}),q({type:Y(`error`),message:K()})]),Nu=q({type:Y(`approval.respond`),id:K(),decision:J([`approve`,`deny`,`approve_always`]),pin:K().max(32).optional()});wl(`type`,[q({type:Y(`chat.send`),text:K().min(1).max(8e3)}),q({type:Y(`stage.event`),objectId:K(),event:K().max(64)}),Nu,q({type:Y(`voice.interrupt`)}),q({type:Y(`voice.confirm`),id:K(),pin:K().max(32)}),q({type:Y(`voice.cancel`),id:K()}),q({type:Y(`camera.denied`),id:K(),reason:J([`off`,`no-camera`,`permission`,`busy`])}),q({type:Y(`screen.denied`),id:K(),reason:J([`unsupported`,`failed`,`busy`])}),q({type:Y(`ui.panels`),open:yl(J([`chat`,`tasks`])).max(2)}),q({type:Y(`ui.screen`),...Tu}),q({type:Y(`stage.move`),objectId:K().max(64),rect:q({x:ll().min(0).max(1),y:ll().min(0).max(1),w:ll().min(0).max(1),h:ll().min(0).max(1)})}),q({type:Y(`stage.pin`),objectId:K().max(64),pinned:pl()}),q({type:Y(`music.state`),state:Ou}),q({type:Y(`music.remote`),command:ku}),q({type:Y(`ping`)})]),q({type:Y(`tool.exec`),id:K(),tool:K(),args:hl(),approvedOutside:pl().optional()}),wl(`type`,[q({type:Y(`tool.result`),id:K(),result:q({output:K(),truncated:pl()})}),q({type:Y(`tool.error`),id:K(),error:K()})]),q({path:K()}),q({path:K()}),q({path:K(),content:K()}),q({}),q({}),q({command:K().min(1),cwd:K().optional()}),q({city:K().min(1).max(80)}),q({plugin:K().min(1).max(40),name:K().min(1).max(40)}),q({language:J([`python`,`node`,`shell`]),code:K().min(1).max(5e4),timeoutSec:ll().int().min(1).max(60).optional()}),q({text:K().min(1).max(4e3)}),q({query:K().min(1).max(200)}),q({id:ll().int().positive()}),q({title:K().min(1).max(1e3),inMinutes:ll().int().min(1).max(525600).optional(),dueAt:K().max(40).optional(),repeat:J([`hourly`,`daily`,`weekly`]).optional()}),q({}),q({id:ll().int().positive()}),q({id:ll().int().positive()}),q({}),q({path:K().min(1).max(1e3),id:K().min(1).max(64).optional(),title:K().max(120).optional(),placement:nu.optional()}),q({}),q({}),q({id:K().min(1).max(40)}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`]).optional()}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`]),enabled:pl().optional(),accountSid:K().max(64).optional(),smsFrom:K().max(30).optional(),whatsappFrom:K().max(30).optional(),ownerNumber:K().max(30).optional()}).strict(),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`])}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`])}),q({channel:J([`telegram`,`sms`,`whatsapp`]),to:K().min(1).max(40),text:K().min(1).max(1500)}),q({channel:J([`telegram`,`whatsapp`]),to:Y(`me`),path:K().min(1).max(500),caption:K().max(1e3).optional()}).strict(),q({channel:J([`telegram`,`sms`,`whatsapp`]).optional(),unread:pl().optional(),limit:ll().int().min(1).max(20).optional()}),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({kind:J([`morning`,`close`,`custom`]).optional(),send:pl().optional()}).strict(),q({name:K().min(1).max(60),kind:J([`morning`,`close`,`custom`]),time:K().regex(/^([01]\d|2[0-3]):[0-5]\d$/),days:yl(ll().int().min(1).max(7)).min(1).max(7).optional(),channel:J([`telegram`,`whatsapp`,`sms`]),commentary:pl().optional()}).strict(),q({}).strict(),q({id:ll().int().min(1)}).strict(),q({query:K().max(200).optional(),title:K().max(200).optional(),artist:K().max(200).optional(),album:K().max(200).optional(),shuffle:pl().optional(),mode:J([`replace`,`add`,`next`]).optional(),limit:ll().int().min(1).max(500).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({action:J([`pause`,`resume`,`toggle`,`stop`,`next`,`previous`,`seek`,`volume`,`mute`,`shuffle`,`repeat`,`view`]),level:ll().min(0).max(100).optional(),delta:ll().min(-100).max(100).optional(),seconds:ll().min(0).optional(),percent:ll().min(0).max(100).optional(),on:pl().optional(),mode:J([`off`,`all`,`one`]).optional(),view:J([`mini`,`full`,`hidden`]).optional()}).strict(),q({action:J([`add`,`remove`,`clear`,`show`]),query:K().max(200).optional(),index:ll().int().min(1).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({query:K().max(200),limit:ll().int().min(1).max(15).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({}).strict(),q({url:K().max(2e3).optional(),query:K().max(200).optional(),output:J([`screen`,`host`]).optional(),start:ll().min(0).max(86400).optional(),mode:J([`embed`,`stream`]).optional()}).strict(),q({action:J([`pause`,`resume`,`stop`,`seek`,`volume`]),seconds:ll().min(0).max(86400).optional(),level:ll().min(0).max(100).optional()}).strict(),q({}).strict(),q({}),q({settings:Ol(K(),hl())}),q({style:au.optional(),accent:K().regex(/^#[0-9a-fA-F]{6}$/).optional(),intensity:ll().min(0).max(1).optional(),size:ll().min(.5).max(1.5).optional(),reactivity:ll().min(0).max(1).optional(),ambient:pl().optional(),captions:pl().optional(),captionSize:J([`small`,`medium`,`large`]).optional()}),q({view:Cu}),q({}),q({id:K().min(1).max(16),name:K().min(1).max(60),kind:J([`stdio`,`http`]),command:K().max(260).optional(),args:yl(K().max(500)).max(20).optional(),url:K().max(2e3).optional()}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({}),q({id:K().min(1).max(40),name:K().min(1).max(80),description:K().max(500).optional(),skills:yl(q({name:K().min(1).max(40),description:K().min(1).max(300),text:K().min(1).max(2e4)})).max(10).optional(),tools:yl(q({name:K().min(1).max(40),description:K().min(1).max(500),language:J([`python`,`node`,`shell`]),code:K().min(1).max(5e4),parameters:Ol(K(),q({type:J([`string`,`number`,`integer`,`boolean`]),description:K().max(300).optional(),enum:yl(K().max(100)).max(50).optional()})).optional(),required:yl(K()).optional()})).max(10).optional()}),q({}),q({id:K().min(1).max(40)}),q({id:K().min(1).max(40)}),q({id:K().min(1).max(40)}),q({mode:ru}),q({object:ou}),q({topic:J([`all`,`widgets`,`layout`,`overlay`,`theme`,`files`,`recipes`]).optional()}),q({id:K(),props:Ol(K(),hl())}),q({id:K()}),q({}),q({id:K()}),q({id:K()}),q({state:iu.optional(),style:au.optional()}),q({accent:K().max(16).optional(),intensity:ll().min(0).max(1).optional()});var Pu=new Set([`alexa`,`amazon`,`echo`,`skill`,`app`,`ask`,`tell`,`open`,`start`,`run`,`enable`,`launch`,`load`,`begin`,`use`]),Fu=50;function Iu(e){let t=e.trim().split(/\s+/).filter(Boolean);if(t.length<1)return`Enter the name you will say after "Alexa, ask".`;if(e.length>Fu)return`That is too long (at most ${Fu} characters).`;if(!/^[a-z' ]+$/.test(e))return`Use lower-case letters, spaces and apostrophes only. Spell numbers out as words.`;let n=t.find(e=>Pu.has(e));return n?`The word "${n}" cannot be in the name (it is reserved by Alexa).`:null}var Lu=[`mp3`,`m4a`,`aac`,`ogg`,`opus`,`wav`,`flac`],Ru={maxTracks:{min:100,max:5e4,def:5e3},scanDepth:{min:1,max:12,def:6},volume:{min:0,max:100,def:70},searchLimit:{min:3,max:50,def:10}},zu=[`chat`,`tasks`,`plugins`,`settings`,`music`],Bu=[`toggle`,`play`,`pause`,`next`,`previous`],Vu=[`url`,`prompt`,`panel`,`music`];function Hu(e){let t=e&&typeof e==`object`?e:null;if(!t)return`A button needs a label and an action.`;let n=typeof t.label==`string`?t.label.trim():``;if(n.length<1||n.length>24)return`A button label is 1 to 24 characters.`;let r=typeof t.icon==`string`?t.icon.trim():``;if(r.length<1||[...r].length>4)return`A button icon is 1 to 4 characters (a symbol or an emoji).`;let i=t.action&&typeof t.action==`object`?t.action:null;if(!i||!Vu.includes(i.type)||typeof i.value!=`string`)return`A button needs an action: an address, a question, a panel or a music control.`;let a=i.value.trim();switch(i.type){case`url`:if(a.length>500)return`A button address is at most 500 characters.`;try{let e=new URL(a);return e.protocol===`https:`||e.protocol===`http:`?null:`A button address must start with https:// or http://.`}catch{return`A button address must start with https:// or http://.`}case`prompt`:return a.length>=1&&a.length<=500?null:`A question for the assistant is 1 to 500 characters.`;case`panel`:return zu.includes(a)?null:`A panel is one of: ${zu.join(`, `)}.`;default:return Bu.includes(a)?null:`A music control is one of: ${Bu.join(`, `)}.`}}function Uu(e){return e===``?null:e.length>260?`That program name is too long.`:/\s/.test(e)?`Use the program's name, or a short path with no spaces (or add the program to your PATH). Arguments cannot be added here.`:e.startsWith(`-`)||!/^[A-Za-z0-9._:\\/~+-]+$/.test(e)?`A program is a name or a path made of letters, digits and . _ : / \\ ~ + - only, and cannot start with a dash.`:null}var Wu=2e3,Gu=3,Ku=e=>({queue:[],index:-1,playing:!1,position:0,duration:0,volume:e.volume,muted:!1,shuffle:e.shuffle,repeat:e.repeat,view:e.view});function qu(e,t=Math.random){let n=[...e];for(let e=n.length-1;e>0;e--){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}var Ju=(e,t,n)=>Math.min(n,Math.max(t,e)),Yu=(e,t,n)=>({...e,index:t,playing:n,position:0,duration:0});function Xu(e,t,n={}){let r=n.shuffle??qu,i=e.queue.length-1;switch(t.type){case`play`:{if(t.tracks.length===0)return e;let n=t.tracks.slice(0,Wu);if(t.mode===`replace`){let i=t.shuffle?r(n):n;return{...Yu(e,t.shuffle?0:Ju(t.start??0,0,i.length-1),!0),queue:i,shuffle:t.shuffle?!0:e.shuffle}}if(e.queue.length===0)return{...Yu(e,0,!0),queue:n};let i=t.mode===`next`?e.index+1:e.queue.length;return{...e,queue:[...e.queue.slice(0,i),...n,...e.queue.slice(i)].slice(0,Wu)}}case`next`:return i<0?e:e.index<i?Yu(e,e.index+1,!0):e.repeat===`off`?{...e,playing:!1,position:0}:Yu(e,0,!0);case`previous`:return i<0?e:e.position>Gu?{...e,position:0}:e.index>0?Yu(e,e.index-1,e.playing||!0):e.repeat===`all`?Yu(e,i,!0):{...e,position:0};case`ended`:return i<0?e:e.repeat===`one`?Yu(e,e.index,!0):e.index<i?Yu(e,e.index+1,!0):e.repeat===`all`?Yu(e,0,!0):{...e,playing:!1,position:0};case`failed`:return i<0?e:e.index<i?Yu(e,e.index+1,!0):{...e,playing:!1,position:0};case`pause`:return e.playing?{...e,playing:!1}:e;case`resume`:return e.index>=0&&!e.playing?{...e,playing:!0}:e;case`toggle`:return e.index<0?e:{...e,playing:!e.playing};case`stop`:return{...e,playing:!1,position:0};case`volume`:{let n=typeof t.level==`number`?Math.round(t.level):typeof t.delta==`number`?e.volume+Math.round(t.delta):e.volume;return{...e,volume:Ju(n,0,100),muted:typeof t.level==`number`||(t.delta??0)>0?!1:e.muted}}case`mute`:return{...e,muted:t.on??!e.muted};case`seek`:{let n=typeof t.seconds==`number`?t.seconds:typeof t.percent==`number`?e.duration*Ju(t.percent,0,100)/100:e.position;return{...e,position:Ju(n,0,e.duration>0?e.duration:Math.max(n,0))}}case`repeat`:return{...e,repeat:t.mode};case`shuffle`:{if(!(t.on??!e.shuffle))return{...e,shuffle:!1};let n=e.queue.slice(0,e.index+1);return{...e,shuffle:!0,queue:[...n,...r(e.queue.slice(e.index+1))]}}case`view`:return{...e,view:t.view};case`remove`:{if(!Number.isInteger(t.index)||t.index<0||t.index>i)return e;let n=e.queue.filter((e,n)=>n!==t.index);return n.length===0?{...e,queue:n,index:-1,playing:!1,position:0,duration:0}:t.index<e.index?{...e,queue:n,index:e.index-1}:t.index>e.index?{...e,queue:n}:t.index<n.length?{...Yu(e,t.index,e.playing),queue:n}:e.repeat===`all`?{...Yu(e,0,e.playing),queue:n}:{...e,queue:n,index:n.length-1,playing:!1,position:0}}case`clear`:return{...e,queue:[],index:-1,playing:!1,position:0,duration:0};case`jump`:return Number.isInteger(t.index)&&t.index>=0&&t.index<=i?Yu(e,t.index,!0):e;case`time`:return{...e,position:Math.max(0,t.position),duration:Math.max(0,t.duration)}}}function Zu(e){switch(e.action){case`play`:return{type:`play`,tracks:e.tracks??[],mode:e.mode===`add`||e.mode===`next`?e.mode:`replace`,...e.shuffle?{shuffle:!0}:{},...e.index===void 0?{}:{start:e.index}};case`pause`:case`resume`:case`toggle`:case`stop`:case`next`:case`previous`:return{type:e.action};case`seek`:return{type:`seek`,...e.seconds===void 0?{}:{seconds:e.seconds},...e.percent===void 0?{}:{percent:e.percent}};case`volume`:return{type:`volume`,...e.level===void 0?{}:{level:e.level},...e.delta===void 0?{}:{delta:e.delta}};case`mute`:return{type:`mute`,...e.on===void 0?{}:{on:e.on}};case`shuffle`:return{type:`shuffle`,...e.on===void 0?{}:{on:e.on}};case`repeat`:return e.mode===`off`||e.mode===`all`||e.mode===`one`?{type:`repeat`,mode:e.mode}:null;case`view`:return e.view?{type:`view`,view:e.view}:null;case`queue.remove`:return e.index===void 0?null:{type:`remove`,index:e.index};case`queue.clear`:return{type:`clear`};case`jump`:return e.index===void 0?null:{type:`jump`,index:e.index};default:return null}}function Qu(e){switch(e.type){case`play`:return{action:`play`,tracks:e.tracks,mode:e.mode,...e.shuffle?{shuffle:!0}:{},...e.start===void 0?{}:{index:e.start}};case`next`:case`previous`:case`pause`:case`resume`:case`toggle`:case`stop`:return{action:e.type};case`volume`:return{action:`volume`,...e.level===void 0?{}:{level:e.level},...e.delta===void 0?{}:{delta:e.delta}};case`mute`:return{action:`mute`,...e.on===void 0?{}:{on:e.on}};case`seek`:return{action:`seek`,...e.seconds===void 0?{}:{seconds:e.seconds},...e.percent===void 0?{}:{percent:e.percent}};case`repeat`:return{action:`repeat`,mode:e.mode};case`shuffle`:return{action:`shuffle`,...e.on===void 0?{}:{on:e.on}};case`view`:return{action:`view`,view:e.view};case`remove`:return{action:`queue.remove`,index:e.index};case`clear`:return{action:`queue.clear`};case`jump`:return{action:`jump`,index:e.index};default:return null}}function $u({label:e,value:t,onChange:n,min:r,max:i,step:a}){let[o,s]=(0,l.useState)(String(t));return(0,l.useEffect)(()=>{s(e=>Number(e)===t?e:String(t))},[t]),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:e}),(0,p.jsx)(`input`,{type:`number`,min:r,max:i,step:a,value:o,onChange:e=>{s(e.target.value),e.target.value.trim()!==``&&Number.isFinite(Number(e.target.value))&&n(Number(e.target.value))},onBlur:()=>s(String(t)),style:d})]})}async function ed(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:`The request failed (${n.status}).`));return r}var td={status:()=>ed(`/api/alexa`),allow:async(e,t)=>void await ed(`/api/alexa/devices/allow`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,pin:t})}),forget:async e=>void await ed(`/api/alexa/devices/${encodeURIComponent(e)}`,{method:`DELETE`})},nd=/^amzn1\.ask\.skill\.[A-Za-z0-9-]{8,80}$/;function rd(e){return e.skillId.trim()&&!nd.test(e.skillId.trim())?`A skill ID looks like amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (copy it from the console).`:e.invocationName.trim()?Iu(e.invocationName):null}var id={"skill.json":`the skill's manifest (name, endpoint)`,"en-IN.json":`the English (India) interaction model`,"hi-IN.json":`the Hindi (India) interaction model`},ad={"en-IN":`English (India)`,"hi-IN":`Hindi (India)`},od=e=>{let t=Math.max(0,Math.round((Date.now()-e)/6e4));return t<1?`just now`:t<60?`${t} min ago`:`${Math.round(t/60)} h ago`};function sd({view:e,setView:t,api:n=td}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(null),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(!1),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>n.status().then(e=>v.current&&i(e)).catch(()=>{}),[n]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async e=>{_(!0),f(null);try{await e()}catch(e){v.current&&f(e.message)}finally{v.current&&_(!1)}},x=rd(e),S=r?.invocationName||e.invocationName,C=!!r?.endpoint&&!!r.invocationName;return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend talks to a skill of your own on Alexa. It is free: the skill stays in development mode in your own Amazon developer account and is never published, and only the Echo devices you allow can use it. Alexa can look things up and answer; anything that changes something is refused, or sent to your phone for a yes.`}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`In the Alexa developer console`}),r&&r.endpoint?(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Endpoint to paste (HTTPS, "My development endpoint has a certificate from a trusted certificate authority"): `,(0,p.jsx)(`code`,{children:r.endpoint}),` `,(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{navigator.clipboard?.writeText(r.endpoint).then(()=>h(!0),()=>{})},children:m?`Copied`:`Copy`})]}):r&&(0,p.jsx)(`p`,{className:`auth-note`,children:`No public address is set yet, so Amazon cannot reach Friend (friend config set publicUrl https://…).`}),(0,p.jsx)(`p`,{className:`auth-note`,children:`If your address changes later, paste the new address into the console again. Nothing else needs to change.`}),C?(0,p.jsx)(`ul`,{className:`plugins-list`,children:r.files.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`a`,{href:`/api/alexa/package/${e}`,download:e,children:e}),` `,(0,p.jsx)(`small`,{className:`auth-note`,children:id[e]??``})]},e))}):r&&r.endpoint&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Save an invocation name first; the files are made with it.`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Skill ID`}),(0,p.jsx)(`input`,{value:e.skillId,autoComplete:`off`,onChange:n=>t({...e,skillId:n.target.value}),placeholder:`amzn1.ask.skill.…`,style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Invocation name`}),(0,p.jsx)(`input`,{value:e.invocationName,autoComplete:`off`,onChange:n=>t({...e,invocationName:n.target.value}),placeholder:`jarvis assistant`,style:d})]}),x&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:x}),(0,p.jsxs)(`details`,{children:[(0,p.jsx)(`summary`,{className:`plugins-heading`,children:`Advanced`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Skill name`}),(0,p.jsx)(`input`,{value:e.skillName,onChange:n=>t({...e,skillName:n.target.value}),style:d})]}),(0,p.jsx)(`div`,{className:`settings-field`,role:`group`,"aria-label":`Languages`,children:Object.entries(ad).map(([n,r])=>(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.locales.includes(n),onChange:r=>{let i=r.target.checked?[...e.locales,n]:e.locales.filter(e=>e!==n);i.length>0&&t({...e,locales:Object.keys(ad).filter(e=>i.includes(e))})}}),(0,p.jsx)(`span`,{children:r})]},n))}),(0,p.jsx)($u,{label:`Seconds to work on an answer`,value:e.answerSeconds,min:2,max:7.5,step:.5,onChange:n=>t({...e,answerSeconds:n})}),(0,p.jsx)($u,{label:`Minutes to keep a late answer`,value:e.holdMinutes,min:1,max:60,onChange:n=>t({...e,holdMinutes:n})}),(0,p.jsx)($u,{label:`Seconds to wait for your yes on your phone`,value:e.permissionSeconds,min:30,max:600,onChange:n=>t({...e,permissionSeconds:n})}),(0,p.jsx)($u,{label:`Requests a minute allowed`,value:e.requestsPerMinute,min:10,max:600,onChange:n=>t({...e,requestsPerMinute:n})}),(0,p.jsx)($u,{label:`Echo devices allowed`,value:e.maxDevices,min:1,max:50,onChange:n=>t({...e,maxDevices:n})}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Extra tools a voice may use without asking (one per line)`}),(0,p.jsx)(`textarea`,{rows:2,value:e.extraVoiceTools.join(`
|
|
65
|
+
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}r.count>1&&e.reused===`ref`&&a(n)}e.external&&(e.sharedDefsExtractedFor=e.external)}function bs(e){let t=e.anyOf;if(!Array.isArray(t)||t.length===0||e.type!==void 0)return;let n=[];for(let e of t){if(!e||typeof e!=`object`)return;bs(e);let t=Object.keys(e);if(t.length!==1||t[0]!==`type`)return;let r=e.type;for(let e of Array.isArray(r)?r:[r]){if(typeof e!=`string`)return;n.includes(e)||n.push(e)}}delete e.anyOf,e.type=n.length===1?n[0]:n}var xs=new Set([`type`,`properties`,`required`,`additionalProperties`]),Ss=[`oneOf`,`anyOf`];function Cs(e){let t=e.additionalProperties;return t===void 0||t===!1||typeof t!=`object`||!t?null:Object.keys(t).length?t:null}function ws(e){let t=[];for(let n of e){if(typeof n!=`object`||n.type!==`object`)return null;for(let e in n)if(!xs.has(e))return null;t.push(n)}let n={},r=new Set;for(let e of t){for(let r in e.properties){if(Object.prototype.hasOwnProperty.call(n,r))continue;let e=[];for(let n of t){let t=n.properties?.[r]??Cs(n);t!=null&&(e.some(e=>JSON.stringify(e)===JSON.stringify(t))||e.push(t))}Et(n,r,e.length===1?e[0]:ws(e)??{allOf:e})}for(let t of e.required??[])r.add(t)}let i={type:`object`,properties:n};if(r.size&&(i.required=[...r]),t.every(e=>e.additionalProperties===!1))i.additionalProperties=!1;else{let e=[];for(let n of t){let t=Cs(n);t&&!e.some(e=>JSON.stringify(e)===JSON.stringify(t))&&e.push(t)}e.length===1?i.additionalProperties=e[0]:e.length>1&&(i.additionalProperties={allOf:e})}return i}function Ts(e){let t=e.allOf;if(!Array.isArray(t)||t.length<2)return;for(let t of xs)if(t in e)return;let n=t.filter(e=>Ss.some(t=>Array.isArray(e[t]))),r=null;if(!n.length)r=ws(t);else{let e=n[0],i=Ss.find(t=>Array.isArray(e[t]));if(Object.keys(e).length!==1)return;let a=t.filter(t=>t!==e),o=e[i].map(e=>ws([...a,e]));if(o.some(e=>!e))return;r={[i]:o}}r&&(delete e.allOf,ms(e,r))}function Es(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):ms(i,s),ms(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};if(!e.external||e.sharedEmitDoneFor!==e.external){for(let t of[...e.seen.entries()].reverse())r(t[0]);if(e.target!==`openapi-3.0`)for(let t of e.seen.entries())bs(t[1].def??t[1].schema);for(let t of e.deferred)t();if(e.intersections.length){let t=new Map;for(let n of e.seen.values())for(let e of[n.schema,n.def]){let n=e?.allOf;if(!Array.isArray(n))continue;let r=t.get(n);r?r.push(e):t.set(n,[e])}for(let n of e.intersections)for(let e of t.get(n)??[])Ts(e)}}let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}ms(i,n.defId?n.schema:n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};if(!e.external||e.sharedEmitDoneFor!==e.external)for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,Et(o,e.defId,e.def))}e.external&&(e.sharedEmitDoneFor=e.external),e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:ks(t,`input`,e.processors),output:ks(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Ds(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Ds(r.element,n);if(r.type===`set`)return Ds(r.valueType,n);if(r.type===`lazy`)return Ds(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`||r.type===`catch`)return Ds(r.innerType,n);if(r.type===`intersection`)return Ds(r.left,n)||Ds(r.right,n);if(r.type===`record`||r.type===`map`)return Ds(r.keyType,n)||Ds(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:Ds(r.in,n)||Ds(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Ds(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Ds(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Ds(e,n))return!0;return!!(r.rest&&Ds(r.rest,n))}return!1}var Os=(e,t={})=>n=>{let r=hs({...n,processors:t});return _s(e,r),ys(r,e),Es(r,e)},ks=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=hs({...i??{},target:a,io:t,processors:n});return _s(e,o),ys(o,e),Es(o,e)},As=(e,t,n)=>{(e[t]===void 0||n>e[t])&&(e[t]=n)},js=(e,t,n)=>{(e[t]===void 0||n<e[t])&&(e[t]=n)},Ms=(e,t)=>{As(e,`minimum`,t),js(e,`maximum`,t)},Ns=(e,t)=>{e.multipleOf??=[],e.multipleOf.includes(t)||e.multipleOf.push(t)},Ps=(e,t)=>{e.patterns??=new Set,e.patterns.add(t)},Fs=(e,t)=>{e.mime=e.mime?e.mime.filter(e=>t.includes(e)):[...t]},Is=(e,t)=>{e.format=t,t.includes(`int`)&&(e.isInt=!0)},Ls=(e,t)=>As(e,`minimum`,t.minimum),Rs=(e,t)=>js(e,`maximum`,t.maximum),zs=e=>(t,n)=>{Is(t,n.format);let[r,i]=e[n.format];As(t,`minimum`,r),js(t,`maximum`,i)},Bs={greater_than:(e,t)=>As(e,t.inclusive?`minimum`:`exclusiveMinimum`,t.value),less_than:(e,t)=>js(e,t.inclusive?`maximum`:`exclusiveMaximum`,t.value),multiple_of:(e,t)=>Ns(e,t.value),number_format:zs(Kt),bigint_format:zs(qt),min_length:Ls,max_length:Rs,length_equals:(e,t)=>Ms(e,t.length),min_size:Ls,max_size:Rs,size_equals:(e,t)=>Ms(e,t.size),string_format:(e,t)=>{Is(e,t.format),t.pattern&&Ps(e,t.pattern),(t.format===`base64`||t.format===`base64url`)&&(e.contentEncoding=t.format),(t.local||t.precision===-1)&&(e.laxFormat=!0)},mime_type:(e,t)=>Fs(e,t.mime)};function Vs(e){let t={},n=e._zod.def,r=e._zod.traits.has(`$ZodCheck`)?[e,...n.checks??[]]:n.checks??[];for(let e of r)Bs[e._zod.def.check]?.(t,e._zod.def);let i=e._zod.bag;i.minimum!==void 0&&As(t,`minimum`,i.minimum),i.exclusiveMinimum!==void 0&&As(t,`exclusiveMinimum`,i.exclusiveMinimum),i.maximum!==void 0&&js(t,`maximum`,i.maximum),i.exclusiveMaximum!==void 0&&js(t,`exclusiveMaximum`,i.exclusiveMaximum),i.multipleOf!==void 0&&Ns(t,i.multipleOf),i.format!==void 0&&(t.format??=i.format,i.format.includes(`int`)&&(t.isInt=!0)),i.mime&&Fs(t,i.mime);for(let e of i.patterns??[])Ps(t,e);return t}var Hs={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Us=new Map([[Ki,Or],[Ji,kr]]),Ws=e=>Us.get(e)??e,Gs=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l,laxFormat:u}=Vs(e);if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Hs[s]??s,i.format===``&&delete i.format,(s===`time`||u)&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c].map(Ws);e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},Ks=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,multipleOf:s,exclusiveMaximum:c,exclusiveMinimum:l,isInt:u}=Vs(e);i.type=u?`integer`:`number`;let d=typeof l==`number`&&l>=(a??-1/0),f=typeof c==`number`&&c<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;if(d?p?(i.minimum=l,i.exclusiveMinimum=!0):i.exclusiveMinimum=l:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=c,i.exclusiveMaximum=!0):i.exclusiveMaximum=c:typeof o==`number`&&(i.maximum=o),s){let n=new Set;for(let a of s)Number.isFinite(a)&&a!==0?n.add(Math.abs(a)):gs(e,t,i,r,`A multipleOf divisor of ${a} cannot be represented in JSON Schema`);let[a,...o]=n;a!==void 0&&(i.multipleOf=a),o.length&&(i.allOf=[...i.allOf??[],...o.map(e=>({multipleOf:e}))])}},qs=(e,t,n,r)=>{n.type=`boolean`},Js=(e,t,n,r)=>{n.not={}},Ys=(e,t,n,r)=>{let i=e._zod.def,a=vt(i.entries);if(a.length===0){n.not={};return}a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Xs=(e,t,n,r)=>{let i=e._zod.def;if(i.values.length===0){n.not={};return}let a=[];for(let o of i.values)if(o===void 0){if(gs(e,t,n,r,"Literal `undefined` cannot be represented in JSON Schema"))return}else if(typeof o==`bigint`){if(gs(e,t,n,r,`BigInt literals cannot be represented in JSON Schema`))return;a.push(Number(o))}else a.push(o);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},Zs=(e,t,n,r)=>{gs(e,t,n,r,`Custom types cannot be represented in JSON Schema`)},Qs=(e,t,n,r)=>{gs(e,t,n,r,`Transforms cannot be represented in JSON Schema`)},$s=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=Vs(e);typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=_s(a.element,t,{...r,path:[...r.path,`items`]})};function ec(e){let t=e._zod.def;return t.type===`pipe`&&t.in._zod.traits.has(`$ZodTransform`)?ec(t.out):t.type===`catch`?ec(t.innerType):e._zod.optin}var tc=(e,t,n,r)=>{let i=n,a=e._zod.def,o=a.shape;if(Object.getOwnPropertySymbols(o).length&&gs(e,t,i,r,`Symbol keys cannot be represented in JSON Schema`))return;i.type=`object`,i.properties={};for(let e in o)Et(i.properties,e,_s(o[e],t,{...r,path:[...r.path,`properties`,e]}));let s=[];for(let e of Object.keys(o)){let n=a.shape[e];(t.io===`input`?ec(n)===void 0:n._zod.optout===void 0)&&s.push(e)}s.length>0&&(i.required=s),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=_s(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},nc=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>_s(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},rc=(e,t,n,r)=>{let i=e._zod.def,a=_s(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=_s(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1,c=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]];n.allOf=c,t.intersections.push(c)};function ic(e,t,n){if(t.$ref){if(n.has(t))return t;n.add(t);let r=e.get(t)?.def;if(!r)return t;let i=ic(e,r,n);return i===r?t:i}for(let r of[`anyOf`,`oneOf`]){let i=t[r];if(!Array.isArray(i))continue;let a=i.map(t=>ic(e,t,n));a.some((e,t)=>e!==i[t])&&(t={...t,[r]:a})}let r=Array.isArray(t.type)?t.type:[t.type],i=!r.includes(`string`)&&r.some(e=>e===`number`||e===`integer`),a=t.enum??(t.const===void 0?void 0:[t.const]);if(!i&&!a?.some(e=>typeof e==`number`))return t;let{minimum:o,maximum:s,exclusiveMinimum:c,exclusiveMaximum:l,multipleOf:u,format:d,id:f,...p}=t;return p.enum?p.enum=p.enum.map(e=>typeof e==`number`?String(e):e):typeof p.const==`number`&&(p.const=String(p.const)),i?(p.type=`string`,a||(p.pattern=(r.includes(`number`)?Br:zr).source),p):p}var ac=new WeakMap;function oc(e){let t=new Map;for(let n of e.seen.values())n.def&&!t.has(n.schema)&&t.set(n.schema,n);let n=new Map;for(let r of ac.get(e)??[]){let i=e.seen.get(r),a=(i?.def??i?.schema)?.propertyNames;if(!a||a===!0||n.has(a))continue;let o=ic(t,a,new Set);o!==a&&n.set(a,o)}if(n.size)for(let t of e.seen.values())for(let e of[t.schema,t.def]){let t=e&&n.get(e.propertyNames);t&&(e.propertyNames=t)}}var sc=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=Vs(o).patterns;if(a.mode===`loose`&&s&&s.size>0){let e=_s(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)Et(i.patternProperties,Ws(t).source,e)}else{if(t.target===`draft-07`||t.target===`draft-2020-12`){i.propertyNames=_s(a.keyType,t,{...r,path:[...r.path,`propertyNames`]});let n=ac.get(t);n||(n=[],ac.set(t,n),t.deferred.push(()=>oc(t))),n.push(e)}i.additionalProperties=_s(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]})}let c=o._zod.values,l=t.io===`input`&&ec(a.valueType)!==void 0;if(c&&!a.partial&&!l){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e.map(String))}},cc=(e,t,n,r)=>{let i=e._zod.def,a=_s(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},lc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},uc=Symbol();function dc(e,t,n,r,i){let a=!1,o=JSON.stringify(e,(e,t)=>typeof t==`bigint`?(a=!0,null):t);return a?(gs(t,n,r,i,`BigInt defaults cannot be represented in JSON Schema`),uc):JSON.parse(o)}var fc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o=dc(i.defaultValue,e,t,n,r);o!==uc&&(n.default=o)},pc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);if(a.ref=i.innerType,t.io!==`input`)return;let o=dc(i.defaultValue,e,t,n,r);o!==uc&&(n._prefault=o)},mc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{gs(e,t,n,r,`Dynamic catch values are not supported in JSON Schema`);return}n.default=o},hc=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;_s(o,t,r);let s=t.seen.get(e);s.ref=o},gc=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},_c=(e,t,n,r)=>{let i=e._zod.def;_s(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},vc=new WeakSet([Object.prototype,Error.prototype]);function yc(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,get(){let e=n(this);return Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0})}})}var bc=G(`ZodError`,(e,t)=>{Hn.init(e,t),e.name=`ZodError`;let n=Object.getPrototypeOf(e);vc.has(n)||(vc.add(n),yc(n,`format`,e=>t=>Gn(e,t)),yc(n,`flatten`,e=>t=>Wn(e,t)),yc(n,`addIssue`,e=>t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,bt,2)}),yc(n,`addIssues`,e=>t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,bt,2)}),Object.defineProperty(n,"isEmpty",{configurable:!0,enumerable:!1,get(){return this.issues.length===0}}))},void 0,{Parent:Error}),xc=qn(bc),Sc=Jn(bc),Cc=Yn(bc),wc=Zn(bc),Tc=rr(bc),Ec=ir(bc),Dc=ar(bc),Oc=or(bc),kc=sr(bc),Ac=cr(bc),jc=lr(bc),Mc=ur(bc);function Nc(){Pn.localeError||Fn(ao())}function Pc(){Pn.memoizer||Fn({memoizer:no()})}var Fc=G(`ZodType`,(e,t)=>(Nc(),ui.init(e,t),e.def=t,e.type=t.type,e),{check(...e){let t=this.def;return this.clone(Nt(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return Ut(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(Ql(e,t))},superRefine(e,t){return this.check($l(e,t))},overwrite(e){return this.check(is(e))},optional(){return Pl(this)},exactOptional(){return Il(this)},nullable(){return Rl(this)},nullish(){return Pl(Rl(this))},nonoptional(e){return Wl(this,e)},array(){return yl(this)},or(e){return Sl([this,e])},and(e){return El(this,e)},transform(e){return Jl(this,Ml(e))},default(e){return Bl(this,e)},prefault(e){return Hl(this,e)},catch(e){return Kl(this,e)},pipe(e){return Jl(this,e)},readonly(){return Xl(this)},describe(e){let t=this.clone();return lo.add(t,{description:e}),t},meta(...e){if(e.length===0)return lo.get(this);let t=this.clone();return lo.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e,...t){return t.length===0?e(this):e(this,...t)},get"~standard"(){return _n(this,`~standard`,{...pi(this),jsonSchema:{input:ks(this,`input`),output:ks(this,`output`)}})},set"~standard"(e){gn(this,`~standard`,e)},parse:function e(t,n){return xc(this,t,n,{callee:e})},parseAsync:async function e(t,n){return await Sc(this,t,n,{callee:e})},safeParse(e,t){return Cc(this,e,t)},async safeParseAsync(e,t){return wc(this,e,t)},get spa(){return this?.safeParseAsync},set spa(e){gn(this,`spa`,e)},validate(e,t){return er(this,e,t)},validateAsync(e,t){return nr(this,e,t)},encode:function e(t,n){return Tc(this,t,n,{callee:e})},decode:function e(t,n){return Ec(this,t,n,{callee:e})},encodeAsync:async function e(t,n){return await Dc(this,t,n,{callee:e})},decodeAsync:async function e(t,n){return await Oc(this,t,n,{callee:e})},safeEncode(e,t){return kc(this,e,t)},safeDecode(e,t){return Ac(this,e,t)},async safeEncodeAsync(e,t){return jc(this,e,t)},async safeDecodeAsync(e,t){return Mc(this,e,t)},toJSONSchema(e){return Os(this,{})(e)},get description(){return lo.get(this)?.description},get _def(){return this._zod.def}}),Ic=G(`_ZodString`,(e,t)=>{mi.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gs(e,t,n,r)},vn({format:e=>Vs(e).format??null,minLength:e=>Vs(e).minimum??null,maxLength:e=>Vs(e).maximum??null},{regex(...e){return this.check(Qo(...e))},includes(...e){return this.check(ts(...e))},startsWith(...e){return this.check(ns(...e))},endsWith(...e){return this.check(rs(...e))},min(...e){return this.check(Xo(...e))},max(...e){return this.check(Yo(...e))},length(...e){return this.check(Zo(...e))},nonempty(...e){return this.check(Xo(1,...e))},lowercase(e){return this.check($o(e))},uppercase(e){return this.check(es(e))},trim(){return this.check(os())},normalize(...e){return this.check(as(...e))},toLowerCase(){return this.check(ss())},toUpperCase(){return this.check(cs())},slugify(){return this.check(ls())}})),Lc=G(`ZodString`,(e,t)=>{mi.init(e,t),Ic.init(e,t)},{email(e){return this.check(po(Uc,e))},url(e){return this.check(yo(Kc,e))},jwt(e){return this.check(Po(sl,e))},emoji(e){return this.check(bo(qc,e))},guid(e){return this.check(mo(Wc,e))},uuid(e){return this.check(ho(Gc,e))},uuidv4(e){return this.check(go(Gc,e))},uuidv6(e){return this.check(_o(Gc,e))},uuidv7(e){return this.check(vo(Gc,e))},nanoid(e){return this.check(xo(Jc,e))},cuid(e){return this.check(So(Yc,e))},cuid2(e){return this.check(Co(Xc,e))},ulid(e){return this.check(wo(Zc,e))},base64(e){return this.check(jo(il,e))},base64url(e){return this.check(Mo(al,e))},xid(e){return this.check(To(Qc,e))},ksuid(e){return this.check(Eo($c,e))},ipv4(e){return this.check(Do(el,e))},ipv6(e){return this.check(Oo(tl,e))},cidrv4(e){return this.check(ko(nl,e))},cidrv6(e){return this.check(Ao(rl,e))},e164(e){return this.check(No(ol,e))},datetime(e){return this.check(Fo(zc,e))},date(e){return this.check(Io(Bc,e))},time(e){return this.check(Lo(Vc,e))},duration(e){return this.check(Ro(Hc,e))}});function K(e){return fo(Lc,e)}var Rc=G(`ZodStringFormat`,(e,t)=>{hi.init(e,t),Ic.init(e,t)}),zc=G(`ZodISODateTime`,(e,t)=>{Pi.init(e,t),Rc.init(e,t)}),Bc=G(`ZodISODate`,(e,t)=>{Fi.init(e,t),Rc.init(e,t)}),Vc=G(`ZodISOTime`,(e,t)=>{Ii.init(e,t),Rc.init(e,t)}),Hc=G(`ZodISODuration`,(e,t)=>{Li.init(e,t),Rc.init(e,t)}),Uc=G(`ZodEmail`,(e,t)=>{vi.init(e,t),Rc.init(e,t)}),Wc=G(`ZodGUID`,(e,t)=>{gi.init(e,t),Rc.init(e,t)}),Gc=G(`ZodUUID`,(e,t)=>{_i.init(e,t),Rc.init(e,t)}),Kc=G(`ZodURL`,(e,t)=>{Ei.init(e,t),Rc.init(e,t)}),qc=G(`ZodEmoji`,(e,t)=>{Di.init(e,t),Rc.init(e,t)}),Jc=G(`ZodNanoID`,(e,t)=>{Oi.init(e,t),Rc.init(e,t)}),Yc=G(`ZodCUID`,(e,t)=>{ki.init(e,t),Rc.init(e,t)}),Xc=G(`ZodCUID2`,(e,t)=>{Ai.init(e,t),Rc.init(e,t)}),Zc=G(`ZodULID`,(e,t)=>{ji.init(e,t),Rc.init(e,t)}),Qc=G(`ZodXID`,(e,t)=>{Mi.init(e,t),Rc.init(e,t)}),$c=G(`ZodKSUID`,(e,t)=>{Ni.init(e,t),Rc.init(e,t)}),el=G(`ZodIPv4`,(e,t)=>{Ri.init(e,t),Rc.init(e,t)}),tl=G(`ZodIPv6`,(e,t)=>{Vi.init(e,t),Rc.init(e,t)}),nl=G(`ZodCIDRv4`,(e,t)=>{Hi.init(e,t),Rc.init(e,t)}),rl=G(`ZodCIDRv6`,(e,t)=>{Wi.init(e,t),Rc.init(e,t)}),il=G(`ZodBase64`,(e,t)=>{qi.init(e,t),Rc.init(e,t)}),al=G(`ZodBase64URL`,(e,t)=>{Xi.init(e,t),Rc.init(e,t)}),ol=G(`ZodE164`,(e,t)=>{Zi.init(e,t),Rc.init(e,t)}),sl=G(`ZodJWT`,(e,t)=>{$i.init(e,t),Rc.init(e,t)}),cl=G(`ZodNumber`,(e,t)=>{ea.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ks(e,t,n,r),e.isFinite=!0},vn({minValue:e=>{let{minimum:t,exclusiveMinimum:n}=Vs(e);return Math.max(t??-1/0,n??-1/0)},maxValue:e=>{let{maximum:t,exclusiveMaximum:n}=Vs(e);return Math.min(t??1/0,n??1/0)},isInt:e=>{let{isInt:t,multipleOf:n}=Vs(e);return!!t||!!n?.some(Number.isSafeInteger)},format:e=>Vs(e).format??null},{gt(e,t){return this.check(Ko(e,t))},gte(e,t){return this.check(qo(e,t))},min(e,t){return this.check(qo(e,t))},lt(e,t){return this.check(Wo(e,t))},lte(e,t){return this.check(Go(e,t))},max(e,t){return this.check(Go(e,t))},int(e){return this.check(dl(e))},safe(e){return this.check(dl(e))},positive(e){return this.check(Ko(0,e))},nonnegative(e){return this.check(qo(0,e))},negative(e){return this.check(Wo(0,e))},nonpositive(e){return this.check(Go(0,e))},multipleOf(e,t){return this.check(Jo(e,t))},step(e,t){return this.check(Jo(e,t))},finite(){return this}}));function ll(e){return zo(cl,e)}var ul=G(`ZodNumberFormat`,(e,t)=>{ta.init(e,t),cl.init(e,t)});function dl(e){return Bo(ul,e)}var fl=G(`ZodBoolean`,(e,t)=>{na.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qs(e,t,n,r)});function pl(e){return Vo(fl,e)}var ml=G(`ZodUnknown`,(e,t)=>{ra.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function hl(){return Ho(ml)}var gl=G(`ZodNever`,(e,t)=>{ia.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Js(e,t,n,r)});function _l(e){return Uo(gl,e)}var vl=G(`ZodArray`,(e,t)=>{Pc(),oa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$s(e,t,n,r),e.element=t.element},{min(e,t){return this.check(Xo(e,t))},nonempty(e){return this.check(Xo(1,e))},max(e,t){return this.check(Yo(e,t))},length(e,t){return this.check(Zo(e,t))},unwrap(){return this.element}});function yl(e,t){return us(vl,e,t)}var bl=G(`ZodObject`,(e,t)=>{Pc(),fa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>tc(e,t,n,r),Tn(e,`shape`,e=>e._zod.def.shape,!1)},{keyof(){return J(Object.keys(this._zod.def.shape))},catchall(e){return this.clone(Nt(this._zod.def,{catchall:e}))},passthrough(){return this.clone(Nt(this._zod.def,{catchall:hl()}))},loose(){return this.clone(Nt(this._zod.def,{catchall:hl()}))},strict(){return this.clone(Nt(this._zod.def,{catchall:_l()}))},strip(){return this.clone(Nt(this._zod.def,{catchall:void 0}))},extend(e){return Zt(this,e)},safeExtend(e){return $t(this,e)},merge(e){return en(this,e)},pick(e){return Jt(this,e)},omit(e){return Xt(this,e)},partial(...e){return tn(Nl,this,e[0])},exactPartial(...e){return tn(Fl,this,e[0],`exactPartial`)},required(...e){return nn(Ul,this,e[0])}});function q(e,t){return new bl({type:`object`,shape:e??{},...W(t)})}var xl=G(`ZodUnion`,(e,t)=>{ma.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>nc(e,t,n,r),e.options=t.options});function Sl(e,t){return new xl({type:`union`,options:e,...W(t)})}var Cl=G(`ZodDiscriminatedUnion`,(e,t)=>{xl.init(e,t),ga.init(e,t)});function wl(e,t,n){return new Cl({type:`union`,options:t,discriminator:e,...W(n)})}var Tl=G(`ZodIntersection`,(e,t)=>{_a.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>rc(e,t,n,r)});function El(e,t){return new Tl({type:`intersection`,left:e,right:t})}var Dl=G(`ZodRecord`,(e,t)=>{Pc(),ba.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>sc(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function Ol(e,t,n){return!t||!t._zod?new Dl({type:`record`,keyType:K(),valueType:e,...W(t)}):new Dl({type:`record`,keyType:e,valueType:t,...W(n)})}var kl=G(`ZodEnum`,(e,t)=>{xa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ys(e,t,n,r),e.enum=t.entries,e.options=[...e._zod.values];let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new kl({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new kl({...t,checks:[],...W(r),entries:i})}});function J(e,t){return new kl({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}var Al=G(`ZodLiteral`,(e,t)=>{Sa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xs(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function Y(e,t){return new Al({type:`literal`,values:Array.isArray(e)?e:[e],...W(t)})}var jl=G(`ZodTransform`,(e,t)=>{Pc(),Ca.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qs(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Nn(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(mn(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,`input`in t||(t.input=n.value),t.inst??=e,n.issues.push(mn(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Ml(e){return new jl({type:`transform`,transform:e})}var Nl=G(`ZodOptional`,(e,t)=>{Ta.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_c(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Pl(e){return new Nl({type:`optional`,innerType:e})}var Fl=G(`ZodExactOptional`,(e,t)=>{Ea.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_c(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Il(e){return new Fl({type:`optional`,innerType:e})}var Ll=G(`ZodNullable`,(e,t)=>{Da.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>cc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Rl(e){return new Ll({type:`nullable`,innerType:e})}var zl=G(`ZodDefault`,(e,t)=>{Oa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Bl(e,t){return new zl({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Bt(t)}})}var Vl=G(`ZodPrefault`,(e,t)=>{Aa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Hl(e,t){return new Vl({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Bt(t)}})}var Ul=G(`ZodNonOptional`,(e,t)=>{ja.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>lc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Wl(e,t){return new Ul({type:`nonoptional`,innerType:e,...W(t)})}var Gl=G(`ZodCatch`,(e,t)=>{Pa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Kl(e,t){return new Gl({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:Dn(t)})}var ql=G(`ZodPipe`,(e,t)=>{Fa.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hc(e,t,n,r),e.in=t.in,e.out=t.out});function Jl(e,t){return new ql({type:`pipe`,in:e,out:t})}var Yl=G(`ZodReadonly`,(e,t)=>{La.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gc(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Xl(e){return new Yl({type:`readonly`,innerType:e})}var Zl=G(`ZodCustom`,(e,t)=>{za.init(e,t),Fc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zs(e,t,n,r)});function Ql(e,t={}){return ds(Zl,e,t)}function $l(e,t){return fs(e,t)}var eu=J([`T0`,`T1`,`T2`,`T3`]);J([`owner`,`guest`,`member`,`voice-device`]);var tu=ll().min(0).max(1),nu=Sl([J([`auto`,`center`,`left`,`right`,`top`,`bottom`]),q({x:tu,y:tu,w:tu,h:tu})]),ru=J([`ambient`,`conversation`,`focus`,`multi`]),iu=J([`idle`,`listening`,`thinking`,`speaking`]),au=J([`sphere`,`orb`,`ring`]),ou=q({id:K().min(1).max(64),type:J([`card`,`stat`,`list`,`table`,`code`,`chart`,`gauge`,`timeline`,`graph`,`sandbox`,`markdown`,`image`,`video`,`pdf`,`gallery`,`group`,`tabs`,`progress`,`checklist`,`countdown`,`kv`]),props:Ol(K(),hl()),placement:nu,ttl:ll().positive().max(3600).optional(),style:J([`glass`,`alert`]).optional(),layer:J([`base`,`overlay`]).optional(),pinned:pl().optional()}),su=wl(`cmd`,[q({cmd:Y(`scene`),mode:ru}),q({cmd:Y(`show`),object:ou}),q({cmd:Y(`update`),id:K(),props:Ol(K(),hl())}),q({cmd:Y(`hide`),id:K()}),q({cmd:Y(`clear`)}),q({cmd:Y(`pin`),id:K()}),q({cmd:Y(`unpin`),id:K()}),q({cmd:Y(`place`),id:K(),placement:nu}),q({cmd:Y(`presence`),state:iu.optional(),style:au.optional()}),q({cmd:Y(`mood`),accent:K().max(16).optional(),intensity:tu.optional()})]),cu=q({scene:ru,objects:yl(ou),presence:q({state:iu,style:au}),mood:q({accent:K(),intensity:tu})}),lu={center:[20,18,60,58],left:[3,12,30,70],right:[67,12,30,70],top:[20,4,60,30],bottom:[20,62,60,30]};Object.keys(lu);var uu=[{id:`en_US-amy-medium`,name:`Amy`,gender:`female`,accent:`American`},{id:`en_US-kristin-medium`,name:`Kristin`,gender:`female`,accent:`American`},{id:`en_US-hfc_female-medium`,name:`Hannah`,gender:`female`,accent:`American`,note:`clear and steady`},{id:`en_GB-jenny_dioco-medium`,name:`Jenny`,gender:`female`,accent:`British`},{id:`en_GB-alba-medium`,name:`Alba`,gender:`female`,accent:`Scottish`},{id:`en_US-kathleen-low`,name:`Kathleen`,gender:`female`,accent:`American`,note:`smaller and faster`},{id:`en_US-ryan-medium`,name:`Ryan`,gender:`male`,accent:`American`},{id:`en_US-joe-medium`,name:`Joe`,gender:`male`,accent:`American`},{id:`en_US-norman-medium`,name:`Norman`,gender:`male`,accent:`American`},{id:`en_US-hfc_male-medium`,name:`Henry`,gender:`male`,accent:`American`,note:`clear and steady`},{id:`en_GB-alan-medium`,name:`Alan`,gender:`male`,accent:`British`},{id:`en_GB-northern_english_male-medium`,name:`Tom`,gender:`male`,accent:`Northern English`}],du=[{id:`hi_IN-priyamvada-medium`,name:`Priyamvada`,gender:`female`,accent:`Hindi`,note:`for personal use (non-commercial licence)`},{id:`hi_IN-pratham-medium`,name:`Pratham`,gender:`male`,accent:`Hindi`,note:`for personal use (non-commercial licence)`},{id:`hi_IN-rohan-medium`,name:`Rohan`,gender:`male`,accent:`Hindi`}],fu=[{id:`mr_IN-google-medium`,name:`Marathi`,gender:`female`,accent:`Marathi`}],pu={id:`en_US-lessac-medium`,name:`Lessac`,accent:`American`,note:`the original voice`},mu=e=>e===pu.id||uu.some(t=>t.id===e),hu=[{id:`tiny`,name:`Tiny`,mb:75,note:`fastest, mishears a lot`},{id:`base`,name:`Base`,mb:145,note:`fast, struggles with Hindi, Marathi and distance`},{id:`small`,name:`Small`,mb:480,note:`recommended: much better, still quick`},{id:`medium`,name:`Medium`,mb:1500,note:`better again, slow on a PC without a graphics card`},{id:`large-v3-turbo`,name:`Large (turbo)`,mb:1600,note:`most accurate for Marathi; needs a fast PC`}],gu=e=>`about ${e>=1e3?`${(e/1e3).toFixed(1)} GB`:`${e} MB`}`,_u=[{id:`aurora`,name:`Aurora`,style:`sphere`,accent:`#3fd8ff`,intensity:.6},{id:`ocean`,name:`Ocean`,style:`sphere`,accent:`#2b7bff`,intensity:.6},{id:`ember`,name:`Ember`,style:`orb`,accent:`#ff9b3d`,intensity:.7},{id:`violet`,name:`Violet storm`,style:`orb`,accent:`#a066ff`,intensity:.8},{id:`matrix`,name:`Matrix`,style:`ring`,accent:`#3dff8c`,intensity:.6},{id:`rose`,name:`Rose`,style:`ring`,accent:`#ff6fae`,intensity:.7},{id:`ghost`,name:`Ghost`,style:`sphere`,accent:`#e8f4ff`,intensity:.4}],vu=[`local`,`spotify`,`soundcloud`,`audius`],yu=/^[0-9a-f]{16}$/,bu=/^[0-9]{1,20}$/,xu=/^[A-Za-z0-9_-]{1,64}$/;function Su(e){if(typeof e!=`string`)return null;if(yu.test(e))return{source:`local`,id:e};let t=e.indexOf(`:`);if(t<1)return null;let n=e.slice(0,t),r=e.slice(t+1);return!vu.includes(n)||!(n===`local`?yu:n===`soundcloud`?bu:xu).test(r)?null:{source:n,id:r}}var Cu=J([`minimal`,`companion`,`workspace`]),wu=q({size:ll().min(.5).max(1.5),reactivity:ll().min(0).max(1),ambient:pl(),captions:pl(),captionSize:J([`small`,`medium`,`large`])}),Tu={width:ll().int().min(100).max(1e4),height:ll().int().min(100).max(1e4),kind:J([`phone`,`tablet`,`desktop`]),orientation:J([`portrait`,`landscape`]),touch:pl()};q(Tu);var Eu=q({id:K(),tool:K(),summary:K(),tier:eu,needsPin:pl()}),Du=q({id:K().refine(e=>Su(e)!==null,`A track id or a source:id ref`),title:K().max(200),artist:K().max(200),album:K().max(200),durationSec:ll().nullable()}),Ou=q({playing:pl(),trackId:K().max(80).nullable(),title:K().max(200),artist:K().max(200),album:K().max(200),position:ll().min(0),duration:ll().min(0),volume:ll().min(0).max(100),muted:pl(),shuffle:pl(),repeat:J([`off`,`all`,`one`]),view:J([`mini`,`full`,`hidden`]),queue:yl(q({id:K().max(80),title:K().max(200)})).max(50),index:ll().int().min(-1),active:pl()}),ku=q({action:J([`play`,`pause`,`resume`,`toggle`,`stop`,`next`,`previous`,`seek`,`volume`,`mute`,`shuffle`,`repeat`,`view`,`queue.remove`,`queue.clear`,`jump`]),tracks:yl(Du).max(500).optional(),mode:J([`replace`,`add`,`next`,`off`,`all`,`one`]).optional(),shuffle:pl().optional(),seconds:ll().min(0).optional(),percent:ll().min(0).max(100).optional(),level:ll().min(0).max(100).optional(),delta:ll().min(-100).max(100).optional(),on:pl().optional(),view:J([`mini`,`full`,`hidden`]).optional(),index:ll().int().min(0).optional()}),Au=q({terminalLabel:K().max(24),clock:q({hour12:pl(),seconds:pl(),locale:K().max(35)}),launcher:yl(q({id:K().max(20),label:K().max(24),icon:K().max(16),action:q({type:J([`url`,`prompt`,`panel`,`music`]),value:K().max(500)})})).max(12),animations:J([`full`,`reduced`,`off`])}),ju=q({folderSet:pl(),volume:ll().min(0).max(100),shuffle:pl(),repeat:J([`off`,`all`,`one`]),visualizer:pl(),startView:J([`mini`,`full`]),output:J([`screen`,`host`]).optional()}),Mu=wl(`type`,[q({type:Y(`music.command`)}).merge(ku),q({type:Y(`music.host`),state:Ou}),q({type:Y(`stage`),command:su}),q({type:Y(`caption.delta`),text:K()}),q({type:Y(`caption.end`)}),q({type:Y(`approval.request`)}).merge(Eu),q({type:Y(`approval.resolved`),id:K()}),q({type:Y(`alert`),level:J([`info`,`warn`,`error`]),text:K()}),q({type:Y(`chat.user`),text:K()}),q({type:Y(`ui`),view:Cu,look:wu.optional(),ownerName:K().max(40).optional(),assistantName:K().max(40).optional(),hud:Au.optional(),music:ju.optional()}),q({type:Y(`activity`),text:K().max(80).nullable()}),q({type:Y(`status`),busy:pl(),deviceOnline:pl(),voiceAvailable:pl().optional(),voiceEnrolled:pl().optional(),message:K().optional()}),q({type:Y(`voice.heard`),text:K(),trust:J([`owner`,`guest`,`unverified`,`member`]).optional(),speaker:K().max(60).optional()}),q({type:Y(`voice.challenge`),id:K(),text:K()}),q({type:Y(`voice.challenge.end`),id:K()}),q({type:Y(`audio.chunk`),id:K(),seq:ll().int().min(0),last:pl(),mime:K(),data:K()}),q({type:Y(`audio.stop`)}),q({type:Y(`audio.duck`),level:ll().min(0).max(1)}),q({type:Y(`camera.request`),id:K()}),q({type:Y(`camera.cancel`),id:K()}),q({type:Y(`ui.open`),panel:Y(`plugins`),integration:K().max(40).optional()}),q({type:Y(`screen.request`),id:K()}),q({type:Y(`screen.cancel`),id:K()}),q({type:Y(`snapshot`),stage:cu,pendingApproval:Eu.nullable().optional()}),q({type:Y(`error`),message:K()})]),Nu=q({type:Y(`approval.respond`),id:K(),decision:J([`approve`,`deny`,`approve_always`]),pin:K().max(32).optional()});wl(`type`,[q({type:Y(`chat.send`),text:K().min(1).max(8e3)}),q({type:Y(`stage.event`),objectId:K(),event:K().max(64)}),Nu,q({type:Y(`voice.interrupt`)}),q({type:Y(`audio.activity`),active:pl()}),q({type:Y(`voice.confirm`),id:K(),pin:K().max(32)}),q({type:Y(`voice.cancel`),id:K()}),q({type:Y(`camera.denied`),id:K(),reason:J([`off`,`no-camera`,`permission`,`busy`])}),q({type:Y(`screen.denied`),id:K(),reason:J([`unsupported`,`failed`,`busy`])}),q({type:Y(`ui.panels`),open:yl(J([`chat`,`tasks`])).max(2)}),q({type:Y(`ui.screen`),...Tu}),q({type:Y(`stage.move`),objectId:K().max(64),rect:q({x:ll().min(0).max(1),y:ll().min(0).max(1),w:ll().min(0).max(1),h:ll().min(0).max(1)})}),q({type:Y(`stage.pin`),objectId:K().max(64),pinned:pl()}),q({type:Y(`music.state`),state:Ou}),q({type:Y(`music.remote`),command:ku}),q({type:Y(`ping`)})]),q({type:Y(`tool.exec`),id:K(),tool:K(),args:hl(),approvedOutside:pl().optional()}),wl(`type`,[q({type:Y(`tool.result`),id:K(),result:q({output:K(),truncated:pl()})}),q({type:Y(`tool.error`),id:K(),error:K()})]),q({path:K()}),q({path:K()}),q({path:K(),content:K()}),q({}),q({}),q({command:K().min(1),cwd:K().optional()}),q({city:K().min(1).max(80)}),q({plugin:K().min(1).max(40),name:K().min(1).max(40)}),q({language:J([`python`,`node`,`shell`]),code:K().min(1).max(5e4),timeoutSec:ll().int().min(1).max(60).optional()}),q({text:K().min(1).max(4e3)}),q({query:K().min(1).max(200)}),q({id:ll().int().positive()}),q({title:K().min(1).max(1e3),inMinutes:ll().int().min(1).max(525600).optional(),dueAt:K().max(40).optional(),repeat:J([`hourly`,`daily`,`weekly`]).optional()}),q({}),q({id:ll().int().positive()}),q({id:ll().int().positive()}),q({}),q({path:K().min(1).max(1e3),id:K().min(1).max(64).optional(),title:K().max(120).optional(),placement:nu.optional()}),q({}),q({}),q({id:K().min(1).max(40)}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`]).optional()}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`]),enabled:pl().optional(),accountSid:K().max(64).optional(),smsFrom:K().max(30).optional(),whatsappFrom:K().max(30).optional(),ownerNumber:K().max(30).optional()}).strict(),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`])}),q({id:J([`telegram`,`twilio`,`zerodha`,`alexa`])}),q({channel:J([`telegram`,`sms`,`whatsapp`]),to:K().min(1).max(40),text:K().min(1).max(1500)}),q({channel:J([`telegram`,`whatsapp`]),to:Y(`me`),path:K().min(1).max(500),caption:K().max(1e3).optional()}).strict(),q({channel:J([`telegram`,`sms`,`whatsapp`]).optional(),unread:pl().optional(),limit:ll().int().min(1).max(20).optional()}),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({}).strict(),q({kind:J([`morning`,`close`,`custom`]).optional(),send:pl().optional()}).strict(),q({name:K().min(1).max(60),kind:J([`morning`,`close`,`custom`]),time:K().regex(/^([01]\d|2[0-3]):[0-5]\d$/),days:yl(ll().int().min(1).max(7)).min(1).max(7).optional(),channel:J([`telegram`,`whatsapp`,`sms`]),commentary:pl().optional()}).strict(),q({}).strict(),q({id:ll().int().min(1)}).strict(),q({query:K().max(200).optional(),title:K().max(200).optional(),artist:K().max(200).optional(),album:K().max(200).optional(),shuffle:pl().optional(),mode:J([`replace`,`add`,`next`]).optional(),limit:ll().int().min(1).max(500).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({action:J([`pause`,`resume`,`toggle`,`stop`,`next`,`previous`,`seek`,`volume`,`mute`,`shuffle`,`repeat`,`view`]),level:ll().min(0).max(100).optional(),delta:ll().min(-100).max(100).optional(),seconds:ll().min(0).optional(),percent:ll().min(0).max(100).optional(),on:pl().optional(),mode:J([`off`,`all`,`one`]).optional(),view:J([`mini`,`full`,`hidden`]).optional()}).strict(),q({action:J([`add`,`remove`,`clear`,`show`]),query:K().max(200).optional(),index:ll().int().min(1).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({query:K().max(200),limit:ll().int().min(1).max(15).optional(),source:J([`local`,`spotify`,`soundcloud`,`audius`,`any`]).optional()}).strict(),q({}).strict(),q({url:K().max(2e3).optional(),query:K().max(200).optional(),output:J([`screen`,`host`]).optional(),start:ll().min(0).max(86400).optional(),mode:J([`embed`,`stream`]).optional()}).strict(),q({action:J([`pause`,`resume`,`stop`,`seek`,`volume`]),seconds:ll().min(0).max(86400).optional(),level:ll().min(0).max(100).optional()}).strict(),q({}).strict(),q({}),q({settings:Ol(K(),hl())}),q({style:au.optional(),accent:K().regex(/^#[0-9a-fA-F]{6}$/).optional(),intensity:ll().min(0).max(1).optional(),size:ll().min(.5).max(1.5).optional(),reactivity:ll().min(0).max(1).optional(),ambient:pl().optional(),captions:pl().optional(),captionSize:J([`small`,`medium`,`large`]).optional()}),q({view:Cu}),q({}),q({id:K().min(1).max(16),name:K().min(1).max(60),kind:J([`stdio`,`http`]),command:K().max(260).optional(),args:yl(K().max(500)).max(20).optional(),url:K().max(2e3).optional()}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({id:K().min(1).max(16)}),q({}),q({id:K().min(1).max(40),name:K().min(1).max(80),description:K().max(500).optional(),skills:yl(q({name:K().min(1).max(40),description:K().min(1).max(300),text:K().min(1).max(2e4)})).max(10).optional(),tools:yl(q({name:K().min(1).max(40),description:K().min(1).max(500),language:J([`python`,`node`,`shell`]),code:K().min(1).max(5e4),parameters:Ol(K(),q({type:J([`string`,`number`,`integer`,`boolean`]),description:K().max(300).optional(),enum:yl(K().max(100)).max(50).optional()})).optional(),required:yl(K()).optional()})).max(10).optional()}),q({}),q({id:K().min(1).max(40)}),q({id:K().min(1).max(40)}),q({id:K().min(1).max(40)}),q({mode:ru}),q({object:ou}),q({topic:J([`all`,`widgets`,`layout`,`overlay`,`theme`,`files`,`recipes`]).optional()}),q({id:K(),props:Ol(K(),hl())}),q({id:K()}),q({}),q({id:K()}),q({id:K()}),q({state:iu.optional(),style:au.optional()}),q({accent:K().max(16).optional(),intensity:ll().min(0).max(1).optional()});var Pu=new Set([`alexa`,`amazon`,`echo`,`skill`,`app`,`ask`,`tell`,`open`,`start`,`run`,`enable`,`launch`,`load`,`begin`,`use`]),Fu=50;function Iu(e){let t=e.trim().split(/\s+/).filter(Boolean);if(t.length<1)return`Enter the name you will say after "Alexa, ask".`;if(e.length>Fu)return`That is too long (at most ${Fu} characters).`;if(!/^[a-z' ]+$/.test(e))return`Use lower-case letters, spaces and apostrophes only. Spell numbers out as words.`;let n=t.find(e=>Pu.has(e));return n?`The word "${n}" cannot be in the name (it is reserved by Alexa).`:null}var Lu=[`mp3`,`m4a`,`aac`,`ogg`,`opus`,`wav`,`flac`],Ru={maxTracks:{min:100,max:5e4,def:5e3},scanDepth:{min:1,max:12,def:6},volume:{min:0,max:100,def:70},searchLimit:{min:3,max:50,def:10}},zu=[`chat`,`tasks`,`plugins`,`settings`,`music`],Bu=[`toggle`,`play`,`pause`,`next`,`previous`],Vu=[`url`,`prompt`,`panel`,`music`];function Hu(e){let t=e&&typeof e==`object`?e:null;if(!t)return`A button needs a label and an action.`;let n=typeof t.label==`string`?t.label.trim():``;if(n.length<1||n.length>24)return`A button label is 1 to 24 characters.`;let r=typeof t.icon==`string`?t.icon.trim():``;if(r.length<1||[...r].length>4)return`A button icon is 1 to 4 characters (a symbol or an emoji).`;let i=t.action&&typeof t.action==`object`?t.action:null;if(!i||!Vu.includes(i.type)||typeof i.value!=`string`)return`A button needs an action: an address, a question, a panel or a music control.`;let a=i.value.trim();switch(i.type){case`url`:if(a.length>500)return`A button address is at most 500 characters.`;try{let e=new URL(a);return e.protocol===`https:`||e.protocol===`http:`?null:`A button address must start with https:// or http://.`}catch{return`A button address must start with https:// or http://.`}case`prompt`:return a.length>=1&&a.length<=500?null:`A question for the assistant is 1 to 500 characters.`;case`panel`:return zu.includes(a)?null:`A panel is one of: ${zu.join(`, `)}.`;default:return Bu.includes(a)?null:`A music control is one of: ${Bu.join(`, `)}.`}}function Uu(e){return e===``?null:e.length>260?`That program name is too long.`:/\s/.test(e)?`Use the program's name, or a short path with no spaces (or add the program to your PATH). Arguments cannot be added here.`:e.startsWith(`-`)||!/^[A-Za-z0-9._:\\/~+-]+$/.test(e)?`A program is a name or a path made of letters, digits and . _ : / \\ ~ + - only, and cannot start with a dash.`:null}var Wu=2e3,Gu=3,Ku=e=>({queue:[],index:-1,playing:!1,position:0,duration:0,volume:e.volume,muted:!1,shuffle:e.shuffle,repeat:e.repeat,view:e.view});function qu(e,t=Math.random){let n=[...e];for(let e=n.length-1;e>0;e--){let r=Math.floor(t()*(e+1));[n[e],n[r]]=[n[r],n[e]]}return n}var Ju=(e,t,n)=>Math.min(n,Math.max(t,e)),Yu=(e,t,n)=>({...e,index:t,playing:n,position:0,duration:0});function Xu(e,t,n={}){let r=n.shuffle??qu,i=e.queue.length-1;switch(t.type){case`play`:{if(t.tracks.length===0)return e;let n=t.tracks.slice(0,Wu);if(t.mode===`replace`){let i=t.shuffle?r(n):n;return{...Yu(e,t.shuffle?0:Ju(t.start??0,0,i.length-1),!0),queue:i,shuffle:t.shuffle?!0:e.shuffle}}if(e.queue.length===0)return{...Yu(e,0,!0),queue:n};let i=t.mode===`next`?e.index+1:e.queue.length;return{...e,queue:[...e.queue.slice(0,i),...n,...e.queue.slice(i)].slice(0,Wu)}}case`next`:return i<0?e:e.index<i?Yu(e,e.index+1,!0):e.repeat===`off`?{...e,playing:!1,position:0}:Yu(e,0,!0);case`previous`:return i<0?e:e.position>Gu?{...e,position:0}:e.index>0?Yu(e,e.index-1,e.playing||!0):e.repeat===`all`?Yu(e,i,!0):{...e,position:0};case`ended`:return i<0?e:e.repeat===`one`?Yu(e,e.index,!0):e.index<i?Yu(e,e.index+1,!0):e.repeat===`all`?Yu(e,0,!0):{...e,playing:!1,position:0};case`failed`:return i<0?e:e.index<i?Yu(e,e.index+1,!0):{...e,playing:!1,position:0};case`pause`:return e.playing?{...e,playing:!1}:e;case`resume`:return e.index>=0&&!e.playing?{...e,playing:!0}:e;case`toggle`:return e.index<0?e:{...e,playing:!e.playing};case`stop`:return{...e,playing:!1,position:0};case`volume`:{let n=typeof t.level==`number`?Math.round(t.level):typeof t.delta==`number`?e.volume+Math.round(t.delta):e.volume;return{...e,volume:Ju(n,0,100),muted:typeof t.level==`number`||(t.delta??0)>0?!1:e.muted}}case`mute`:return{...e,muted:t.on??!e.muted};case`seek`:{let n=typeof t.seconds==`number`?t.seconds:typeof t.percent==`number`?e.duration*Ju(t.percent,0,100)/100:e.position;return{...e,position:Ju(n,0,e.duration>0?e.duration:Math.max(n,0))}}case`repeat`:return{...e,repeat:t.mode};case`shuffle`:{if(!(t.on??!e.shuffle))return{...e,shuffle:!1};let n=e.queue.slice(0,e.index+1);return{...e,shuffle:!0,queue:[...n,...r(e.queue.slice(e.index+1))]}}case`view`:return{...e,view:t.view};case`remove`:{if(!Number.isInteger(t.index)||t.index<0||t.index>i)return e;let n=e.queue.filter((e,n)=>n!==t.index);return n.length===0?{...e,queue:n,index:-1,playing:!1,position:0,duration:0}:t.index<e.index?{...e,queue:n,index:e.index-1}:t.index>e.index?{...e,queue:n}:t.index<n.length?{...Yu(e,t.index,e.playing),queue:n}:e.repeat===`all`?{...Yu(e,0,e.playing),queue:n}:{...e,queue:n,index:n.length-1,playing:!1,position:0}}case`clear`:return{...e,queue:[],index:-1,playing:!1,position:0,duration:0};case`jump`:return Number.isInteger(t.index)&&t.index>=0&&t.index<=i?Yu(e,t.index,!0):e;case`time`:return{...e,position:Math.max(0,t.position),duration:Math.max(0,t.duration)}}}function Zu(e){switch(e.action){case`play`:return{type:`play`,tracks:e.tracks??[],mode:e.mode===`add`||e.mode===`next`?e.mode:`replace`,...e.shuffle?{shuffle:!0}:{},...e.index===void 0?{}:{start:e.index}};case`pause`:case`resume`:case`toggle`:case`stop`:case`next`:case`previous`:return{type:e.action};case`seek`:return{type:`seek`,...e.seconds===void 0?{}:{seconds:e.seconds},...e.percent===void 0?{}:{percent:e.percent}};case`volume`:return{type:`volume`,...e.level===void 0?{}:{level:e.level},...e.delta===void 0?{}:{delta:e.delta}};case`mute`:return{type:`mute`,...e.on===void 0?{}:{on:e.on}};case`shuffle`:return{type:`shuffle`,...e.on===void 0?{}:{on:e.on}};case`repeat`:return e.mode===`off`||e.mode===`all`||e.mode===`one`?{type:`repeat`,mode:e.mode}:null;case`view`:return e.view?{type:`view`,view:e.view}:null;case`queue.remove`:return e.index===void 0?null:{type:`remove`,index:e.index};case`queue.clear`:return{type:`clear`};case`jump`:return e.index===void 0?null:{type:`jump`,index:e.index};default:return null}}function Qu(e){switch(e.type){case`play`:return{action:`play`,tracks:e.tracks,mode:e.mode,...e.shuffle?{shuffle:!0}:{},...e.start===void 0?{}:{index:e.start}};case`next`:case`previous`:case`pause`:case`resume`:case`toggle`:case`stop`:return{action:e.type};case`volume`:return{action:`volume`,...e.level===void 0?{}:{level:e.level},...e.delta===void 0?{}:{delta:e.delta}};case`mute`:return{action:`mute`,...e.on===void 0?{}:{on:e.on}};case`seek`:return{action:`seek`,...e.seconds===void 0?{}:{seconds:e.seconds},...e.percent===void 0?{}:{percent:e.percent}};case`repeat`:return{action:`repeat`,mode:e.mode};case`shuffle`:return{action:`shuffle`,...e.on===void 0?{}:{on:e.on}};case`view`:return{action:`view`,view:e.view};case`remove`:return{action:`queue.remove`,index:e.index};case`clear`:return{action:`queue.clear`};case`jump`:return{action:`jump`,index:e.index};default:return null}}function $u({label:e,value:t,onChange:n,min:r,max:i,step:a}){let[o,s]=(0,l.useState)(String(t));return(0,l.useEffect)(()=>{s(e=>Number(e)===t?e:String(t))},[t]),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:e}),(0,p.jsx)(`input`,{type:`number`,min:r,max:i,step:a,value:o,onChange:e=>{s(e.target.value),e.target.value.trim()!==``&&Number.isFinite(Number(e.target.value))&&n(Number(e.target.value))},onBlur:()=>s(String(t)),style:d})]})}async function ed(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:`The request failed (${n.status}).`));return r}var td={status:()=>ed(`/api/alexa`),allow:async(e,t)=>void await ed(`/api/alexa/devices/allow`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,pin:t})}),forget:async e=>void await ed(`/api/alexa/devices/${encodeURIComponent(e)}`,{method:`DELETE`})},nd=/^amzn1\.ask\.skill\.[A-Za-z0-9-]{8,80}$/;function rd(e){return e.skillId.trim()&&!nd.test(e.skillId.trim())?`A skill ID looks like amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (copy it from the console).`:e.invocationName.trim()?Iu(e.invocationName):null}var id={"skill.json":`the skill's manifest (name, endpoint)`,"en-IN.json":`the English (India) interaction model`,"hi-IN.json":`the Hindi (India) interaction model`},ad={"en-IN":`English (India)`,"hi-IN":`Hindi (India)`},od=e=>{let t=Math.max(0,Math.round((Date.now()-e)/6e4));return t<1?`just now`:t<60?`${t} min ago`:`${Math.round(t/60)} h ago`};function sd({view:e,setView:t,api:n=td}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(null),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(!1),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>n.status().then(e=>v.current&&i(e)).catch(()=>{}),[n]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async e=>{_(!0),f(null);try{await e()}catch(e){v.current&&f(e.message)}finally{v.current&&_(!1)}},x=rd(e),S=r?.invocationName||e.invocationName,C=!!r?.endpoint&&!!r.invocationName;return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend talks to a skill of your own on Alexa. It is free: the skill stays in development mode in your own Amazon developer account and is never published, and only the Echo devices you allow can use it. Alexa can look things up and answer; anything that changes something is refused, or sent to your phone for a yes.`}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`In the Alexa developer console`}),r&&r.endpoint?(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Endpoint to paste (HTTPS, "My development endpoint has a certificate from a trusted certificate authority"): `,(0,p.jsx)(`code`,{children:r.endpoint}),` `,(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{navigator.clipboard?.writeText(r.endpoint).then(()=>h(!0),()=>{})},children:m?`Copied`:`Copy`})]}):r&&(0,p.jsx)(`p`,{className:`auth-note`,children:`No public address is set yet, so Amazon cannot reach Friend (friend config set publicUrl https://…).`}),(0,p.jsx)(`p`,{className:`auth-note`,children:`If your address changes later, paste the new address into the console again. Nothing else needs to change.`}),C?(0,p.jsx)(`ul`,{className:`plugins-list`,children:r.files.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`a`,{href:`/api/alexa/package/${e}`,download:e,children:e}),` `,(0,p.jsx)(`small`,{className:`auth-note`,children:id[e]??``})]},e))}):r&&r.endpoint&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Save an invocation name first; the files are made with it.`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Skill ID`}),(0,p.jsx)(`input`,{value:e.skillId,autoComplete:`off`,onChange:n=>t({...e,skillId:n.target.value}),placeholder:`amzn1.ask.skill.…`,style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Invocation name`}),(0,p.jsx)(`input`,{value:e.invocationName,autoComplete:`off`,onChange:n=>t({...e,invocationName:n.target.value}),placeholder:`jarvis assistant`,style:d})]}),x&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:x}),(0,p.jsxs)(`details`,{children:[(0,p.jsx)(`summary`,{className:`plugins-heading`,children:`Advanced`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Skill name`}),(0,p.jsx)(`input`,{value:e.skillName,onChange:n=>t({...e,skillName:n.target.value}),style:d})]}),(0,p.jsx)(`div`,{className:`settings-field`,role:`group`,"aria-label":`Languages`,children:Object.entries(ad).map(([n,r])=>(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.locales.includes(n),onChange:r=>{let i=r.target.checked?[...e.locales,n]:e.locales.filter(e=>e!==n);i.length>0&&t({...e,locales:Object.keys(ad).filter(e=>i.includes(e))})}}),(0,p.jsx)(`span`,{children:r})]},n))}),(0,p.jsx)($u,{label:`Seconds to work on an answer`,value:e.answerSeconds,min:2,max:7.5,step:.5,onChange:n=>t({...e,answerSeconds:n})}),(0,p.jsx)($u,{label:`Minutes to keep a late answer`,value:e.holdMinutes,min:1,max:60,onChange:n=>t({...e,holdMinutes:n})}),(0,p.jsx)($u,{label:`Seconds to wait for your yes on your phone`,value:e.permissionSeconds,min:30,max:600,onChange:n=>t({...e,permissionSeconds:n})}),(0,p.jsx)($u,{label:`Requests a minute allowed`,value:e.requestsPerMinute,min:10,max:600,onChange:n=>t({...e,requestsPerMinute:n})}),(0,p.jsx)($u,{label:`Echo devices allowed`,value:e.maxDevices,min:1,max:50,onChange:n=>t({...e,maxDevices:n})}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Extra tools a voice may use without asking (one per line)`}),(0,p.jsx)(`textarea`,{rows:2,value:e.extraVoiceTools.join(`
|
|
66
66
|
`),onChange:n=>t({...e,extraVoiceTools:n.target.value.split(/[\s,]+/).filter(Boolean)})})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Tools that reach your PC, files, settings, add-ons or camera, and anything that needs your PIN, can never be added.`})]}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Echo devices`}),r&&r.waiting.length===0&&r.allowed.length===0&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Say "Alexa, ask `,S||`your invocation name`,`" on your Echo once; it will appear here for you to allow.`]}),(0,p.jsxs)(`ul`,{className:`plugins-list`,children:[(r?.waiting??[]).map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsxs)(`b`,{children:[`Echo …`,e.short]}),` `,(0,p.jsxs)(`small`,{className:`auth-note`,children:[`waiting (`,e.locale,`), asked `,od(e.at)]}),` `,(0,p.jsx)(`button`,{type:`button`,style:d,disabled:g,onClick:()=>{o(e.short),c(``),f(null)},children:`Allow`})]},e.short)),(r?.allowed??[]).map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`b`,{children:e.name}),` `,(0,p.jsxs)(`small`,{className:`auth-note`,children:[`…`,e.short]}),` `,(0,p.jsx)(`button`,{type:`button`,style:d,disabled:g,onClick:()=>void b(async()=>{await n.forget(e.short),await y()}),children:`Forget`})]},e.short))]}),a&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to allow Echo …`,a,`. Anyone who can speak to that Echo can then ask Friend things.`]}),(0,p.jsx)(T,{pin:s,onChange:c,onSubmit:()=>!g&&s.length>=6&&void b(async()=>{await n.allow(a,s),o(null),c(``),await y()})}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:g||s.length<6,onClick:()=>void b(async()=>{await n.allow(a,s),o(null),c(``),await y()}),children:`Allow this Echo`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{o(null),c(``),f(null)},children:`Back`})]})]}),u&&!x&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:u})]})}async function cd(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:n.status===403?`Incorrect PIN`:`The request failed (${n.status}).`));return r}var ld={info:async()=>{let e=(await cd(`/api/plugins`)).integrations?.find(e=>e.id===`chrome`),t=e?.settings?.extensionFolder;return{state:e?.state??`not-installed`,detail:e?.detail??``,extensionFolder:typeof t==`string`&&t?t:null}},setUp:e=>cd(`/api/connectors/quick/chrome/install`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pin:e})}),access:()=>cd(`/api/plugins/chrome/access`),banner:()=>cd(`/api/plugins/chrome/banner`),hideBanner:e=>cd(`/api/plugins/chrome/banner/hide`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pin:e})}),restartChrome:e=>cd(`/api/plugins/chrome/banner/restart`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pin:e})}),setRemote:async(e,t)=>{await cd(`/api/plugins/chrome/remote`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:e,...t?{pin:t}:{}})})},revealKey:async e=>(await cd(`/api/plugins/chrome/token`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pin:e})})).token};function ud({label:e,value:t}){let[n,r]=(0,l.useState)(!1);return(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:e}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,p.jsx)(`input`,{type:`text`,readOnly:!0,value:t,style:{flex:1},onFocus:e=>e.currentTarget.select()}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(t).then(()=>r(!0),()=>{})},children:n?`Copied`:`Copy`})]})]})}function dd({api:e=ld,pollMs:t=3e3}){let[n,r]=(0,l.useState)(null),[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(null),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(``),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(!1),E=(0,l.useRef)(!0),D=(0,l.useCallback)(async()=>{try{let[t,n,i]=await Promise.all([e.info(),e.access(),e.banner().catch(()=>null)]);if(!E.current)return;r(t),a(n),s(i)}catch{}},[e]);(0,l.useEffect)(()=>{E.current=!0,D();let e=t>0?setInterval(()=>void D(),t):null;return()=>{E.current=!1,e&&clearInterval(e)}},[D,t]);let O=async()=>{v(!0),b(null);try{if(f===`setup`){let t=await e.setUp(h);if(!E.current)return;S(t.message)}else if(f===`allow`)await e.setRemote(!0,h);else if(f===`key`){let t=await e.revealKey(h);if(!E.current)return;u(t)}else if(f===`hide`||f===`restart`){let t=await(f===`hide`?e.hideBanner(h):e.restartChrome(h));if(!E.current)return;S(t.message)}if(!E.current)return;m(null),await D()}catch(e){E.current&&b(e.message)}finally{E.current&&(v(!1),g(``))}};return f?(0,p.jsxs)(p.Fragment,{children:[f===`restart`&&(0,p.jsx)(`p`,{className:`auth-note connector-warning`,children:`This closes Chrome and opens it again with your tabs. Anything typed in a page that was not saved can be lost.`}),(0,p.jsx)(`p`,{className:`auth-note`,children:f===`setup`?`Enter your PIN to set up Chrome control.`:f===`allow`?`Enter your PIN to allow other PCs to use Chrome control through Friend.`:f===`hide`?`Enter your PIN to add the flag to your Chrome shortcuts.`:f===`restart`?`Enter your PIN to restart Chrome.`:`Enter your PIN to show the key.`}),(0,p.jsx)(T,{pin:h,onChange:g,onSubmit:()=>!_&&h.length>=6&&void O()}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||h.length<6,onClick:()=>void O(),children:`Continue`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{m(null),g(``),b(null)},children:`Back`})]})]}):(0,p.jsxs)(`div`,{className:`settings-section`,children:[n?.detail&&(0,p.jsx)(`p`,{className:`auth-note`,style:{marginBottom:10},children:n.detail}),n?.extensionFolder&&(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Folder to load in Chrome (chrome://extensions, Developer mode, Load unpacked)`}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,p.jsx)(`input`,{type:`text`,readOnly:!0,value:n.extensionFolder,style:{flex:1},onFocus:e=>e.currentTarget.select()}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(n.extensionFolder??``).then(()=>w(!0),()=>{})},children:C?`Copied`:`Copy`})]})]}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:n?.extensionFolder?void 0:`primary`,onClick:()=>m(`setup`),children:n?.extensionFolder?`Set up again`:`Set up Chrome control`})}),x&&(0,p.jsx)(`p`,{className:`auth-note`,children:x}),o?.supported&&n?.extensionFolder&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Chrome's debugging banner`}),(0,p.jsx)(`p`,{className:`auth-note`,children:`While Friend uses your Chrome, Chrome shows "started debugging this browser" with a Cancel button. It can be hidden, but only in a Chrome that was started with a special flag: a shortcut with the flag does nothing while Chrome is already open.`}),o.error?(0,p.jsx)(`p`,{className:`auth-error`,children:o.error}):o.running===!1?(0,p.jsx)(`p`,{className:`auth-note`,children:`Chrome is closed. Start it from here and the banner stays hidden.`}):o.hidden?(0,p.jsx)(`p`,{className:`auth-note`,children:`The banner is hidden in the Chrome that is open now.`}):(0,p.jsx)(`p`,{className:`auth-note connector-warning`,children:`The Chrome that is open now was started without it, so the banner shows. Restarting Chrome from here fixes that.`}),o.shortcuts&&o.shortcuts.total>0&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[o.shortcuts.withFlag,` of `,o.shortcuts.total,` shortcuts start Chrome with the banner hidden.`]}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[o.running===!1?(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:()=>m(`restart`),children:`Start Chrome with the banner hidden`}):o.hidden===!1&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:()=>m(`restart`),children:`Restart Chrome with the banner hidden`}),o.shortcuts&&o.shortcuts.withFlag<o.shortcuts.total&&(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>m(`hide`),children:`Add the flag to my Chrome shortcuts`})]})]}),i&&n?.extensionFolder&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`From another PC`}),i.extensionZip&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[(0,p.jsx)(`a`,{href:i.extensionZip,download:`friend-chrome-extension.zip`,children:`Download the extension`}),` `,`to install it in Chrome on another PC: unzip it, open chrome://extensions, turn on Developer mode, press Load unpacked and choose the unzipped folder.`]}),i.remote?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ud,{label:`Server to type in the extension's popup on the other PC`,value:i.extensionAddress}),(0,p.jsx)(ud,{label:`MCP address for apps on other PCs (Claude Code, Claude Desktop). Send the key as: Authorization: Bearer KEY`,value:i.mcpUrl}),/^(ws|http):\/\/(127\.0\.0\.1|localhost|\[::1\])/i.test(i.extensionAddress)&&(0,p.jsx)(`p`,{className:`auth-note`,children:`These use the address you opened Friend with, and another PC cannot reach 127.0.0.1. Open Friend by its network or public address and these will show that one.`}),c?(0,p.jsx)(ud,{label:`The key (paste it in the extension's popup)`,value:c}):null,(0,p.jsxs)(`div`,{className:`approval-actions`,children:[!c&&(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>m(`key`),children:`Show the key`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{u(null),e.setRemote(!1).then(()=>D(),e=>b(e.message))},children:`Stop allowing other PCs`})]})]}):(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>m(`allow`),children:`Allow other PCs`})})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Chrome does not allow programs to add an extension by themselves, so loading the folder above is the one step you do. While the extension is on, Friend can act as you on the sites it allows; every action still asks for your approval, and in the extension's popup you can limit it to certain sites.`})]})}async function fd(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:`The request failed (${n.status}).`));return r}var pd=(e,t)=>fd(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),md={info:async()=>{let e=await fd(`/api/music/sources`);return{status:e.sources.find(e=>e.id===`soundcloud`)?.status??{connected:!1,needs:null,account:null},redirectUri:e.soundcloud.redirectUri,clientId:e.soundcloud.clientId,secretSet:e.soundcloud.secretSet}},saveCredentials:async(e,t,n)=>void await pd(`/api/music/soundcloud/credentials`,{clientId:e,...t?{clientSecret:t}:{},pin:n}),connect:async e=>(await pd(`/api/music/soundcloud/connect`,{pin:e})).url,disconnect:async e=>void await pd(`/api/music/soundcloud/disconnect`,{pin:e})},hd=e=>e.trim()===``||/^[A-Za-z0-9]{8,64}$/.test(e.trim())?null:`A client id is letters and digits only, copied from your app at soundcloud.com/you/apps.`;function gd({api:e=md,navigate:t=e=>window.location.assign(e)}){let[n,r]=(0,l.useState)(null),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(``),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(null),[y,b]=(0,l.useState)(!1),x=(0,l.useRef)(!0),S=(0,l.useCallback)(async()=>{try{let t=await e.info();if(!x.current)return;r(t),a(t.clientId)}catch(e){x.current&&v(e.message)}},[e]);(0,l.useEffect)(()=>(x.current=!0,S(),()=>{x.current=!1}),[S]);let C=async()=>{if(c){g(!0),v(null);try{c===`save`?(await e.saveCredentials(i.trim(),o.trim()||void 0,f),x.current&&s(``),await S()):c===`connect`?t(await e.connect(f)):(await e.disconnect(f),await S()),x.current&&u(null)}catch(e){x.current&&v(e.message)}finally{x.current&&(g(!1),m(``))}}};if(c)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN `,c===`save`?`to save the SoundCloud app details`:c===`connect`?`to connect SoundCloud`:`to disconnect SoundCloud`,`.`]}),(0,p.jsx)(T,{pin:f,onChange:m,onSubmit:()=>!h&&f.length>=6&&void C()}),_&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:_}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:h||f.length<6,onClick:()=>void C(),children:c===`save`?`Save`:`Continue`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{u(null),m(``),v(null)},children:`Back`})]})]});let w=hd(i),E=!!n&&i.trim()!==n.clientId||o.trim()!==``,D=!!n?.clientId&&n.secretSet,O=n?.status;return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Redirect address to add in your SoundCloud app`}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,p.jsx)(`input`,{type:`text`,readOnly:!0,value:n?.redirectUri??``,style:{flex:1},onFocus:e=>e.currentTarget.select()}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(n?.redirectUri??``).then(()=>b(!0),()=>{})},children:y?`Copied`:`Copy`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Client id of your SoundCloud app`}),(0,p.jsx)(`input`,{type:`text`,value:i,maxLength:64,autoComplete:`off`,spellCheck:!1,onChange:e=>a(e.target.value)})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Client secret of your SoundCloud app`}),(0,p.jsx)(`input`,{type:`password`,value:o,maxLength:200,autoComplete:`new-password`,spellCheck:!1,onChange:e=>s(e.target.value)}),n?.secretSet&&(0,p.jsx)(`small`,{className:`auth-note`,children:`The secret is saved. Type a new one only to replace it.`})]}),w&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:w}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:!E||!i.trim()||w!==null||!n?.secretSet&&!o.trim(),onClick:()=>u(`save`),children:`Save`}),O?.connected?(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>u(`disconnect`),children:`Disconnect SoundCloud`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!D||E,onClick:()=>u(`connect`),children:`Connect SoundCloud`})]}),O?.connected&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Connected as `,O.account??`your account`,`.`]}),O?.needs&&(0,p.jsx)(`p`,{className:`auth-note`,children:O.needs}),_&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:_}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Sign-in is on SoundCloud's own page: Friend never sees your SoundCloud password. SoundCloud decides who can register an app, and some tracks only play with the right SoundCloud plan.`})]})}async function _d(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:`The request failed (${n.status}).`));return r}var vd=(e,t)=>_d(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),yd={info:async()=>{let e=await _d(`/api/music/sources`);return{status:e.sources.find(e=>e.id===`spotify`)?.status??{connected:!1,needs:null,account:null},redirectUri:e.spotify.redirectUri,clientId:e.spotify.clientId}},saveClientId:async(e,t)=>void await vd(`/api/music/spotify/client-id`,{clientId:e,pin:t}),connect:async e=>(await vd(`/api/music/spotify/connect`,{pin:e})).url,disconnect:async e=>void await vd(`/api/music/spotify/disconnect`,{pin:e})},bd=e=>e.trim()===``||/^[A-Za-z0-9]{8,64}$/.test(e.trim())?null:`A client id is letters and digits only, copied from your app at developer.spotify.com.`;function xd({api:e=yd,navigate:t=e=>window.location.assign(e)}){let[n,r]=(0,l.useState)(null),[i,a]=(0,l.useState)(``),[o,s]=(0,l.useState)(null),[c,u]=(0,l.useState)(``),[f,m]=(0,l.useState)(!1),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(!0),b=(0,l.useCallback)(async()=>{try{let t=await e.info();if(!y.current)return;r(t),a(t.clientId)}catch(e){y.current&&g(e.message)}},[e]);(0,l.useEffect)(()=>(y.current=!0,b(),()=>{y.current=!1}),[b]);let x=async()=>{if(o){m(!0),g(null);try{o===`client`?(await e.saveClientId(i.trim(),c),await b()):o===`connect`?t(await e.connect(c)):(await e.disconnect(c),await b()),y.current&&s(null)}catch(e){y.current&&g(e.message)}finally{y.current&&(m(!1),u(``))}}};if(o)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN `,o===`client`?`to save the client id`:o===`connect`?`to connect Spotify`:`to disconnect Spotify`,`.`]}),(0,p.jsx)(T,{pin:c,onChange:u,onSubmit:()=>!f&&c.length>=6&&void x()}),h&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:h}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:f||c.length<6,onClick:()=>void x(),children:o===`client`?`Save`:`Continue`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{s(null),u(``),g(null)},children:`Back`})]})]});let S=bd(i),C=!!n&&i.trim()!==n.clientId,w=!!n?.clientId,E=n?.status;return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Redirect address to add in your Spotify app`}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,p.jsx)(`input`,{type:`text`,readOnly:!0,value:n?.redirectUri??``,style:{flex:1},onFocus:e=>e.currentTarget.select()}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(n?.redirectUri??``).then(()=>v(!0),()=>{})},children:_?`Copied`:`Copy`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Client id of your Spotify app`}),(0,p.jsx)(`input`,{type:`text`,value:i,maxLength:64,autoComplete:`off`,spellCheck:!1,onChange:e=>a(e.target.value)})]}),S&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:S}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:!C||!i.trim()||S!==null,onClick:()=>s(`client`),children:`Save client id`}),E?.connected?(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>s(`disconnect`),children:`Disconnect Spotify`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!w||C,onClick:()=>s(`connect`),children:`Connect Spotify`})]}),E?.connected&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Connected as `,E.account??`your account`,`.`]}),E?.needs&&(0,p.jsx)(`p`,{className:`auth-note`,children:E.needs}),h&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:h}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Sign-in is on Spotify's own page: Friend never sees your Spotify password. A development-mode Spotify app allows up to five people, and playing needs Spotify Premium on the account.`})]})}async function Sd(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:n.status===403?`Incorrect PIN`:`The request failed (${n.status}).`));return r}var Cd={output:`screen`,maxHeight:720,maxMinutes:240,allowedSites:[],ytdlp:``,ffmpeg:``,autoInstall:!0,youtube:`embed`},wd={info:async()=>{let[e,t]=await Promise.all([Sd(`/api/settings`),Sd(`/api/plugins/video/status`)]);return{settings:e.video??Cd,status:t}},recheck:()=>Sd(`/api/plugins/video/check`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}),prepare:()=>Sd(`/api/plugins/video/prepare`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}),save:async(e,t)=>{await Sd(`/api/settings`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({pin:t,settings:{video:e}})})}},Td=[360,480,720,1080],Ed=1,Dd=600,Od=e=>e.split(/[\s,;]+/).map(e=>e.trim()).filter(Boolean),kd=e=>e.join(`, `);function Ad({name:e,h:t,need:n,auto:r}){return(0,p.jsx)(`li`,{className:t.found?`done`:void 0,children:t.found?(0,p.jsxs)(p.Fragment,{children:[e,` `,t.version??``,` found`]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`strong`,{children:[e,` not found`]}),` `,(0,p.jsxs)(`small`,{children:[`(`,n,`)`]}),r&&(0,p.jsx)(`div`,{className:`auth-note`,children:r}),t.install&&(0,p.jsx)(`div`,{className:`auth-note`,children:t.install})]})})}function jd({api:e=wd,pollMs:t=2e3}){let[n,r]=(0,l.useState)(null),[i,a]=(0,l.useState)(Cd),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(`240`),[f,m]=(0,l.useState)(!1),[h,g]=(0,l.useState)(``),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(null),C=(0,l.useRef)(!0),w=(0,l.useCallback)(async()=>{try{let t=await e.info();if(!C.current)return;r(t),a(t.settings),s(kd(t.settings.allowedSites)),u(String(t.settings.maxMinutes))}catch(e){C.current&&b(e.message)}},[e]);(0,l.useEffect)(()=>(C.current=!0,w(),()=>{C.current=!1}),[w]);let E=n?.status.setup?.busy===!0;(0,l.useEffect)(()=>{if(!E||t<=0)return;let n=setInterval(()=>{e.info().then(e=>C.current&&r(t=>t?{...t,status:e.status}:e)).catch(()=>{})},t);return()=>clearInterval(n)},[E,t,e]);let D=n?.settings??Cd,O=Number(c),k=!Number.isInteger(O)||O<Ed||O>Dd?`Use a whole number of minutes from ${Ed} to ${Dd}.`:null,A=(()=>{let e={};i.output!==D.output&&(e.output=i.output),i.maxHeight!==D.maxHeight&&(e.maxHeight=i.maxHeight),!k&&O!==D.maxMinutes&&(e.maxMinutes=O);let t=Od(o);return JSON.stringify(t)!==JSON.stringify(D.allowedSites)&&(e.allowedSites=t),i.autoInstall!==D.autoInstall&&(e.autoInstall=i.autoInstall),i.youtube!==D.youtube&&(e.youtube=i.youtube),i.ytdlp.trim()!==D.ytdlp&&(e.ytdlp=i.ytdlp.trim()),i.ffmpeg.trim()!==D.ffmpeg&&(e.ffmpeg=i.ffmpeg.trim()),e})(),j=Object.keys(A).length>0,ee=async()=>{v(!0),b(null);try{let t=await e.recheck();C.current&&r(e=>e&&{...e,status:t})}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}},M=async()=>{v(!0),b(null);try{let t=await e.prepare();C.current&&r(e=>e&&{...e,status:t})}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}},N=async()=>{v(!0),b(null);try{if(await e.save(A,h),!C.current)return;m(!1),S(`Saved.`),await w()}catch(e){C.current&&b(e.message)}finally{C.current&&(v(!1),g(``))}};if(f)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Enter your PIN to save these changes.`}),(0,p.jsx)(T,{pin:h,onChange:g,onSubmit:()=>!_&&h.length>=6&&void N()}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||h.length<6,onClick:()=>void N(),children:`Save`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{m(!1),g(``),b(null)},children:`Back`})]})]});let P=n?.status,F=P?.setup,te=e=>i.autoInstall?`Friend downloads ${e} by itself when it is needed (or press Download now).`:null,I=!!P&&(!P.ytdlp.found||!P.ffmpeg.found);return(0,p.jsxs)(`div`,{className:`settings-section`,children:[P&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Helper programs on this PC`}),(0,p.jsxs)(`ol`,{className:`integration-steps`,children:[(0,p.jsx)(Ad,{name:`yt-dlp`,h:P.ytdlp,need:`finds the video, needed for every video`,auto:te(`it`)}),(0,p.jsx)(Ad,{name:`ffmpeg`,h:P.ffmpeg,need:`makes the video playable, needed for the Friend screen`,auto:te(`it`)}),(0,p.jsx)(Ad,{name:`mpv`,h:P.mpv,need:`optional: a window of its own on this PC; without it a browser window is used`,auto:null})]}),F?.busy&&(0,p.jsx)(`p`,{className:`auth-note`,children:F.message??`Setting up the video tools…`}),!F?.busy&&F?.error&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:F.error}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[I&&i.autoInstall&&!F?.busy&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_,onClick:()=>void M(),children:`Download now`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:_,onClick:()=>void ee(),children:`Check again`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,style:{flexDirection:`row`,alignItems:`center`,gap:8},children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:i.autoInstall,onChange:e=>a({...i,autoInstall:e.target.checked})}),(0,p.jsx)(`span`,{children:`Let Friend download yt-dlp and ffmpeg by itself (recommended)`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Where videos play`}),(0,p.jsxs)(`select`,{value:i.output,onChange:e=>a({...i,output:e.target.value}),children:[(0,p.jsx)(`option`,{value:`screen`,children:`On the Friend screen`}),(0,p.jsx)(`option`,{value:`host`,children:`In a window on this PC`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`YouTube plays with`}),(0,p.jsxs)(`select`,{value:i.youtube,onChange:e=>a({...i,youtube:e.target.value}),children:[(0,p.jsx)(`option`,{value:`embed`,children:`YouTube's own player (recommended: nothing to download)`}),(0,p.jsx)(`option`,{value:`stream`,children:`Friend's player (made by Friend with ffmpeg)`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Picture quality (the tallest picture)`}),(0,p.jsx)(`select`,{value:String(i.maxHeight),onChange:e=>a({...i,maxHeight:Number(e.target.value)}),children:(Td.includes(i.maxHeight)?Td:[...Td,i.maxHeight].sort((e,t)=>e-t)).map(e=>(0,p.jsxs)(`option`,{value:e,children:[e,`p`]},e))})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Longest video, in minutes`}),(0,p.jsx)(`input`,{type:`number`,min:Ed,max:Dd,value:c,onChange:e=>u(e.target.value)})]}),k&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:k}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Allowed sites (empty: any public site)`}),(0,p.jsx)(`textarea`,{rows:2,spellCheck:!1,placeholder:`youtube.com, vimeo.com`,value:o,onChange:e=>s(e.target.value)})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`yt-dlp program (empty: find it by itself)`}),(0,p.jsx)(`input`,{type:`text`,value:i.ytdlp,maxLength:260,spellCheck:!1,autoComplete:`off`,placeholder:`yt-dlp`,onChange:e=>a({...i,ytdlp:e.target.value})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`ffmpeg program (empty: find it by itself)`}),(0,p.jsx)(`input`,{type:`text`,value:i.ffmpeg,maxLength:260,spellCheck:!1,autoComplete:`off`,placeholder:`ffmpeg`,onChange:e=>a({...i,ffmpeg:e.target.value})})]}),x&&!j&&(0,p.jsx)(`p`,{className:`auth-note`,children:x}),y&&!k&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!j||_||k!==null,onClick:()=>m(!0),children:j?`Save…`:`Save`})}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Friend downloads the two programs from their projects' own release pages (github.com), checks them against the published checksums and keeps them in its own folder, never anywhere else on your PC. Videos stay on the site; nothing is saved to your disk. Some sites need a login or are not available in every country, and those cannot be played.`})]})}async function Md(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}let r={};try{r=await n.json()}catch{}if(!n.ok)throw Error(r.error??(n.status===401?`Please sign in again.`:`The request failed (${n.status}).`));return r}var Nd=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Pd={status:()=>Md(`/api/brokers`),loginLink:e=>Md(`/api/brokers/zerodha/login-link`,Nd(`POST`,{send:e})),runNow:e=>Md(`/api/brokers/run`,Nd(`POST`,{kind:`custom`,send:e===!0})),addSchedule:async(e,t)=>void await Md(`/api/brokers/schedules`,Nd(`POST`,{...e,pin:t})),removeSchedule:async e=>void await Md(`/api/brokers/schedules/${e}`,{method:`DELETE`})},Fd=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],Id=[[`telegram`,`Telegram`],[`whatsapp`,`WhatsApp`],[`sms`,`SMS`]],Ld={telegram:`Telegram`,whatsapp:`WhatsApp`,sms:`SMS`};function Rd({view:e,setView:t,secret:n,setSecret:r,api:i=Pd}){let[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(null),[u,f]=(0,l.useState)(null),[m,h]=(0,l.useState)(null),[g,_]=(0,l.useState)(!1),[v,y]=(0,l.useState)(!1),[b,x]=(0,l.useState)(``),[S,C]=(0,l.useState)({name:`Morning report`,kind:`morning`,time:`09:30`,days:[1,2,3,4,5],channel:`telegram`}),[w,E]=(0,l.useState)(!1),D=(0,l.useRef)(!0),O=(0,l.useCallback)(()=>i.status().then(e=>D.current&&o(e)).catch(()=>{}),[i]);(0,l.useEffect)(()=>(D.current=!0,O(),()=>{D.current=!1}),[O]);let k=async e=>{E(!0),f(null),c(null);try{await e()}catch(e){D.current&&f(e.message)}finally{D.current&&E(!1)}},A=e.zerodha,j=n=>t({...e,...n}),ee=a?.schedules[0]?.channel??`telegram`,M=()=>/^([01]\d|2[0-3]):[0-5]\d$/.test(S.time)?S.days.length===0?`Choose at least one day.`:S.name.trim()?null:`Give the report a name.`:`Write the time like 09:30 (HH:MM, 24 hour).`,N=()=>k(async()=>{await i.addSchedule({...S,name:S.name.trim()},b),_(!1),y(!1),x(``),await O()});return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend only reads your account. It cannot place orders. The figures you ask about pass through the AI model you chose (Claude from Anthropic, or Ollama on this PC), and a report you schedule goes to the messaging app you pick (Telegram or WhatsApp). Nothing else leaves this PC.`}),(0,p.jsx)(`p`,{className:`auth-note`,children:a?.redirectUrl?(0,p.jsxs)(p.Fragment,{children:[`In your Kite Connect app, set the redirect URL to `,(0,p.jsx)(`code`,{children:a.redirectUrl})]}):`No public address is set yet, so Zerodha cannot send you back to Friend after login (friend config set publicUrl https://…).`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`API key`}),(0,p.jsx)(`input`,{value:A.apiKey,autoComplete:`off`,onChange:e=>j({zerodha:{...A,apiKey:e.target.value}}),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`API secret`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`off`,value:n,placeholder:A.secretSet?`A secret is saved. Type to replace it.`:``,onChange:e=>r(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Time zone`}),(0,p.jsx)(`input`,{value:e.timezone,onChange:e=>j({timezone:e.target.value}),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Days with no reports (one per line, YYYY-MM-DD)`}),(0,p.jsx)(`textarea`,{value:e.skipDates.join(`
|
|
67
67
|
`),rows:3,onChange:e=>j({skipDates:e.target.value.split(/[\s,]+/).filter(Boolean)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Remind me to log in (minutes before the first report, 0 = never)`}),(0,p.jsx)(`input`,{type:`number`,min:0,max:120,value:e.loginReminderMinutes,onChange:e=>j({loginReminderMinutes:Number(e.target.value)}),style:d})]}),(0,p.jsxs)(`details`,{children:[(0,p.jsx)(`summary`,{className:`plugins-heading`,children:`Report options`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Currency sign`}),(0,p.jsx)(`input`,{value:e.currencySymbol,maxLength:4,onChange:e=>j({currencySymbol:e.target.value}),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Currency word (spoken)`}),(0,p.jsx)(`input`,{value:e.currencyName,maxLength:20,onChange:e=>j({currencyName:e.target.value}),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Number format (locale)`}),(0,p.jsx)(`input`,{value:e.numberLocale,onChange:e=>j({numberLocale:e.target.value}),placeholder:`en-IN, en-US, de-DE`,style:d})]}),(0,p.jsx)($u,{label:`Mention a holding above this share of the portfolio (%)`,value:e.concentrationPct,min:5,max:90,onChange:e=>j({concentrationPct:e})}),(0,p.jsx)($u,{label:`Mention a holding down more than this today (%)`,value:e.bigDropPct,min:1,max:50,onChange:e=>j({bigDropPct:e})}),(0,p.jsx)($u,{label:`Seconds to keep an account read`,value:e.cacheSeconds,min:5,max:300,onChange:e=>j({cacheSeconds:e})}),(0,p.jsx)($u,{label:`Most report schedules`,value:e.maxSchedules,min:1,max:50,onChange:e=>j({maxSchedules:e})}),(0,p.jsx)($u,{label:`Tries a day for a report`,value:e.maxTriesPerDay,min:1,max:10,onChange:e=>j({maxTriesPerDay:e})})]}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Daily login`}),(0,p.jsx)(`p`,{className:(a?.zerodha.loggedIn,`auth-note`),children:a?.zerodha.detail??`Checking…`}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:w,onClick:()=>void k(async()=>{let e=await i.loginLink(!1);e.url&&window.open(e.url,`_blank`,`noopener,noreferrer`)}),children:`Open Zerodha login`}),(0,p.jsxs)(`button`,{type:`button`,style:d,disabled:w,onClick:()=>void k(async()=>{let e=await i.loginLink(!0);c(`The login link was sent to your phone${e.via?` (${Ld[e.via]??e.via})`:``}.`)}),children:[`Send me the login link on `,Ld[ee]??`Telegram`]})]}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Reports`}),a&&a.schedules.length===0&&(0,p.jsx)(`p`,{className:`auth-note`,children:`No reports are scheduled.`}),(0,p.jsx)(`ul`,{className:`plugins-list`,children:(a?.schedules??[]).map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`b`,{children:e.name}),` `,(0,p.jsxs)(`small`,{className:`auth-note`,children:[e.time,`, `,e.days.map(e=>Fd[e-1]).join(` `),` to `,Ld[e.channel],e.lastRunDay?`, last sent ${e.lastRunDay}`:``]}),` `,(0,p.jsx)(`button`,{type:`button`,style:d,disabled:w,onClick:()=>void k(async()=>{await i.removeSchedule(e.id),await O()}),children:`Remove`})]},e.id))}),g&&!v&&(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Name`}),(0,p.jsx)(`input`,{value:S.name,onChange:e=>C({...S,name:e.target.value}),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Kind`}),(0,p.jsxs)(`select`,{value:S.kind,onChange:e=>C({...S,kind:e.target.value}),style:d,children:[(0,p.jsx)(`option`,{value:`morning`,children:`Morning`}),(0,p.jsx)(`option`,{value:`close`,children:`Market close`}),(0,p.jsx)(`option`,{value:`custom`,children:`Custom`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Time (24 hour)`}),(0,p.jsx)(`input`,{value:S.time,onChange:e=>C({...S,time:e.target.value}),placeholder:`09:30`,style:d})]}),(0,p.jsx)(`div`,{className:`settings-field`,role:`group`,"aria-label":`Days`,children:Fd.map((e,t)=>(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:S.days.includes(t+1),onChange:e=>C({...S,days:e.target.checked?[...S.days,t+1].sort():S.days.filter(e=>e!==t+1)})}),(0,p.jsx)(`span`,{children:e})]},e))}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Send it on`}),(0,p.jsx)(`select`,{value:S.channel,onChange:e=>C({...S,channel:e.target.value}),style:d,children:Id.map(([e,t])=>(0,p.jsx)(`option`,{value:e,children:t},e))})]}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:()=>{let e=M();f(e),e||y(!0)},children:`Add report…`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{_(!1),f(null)},children:`Cancel`})]})]}),g&&v&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to add this report. It sends your portfolio figures to `,Ld[S.channel],`.`]}),(0,p.jsx)(T,{pin:b,onChange:x,onSubmit:()=>!w&&b.length>=6&&void N()}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:w||b.length<6,onClick:()=>void N(),children:`Add report`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{y(!1),x(``)},children:`Back`})]})]}),!g&&(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{_(!0),f(null),c(null)},children:`Add a report`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:w,onClick:()=>void k(async()=>h((await i.runNow()).text)),children:`Show a report now`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:w,onClick:()=>void k(async()=>{await i.runNow(!0),c(`The report was sent to your phone.`)}),children:`Send a report to my phone`})]}),m&&(0,p.jsx)(`pre`,{className:`auth-note`,style:{whiteSpace:`pre-wrap`},children:m}),s&&(0,p.jsx)(`p`,{className:`auth-note`,children:s}),u&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:u})]})}var zd={telegram:{installed:!1,enabled:!1,tokenSet:!1,linked:!1},twilio:{installed:!1,enabled:!1,accountSid:``,tokenSet:!1,smsFrom:``,whatsappFrom:``,ownerNumber:``}},Bd={zerodha:{installed:!1,enabled:!1,apiKey:``,secretSet:!1},timezone:`Asia/Kolkata`,skipDates:[],loginReminderMinutes:15,currencySymbol:`₹`,currencyName:`rupees`,numberLocale:`en-IN`,concentrationPct:30,bigDropPct:5,cacheSeconds:30,maxSchedules:20,maxTriesPerDay:3},Vd=[`currencySymbol`,`currencyName`,`numberLocale`,`concentrationPct`,`bigDropPct`,`cacheSeconds`,`maxSchedules`,`maxTriesPerDay`],Hd=[`skillName`,`locales`,`answerSeconds`,`holdMinutes`,`permissionSeconds`,`requestsPerMinute`,`maxDevices`,`extraVoiceTools`],Ud=(e,t,n)=>Object.fromEntries(n.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n])).map(t=>[t,e[t]])),Wd={installed:!1,enabled:!1,skillId:``,invocationName:``,allowed:[],skillName:`Friend Assistant`,locales:[`en-IN`,`hi-IN`],answerSeconds:6.5,holdMinutes:10,permissionSeconds:120,requestsPerMinute:60,maxDevices:10,extraVoiceTools:[]};function Gd({integration:e,onBack:t,settingsApi:n=ht,channelsApi:r=ct,brokersApi:i=Pd,alexaApi:a=td,spotifyApi:o=yd,soundcloudApi:s=md,chromeApi:c=ld,videoApi:u=wd}){let[f,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(zd),[_,v]=(0,l.useState)(null),[y,b]=(0,l.useState)(Bd),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(Wd),[E,D]=(0,l.useState)(``),[O,k]=(0,l.useState)(null),[A,j]=(0,l.useState)(!1),[ee,M]=(0,l.useState)(``),[N,P]=(0,l.useState)(!1),[F,te]=(0,l.useState)(null),[I,ne]=(0,l.useState)(null),L=(0,l.useRef)(!0),re=e.id===`telegram`,ie=e.id===`zerodha`,ae=e.id===`alexa`,oe=e.id===`spotify`,se=e.id===`soundcloud`,ce=e.id===`audius`,le=e.id===`chrome`,ue=e.id===`video`,de=oe||se||ce||le||ue;(0,l.useEffect)(()=>(L.current=!0,n.get().then(e=>{if(!L.current)return;let t=e.channels??zd;m(t),g(structuredClone(t));let n=e.brokers??Bd;v(n),b(structuredClone(n));let r=e.alexa??Wd;S(r),w(structuredClone(r))}).catch(e=>L.current&&te(e.message)),r.status().then(e=>L.current&&k(e)).catch(()=>{}),()=>{L.current=!1}),[n,r]);let R=(()=>{if(de)return{};if(ae){if(!x)return{};let e=Ud(C,x,Hd);return C.skillId.trim()!==x.skillId&&(e.skillId=C.skillId.trim()),C.invocationName.trim()!==x.invocationName&&(e.invocationName=C.invocationName.trim()),Object.keys(e).length?{alexa:e}:{}}if(ie){if(!_)return{};let e={};y.zerodha.apiKey!==_.zerodha.apiKey&&(e.apiKey=y.zerodha.apiKey.trim()),E.trim()&&(e.apiSecret=E.trim());let t={};return Object.keys(e).length&&(t.zerodha=e),y.timezone!==_.timezone&&(t.timezone=y.timezone.trim()),JSON.stringify(y.skipDates)!==JSON.stringify(_.skipDates)&&(t.skipDates=y.skipDates),y.loginReminderMinutes!==_.loginReminderMinutes&&(t.loginReminderMinutes=y.loginReminderMinutes),Object.assign(t,Ud(y,_,Vd)),Object.keys(t).length?{brokers:t}:{}}if(!f)return{};if(re)return E.trim()?{channels:{telegram:{botToken:E.trim()}}}:{};let e={};for(let t of[`accountSid`,`smsFrom`,`whatsappFrom`,`ownerNumber`])h.twilio[t]!==f.twilio[t]&&(e[t]=h.twilio[t]);return E.trim()&&(e.authToken=E.trim()),Object.keys(e).length?{channels:{twilio:e}}:{}})(),z=Object.keys(R).length>0,B=async()=>{P(!0),te(null);try{let t=await n.save(R,ee);if(!L.current)return;let r=t.settings.channels??zd;m(r),g(structuredClone(r));let i=t.settings.brokers??Bd;v(i),b(structuredClone(i));let a=t.settings.alexa??Wd;S(a),w(structuredClone(a)),D(``),j(!1),ne(re&&!e.enabled?`Saved. Now press Turn on in the plugins list.`:`Saved.`)}catch(e){L.current&&te(e.message)}finally{L.current&&(P(!1),M(``))}};return A?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Enter your PIN to save these changes.`}),(0,p.jsx)(T,{pin:ee,onChange:M,onSubmit:()=>!N&&void B()}),F&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:F}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:N||ee.length<6,onClick:()=>void B(),children:`Save`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{j(!1),M(``),te(null)},children:`Back`})]})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:e.name}),(0,p.jsx)(`p`,{className:`auth-note`,children:le?e.description:e.detail||e.description}),(0,p.jsx)(`ol`,{className:`integration-steps`,children:e.steps.map((e,t)=>(0,p.jsx)(`li`,{className:e.done?`done`:void 0,children:e.text},t))}),oe&&(0,p.jsx)(xd,{api:o}),se&&(0,p.jsx)(gd,{api:s}),le&&(0,p.jsx)(dd,{api:c}),ue&&(0,p.jsx)(jd,{api:u}),ae&&x&&(0,p.jsx)(sd,{view:C,setView:w,api:a}),ie&&_&&(0,p.jsx)(Rd,{view:y,setView:b,secret:E,setSecret:D,api:i}),!ie&&!ae&&!oe&&!se&&!ce&&!le&&!ue&&f&&(re?(0,p.jsx)(lt,{view:{...h.telegram,enabled:e.enabled},secret:E,setSecret:D,api:r}):(0,p.jsx)(ut,{view:h.twilio,setView:e=>g({...h,twilio:e}),secret:E,setSecret:D,webhook:O?.twilio.webhook??null})),I&&!z&&(0,p.jsx)(`p`,{className:`auth-note`,children:I}),F&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:F}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[!de&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!z||N||ae&&rd(C)!==null,onClick:()=>j(!0),children:z?`Save…`:`Save`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Back`})]})]})}async function Kd(e,t={}){let n;try{n=await fetch(`/api/plugins${e}`,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||(n.status===401?`Please sign in again.`:n.status===429?`Too many attempts. Wait a moment.`:`The request failed (${n.status}).`))}return await n.json()}var qd=(e,t)=>({method:e,...t===void 0?{}:{headers:{"content-type":`application/json`},body:JSON.stringify(t)}}),Jd={list:()=>Kd(``),install:async(e,t)=>{await Kd(`/install`,qd(`POST`,{id:e,pin:t}))},setEnabled:async(e,t,n)=>{await Kd(`/${encodeURIComponent(e)}/enabled`,qd(`POST`,{enabled:t,...n?{pin:n}:{}}))},remove:async e=>{await Kd(`/${encodeURIComponent(e)}`,qd(`DELETE`))},reload:async()=>{await Kd(`/reload`,qd(`POST`,{}))}},Yd=(e,t)=>`${e} ${t}${e===1?``:`s`}`,Xd={"not-installed":``,"needs-setup":`Needs setup`,off:`Off`,connecting:`Connecting…`,online:`On`,error:`Not working`},Zd={"not-installed":`off`,"needs-setup":`warn`,off:`off`,connecting:`warn`,online:`on`,error:`error`},Qd=e=>({id:e.id,name:e.name,version:``,description:e.description,tools:0,skills:0,error:null,installed:!1});function $d({api:e=Jd,onClose:t,initialConfigure:n,variant:r=`classic`}){let[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(null),[c,u]=(0,l.useState)(n??null),[f,m]=(0,l.useState)(``),[h,g]=(0,l.useState)(!1),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(`installed`),[E,D]=(0,l.useState)(0),O=(0,l.useRef)(!0);(0,l.useEffect)(()=>{n&&u(n)},[n]);let k=(0,l.useCallback)(async()=>{try{let t=await e.list();O.current&&a(t)}catch(e){O.current&&S(e.message)}},[e]);(0,l.useEffect)(()=>(O.current=!0,k(),()=>{O.current=!1}),[k]);let A=async e=>{S(null),g(!0);try{if(await e(),!O.current)return;s(null),await k()}catch(e){O.current&&S(e.message)}finally{O.current&&(g(!1),m(``))}},j=()=>{o&&A(()=>o.kind===`install`?e.install(o.plugin.id,f):e.setEnabled(o.id,!0,f))},ee=i?.integrations??[],M=(i?.catalog??[]).filter(e=>!e.installed),N=ee.filter(e=>e.installed),P=ee.filter(e=>!e.installed),F=c?ee.find(e=>e.id===c&&e.installed):void 0,te=(t,n,r)=>({label:r?`Turn off`:`Turn on`,disabled:h,onClick:()=>r?void A(()=>e.setEnabled(t,!1,void 0)):s({kind:`enable`,id:t,name:n})}),I=t=>({label:`Remove`,kind:`danger`,disabled:h,onClick:()=>void A(()=>e.remove(t))}),ne=[...N.map(e=>({key:e.id,integrationId:e.id,name:e.name,small:Xd[e.state],note:e.detail,noteClass:e.state===`error`?`auth-error`:`auth-note`,badge:Zd[e.state],badgeText:Xd[e.state]||`Off`,actions:[{label:`Configure`,kind:`primary`,disabled:h,onClick:()=>u(e.id)},te(e.id,e.name,e.enabled),I(e.id)]})),...(i?.installed??[]).map(e=>({key:e.id,name:e.name,small:e.version,note:e.error?`This plugin cannot be used: ${e.error}`:`${Yd(e.skills.length,`skill`)}, ${Yd(e.tools.length,`tool`)}${e.enabled?``:` (off)`}`,noteClass:`auth-note`,badge:e.error?`error`:e.enabled?`on`:`off`,badgeText:e.error?`Error`:e.enabled?`On`:`Off`,actions:[te(e.id,e.name,e.enabled),I(e.id)]}))],L=[...P.map(e=>({key:e.id,integrationId:e.id,name:e.name,small:`integration`,note:e.description,noteClass:`auth-note`,actions:[{label:`Install`,kind:`primary`,disabled:h,onClick:()=>s({kind:`install`,plugin:Qd(e),integration:!0})}]})),...M.map(e=>({key:e.id,name:e.name,small:e.version,note:e.error?`Cannot be installed: ${e.error}`:`${e.description} (${Yd(e.skills,`skill`)}, ${Yd(e.tools,`tool`)})`,noteClass:`auth-note`,actions:[{label:`Install`,kind:`primary`,disabled:h||!!e.error,onClick:()=>s({kind:`install`,plugin:e})}]}))],re=x&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:x}),ie=o&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:o.kind===`install`?o.integration?`Install ${o.plugin.name}? It connects Friend to an outside service, and you set it up afterwards. Enter your PIN to confirm.`:`Install ${o.plugin.name}? ${o.plugin.tools>0?`Its tools run in a Docker sandbox with no network and no access to your files, and ask for your approval every time. `:``}Enter your PIN to confirm.`:`Switch on ${o.name}? Enter your PIN to confirm.`}),(0,p.jsx)(T,{pin:f,onChange:m,onSubmit:()=>!h&&j()}),re,(0,p.jsxs)(`div`,{className:r===`holo`?`holo-actions`:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:r===`holo`?`holo-btn`:`primary`,disabled:h||f.length<6,onClick:j,children:`Confirm`}),(0,p.jsx)(`button`,{type:`button`,style:d,className:r===`holo`?`holo-btn quiet`:void 0,onClick:()=>{s(null),m(``),S(null)},children:`Back`})]})]}),ae=F&&(0,p.jsx)(Gd,{integration:F,onBack:()=>{u(null),k()}});if(r===`holo`){let{here:n,at:r,pages:a}=_(C===`installed`?ne:L,E),s=!o&&!F,c=o?ie:F?ae:(0,p.jsxs)(p.Fragment,{children:[re,(0,p.jsx)(y,{tabs:[{id:`installed`,label:`Installed`,count:ne.length},{id:`available`,label:`Available`,count:L.length}],active:C,onTab:e=>{w(e),D(0)},cards:n.map(e=>({...e,meta:e.badge?e.integrationId||!e.small?void 0:`version ${e.small}`:e.small||void 0})),empty:C===`installed`?`Nothing installed yet.`:`Everything in the catalog is installed.`,ready:!!i})]});return(0,p.jsx)(b,{label:`Plugins`,title:o?`Confirm with PIN`:F?F.name:`Plugins`,...s&&a>1?{page:v(r,a,D)}:{},help:s?(0,p.jsxs)(p.Fragment,{children:[`Turn plugins on or off, set them up, or install more. Installing and switching on need your `,(0,p.jsx)(`b`,{children:`PIN`}),`.`]}):void 0,extra:s?(0,p.jsx)(`button`,{type:`button`,className:`holo-btn quiet`,disabled:h,onClick:()=>void A(()=>e.reload()),children:`Reload plugins`}):void 0,onDone:t,children:c})}let oe=e=>(0,p.jsxs)(`li`,{...e.integrationId?{"data-integration":e.integrationId}:{},children:[(0,p.jsxs)(`div`,{className:`plugin-info`,children:[(0,p.jsx)(`strong`,{children:e.name}),` `,(0,p.jsx)(`small`,{children:e.small}),(0,p.jsx)(`div`,{className:e.noteClass,children:e.note})]}),(0,p.jsx)(`div`,{className:`plugin-actions`,children:e.actions.map(e=>(0,p.jsx)(`button`,{type:`button`,style:d,className:e.kind,disabled:e.disabled,onClick:e.onClick,children:e.label},e.label))})]},e.key);return(0,p.jsxs)(`div`,{className:`approval plugins glass`,role:`dialog`,"aria-label":`Plugins`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Plugins`})}),(0,p.jsx)(`div`,{className:`plugins-body`,children:o?ie:F?ae:(0,p.jsxs)(p.Fragment,{children:[re,(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Installed`}),i&&ne.length===0&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Nothing installed yet.`}),(0,p.jsx)(`ul`,{className:`plugin-list`,children:ne.map(oe)}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Available`}),i&&L.length===0&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Everything in the catalog is installed.`}),(0,p.jsx)(`ul`,{className:`plugin-list`,children:L.map(oe)}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:h,onClick:()=>void A(()=>e.reload()),children:`Reload plugins`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Close`})]})]})})]})}function ef(e){return e.webgl?e.reducedMotion?6e3:e.memoryGb===void 0?8e3:e.memoryGb>=8?12e3:e.memoryGb>=4?9e3:6e3:0}function tf(){let e=!1;try{let t=document.createElement(`canvas`);e=!!(t.getContext(`webgl2`)||t.getContext(`webgl`))}catch{e=!1}return{webgl:e,memoryGb:navigator.deviceMemory,reducedMotion:typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches}}var nf={idle:{speed:.15,noise:.05,brightness:.85,size:1.6,rotate:.08,tighten:0},listening:{speed:.4,noise:.1,brightness:1.1,size:1.9,rotate:.15,tighten:.08},thinking:{speed:1.1,noise:.22,brightness:1,size:1.7,rotate:.35,tighten:0},speaking:{speed:.6,noise:.12,brightness:1.25,size:1.8,rotate:.12,tighten:0}},rf=e=>Number.isFinite(e)?Math.min(1,Math.max(0,e)):0,af=class{state=`idle`;amplitudeTarget=0;intensity=.6;amp=0;cur={...nf.idle};phase=0;angle=0;motion;constructor(e={}){this.motion=e.reducedMotion?.25:1}setState(e){this.state=e}setAmplitude(e){this.amplitudeTarget=rf(e)}setIntensity(e){this.intensity=rf(e)}tick(e){let t=nf[this.state],n=1-Math.exp(-e*3);for(let e of Object.keys(t))this.cur[e]+=(t[e]-this.cur[e])*n;this.amp+=(this.amplitudeTarget-this.amp)*(1-Math.exp(-e*12)),this.amplitudeTarget*=Math.exp(-e*3),this.phase+=e*this.cur.speed*this.motion,this.angle+=e*this.cur.rotate*this.motion}uniforms(){return{...this.cur,brightness:this.cur.brightness*(.5+this.intensity)/1.1,speed:this.cur.speed*this.motion,rotate:this.cur.rotate*this.motion,amplitude:this.amp*(this.motion===1?1:.5),phase:this.phase,angle:this.angle}}},of=1e3,sf=1001,cf=1002,lf=1003,uf=1004,df=1005,ff=1006,pf=1007,mf=1008,hf=1009,gf=1010,_f=1011,vf=1012,yf=1013,bf=1014,xf=1015,Sf=1016,Cf=1017,wf=1018,Tf=1020,Ef=35902,Df=35899,Of=1021,kf=1022,Af=1023,jf=1026,Mf=1027,Nf=1028,Pf=1029,Ff=1030,If=1031,Lf=1033,Rf=33776,zf=33777,Bf=33778,Vf=33779,Hf=35840,Uf=35841,Wf=35842,Gf=35843,Kf=36196,qf=37492,Jf=37496,Yf=37488,Xf=37489,Zf=37490,Qf=37491,$f=37808,ep=37809,tp=37810,np=37811,rp=37812,ip=37813,ap=37814,op=37815,sp=37816,cp=37817,lp=37818,up=37819,dp=37820,fp=37821,pp=36492,mp=36494,hp=36495,gp=36283,_p=36284,vp=36285,yp=36286,bp=2300,xp=2301,Sp=2302,Cp=2303,wp=2400,Tp=2401,Ep=2402,Dp=3200,Op=`srgb`,kp=`srgb-linear`,Ap=`linear`,jp=`srgb`,Mp=7680,Np=35044,Pp=2e3;function Fp(e){for(let t=e.length-1;t>=0;--t)if(e[t]>=65535)return!0;return!1}function Ip(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function Lp(e){return document.createElementNS(`http://www.w3.org/1999/xhtml`,e)}function Rp(){let e=Lp(`canvas`);return e.style.display=`block`,e}var zp={};function Bp(...e){let t=`THREE.`+e.shift();console.log(t,...e)}function Vp(e){let t=e[0];if(typeof t==`string`&&t.startsWith(`TSL:`)){let t=e[1];t&&t.isStackTrace?e[0]+=` `+t.getLocation():e[1]=`Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.`}return e}function X(...e){e=Vp(e);let t=`THREE.`+e.shift();{let n=e[0];n&&n.isStackTrace?console.warn(n.getError(t)):console.warn(t,...e)}}function Z(...e){e=Vp(e);let t=`THREE.`+e.shift();{let n=e[0];n&&n.isStackTrace?console.error(n.getError(t)):console.error(t,...e)}}function Hp(...e){let t=e.join(` `);t in zp||(zp[t]=!0,X(...e))}function Up(e,t,n){return new Promise(function(r,i){function a(){switch(e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0)){case e.WAIT_FAILED:i();break;case e.TIMEOUT_EXPIRED:setTimeout(a,n);break;default:r()}}setTimeout(a,n)})}var Wp={0:1,2:6,4:7,3:5,1:0,6:2,7:4,5:3},Gp=class{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){let n=this._listeners;return n!==void 0&&n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){let n=this._listeners;if(n===void 0)return;let r=n[e];if(r!==void 0){let e=r.indexOf(t);e!==-1&&r.splice(e,1)}}dispatchEvent(e){let t=this._listeners;if(t===void 0)return;let n=t[e.type];if(n!==void 0){e.target=this;let t=n.slice(0);for(let n=0,r=t.length;n<r;n++)t[n].call(this,e);e.target=null}}},Kp=`00.01.02.03.04.05.06.07.08.09.0a.0b.0c.0d.0e.0f.10.11.12.13.14.15.16.17.18.19.1a.1b.1c.1d.1e.1f.20.21.22.23.24.25.26.27.28.29.2a.2b.2c.2d.2e.2f.30.31.32.33.34.35.36.37.38.39.3a.3b.3c.3d.3e.3f.40.41.42.43.44.45.46.47.48.49.4a.4b.4c.4d.4e.4f.50.51.52.53.54.55.56.57.58.59.5a.5b.5c.5d.5e.5f.60.61.62.63.64.65.66.67.68.69.6a.6b.6c.6d.6e.6f.70.71.72.73.74.75.76.77.78.79.7a.7b.7c.7d.7e.7f.80.81.82.83.84.85.86.87.88.89.8a.8b.8c.8d.8e.8f.90.91.92.93.94.95.96.97.98.99.9a.9b.9c.9d.9e.9f.a0.a1.a2.a3.a4.a5.a6.a7.a8.a9.aa.ab.ac.ad.ae.af.b0.b1.b2.b3.b4.b5.b6.b7.b8.b9.ba.bb.bc.bd.be.bf.c0.c1.c2.c3.c4.c5.c6.c7.c8.c9.ca.cb.cc.cd.ce.cf.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.da.db.dc.dd.de.df.e0.e1.e2.e3.e4.e5.e6.e7.e8.e9.ea.eb.ec.ed.ee.ef.f0.f1.f2.f3.f4.f5.f6.f7.f8.f9.fa.fb.fc.fd.fe.ff`.split(`.`),qp=Math.PI/180,Jp=180/Math.PI;function Yp(){let e=Math.random()*4294967295|0,t=Math.random()*4294967295|0,n=Math.random()*4294967295|0,r=Math.random()*4294967295|0;return(Kp[e&255]+Kp[e>>8&255]+Kp[e>>16&255]+Kp[e>>24&255]+`-`+Kp[t&255]+Kp[t>>8&255]+`-`+Kp[t>>16&15|64]+Kp[t>>24&255]+`-`+Kp[n&63|128]+Kp[n>>8&255]+`-`+Kp[n>>16&255]+Kp[n>>24&255]+Kp[r&255]+Kp[r>>8&255]+Kp[r>>16&255]+Kp[r>>24&255]).toLowerCase()}function Xp(e,t,n){return Math.max(t,Math.min(n,e))}function Zp(e,t){return(e%t+t)%t}function Qp(e,t,n){return(1-n)*e+n*t}function $p(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return e/4294967295;case Uint16Array:return e/65535;case Uint8Array:case Uint8ClampedArray:return e/255;case Int32Array:return Math.max(e/2147483647,-1);case Int16Array:return Math.max(e/32767,-1);case Int8Array:return Math.max(e/127,-1);default:throw Error(`THREE.MathUtils: Invalid component type.`)}}function em(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return Math.round(e*4294967295);case Uint16Array:return Math.round(e*65535);case Uint8Array:case Uint8ClampedArray:return Math.round(e*255);case Int32Array:return Math.round(e*2147483647);case Int16Array:return Math.round(e*32767);case Int8Array:return Math.round(e*127);default:throw Error(`THREE.MathUtils: Invalid component type.`)}}var tm=class e{static{e.prototype.isVector2=!0}constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error(`THREE.Vector2: index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error(`THREE.Vector2: index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){let t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Xp(this.x,e.x,t.x),this.y=Xp(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=Xp(this.x,e,t),this.y=Xp(this.y,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xp(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(Xp(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){let n=Math.cos(t),r=Math.sin(t),i=this.x-e.x,a=this.y-e.y;return this.x=i*n-a*r+e.x,this.y=i*r+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},nm=class{constructor(e=0,t=0,n=0,r=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=r}static slerpFlat(e,t,n,r,i,a,o){let s=n[r+0],c=n[r+1],l=n[r+2],u=n[r+3],d=i[a+0],f=i[a+1],p=i[a+2],m=i[a+3];if(u!==m||s!==d||c!==f||l!==p){let e=s*d+c*f+l*p+u*m;e<0&&(d=-d,f=-f,p=-p,m=-m,e=-e);let t=1-o;if(e<.9995){let n=Math.acos(e),r=Math.sin(n);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r,s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o}else{s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o;let e=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=e,c*=e,l*=e,u*=e}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,r,i,a){let o=n[r],s=n[r+1],c=n[r+2],l=n[r+3],u=i[a],d=i[a+1],f=i[a+2],p=i[a+3];return e[t]=o*p+l*u+s*f-c*d,e[t+1]=s*p+l*d+c*u-o*f,e[t+2]=c*p+l*f+o*d-s*u,e[t+3]=l*p-o*u-s*d-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._w=r,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){let n=e._x,r=e._y,i=e._z,a=e._order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(r/2),u=o(i/2),d=s(n/2),f=s(r/2),p=s(i/2);switch(a){case`XYZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`YXZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`ZXY`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`ZYX`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`YZX`:this._x=d*l*u+c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u-d*f*p;break;case`XZY`:this._x=d*l*u-c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u+d*f*p;break;default:X(`Quaternion: .setFromEuler() encountered an unknown order: `+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){let n=t/2,r=Math.sin(n);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){let t=e.elements,n=t[0],r=t[4],i=t[8],a=t[1],o=t[5],s=t[9],c=t[2],l=t[6],u=t[10],d=n+o+u;if(d>0){let e=.5/Math.sqrt(d+1);this._w=.25/e,this._x=(l-s)*e,this._y=(i-c)*e,this._z=(a-r)*e}else if(n>o&&n>u){let e=2*Math.sqrt(1+n-o-u);this._w=(l-s)/e,this._x=.25*e,this._y=(r+a)/e,this._z=(i+c)/e}else if(o>u){let e=2*Math.sqrt(1+o-n-u);this._w=(i-c)/e,this._x=(r+a)/e,this._y=.25*e,this._z=(s+l)/e}else{let e=2*Math.sqrt(1+u-n-o);this._w=(a-r)/e,this._x=(i+c)/e,this._y=(s+l)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Xp(this.dot(e),-1,1)))}rotateTowards(e,t){let n=this.angleTo(e);if(n===0)return this;let r=Math.min(1,t/n);return this.slerp(e,r),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+r*c-i*s,this._y=r*l+a*s+i*o-n*c,this._z=i*l+a*c+n*s-r*o,this._w=a*l-n*o-r*s-i*c,this._onChangeCallback(),this}slerp(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,r=-r,i=-i,a=-a,o=-o);let s=1-t;if(o<.9995){let e=Math.acos(o),c=Math.sin(e);s=Math.sin(s*e)/c,t=Math.sin(t*e)/c,this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this._onChangeCallback()}else this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){let e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),r=Math.sqrt(1-n),i=Math.sqrt(n);return this.set(r*Math.sin(e),r*Math.cos(e),i*Math.sin(t),i*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},Q=class e{static{e.prototype.isVector3=!0}constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error(`THREE.Vector3: index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(`THREE.Vector3: index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(im.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(im.setFromAxisAngle(e,t))}applyMatrix3(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6]*r,this.y=i[1]*t+i[4]*n+i[7]*r,this.z=i[2]*t+i[5]*n+i[8]*r,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=e.elements,a=1/(i[3]*t+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*t+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*t+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*t+i[6]*n+i[10]*r+i[14])*a,this}applyQuaternion(e){let t=this.x,n=this.y,r=this.z,i=e.x,a=e.y,o=e.z,s=e.w,c=2*(a*r-o*n),l=2*(o*t-i*r),u=2*(i*n-a*t);return this.x=t+s*c+a*u-o*l,this.y=n+s*l+o*c-i*u,this.z=r+s*u+i*l-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[4]*n+i[8]*r,this.y=i[1]*t+i[5]*n+i[9]*r,this.z=i[2]*t+i[6]*n+i[10]*r,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Xp(this.x,e.x,t.x),this.y=Xp(this.y,e.y,t.y),this.z=Xp(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=Xp(this.x,e,t),this.y=Xp(this.y,e,t),this.z=Xp(this.z,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xp(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){let n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this}projectOnVector(e){let t=e.lengthSq();if(t===0)return this.set(0,0,0);let n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return rm.copy(this).projectOnVector(e),this.sub(rm)}reflect(e){return this.sub(rm.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(Xp(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){let r=Math.sin(t)*e;return this.x=r*Math.sin(n),this.y=Math.cos(t)*e,this.z=r*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){let t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),r=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=r,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},rm=new Q,im=new nm,am=class e{static{e.prototype.isMatrix3=!0}constructor(e,t,n,r,i,a,o,s,c){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,r,i,a,o,s,c)}set(e,t,n,r,i,a,o,s,c){let l=this.elements;return l[0]=e,l[1]=r,l[2]=o,l[3]=t,l[4]=i,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){let t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){let t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){let n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],d=n[2],f=n[5],p=n[8],m=r[0],h=r[3],g=r[6],_=r[1],v=r[4],y=r[7],b=r[2],x=r[5],S=r[8];return i[0]=a*m+o*_+s*b,i[3]=a*h+o*v+s*x,i[6]=a*g+o*y+s*S,i[1]=c*m+l*_+u*b,i[4]=c*h+l*v+u*x,i[7]=c*g+l*y+u*S,i[2]=d*m+f*_+p*b,i[5]=d*h+f*v+p*x,i[8]=d*g+f*y+p*S,this}multiplyScalar(e){let t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*i*l+n*o*s+r*i*c-r*a*s}invert(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=l*a-o*c,d=o*s-l*i,f=c*i-a*s,p=t*u+n*d+r*f;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);let m=1/p;return e[0]=u*m,e[1]=(r*c-l*n)*m,e[2]=(o*n-r*a)*m,e[3]=d*m,e[4]=(l*t-r*s)*m,e[5]=(r*i-o*t)*m,e[6]=f*m,e[7]=(n*s-c*t)*m,e[8]=(a*t-n*i)*m,this}transpose(){let e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){let t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,r,i,a,o){let s=Math.cos(i),c=Math.sin(i);return this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-r*c,r*s,-r*(-c*a+s*o)+o+t,0,0,1),this}scale(e,t){return Hp(`Matrix3: .scale() is deprecated. Use .makeScale() instead.`),this.premultiply(om.makeScale(e,t)),this}rotate(e){return Hp(`Matrix3: .rotate() is deprecated. Use .makeRotation() instead.`),this.premultiply(om.makeRotation(-e)),this}translate(e,t){return Hp(`Matrix3: .translate() is deprecated. Use .makeTranslation() instead.`),this.premultiply(om.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){let t=this.elements,n=e.elements;for(let e=0;e<9;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){let n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}},om=new am,sm=new am().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),cm=new am().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function lm(){let e={enabled:!0,workingColorSpace:kp,spaces:{},convert:function(e,t,n){return this.enabled===!1||t===n||!t||!n?e:(this.spaces[t].transfer===`srgb`&&(e.r=dm(e.r),e.g=dm(e.g),e.b=dm(e.b)),this.spaces[t].primaries!==this.spaces[n].primaries&&(e.applyMatrix3(this.spaces[t].toXYZ),e.applyMatrix3(this.spaces[n].fromXYZ)),this.spaces[n].transfer===`srgb`&&(e.r=fm(e.r),e.g=fm(e.g),e.b=fm(e.b)),e)},workingToColorSpace:function(e,t){return this.convert(e,this.workingColorSpace,t)},colorSpaceToWorking:function(e,t){return this.convert(e,t,this.workingColorSpace)},getPrimaries:function(e){return this.spaces[e].primaries},getTransfer:function(e){return e===``?Ap:this.spaces[e].transfer},getToneMappingMode:function(e){return this.spaces[e].outputColorSpaceConfig.toneMappingMode||`standard`},getLuminanceCoefficients:function(e,t=this.workingColorSpace){return e.fromArray(this.spaces[t].luminanceCoefficients)},define:function(e){Object.assign(this.spaces,e)},_getMatrix:function(e,t,n){return e.copy(this.spaces[t].toXYZ).multiply(this.spaces[n].fromXYZ)},_getDrawingBufferColorSpace:function(e){return this.spaces[e].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(e=this.workingColorSpace){return this.spaces[e].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(t,n){return Hp(`ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().`),e.workingToColorSpace(t,n)},toWorkingColorSpace:function(t,n){return Hp(`ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().`),e.colorSpaceToWorking(t,n)}},t=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],r=[.3127,.329];return e.define({[kp]:{primaries:t,whitePoint:r,transfer:Ap,toXYZ:sm,fromXYZ:cm,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:Op},outputColorSpaceConfig:{drawingBufferColorSpace:Op}},[Op]:{primaries:t,whitePoint:r,transfer:jp,toXYZ:sm,fromXYZ:cm,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:Op}}}),e}var um=lm();function dm(e){return e<.04045?e*.0773993808:(e*.9478672986+.0521327014)**2.4}function fm(e){return e<.0031308?e*12.92:1.055*e**.41666-.055}var pm,mm=class{static getDataURL(e,t=`image/png`){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>`u`)return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{pm===void 0&&(pm=Lp(`canvas`)),pm.width=e.width,pm.height=e.height;let t=pm.getContext(`2d`);e instanceof ImageData?t.putImageData(e,0,0):t.drawImage(e,0,0,e.width,e.height),n=pm}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||typeof ImageBitmap<`u`&&e instanceof ImageBitmap){let t=Lp(`canvas`);t.width=e.width,t.height=e.height;let n=t.getContext(`2d`);n.drawImage(e,0,0,e.width,e.height);let r=n.getImageData(0,0,e.width,e.height),i=r.data;for(let e=0;e<i.length;e++)i[e]=dm(i[e]/255)*255;return n.putImageData(r,0,0),t}if(e.data){let t=e.data.slice(0);for(let e=0;e<t.length;e++)t instanceof Uint8Array||t instanceof Uint8ClampedArray?t[e]=Math.floor(dm(t[e]/255)*255):t[e]=dm(t[e]);return{data:t,width:e.width,height:e.height}}return X(`ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.`),e}},hm=0,gm=class{constructor(e=null){this.isTextureSource=!0,Object.defineProperty(this,"id",{value:hm++}),this.uuid=Yp(),this.data=e,this.dataReady=!0,this.version=0}getSize(e){let t=this.data;return typeof HTMLVideoElement<`u`&&t instanceof HTMLVideoElement?e.set(t.videoWidth,t.videoHeight,0):typeof VideoFrame<`u`&&t instanceof VideoFrame?e.set(t.displayWidth,t.displayHeight,0):t===null?e.set(0,0,0):e.set(t.width,t.height,t.depth||0),e}set needsUpdate(e){e===!0&&this.version++}toJSON(e){let t=e===void 0||typeof e==`string`;if(!t&&e.images[this.uuid]!==void 0)return e.images[this.uuid];let n={uuid:this.uuid,url:``},r=this.data;if(r!==null){let e;if(Array.isArray(r)){e=[];for(let t=0,n=r.length;t<n;t++)r[t].isDataTexture?e.push(_m(r[t].image)):e.push(_m(r[t]))}else e=_m(r);n.url=e}return t||(e.images[this.uuid]=n),n}};function _m(e){return typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||typeof ImageBitmap<`u`&&e instanceof ImageBitmap?mm.getDataURL(e):e.data?{data:Array.from(e.data),width:e.width,height:e.height,type:e.data.constructor.name}:(X(`Texture: Unable to serialize Texture.`),{})}var vm=0,ym=new Q,bm=class e extends Gp{constructor(t=e.DEFAULT_IMAGE,n=e.DEFAULT_MAPPING,r=sf,i=sf,a=ff,o=mf,s=Af,c=hf,l=e.DEFAULT_ANISOTROPY,u=``){super(),this.isTexture=!0,Object.defineProperty(this,"id",{value:vm++}),this.uuid=Yp(),this.name=``,this.source=new gm(t),this.mipmaps=[],this.mapping=n,this.channel=0,this.wrapS=r,this.wrapT=i,this.magFilter=a,this.minFilter=o,this.anisotropy=l,this.format=s,this.internalFormat=null,this.type=c,this.offset=new tm(0,0),this.repeat=new tm(1,1),this.center=new tm(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new am,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.colorSpace=u,this.userData={},this.updateRanges=[],this.version=0,this.onUpdate=null,this.renderTarget=null,this.isRenderTargetTexture=!1,this.isArrayTexture=!!(t&&t.depth&&t.depth>1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(ym).x}get height(){return this.source.getSize(ym).y}get depth(){return this.source.getSize(ym).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(let t in e){let n=e[t];if(n===void 0){X(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){X(`Texture.setValues(): property '${t}' does not exist.`);continue}r&&n&&r.isVector2&&n.isVector2||r&&n&&r.isVector3&&n.isVector3||r&&n&&r.isMatrix3&&n.isMatrix3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];let n={metadata:{version:4.7,type:`Texture`,generator:`Texture.toJSON`},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:`dispose`})}transformUv(e){if(this.mapping!==300)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case of:e.x-=Math.floor(e.x);break;case sf:e.x=e.x<0?0:1;break;case cf:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x-=Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case of:e.y-=Math.floor(e.y);break;case sf:e.y=e.y<0?0:1;break;case cf:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y-=Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};bm.DEFAULT_IMAGE=null,bm.DEFAULT_MAPPING=300,bm.DEFAULT_ANISOTROPY=1;var xm=class e{static{e.prototype.isVector4=!0}constructor(e=0,t=0,n=0,r=1){this.x=e,this.y=t,this.z=n,this.w=r}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,r){return this.x=e,this.y=t,this.z=n,this.w=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error(`THREE.Vector4: index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(`THREE.Vector4: index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w===void 0?1:e.w,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*t+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*t+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*t+a[7]*n+a[11]*r+a[15]*i,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);let t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,r,i,a=.01,o=.1,s=e.elements,c=s[0],l=s[4],u=s[8],d=s[1],f=s[5],p=s[9],m=s[2],h=s[6],g=s[10];if(Math.abs(l-d)<a&&Math.abs(u-m)<a&&Math.abs(p-h)<a){if(Math.abs(l+d)<o&&Math.abs(u+m)<o&&Math.abs(p+h)<o&&Math.abs(c+f+g-3)<o)return this.set(1,0,0,0),this;t=Math.PI;let e=(c+1)/2,s=(f+1)/2,_=(g+1)/2,v=(l+d)/4,y=(u+m)/4,b=(p+h)/4;return e>s&&e>_?e<a?(n=0,r=.707106781,i=.707106781):(n=Math.sqrt(e),r=v/n,i=y/n):s>_?s<a?(n=.707106781,r=0,i=.707106781):(r=Math.sqrt(s),n=v/r,i=b/r):_<a?(n=.707106781,r=.707106781,i=0):(i=Math.sqrt(_),n=y/i,r=b/i),this.set(n,r,i,t),this}let _=Math.sqrt((h-p)*(h-p)+(u-m)*(u-m)+(d-l)*(d-l));return Math.abs(_)<.001&&(_=1),this.x=(h-p)/_,this.y=(u-m)/_,this.z=(d-l)/_,this.w=Math.acos((c+f+g-1)/2),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Xp(this.x,e.x,t.x),this.y=Xp(this.y,e.y,t.y),this.z=Xp(this.z,e.z,t.z),this.w=Xp(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=Xp(this.x,e,t),this.y=Xp(this.y,e,t),this.z=Xp(this.z,e,t),this.w=Xp(this.w,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xp(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},Sm=class extends Gp{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:ff,depthBuffer:!0,stencilBuffer:!1,resolveColorBuffer:!0,resolveDepthBuffer:!0,resolveStencilBuffer:!0,storeMultisampledColorBuffer:!0,storeMultisampledDepthBuffer:!0,storeMultisampledStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1,useArrayDepthTexture:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new xm(0,0,e,t),this.scissorTest=!1,this.viewport=new xm(0,0,e,t),this.textures=[];let r=new bm({width:e,height:t,depth:n.depth}),i=n.count;for(let e=0;e<i;e++)this.textures[e]=r.clone(),this.textures[e].isRenderTargetTexture=!0,this.textures[e].renderTarget=this;this._setTextureOptions(n),this.depthBuffer=n.depthBuffer,this.stencilBuffer=n.stencilBuffer,this.resolveColorBuffer=n.resolveColorBuffer,this.resolveDepthBuffer=n.resolveDepthBuffer,this.resolveStencilBuffer=n.resolveStencilBuffer,this.storeMultisampledColorBuffer=n.storeMultisampledColorBuffer,this.storeMultisampledDepthBuffer=n.storeMultisampledDepthBuffer,this.storeMultisampledStencilBuffer=n.storeMultisampledStencilBuffer,this._depthTexture=null,this.depthTexture=n.depthTexture,this.samples=n.samples,this.multiview=n.multiview,this.useArrayDepthTexture=n.useArrayDepthTexture}_setTextureOptions(e={}){let t={minFilter:ff,generateMipmaps:!1,flipY:!1,internalFormat:null};e.mapping!==void 0&&(t.mapping=e.mapping),e.wrapS!==void 0&&(t.wrapS=e.wrapS),e.wrapT!==void 0&&(t.wrapT=e.wrapT),e.wrapR!==void 0&&(t.wrapR=e.wrapR),e.magFilter!==void 0&&(t.magFilter=e.magFilter),e.minFilter!==void 0&&(t.minFilter=e.minFilter),e.format!==void 0&&(t.format=e.format),e.type!==void 0&&(t.type=e.type),e.anisotropy!==void 0&&(t.anisotropy=e.anisotropy),e.colorSpace!==void 0&&(t.colorSpace=e.colorSpace),e.flipY!==void 0&&(t.flipY=e.flipY),e.generateMipmaps!==void 0&&(t.generateMipmaps=e.generateMipmaps),e.internalFormat!==void 0&&(t.internalFormat=e.internalFormat);for(let e=0;e<this.textures.length;e++)this.textures[e].setValues(t)}get texture(){return this.textures[0]}set texture(e){this.textures[0]=e}set depthTexture(e){this._depthTexture!==null&&this._depthTexture.renderTarget===this&&(this._depthTexture.renderTarget=null),e!==null&&e.renderTarget===null&&(e.renderTarget=this),this._depthTexture=e}get depthTexture(){return this._depthTexture}setSize(e,t,n=1){if(this.width!==e||this.height!==t||this.depth!==n){this.width=e,this.height=t,this.depth=n;for(let r=0,i=this.textures.length;r<i;r++)this.textures[r].image.width=e,this.textures[r].image.height=t,this.textures[r].image.depth=n,this.textures[r].isData3DTexture!==!0&&(this.textures[r].isArrayTexture=this.textures[r].image.depth>1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t<n;t++){this.textures[t]=e.textures[t].clone(),this.textures[t].isRenderTargetTexture=!0,this.textures[t].renderTarget=this;let n=Object.assign({},e.textures[t].image);this.textures[t].source=new gm(n)}if(this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.resolveColorBuffer=e.resolveColorBuffer,this.resolveDepthBuffer=e.resolveDepthBuffer,this.resolveStencilBuffer=e.resolveStencilBuffer,this.storeMultisampledColorBuffer=e.storeMultisampledColorBuffer,this.storeMultisampledDepthBuffer=e.storeMultisampledDepthBuffer,this.storeMultisampledStencilBuffer=e.storeMultisampledStencilBuffer,e.depthTexture!==null){if(e.depthTexture.renderTarget===e){let t=e.depthTexture.clone();t.renderTarget=null,this.depthTexture=t}else this.depthTexture=e.depthTexture}return this.samples=e.samples,this.multiview=e.multiview,this.useArrayDepthTexture=e.useArrayDepthTexture,this}dispose(){this.dispatchEvent({type:`dispose`})}},Cm=class extends Sm{constructor(e=1,t=1,n={}){super(e,t,n),this.isWebGLRenderTarget=!0}},wm=class extends bm{constructor(e=null,t=1,n=1,r=1){super(null),this.isDataArrayTexture=!0,this.image={data:e,width:t,height:n,depth:r},this.magFilter=lf,this.minFilter=lf,this.wrapR=sf,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.layerUpdates=new Set}copy(e){return super.copy(e),this.wrapR=e.wrapR,this}addLayerUpdate(e){this.layerUpdates.add(e)}clearLayerUpdates(){this.layerUpdates.clear()}},Tm=class extends bm{constructor(e=null,t=1,n=1,r=1){super(null),this.isData3DTexture=!0,this.image={data:e,width:t,height:n,depth:r},this.magFilter=lf,this.minFilter=lf,this.wrapR=sf,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}copy(e){return super.copy(e),this.wrapR=e.wrapR,this}},Em=class e{static{e.prototype.isMatrix4=!0}constructor(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h)}set(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=r,g[1]=i,g[5]=a,g[9]=o,g[13]=s,g[2]=c,g[6]=l,g[10]=u,g[14]=d,g[3]=f,g[7]=p,g[11]=m,g[15]=h,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new e().fromArray(this.elements)}copy(e){let t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){let t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){let t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return this.determinantAffine()===0?(e.set(1,0,0),t.set(0,1,0),n.set(0,0,1),this):(e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this)}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){if(e.determinantAffine()===0)return this.identity();let t=this.elements,n=e.elements,r=1/Dm.setFromMatrixColumn(e,0).length(),i=1/Dm.setFromMatrixColumn(e,1).length(),a=1/Dm.setFromMatrixColumn(e,2).length();return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=0,t[4]=n[4]*i,t[5]=n[5]*i,t[6]=n[6]*i,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){let t=this.elements,n=e.x,r=e.y,i=e.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(r),c=Math.sin(r),l=Math.cos(i),u=Math.sin(i);if(e.order===`XYZ`){let e=a*l,n=a*u,r=o*l,i=o*u;t[0]=s*l,t[4]=-s*u,t[8]=c,t[1]=n+r*c,t[5]=e-i*c,t[9]=-o*s,t[2]=i-e*c,t[6]=r+n*c,t[10]=a*s}else if(e.order===`YXZ`){let e=s*l,n=s*u,r=c*l,i=c*u;t[0]=e+i*o,t[4]=r*o-n,t[8]=a*c,t[1]=a*u,t[5]=a*l,t[9]=-o,t[2]=n*o-r,t[6]=i+e*o,t[10]=a*s}else if(e.order===`ZXY`){let e=s*l,n=s*u,r=c*l,i=c*u;t[0]=e-i*o,t[4]=-a*u,t[8]=r+n*o,t[1]=n+r*o,t[5]=a*l,t[9]=i-e*o,t[2]=-a*c,t[6]=o,t[10]=a*s}else if(e.order===`ZYX`){let e=a*l,n=a*u,r=o*l,i=o*u;t[0]=s*l,t[4]=r*c-n,t[8]=e*c+i,t[1]=s*u,t[5]=i*c+e,t[9]=n*c-r,t[2]=-c,t[6]=o*s,t[10]=a*s}else if(e.order===`YZX`){let e=a*s,n=a*c,r=o*s,i=o*c;t[0]=s*l,t[4]=i-e*u,t[8]=r*u+n,t[1]=u,t[5]=a*l,t[9]=-o*l,t[2]=-c*l,t[6]=n*u+r,t[10]=e-i*u}else if(e.order===`XZY`){let e=a*s,n=a*c,r=o*s,i=o*c;t[0]=s*l,t[4]=-u,t[8]=c*l,t[1]=e*u+i,t[5]=a*l,t[9]=n*u-r,t[2]=r*u-n,t[6]=o*l,t[10]=i*u+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(km,e,Am)}lookAt(e,t,n){let r=this.elements;return Nm.subVectors(e,t),Nm.lengthSq()===0&&(Nm.z=1),Nm.normalize(),jm.crossVectors(n,Nm),jm.lengthSq()===0&&(Math.abs(n.z)===1?Nm.x+=1e-4:Nm.z+=1e-4,Nm.normalize(),jm.crossVectors(n,Nm)),jm.normalize(),Mm.crossVectors(Nm,jm),r[0]=jm.x,r[4]=Mm.x,r[8]=Nm.x,r[1]=jm.y,r[5]=Mm.y,r[9]=Nm.y,r[2]=jm.z,r[6]=Mm.z,r[10]=Nm.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){let n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[4],s=n[8],c=n[12],l=n[1],u=n[5],d=n[9],f=n[13],p=n[2],m=n[6],h=n[10],g=n[14],_=n[3],v=n[7],y=n[11],b=n[15],x=r[0],S=r[4],C=r[8],w=r[12],T=r[1],E=r[5],D=r[9],O=r[13],k=r[2],A=r[6],j=r[10],ee=r[14],M=r[3],N=r[7],P=r[11],F=r[15];return i[0]=a*x+o*T+s*k+c*M,i[4]=a*S+o*E+s*A+c*N,i[8]=a*C+o*D+s*j+c*P,i[12]=a*w+o*O+s*ee+c*F,i[1]=l*x+u*T+d*k+f*M,i[5]=l*S+u*E+d*A+f*N,i[9]=l*C+u*D+d*j+f*P,i[13]=l*w+u*O+d*ee+f*F,i[2]=p*x+m*T+h*k+g*M,i[6]=p*S+m*E+h*A+g*N,i[10]=p*C+m*D+h*j+g*P,i[14]=p*w+m*O+h*ee+g*F,i[3]=_*x+v*T+y*k+b*M,i[7]=_*S+v*E+y*A+b*N,i[11]=_*C+v*D+y*j+b*P,i[15]=_*w+v*O+y*ee+b*F,this}multiplyScalar(e){let t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){let e=this.elements,t=e[0],n=e[4],r=e[8],i=e[12],a=e[1],o=e[5],s=e[9],c=e[13],l=e[2],u=e[6],d=e[10],f=e[14],p=e[3],m=e[7],h=e[11],g=e[15],_=s*f-c*d,v=o*f-c*u,y=o*d-s*u,b=a*f-c*l,x=a*d-s*l,S=a*u-o*l;return t*(m*_-h*v+g*y)-n*(p*_-h*b+g*x)+r*(p*v-m*b+g*S)-i*(p*y-m*x+h*S)}determinantAffine(){let e=this.elements,t=e[0],n=e[4],r=e[8],i=e[1],a=e[5],o=e[9],s=e[2],c=e[6],l=e[10];return t*(a*l-o*c)-n*(i*l-o*s)+r*(i*c-a*s)}transpose(){let e=this.elements,t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){let r=this.elements;return e.isVector3?(r[12]=e.x,r[13]=e.y,r[14]=e.z):(r[12]=e,r[13]=t,r[14]=n),this}invert(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=e[9],d=e[10],f=e[11],p=e[12],m=e[13],h=e[14],g=e[15],_=t*o-n*a,v=t*s-r*a,y=t*c-i*a,b=n*s-r*o,x=n*c-i*o,S=r*c-i*s,C=l*m-u*p,w=l*h-d*p,T=l*g-f*p,E=u*h-d*m,D=u*g-f*m,O=d*g-f*h,k=_*O-v*D+y*E+b*T-x*w+S*C;if(k===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);let A=1/k;return e[0]=(o*O-s*D+c*E)*A,e[1]=(r*D-n*O-i*E)*A,e[2]=(m*S-h*x+g*b)*A,e[3]=(d*x-u*S-f*b)*A,e[4]=(s*T-a*O-c*w)*A,e[5]=(t*O-r*T+i*w)*A,e[6]=(h*y-p*S-g*v)*A,e[7]=(l*S-d*y+f*v)*A,e[8]=(a*D-o*T+c*C)*A,e[9]=(n*T-t*D-i*C)*A,e[10]=(p*x-m*y+g*_)*A,e[11]=(u*y-l*x-f*_)*A,e[12]=(o*w-a*E-s*C)*A,e[13]=(t*E-n*w+r*C)*A,e[14]=(m*v-p*b-h*_)*A,e[15]=(l*b-u*v+d*_)*A,this}scale(e){let t=this.elements,n=e.x,r=e.y,i=e.z;return t[0]*=n,t[4]*=r,t[8]*=i,t[1]*=n,t[5]*=r,t[9]*=i,t[2]*=n,t[6]*=r,t[10]*=i,t[3]*=n,t[7]*=r,t[11]*=i,this}getMaxScaleOnAxis(){let e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],r=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,r))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){let t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){let n=Math.cos(t),r=Math.sin(t),i=1-n,a=e.x,o=e.y,s=e.z,c=i*a,l=i*o;return this.set(c*a+n,c*o-r*s,c*s+r*o,0,c*o+r*s,l*o+n,l*s-r*a,0,c*s-r*o,l*s+r*a,i*s*s+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,r,i,a){return this.set(1,n,i,0,e,1,a,0,t,r,1,0,0,0,0,1),this}compose(e,t,n){let r=this.elements,i=t._x,a=t._y,o=t._z,s=t._w,c=i+i,l=a+a,u=o+o,d=i*c,f=i*l,p=i*u,m=a*l,h=a*u,g=o*u,_=s*c,v=s*l,y=s*u,b=n.x,x=n.y,S=n.z;return r[0]=(1-(m+g))*b,r[1]=(f+y)*b,r[2]=(p-v)*b,r[3]=0,r[4]=(f-y)*x,r[5]=(1-(d+g))*x,r[6]=(h+_)*x,r[7]=0,r[8]=(p+v)*S,r[9]=(h-_)*S,r[10]=(1-(d+m))*S,r[11]=0,r[12]=e.x,r[13]=e.y,r[14]=e.z,r[15]=1,this}decompose(e,t,n){let r=this.elements;e.x=r[12],e.y=r[13],e.z=r[14];let i=this.determinantAffine();if(i===0)return n.set(1,1,1),t.identity(),this;let a=Dm.set(r[0],r[1],r[2]).length(),o=Dm.set(r[4],r[5],r[6]).length(),s=Dm.set(r[8],r[9],r[10]).length();i<0&&(a=-a),Om.copy(this);let c=1/a,l=1/o,u=1/s;return Om.elements[0]*=c,Om.elements[1]*=c,Om.elements[2]*=c,Om.elements[4]*=l,Om.elements[5]*=l,Om.elements[6]*=l,Om.elements[8]*=u,Om.elements[9]*=u,Om.elements[10]*=u,t.setFromRotationMatrix(Om),n.x=a,n.y=o,n.z=s,this}makePerspective(e,t,n,r,i,a,o=Pp,s=!1){let c=this.elements,l=2*i/(t-e),u=2*i/(n-r),d=(t+e)/(t-e),f=(n+r)/(n-r),p,m;if(s)p=i/(a-i),m=a*i/(a-i);else if(o===2e3)p=-(a+i)/(a-i),m=-2*a*i/(a-i);else if(o===2001)p=-a/(a-i),m=-a*i/(a-i);else throw Error(`THREE.Matrix4.makePerspective(): Invalid coordinate system: `+o);return c[0]=l,c[4]=0,c[8]=d,c[12]=0,c[1]=0,c[5]=u,c[9]=f,c[13]=0,c[2]=0,c[6]=0,c[10]=p,c[14]=m,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(e,t,n,r,i,a,o=Pp,s=!1){let c=this.elements,l=2/(t-e),u=2/(n-r),d=-(t+e)/(t-e),f=-(n+r)/(n-r),p,m;if(s)p=1/(a-i),m=a/(a-i);else if(o===2e3)p=-2/(a-i),m=-(a+i)/(a-i);else if(o===2001)p=-1/(a-i),m=-i/(a-i);else throw Error(`THREE.Matrix4.makeOrthographic(): Invalid coordinate system: `+o);return c[0]=l,c[4]=0,c[8]=0,c[12]=d,c[1]=0,c[5]=u,c[9]=0,c[13]=f,c[2]=0,c[6]=0,c[10]=p,c[14]=m,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(e){let t=this.elements,n=e.elements;for(let e=0;e<16;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){let n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}},Dm=new Q,Om=new Em,km=new Q(0,0,0),Am=new Q(1,1,1),jm=new Q,Mm=new Q,Nm=new Q,Pm=new Em,Fm=new nm,Im=class e{constructor(t=0,n=0,r=0,i=e.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,r=this._order){return this._x=e,this._y=t,this._z=n,this._order=r,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){let r=e.elements,i=r[0],a=r[4],o=r[8],s=r[1],c=r[5],l=r[9],u=r[2],d=r[6],f=r[10];switch(t){case`XYZ`:this._y=Math.asin(Xp(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,f),this._z=Math.atan2(-a,i)):(this._x=Math.atan2(d,c),this._z=0);break;case`YXZ`:this._x=Math.asin(-Xp(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,f),this._z=Math.atan2(s,c)):(this._y=Math.atan2(-u,i),this._z=0);break;case`ZXY`:this._x=Math.asin(Xp(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,f),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(s,i));break;case`ZYX`:this._y=Math.asin(-Xp(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,f),this._z=Math.atan2(s,i)):(this._x=0,this._z=Math.atan2(-a,c));break;case`YZX`:this._z=Math.asin(Xp(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-l,c),this._y=Math.atan2(-u,i)):(this._x=0,this._y=Math.atan2(o,f));break;case`XZY`:this._z=Math.asin(-Xp(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(o,i)):(this._x=Math.atan2(-l,f),this._y=0);break;default:X(`Euler: .setFromRotationMatrix() encountered an unknown order: `+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return Pm.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Pm,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Fm.setFromEuler(this),this.setFromQuaternion(Fm,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}};Im.DEFAULT_ORDER=`XYZ`;var Lm=class{constructor(){this.mask=1}set(e){this.mask=(1<<e|0)>>>0}enable(e){this.mask|=1<<e|0}enableAll(){this.mask=-1}toggle(e){this.mask^=1<<e|0}disable(e){this.mask&=~(1<<e|0)}disableAll(){this.mask=0}test(e){return(this.mask&e.mask)!==0}isEnabled(e){return!!(this.mask&(1<<e|0))}},Rm=0,zm=new Q,Bm=new nm,Vm=new Em,Hm=new Q,Um=new Q,Wm=new Q,Gm=new nm,Km=new Q(1,0,0),qm=new Q(0,1,0),Jm=new Q(0,0,1),Ym={type:`added`},Xm={type:`removed`},Zm={type:`childadded`,child:null},Qm={type:`childremoved`,child:null},$m=class e extends Gp{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,"id",{value:Rm++}),this.uuid=Yp(),this.name=``,this.type=`Object3D`,this.parent=null,this.children=[],this.up=e.DEFAULT_UP.clone();let t=new Q,n=new Im,r=new nm,i=new Q(1,1,1);function a(){r.setFromEuler(n,!1)}function o(){n.setFromQuaternion(r,void 0,!1)}n._onChange(a),r._onChange(o),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:n},quaternion:{configurable:!0,enumerable:!0,value:r},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new Em},normalMatrix:{value:new am}}),this.matrix=new Em,this.matrixWorld=new Em,this.matrixAutoUpdate=e.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=e.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new Lm,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.customDepthMaterial=void 0,this.customDistanceMaterial=void 0,this.static=!1,this.userData={},this.pivot=null}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(e){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(e),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(e){return this.quaternion.premultiply(e),this}setRotationFromAxisAngle(e,t){this.quaternion.setFromAxisAngle(e,t)}setRotationFromEuler(e){this.quaternion.setFromEuler(e,!0)}setRotationFromMatrix(e){this.quaternion.setFromRotationMatrix(e)}setRotationFromQuaternion(e){this.quaternion.copy(e)}rotateOnAxis(e,t){return Bm.setFromAxisAngle(e,t),this.quaternion.multiply(Bm),this}rotateOnWorldAxis(e,t){return Bm.setFromAxisAngle(e,t),this.quaternion.premultiply(Bm),this}rotateX(e){return this.rotateOnAxis(Km,e)}rotateY(e){return this.rotateOnAxis(qm,e)}rotateZ(e){return this.rotateOnAxis(Jm,e)}translateOnAxis(e,t){return zm.copy(e).applyQuaternion(this.quaternion),this.position.add(zm.multiplyScalar(t)),this}translateX(e){return this.translateOnAxis(Km,e)}translateY(e){return this.translateOnAxis(qm,e)}translateZ(e){return this.translateOnAxis(Jm,e)}localToWorld(e){return this.updateWorldMatrix(!0,!1),e.applyMatrix4(this.matrixWorld)}worldToLocal(e){return this.updateWorldMatrix(!0,!1),e.applyMatrix4(Vm.copy(this.matrixWorld).invert())}lookAt(e,t,n){e.isVector3?Hm.copy(e):Hm.set(e,t,n);let r=this.parent;this.updateWorldMatrix(!0,!1),Um.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Vm.lookAt(Um,Hm,this.up):Vm.lookAt(Hm,Um,this.up),this.quaternion.setFromRotationMatrix(Vm),r&&(Vm.extractRotation(r.matrixWorld),Bm.setFromRotationMatrix(Vm),this.quaternion.premultiply(Bm.invert()))}add(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return e===this?(Z(`Object3D.add: object can't be added as a child of itself.`,e),this):(e&&e.isObject3D?(e.removeFromParent(),e.parent=this,this.children.push(e),e.dispatchEvent(Ym),Zm.child=e,this.dispatchEvent(Zm),Zm.child=null):Z(`Object3D.add: object not an instance of THREE.Object3D.`,e),this)}remove(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}let t=this.children.indexOf(e);return t!==-1&&(e.parent=null,this.children.splice(t,1),e.dispatchEvent(Xm),Qm.child=e,this.dispatchEvent(Qm),Qm.child=null),this}removeFromParent(){let e=this.parent;return e!==null&&e.remove(this),this}clear(){return this.remove(...this.children)}attach(e){return this.updateWorldMatrix(!0,!1),Vm.copy(this.matrixWorld).invert(),e.parent!==null&&(e.parent.updateWorldMatrix(!0,!1),Vm.multiply(e.parent.matrixWorld)),e.applyMatrix4(Vm),e.removeFromParent(),e.parent=this,this.children.push(e),e.updateWorldMatrix(!1,!0),e.dispatchEvent(Ym),Zm.child=e,this.dispatchEvent(Zm),Zm.child=null,this}getObjectById(e){return this.getObjectByProperty(`id`,e)}getObjectByName(e){return this.getObjectByProperty(`name`,e)}getObjectByProperty(e,t){if(this[e]===t)return this;for(let n=0,r=this.children.length;n<r;n++){let r=this.children[n].getObjectByProperty(e,t);if(r!==void 0)return r}}getObjectsByProperty(e,t,n=[]){this[e]===t&&n.push(this);let r=this.children;for(let i=0,a=r.length;i<a;i++)r[i].getObjectsByProperty(e,t,n);return n}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(Um,e,Wm),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(Um,Gm,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);let t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}intersectsFrustum(){}traverse(e){e(this);let t=this.children;for(let n=0,r=t.length;n<r;n++)t[n].traverse(e)}traverseVisible(e){if(this.visible===!1)return;e(this);let t=this.children;for(let n=0,r=t.length;n<r;n++)t[n].traverseVisible(e)}traverseAncestors(e){let t=this.parent;t!==null&&(e(t),t.traverseAncestors(e))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale);let e=this.pivot;if(e!==null){let t=e.x,n=e.y,r=e.z,i=this.matrix.elements;i[12]+=t-i[0]*t-i[4]*n-i[8]*r,i[13]+=n-i[1]*t-i[5]*n-i[9]*r,i[14]+=r-i[2]*t-i[6]*n-i[10]*r}this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,e=!0);let t=this.children;for(let n=0,r=t.length;n<r;n++)t[n].updateMatrixWorld(e)}updateWorldMatrix(e,t,n=!1){let r=this.parent;if(e===!0&&r!==null&&r.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||n)&&(this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,n=!0),t===!0){let e=this.children;for(let t=0,r=e.length;t<r;t++)e[t].updateWorldMatrix(!1,!0,n)}}toJSON(e){let t=e===void 0||typeof e==`string`,n={};t&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},n.metadata={version:4.7,type:`Object`,generator:`Object3D.toJSON`});let r={};r.uuid=this.uuid,r.type=this.type,r.name=this.name,r.castShadow=this.castShadow,r.receiveShadow=this.receiveShadow,r.visible=this.visible,r.frustumCulled=this.frustumCulled,r.renderOrder=this.renderOrder,r.static=this.static,r.matrixAutoUpdate=this.matrixAutoUpdate,Object.keys(this.userData).length>0&&(r.userData=this.userData),r.layers=this.layers.mask,r.matrix=this.matrix.toArray(),r.up=this.up.toArray(),this.pivot!==null&&(r.pivot=this.pivot.toArray()),this.morphTargetDictionary!==void 0&&(r.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(r.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(r.type=`InstancedMesh`,r.count=this.count,r.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(r.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(r.type=`BatchedMesh`,r.perObjectFrustumCulled=this.perObjectFrustumCulled,r.sortObjects=this.sortObjects,r.drawRanges=this._drawRanges,r.reservedRanges=this._reservedRanges,r.geometryInfo=this._geometryInfo.map(e=>({...e,boundingBox:e.boundingBox?e.boundingBox.toJSON():void 0,boundingSphere:e.boundingSphere?e.boundingSphere.toJSON():void 0})),r.instanceInfo=this._instanceInfo.map(e=>({...e})),r.availableInstanceIds=this._availableInstanceIds.slice(),r.availableGeometryIds=this._availableGeometryIds.slice(),r.nextIndexStart=this._nextIndexStart,r.nextVertexStart=this._nextVertexStart,r.geometryCount=this._geometryCount,r.maxInstanceCount=this._maxInstanceCount,r.maxVertexCount=this._maxVertexCount,r.maxIndexCount=this._maxIndexCount,r.geometryInitialized=this._geometryInitialized,r.matricesTexture=this._matricesTexture.toJSON(e),r.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(r.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(r.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(r.boundingBox=this.boundingBox.toJSON()));function i(t,n){return t[n.uuid]===void 0&&(t[n.uuid]=n.toJSON(e)),n.uuid}if(this.isScene)this.background&&(this.background.isColor?r.background=this.background.toJSON():this.background.isTexture&&(r.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(r.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){r.geometry=i(e.geometries,this.geometry);let t=this.geometry.parameters;if(t!==void 0&&t.shapes!==void 0){let n=t.shapes;if(Array.isArray(n))for(let t=0,r=n.length;t<r;t++){let r=n[t];i(e.shapes,r)}else i(e.shapes,n)}}if(this.isSkinnedMesh&&(r.bindMode=this.bindMode,r.bindMatrix=this.bindMatrix.toArray(),this.skeleton!==void 0&&(i(e.skeletons,this.skeleton),r.skeleton=this.skeleton.uuid)),this.material!==void 0){if(Array.isArray(this.material)){let t=[];for(let n=0,r=this.material.length;n<r;n++)t.push(i(e.materials,this.material[n]));r.material=t}else r.material=i(e.materials,this.material)}if(this.children.length>0){r.children=[];for(let t=0;t<this.children.length;t++)r.children.push(this.children[t].toJSON(e).object)}if(this.animations.length>0){r.animations=[];for(let t=0;t<this.animations.length;t++){let n=this.animations[t];r.animations.push(i(e.animations,n))}}if(t){let t=a(e.geometries),r=a(e.materials),i=a(e.textures),o=a(e.images),s=a(e.shapes),c=a(e.skeletons),l=a(e.animations),u=a(e.nodes);t.length>0&&(n.geometries=t),r.length>0&&(n.materials=r),i.length>0&&(n.textures=i),o.length>0&&(n.images=o),s.length>0&&(n.shapes=s),c.length>0&&(n.skeletons=c),l.length>0&&(n.animations=l),u.length>0&&(n.nodes=u)}return n.object=r,n;function a(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot===null?null:e.pivot.clone(),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let t=0;t<e.children.length;t++){let n=e.children[t];this.add(n.clone())}return this}dispose(){this.dispatchEvent({type:`dispose`})}};$m.DEFAULT_UP=new Q(0,1,0),$m.DEFAULT_MATRIX_AUTO_UPDATE=!0,$m.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;var eh=class extends $m{constructor(){super(),this.isGroup=!0,this.type=`Group`}},th={type:`move`},nh=class{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new eh,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new eh,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Q,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Q),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new eh,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Q,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Q,this._grip.eventsEnabled=!1),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){let t=this._hand;if(t)for(let n of e.hand.values())this._getHandJoint(t,n)}return this.dispatchEvent({type:`connected`,data:e}),this}disconnect(e){return this.dispatchEvent({type:`disconnected`,data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,t,n){let r=null,i=null,a=null,o=this._targetRay,s=this._grip,c=this._hand;if(e&&t.session.visibilityState!==`visible-blurred`){if(c&&e.hand){a=!0;for(let r of e.hand.values()){let e=t.getJointPose(r,n),i=this._getHandJoint(c,r);e!==null&&(i.matrix.fromArray(e.transform.matrix),i.matrix.decompose(i.position,i.rotation,i.scale),i.matrixWorldNeedsUpdate=!0,i.jointRadius=e.radius),i.visible=e!==null}let r=c.joints[`index-finger-tip`],i=c.joints[`thumb-tip`],o=r.position.distanceTo(i.position);c.inputState.pinching&&o>.025?(c.inputState.pinching=!1,this.dispatchEvent({type:`pinchend`,handedness:e.handedness,target:this})):!c.inputState.pinching&&o<=.015&&(c.inputState.pinching=!0,this.dispatchEvent({type:`pinchstart`,handedness:e.handedness,target:this}))}else s!==null&&e.gripSpace&&(i=t.getPose(e.gripSpace,n),i!==null&&(s.matrix.fromArray(i.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale),s.matrixWorldNeedsUpdate=!0,i.linearVelocity?(s.hasLinearVelocity=!0,s.linearVelocity.copy(i.linearVelocity)):s.hasLinearVelocity=!1,i.angularVelocity?(s.hasAngularVelocity=!0,s.angularVelocity.copy(i.angularVelocity)):s.hasAngularVelocity=!1,s.eventsEnabled&&s.dispatchEvent({type:`gripUpdated`,data:e,target:this})));o!==null&&(r=t.getPose(e.targetRaySpace,n),r===null&&i!==null&&(r=i),r!==null&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(th)))}return o!==null&&(o.visible=r!==null),s!==null&&(s.visible=i!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){let n=new eh;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}},rh={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},ih={h:0,s:0,l:0},ah={h:0,s:0,l:0};function oh(e,t,n){return n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*6*(2/3-n):e}var sh=class{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){let t=e;t&&t.isColor?this.copy(t):typeof t==`number`?this.setHex(t):typeof t==`string`&&this.setStyle(t)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=Op){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,um.colorSpaceToWorking(this,t),this}setRGB(e,t,n,r=um.workingColorSpace){return this.r=e,this.g=t,this.b=n,um.colorSpaceToWorking(this,r),this}setHSL(e,t,n,r=um.workingColorSpace){if(e=Zp(e,1),t=Xp(t,0,1),n=Xp(n,0,1),t===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+t):n+t-n*t,i=2*n-r;this.r=oh(i,r,e+1/3),this.g=oh(i,r,e),this.b=oh(i,r,e-1/3)}return um.colorSpaceToWorking(this,r),this}setStyle(e,t=Op){function n(t){t!==void 0&&parseFloat(t)<1&&X(`Color: Alpha component of `+e+` will be ignored.`)}let r;if(r=/^(\w+)\(([^\)]*)\)/.exec(e)){let i,a=r[1],o=r[2];switch(a){case`rgb`:case`rgba`:if(i=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(255,parseInt(i[1],10))/255,Math.min(255,parseInt(i[2],10))/255,Math.min(255,parseInt(i[3],10))/255,t);if(i=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(100,parseInt(i[1],10))/100,Math.min(100,parseInt(i[2],10))/100,Math.min(100,parseInt(i[3],10))/100,t);break;case`hsl`:case`hsla`:if(i=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setHSL(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,t);break;default:X(`Color: Unknown color model `+e)}}else if(r=/^\#([A-Fa-f\d]+)$/.exec(e)){let n=r[1],i=n.length;if(i===3)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(i===6)return this.setHex(parseInt(n,16),t);X(`Color: Invalid hex color `+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=Op){let n=rh[e.toLowerCase()];return n===void 0?X(`Color: Unknown color `+e):this.setHex(n,t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=dm(e.r),this.g=dm(e.g),this.b=dm(e.b),this}copyLinearToSRGB(e){return this.r=fm(e.r),this.g=fm(e.g),this.b=fm(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Op){return um.workingToColorSpace(ch.copy(this),e),Math.round(Xp(ch.r*255,0,255))*65536+Math.round(Xp(ch.g*255,0,255))*256+Math.round(Xp(ch.b*255,0,255))}getHexString(e=Op){return(`000000`+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=um.workingColorSpace){um.workingToColorSpace(ch.copy(this),t);let n=ch.r,r=ch.g,i=ch.b,a=Math.max(n,r,i),o=Math.min(n,r,i),s,c,l=(o+a)/2;if(o===a)s=0,c=0;else{let e=a-o;switch(c=l<=.5?e/(a+o):e/(2-a-o),a){case n:s=(r-i)/e+(r<i?6:0);break;case r:s=(i-n)/e+2;break;case i:s=(n-r)/e+4}s/=6}return e.h=s,e.s=c,e.l=l,e}getRGB(e,t=um.workingColorSpace){return um.workingToColorSpace(ch.copy(this),t),e.r=ch.r,e.g=ch.g,e.b=ch.b,e}getStyle(e=Op){um.workingToColorSpace(ch.copy(this),e);let t=ch.r,n=ch.g,r=ch.b;return e===`srgb`?`rgb(${Math.round(t*255)},${Math.round(n*255)},${Math.round(r*255)})`:`color(${e} ${t.toFixed(3)} ${n.toFixed(3)} ${r.toFixed(3)})`}offsetHSL(e,t,n){return this.getHSL(ih),this.setHSL(ih.h+e,ih.s+t,ih.l+n)}add(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this}addColors(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this}addScalar(e){return this.r+=e,this.g+=e,this.b+=e,this}sub(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this}multiply(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this}multiplyScalar(e){return this.r*=e,this.g*=e,this.b*=e,this}lerp(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this}lerpColors(e,t,n){return this.r=e.r+(t.r-e.r)*n,this.g=e.g+(t.g-e.g)*n,this.b=e.b+(t.b-e.b)*n,this}lerpHSL(e,t){this.getHSL(ih),e.getHSL(ah);let n=Qp(ih.h,ah.h,t),r=Qp(ih.s,ah.s,t),i=Qp(ih.l,ah.l,t);return this.setHSL(n,r,i),this}setFromVector3(e){return this.r=e.x,this.g=e.y,this.b=e.z,this}applyMatrix3(e){let t=this.r,n=this.g,r=this.b,i=e.elements;return this.r=i[0]*t+i[3]*n+i[6]*r,this.g=i[1]*t+i[4]*n+i[7]*r,this.b=i[2]*t+i[5]*n+i[8]*r,this}equals(e){return e.r===this.r&&e.g===this.g&&e.b===this.b}fromArray(e,t=0){return this.r=e[t],this.g=e[t+1],this.b=e[t+2],this}toArray(e=[],t=0){return e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e}fromBufferAttribute(e,t){return this.r=e.getX(t),this.g=e.getY(t),this.b=e.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}},ch=new sh;sh.NAMES=rh;var lh=class extends $m{constructor(){super(),this.isScene=!0,this.type=`Scene`,this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Im,this.environmentIntensity=1,this.environmentRotation=new Im,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<`u`&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(`observe`,{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){let t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),t.object.backgroundBlurriness=this.backgroundBlurriness,t.object.backgroundIntensity=this.backgroundIntensity,t.object.backgroundRotation=this.backgroundRotation.toArray(),t.object.environmentIntensity=this.environmentIntensity,t.object.environmentRotation=this.environmentRotation.toArray(),t}},uh=new Q,dh=new Q,fh=new Q,ph=new Q,mh=new Q,hh=new Q,gh=new Q,_h=new Q,vh=new Q,yh=new Q,bh=new xm,xh=new xm,Sh=new xm,Ch=class e{constructor(e=new Q,t=new Q,n=new Q){this.a=e,this.b=t,this.c=n}static getNormal(e,t,n,r){r.subVectors(n,t),uh.subVectors(e,t),r.cross(uh);let i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)}static getBarycoord(e,t,n,r,i){uh.subVectors(r,t),dh.subVectors(n,t),fh.subVectors(e,t);let a=uh.dot(uh),o=uh.dot(dh),s=uh.dot(fh),c=dh.dot(dh),l=dh.dot(fh),u=a*c-o*o;if(u===0)return i.set(0,0,0),null;let d=1/u,f=(c*s-o*l)*d,p=(a*l-o*s)*d;return i.set(1-f-p,p,f)}static containsPoint(e,t,n,r){return this.getBarycoord(e,t,n,r,ph)!==null&&ph.x>=0&&ph.y>=0&&ph.x+ph.y<=1}static getInterpolation(e,t,n,r,i,a,o,s){return this.getBarycoord(e,t,n,r,ph)===null?(s.x=0,s.y=0,`z`in s&&(s.z=0),`w`in s&&(s.w=0),null):(s.setScalar(0),s.addScaledVector(i,ph.x),s.addScaledVector(a,ph.y),s.addScaledVector(o,ph.z),s)}static getInterpolatedAttribute(e,t,n,r,i,a){return bh.setScalar(0),xh.setScalar(0),Sh.setScalar(0),bh.fromBufferAttribute(e,t),xh.fromBufferAttribute(e,n),Sh.fromBufferAttribute(e,r),a.setScalar(0),a.addScaledVector(bh,i.x),a.addScaledVector(xh,i.y),a.addScaledVector(Sh,i.z),a}static isFrontFacing(e,t,n,r){return uh.subVectors(n,t),dh.subVectors(e,t),uh.cross(dh).dot(r)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,r){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[r]),this}setFromAttributeAndIndices(e,t,n,r){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,r),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return uh.subVectors(this.c,this.b),dh.subVectors(this.a,this.b),uh.cross(dh).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return e.getNormal(this.a,this.b,this.c,t)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,n){return e.getBarycoord(t,this.a,this.b,this.c,n)}getInterpolation(t,n,r,i,a){return e.getInterpolation(t,this.a,this.b,this.c,n,r,i,a)}containsPoint(t){return e.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return e.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){let n=this.a,r=this.b,i=this.c,a,o;mh.subVectors(r,n),hh.subVectors(i,n),_h.subVectors(e,n);let s=mh.dot(_h),c=hh.dot(_h);if(s<=0&&c<=0)return t.copy(n);vh.subVectors(e,r);let l=mh.dot(vh),u=hh.dot(vh);if(l>=0&&u<=l)return t.copy(r);let d=s*u-l*c;if(d<=0&&s>=0&&l<=0)return a=s/(s-l),t.copy(n).addScaledVector(mh,a);yh.subVectors(e,i);let f=mh.dot(yh),p=hh.dot(yh);if(p>=0&&f<=p)return t.copy(i);let m=f*c-s*p;if(m<=0&&c>=0&&p<=0)return o=c/(c-p),t.copy(n).addScaledVector(hh,o);let h=l*p-f*u;if(h<=0&&u-l>=0&&f-p>=0)return gh.subVectors(i,r),o=(u-l)/(u-l+(f-p)),t.copy(r).addScaledVector(gh,o);let g=1/(h+m+d);return a=m*g,o=d*g,t.copy(n).addScaledVector(mh,a).addScaledVector(hh,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}},wh=class{constructor(e=new Q(1/0,1/0,1/0),t=new Q(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;t<n;t+=3)this.expandByPoint(Eh.fromArray(e,t));return this}setFromBufferAttribute(e){this.makeEmpty();for(let t=0,n=e.count;t<n;t++)this.expandByPoint(Eh.fromBufferAttribute(e,t));return this}setFromPoints(e){this.makeEmpty();for(let t=0,n=e.length;t<n;t++)this.expandByPoint(e[t]);return this}setFromCenterAndSize(e,t){let n=Eh.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(n),this.max.copy(e).add(n),this}setFromObject(e,t=!1){return this.makeEmpty(),this.expandByObject(e,t)}clone(){return new this.constructor().copy(this)}copy(e){return this.min.copy(e.min),this.max.copy(e.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(e){return this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(e){return this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)}expandByPoint(e){return this.min.min(e),this.max.max(e),this}expandByVector(e){return this.min.sub(e),this.max.add(e),this}expandByScalar(e){return this.min.addScalar(-e),this.max.addScalar(e),this}expandByObject(e,t=!1){e.updateWorldMatrix(!1,!1);let n=e.geometry;if(n!==void 0){let r=n.getAttribute(`position`);if(t===!0&&r!==void 0&&e.isInstancedMesh!==!0)for(let t=0,n=r.count;t<n;t++)e.isMesh===!0?e.getVertexPosition(t,Eh):Eh.fromBufferAttribute(r,t),Eh.applyMatrix4(e.matrixWorld),this.expandByPoint(Eh);else e.boundingBox===void 0?(n.boundingBox===null&&n.computeBoundingBox(),Dh.copy(n.boundingBox)):(e.boundingBox===null&&e.computeBoundingBox(),Dh.copy(e.boundingBox)),Dh.applyMatrix4(e.matrixWorld),this.union(Dh)}let r=e.children;for(let e=0,n=r.length;e<n;e++)this.expandByObject(r[e],t);return this}containsPoint(e){return e.x>=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Eh),Eh.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Ph),Fh.subVectors(this.max,Ph),Oh.subVectors(e.a,Ph),kh.subVectors(e.b,Ph),Ah.subVectors(e.c,Ph),jh.subVectors(kh,Oh),Mh.subVectors(Ah,kh),Nh.subVectors(Oh,Ah);let t=[0,-jh.z,jh.y,0,-Mh.z,Mh.y,0,-Nh.z,Nh.y,jh.z,0,-jh.x,Mh.z,0,-Mh.x,Nh.z,0,-Nh.x,-jh.y,jh.x,0,-Mh.y,Mh.x,0,-Nh.y,Nh.x,0];return!Rh(t,Oh,kh,Ah,Fh)||(t=[1,0,0,0,1,0,0,0,1],!Rh(t,Oh,kh,Ah,Fh))?!1:(Ih.crossVectors(jh,Mh),t=[Ih.x,Ih.y,Ih.z],Rh(t,Oh,kh,Ah,Fh))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Eh).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Eh).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Th[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Th[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Th[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Th[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Th[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Th[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Th[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Th[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Th),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}},Th=[new Q,new Q,new Q,new Q,new Q,new Q,new Q,new Q],Eh=new Q,Dh=new wh,Oh=new Q,kh=new Q,Ah=new Q,jh=new Q,Mh=new Q,Nh=new Q,Ph=new Q,Fh=new Q,Ih=new Q,Lh=new Q;function Rh(e,t,n,r,i){for(let a=0,o=e.length-3;a<=o;a+=3){Lh.fromArray(e,a);let o=i.x*Math.abs(Lh.x)+i.y*Math.abs(Lh.y)+i.z*Math.abs(Lh.z),s=t.dot(Lh),c=n.dot(Lh),l=r.dot(Lh);if(Math.max(-Math.max(s,c,l),Math.min(s,c,l))>o)return!1}return!0}var zh=new Q,Bh=new tm,Vh=0,Hh=class extends Gp{constructor(e,t,n=!1){if(super(),Array.isArray(e))throw TypeError(`THREE.BufferAttribute: array should be a Typed Array.`);this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:Vh++}),this.name=``,this.array=e,this.itemSize=t,this.count=e===void 0?0:e.length/t,this.normalized=n,this.usage=Np,this.updateRanges=[],this.gpuType=xf,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let r=0,i=this.itemSize;r<i;r++)this.array[e+r]=t.array[n+r];return this}copyArray(e){return this.array.set(e),this}applyMatrix3(e){if(this.itemSize===2)for(let t=0,n=this.count;t<n;t++)Bh.fromBufferAttribute(this,t),Bh.applyMatrix3(e),this.setXY(t,Bh.x,Bh.y);else if(this.itemSize===3)for(let t=0,n=this.count;t<n;t++)zh.fromBufferAttribute(this,t),zh.applyMatrix3(e),this.setXYZ(t,zh.x,zh.y,zh.z);return this}applyMatrix4(e){for(let t=0,n=this.count;t<n;t++)zh.fromBufferAttribute(this,t),zh.applyMatrix4(e),this.setXYZ(t,zh.x,zh.y,zh.z);return this}applyNormalMatrix(e){for(let t=0,n=this.count;t<n;t++)zh.fromBufferAttribute(this,t),zh.applyNormalMatrix(e),this.setXYZ(t,zh.x,zh.y,zh.z);return this}transformDirection(e){for(let t=0,n=this.count;t<n;t++)zh.fromBufferAttribute(this,t),zh.transformDirection(e),this.setXYZ(t,zh.x,zh.y,zh.z);return this}set(e,t=0){return this.array.set(e,t),this}getComponent(e,t){let n=this.array[e*this.itemSize+t];return this.normalized&&(n=$p(n,this.array)),n}setComponent(e,t,n){return this.normalized&&(n=em(n,this.array)),this.array[e*this.itemSize+t]=n,this}getX(e){let t=this.array[e*this.itemSize];return this.normalized&&(t=$p(t,this.array)),t}setX(e,t){return this.normalized&&(t=em(t,this.array)),this.array[e*this.itemSize]=t,this}getY(e){let t=this.array[e*this.itemSize+1];return this.normalized&&(t=$p(t,this.array)),t}setY(e,t){return this.normalized&&(t=em(t,this.array)),this.array[e*this.itemSize+1]=t,this}getZ(e){let t=this.array[e*this.itemSize+2];return this.normalized&&(t=$p(t,this.array)),t}setZ(e,t){return this.normalized&&(t=em(t,this.array)),this.array[e*this.itemSize+2]=t,this}getW(e){let t=this.array[e*this.itemSize+3];return this.normalized&&(t=$p(t,this.array)),t}setW(e,t){return this.normalized&&(t=em(t,this.array)),this.array[e*this.itemSize+3]=t,this}setXY(e,t,n){return e*=this.itemSize,this.normalized&&(t=em(t,this.array),n=em(n,this.array)),this.array[e+0]=t,this.array[e+1]=n,this}setXYZ(e,t,n,r){return e*=this.itemSize,this.normalized&&(t=em(t,this.array),n=em(n,this.array),r=em(r,this.array)),this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=r,this}setXYZW(e,t,n,r,i){return e*=this.itemSize,this.normalized&&(t=em(t,this.array),n=em(n,this.array),r=em(r,this.array),i=em(i,this.array)),this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=r,this.array[e+3]=i,this}onUpload(e){return this.onUploadCallback=e,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){let e={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return e.name=this.name,e.usage=this.usage,e.gpuType=this.gpuType,e}dispose(){this.dispatchEvent({type:`dispose`})}},Uh=class extends Hh{constructor(e,t,n){super(new Uint16Array(e),t,n)}},Wh=class extends Hh{constructor(e,t,n){super(new Uint32Array(e),t,n)}},Gh=class extends Hh{constructor(e,t,n){super(new Float32Array(e),t,n)}},Kh=new wh,qh=new Q,Jh=new Q,Yh=class{constructor(e=new Q,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){let n=this.center;t===void 0?Kh.setFromPoints(e).getCenter(n):n.copy(t);let r=0;for(let t=0,i=e.length;t<i;t++)r=Math.max(r,n.distanceToSquared(e[t]));return this.radius=Math.sqrt(r),this}copy(e){return this.center.copy(e.center),this.radius=e.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(e){return e.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(e){return e.distanceTo(this.center)-this.radius}intersectsSphere(e){let t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t}intersectsBox(e){return e.intersectsSphere(this)}intersectsPlane(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius}clampPoint(e,t){let n=this.center.distanceToSquared(e);return t.copy(e),n>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius*=e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;qh.subVectors(e,this.center);let t=qh.lengthSq();if(t>this.radius*this.radius){let e=Math.sqrt(t),n=(e-this.radius)*.5;this.center.addScaledVector(qh,n/e),this.radius+=n}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Jh.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(qh.copy(e.center).add(Jh)),this.expandByPoint(qh.copy(e.center).sub(Jh))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}},Xh=0,Zh=new Em,Qh=new $m,$h=new Q,eg=new wh,tg=new wh,ng=new Q,rg=class e extends Gp{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:Xh++}),this.uuid=Yp(),this.name=``,this.type=`BufferGeometry`,this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={},this._transformed=!1}getIndex(){return this.index}setIndex(e){return this.index=Array.isArray(e)?new(Fp(e)?Wh:Uh)(e,1):e,this}setIndirect(e,t=0){return this.indirect=e,this.indirectOffset=t,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,t,n=0){this.groups.push({start:e,count:t,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){let t=this.attributes.position;t!==void 0&&(t.applyMatrix4(e),t.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let t=new am().getNormalMatrix(e);n.applyNormalMatrix(t),n.needsUpdate=!0}let r=this.attributes.tangent;return r!==void 0&&(r.transformDirection(e),r.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this._transformed=!0,this}applyQuaternion(e){return Zh.makeRotationFromQuaternion(e),this.applyMatrix4(Zh),this}rotateX(e){return Zh.makeRotationX(e),this.applyMatrix4(Zh),this}rotateY(e){return Zh.makeRotationY(e),this.applyMatrix4(Zh),this}rotateZ(e){return Zh.makeRotationZ(e),this.applyMatrix4(Zh),this}translate(e,t,n){return Zh.makeTranslation(e,t,n),this.applyMatrix4(Zh),this}scale(e,t,n){return Zh.makeScale(e,t,n),this.applyMatrix4(Zh),this}lookAt(e){return Qh.lookAt(e),Qh.updateMatrix(),this.applyMatrix4(Qh.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter($h).negate(),this.translate($h.x,$h.y,$h.z),this}setFromPoints(e){let t=this.getAttribute(`position`);if(t===void 0){let t=[];for(let n=0,r=e.length;n<r;n++){let r=e[n];t.push(r.x,r.y,r.z||0)}this.setAttribute(`position`,new Gh(t,3))}else{let n=Math.min(e.length,t.count);for(let r=0;r<n;r++){let n=e[r];t.setXYZ(r,n.x,n.y,n.z||0)}e.length>t.count&&X(`BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.`),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new wh);let e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Z(`BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.`,this),this.boundingBox.set(new Q(-1/0,-1/0,-1/0),new Q(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e<n;e++){let n=t[e];eg.setFromBufferAttribute(n),this.morphTargetsRelative?(ng.addVectors(this.boundingBox.min,eg.min),this.boundingBox.expandByPoint(ng),ng.addVectors(this.boundingBox.max,eg.max),this.boundingBox.expandByPoint(ng)):(this.boundingBox.expandByPoint(eg.min),this.boundingBox.expandByPoint(eg.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&Z(`BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.`,this)}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new Yh);let e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Z(`BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.`,this),this.boundingSphere.set(new Q,1/0);return}if(e){let n=this.boundingSphere.center;if(eg.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e<n;e++){let n=t[e];tg.setFromBufferAttribute(n),this.morphTargetsRelative?(ng.addVectors(eg.min,tg.min),eg.expandByPoint(ng),ng.addVectors(eg.max,tg.max),eg.expandByPoint(ng)):(eg.expandByPoint(tg.min),eg.expandByPoint(tg.max))}eg.getCenter(n);let r=0;for(let t=0,i=e.count;t<i;t++)ng.fromBufferAttribute(e,t),r=Math.max(r,n.distanceToSquared(ng));if(t)for(let i=0,a=t.length;i<a;i++){let a=t[i],o=this.morphTargetsRelative;for(let t=0,i=a.count;t<i;t++)ng.fromBufferAttribute(a,t),o&&($h.fromBufferAttribute(e,t),ng.add($h)),r=Math.max(r,n.distanceToSquared(ng))}this.boundingSphere.radius=Math.sqrt(r),isNaN(this.boundingSphere.radius)&&Z(`BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.`,this)}}computeTangents(){let e=this.index,t=this.attributes;if(e===null||t.position===void 0||t.normal===void 0||t.uv===void 0){Z(`BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)`);return}let n=t.position,r=t.normal,i=t.uv,a=this.getAttribute(`tangent`);(a===void 0||a.count!==n.count)&&(a=new Hh(new Float32Array(4*n.count),4),this.setAttribute(`tangent`,a));let o=[],s=[];for(let e=0;e<n.count;e++)o[e]=new Q,s[e]=new Q;let c=new Q,l=new Q,u=new Q,d=new tm,f=new tm,p=new tm,m=new Q,h=new Q;function g(e,t,r){c.fromBufferAttribute(n,e),l.fromBufferAttribute(n,t),u.fromBufferAttribute(n,r),d.fromBufferAttribute(i,e),f.fromBufferAttribute(i,t),p.fromBufferAttribute(i,r),l.sub(c),u.sub(c),f.sub(d),p.sub(d);let a=1/(f.x*p.y-p.x*f.y);isFinite(a)&&(m.copy(l).multiplyScalar(p.y).addScaledVector(u,-f.y).multiplyScalar(a),h.copy(u).multiplyScalar(f.x).addScaledVector(l,-p.x).multiplyScalar(a),o[e].add(m),o[t].add(m),o[r].add(m),s[e].add(h),s[t].add(h),s[r].add(h))}let _=this.groups;_.length===0&&(_=[{start:0,count:e.count}]);for(let t=0,n=_.length;t<n;++t){let n=_[t],r=n.start,i=n.count;for(let t=r,n=r+i;t<n;t+=3)g(e.getX(t+0),e.getX(t+1),e.getX(t+2))}let v=new Q,y=new Q,b=new Q,x=new Q;function S(e){b.fromBufferAttribute(r,e),x.copy(b);let t=o[e];v.copy(t),v.sub(b.multiplyScalar(b.dot(t))).normalize(),y.crossVectors(x,t);let n=y.dot(s[e])<0?-1:1;a.setXYZW(e,v.x,v.y,v.z,n)}for(let t=0,n=_.length;t<n;++t){let n=_[t],r=n.start,i=n.count;for(let t=r,n=r+i;t<n;t+=3)S(e.getX(t+0)),S(e.getX(t+1)),S(e.getX(t+2))}this._transformed=!0}computeVertexNormals(){let e=this.index,t=this.getAttribute(`position`);if(t!==void 0){let n=this.getAttribute(`normal`);if(n===void 0||n.count!==t.count)n=new Hh(new Float32Array(t.count*3),3),this.setAttribute(`normal`,n);else for(let e=0,t=n.count;e<t;e++)n.setXYZ(e,0,0,0);let r=new Q,i=new Q,a=new Q,o=new Q,s=new Q,c=new Q,l=new Q,u=new Q;if(e)for(let d=0,f=e.count;d<f;d+=3){let f=e.getX(d+0),p=e.getX(d+1),m=e.getX(d+2);r.fromBufferAttribute(t,f),i.fromBufferAttribute(t,p),a.fromBufferAttribute(t,m),l.subVectors(a,i),u.subVectors(r,i),l.cross(u),o.fromBufferAttribute(n,f),s.fromBufferAttribute(n,p),c.fromBufferAttribute(n,m),o.add(l),s.add(l),c.add(l),n.setXYZ(f,o.x,o.y,o.z),n.setXYZ(p,s.x,s.y,s.z),n.setXYZ(m,c.x,c.y,c.z)}else for(let e=0,o=t.count;e<o;e+=3)r.fromBufferAttribute(t,e+0),i.fromBufferAttribute(t,e+1),a.fromBufferAttribute(t,e+2),l.subVectors(a,i),u.subVectors(r,i),l.cross(u),n.setXYZ(e+0,l.x,l.y,l.z),n.setXYZ(e+1,l.x,l.y,l.z),n.setXYZ(e+2,l.x,l.y,l.z);this.normalizeNormals(),n.needsUpdate=!0}}normalizeNormals(){let e=this.attributes.normal;for(let t=0,n=e.count;t<n;t++)ng.fromBufferAttribute(e,t),ng.normalize(),e.setXYZ(t,ng.x,ng.y,ng.z)}toNonIndexed(){function t(e,t){let n=e.array,r=e.itemSize,i=e.normalized,a=new n.constructor(t.length*r),o=0,s=0;for(let i=0,c=t.length;i<c;i++){o=e.isInterleavedBufferAttribute?t[i]*e.data.stride+e.offset:t[i]*r;for(let e=0;e<r;e++)a[s++]=n[o++]}return new Hh(a,r,i)}if(this.index===null)return X(`BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.`),this;let n=new e,r=this.index.array,i=this.attributes;for(let e in i){let a=i[e],o=t(a,r);n.setAttribute(e,o)}let a=this.morphAttributes;for(let e in a){let i=[],o=a[e];for(let e=0,n=o.length;e<n;e++){let n=o[e],a=t(n,r);i.push(a)}n.morphAttributes[e]=i}n.morphTargetsRelative=this.morphTargetsRelative;let o=this.groups;for(let e=0,t=o.length;e<t;e++){let t=o[e];n.addGroup(t.start,t.count,t.materialIndex)}return n}toJSON(){let e={metadata:{version:4.7,type:`BufferGeometry`,generator:`BufferGeometry.toJSON`}};if(e.uuid=this.uuid,e.type=this.parameters!==void 0&&this._transformed===!0?`BufferGeometry`:this.type,e.name=this.name,Object.keys(this.userData).length>0&&(e.userData=this.userData),this.parameters!==void 0&&this._transformed!==!0){let t=this.parameters;for(let n in t)t[n]!==void 0&&(e[n]=t[n]);return e}e.data={attributes:{}};let t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});let n=this.attributes;for(let t in n){let r=n[t];e.data.attributes[t]=r.toJSON(e.data)}let r={},i=!1;for(let t in this.morphAttributes){let n=this.morphAttributes[t],a=[];for(let t=0,r=n.length;t<r;t++){let r=n[t];a.push(r.toJSON(e.data))}a.length>0&&(r[t]=a,i=!0)}i&&(e.data.morphAttributes=r,e.data.morphTargetsRelative=this.morphTargetsRelative);let a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));let o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let t={};this.name=e.name;let n=e.index;n!==null&&this.setIndex(n.clone());let r=e.attributes;for(let e in r){let n=r[e];this.setAttribute(e,n.clone(t))}let i=e.morphAttributes;for(let e in i){let n=[],r=i[e];for(let e=0,i=r.length;e<i;e++)n.push(r[e].clone(t));this.morphAttributes[e]=n}this.morphTargetsRelative=e.morphTargetsRelative;let a=e.groups;for(let e=0,t=a.length;e<t;e++){let t=a[e];this.addGroup(t.start,t.count,t.materialIndex)}let o=e.boundingBox;o!==null&&(this.boundingBox=o.clone());let s=e.boundingSphere;return s!==null&&(this.boundingSphere=s.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this.userData=e.userData,this._transformed=e._transformed,this}dispose(){this.dispatchEvent({type:`dispose`})}},ig=new Q,ag=new Q,og=new am,sg=class{constructor(e=new Q(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,r){return this.normal.set(e,t,n),this.constant=r,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){let r=ig.subVectors(n,t).cross(ag.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(r,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){let e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t,n=!0){let r=e.delta(ig),i=this.normal.dot(r);if(i===0)return this.distanceToPoint(e.start)===0?t.copy(e.start):null;let a=-(e.start.dot(this.normal)+this.constant)/i;return n===!0&&(a<0||a>1)?null:t.copy(e.start).addScaledVector(r,a)}intersectsLine(e){let t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){let n=t||og.getNormalMatrix(e),r=this.coplanarPoint(ig).applyMatrix4(e),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}toJSON(){return{normal:this.normal.toArray(),constant:this.constant}}fromJSON(e){return this.normal.fromArray(e.normal),this.constant=e.constant,this}},cg=0,lg=class extends Gp{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:cg++}),this.uuid=Yp(),this.name=``,this.type=`Material`,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=100,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new sh(0,0,0),this.blendAlpha=0,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Mp,this.stencilZFail=Mp,this.stencilZPass=Mp,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.allowOverride=!0,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(let t in e){let n=e[t];if(n===void 0){X(`Material: parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){X(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}r&&r.isColor?r.set(n):r&&r.isVector2&&n&&n.isVector2||r&&r.isEuler&&n&&n.isEuler||r&&r.isVector3&&n&&n.isVector3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;t&&(e={textures:{},images:{}});let n={metadata:{version:4.7,type:`Material`,generator:`Material.toJSON`}};n.uuid=this.uuid,n.type=this.type,n.blending=this.blending,n.side=this.side,n.shadowSide=this.shadowSide,n.vertexColors=this.vertexColors,n.opacity=this.opacity,n.transparent=this.transparent,n.blendSrc=this.blendSrc,n.blendDst=this.blendDst,n.blendEquation=this.blendEquation,n.blendSrcAlpha=this.blendSrcAlpha,n.blendDstAlpha=this.blendDstAlpha,n.blendEquationAlpha=this.blendEquationAlpha,n.blendColor=this.blendColor.getHex(),n.blendAlpha=this.blendAlpha,n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.clipIntersection=this.clipIntersection,n.clipShadows=this.clipShadows,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,n.stencilWrite=this.stencilWrite,n.polygonOffset=this.polygonOffset,n.polygonOffsetFactor=this.polygonOffsetFactor,n.polygonOffsetUnits=this.polygonOffsetUnits,n.dithering=this.dithering,n.alphaTest=this.alphaTest,n.alphaHash=this.alphaHash,n.alphaToCoverage=this.alphaToCoverage,n.premultipliedAlpha=this.premultipliedAlpha,n.forceSinglePass=this.forceSinglePass,n.allowOverride=this.allowOverride,n.visible=this.visible,n.toneMapped=this.toneMapped,n.name=this.name,this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.retroreflectivity!==void 0&&(n.retroreflectivity=this.retroreflectivity),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),Array.isArray(this.clippingPlanes)&&this.clippingPlanes.length>0&&(n.clippingPlanes=this.clippingPlanes.map(e=>e.toJSON())),this.rotation!==void 0&&(n.rotation=this.rotation),this.depthPacking!==void 0&&(n.depthPacking=this.depthPacking),this.linewidth!==void 0&&(n.linewidth=this.linewidth),this.linecap!==void 0&&(n.linecap=this.linecap),this.linejoin!==void 0&&(n.linejoin=this.linejoin),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.wireframe!==void 0&&(n.wireframe=this.wireframe),this.wireframeLinewidth!==void 0&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!==void 0&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!==void 0&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading!==void 0&&(n.flatShading=this.flatShading),this.fog!==void 0&&(n.fog=this.fog),Object.keys(this.userData).length>0&&(n.userData=this.userData);function r(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}if(t){let t=r(e.textures),i=r(e.images);t.length>0&&(n.textures=t),i.length>0&&(n.images=i)}return n}fromJSON(e,t){if(e.uuid!==void 0&&(this.uuid=e.uuid),e.name!==void 0&&(this.name=e.name),e.color!==void 0&&this.color!==void 0&&this.color.setHex(e.color),e.roughness!==void 0&&(this.roughness=e.roughness),e.metalness!==void 0&&(this.metalness=e.metalness),e.sheen!==void 0&&(this.sheen=e.sheen),e.sheenColor!==void 0&&(this.sheenColor=new sh().setHex(e.sheenColor)),e.sheenRoughness!==void 0&&(this.sheenRoughness=e.sheenRoughness),e.emissive!==void 0&&this.emissive!==void 0&&this.emissive.setHex(e.emissive),e.specular!==void 0&&this.specular!==void 0&&this.specular.setHex(e.specular),e.specularIntensity!==void 0&&(this.specularIntensity=e.specularIntensity),e.specularColor!==void 0&&this.specularColor!==void 0&&this.specularColor.setHex(e.specularColor),e.shininess!==void 0&&(this.shininess=e.shininess),e.clearcoat!==void 0&&(this.clearcoat=e.clearcoat),e.clearcoatRoughness!==void 0&&(this.clearcoatRoughness=e.clearcoatRoughness),e.dispersion!==void 0&&(this.dispersion=e.dispersion),e.retroreflectivity!==void 0&&(this.retroreflectivity=e.retroreflectivity),e.iridescence!==void 0&&(this.iridescence=e.iridescence),e.iridescenceIOR!==void 0&&(this.iridescenceIOR=e.iridescenceIOR),e.iridescenceThicknessRange!==void 0&&(this.iridescenceThicknessRange=e.iridescenceThicknessRange),e.transmission!==void 0&&(this.transmission=e.transmission),e.thickness!==void 0&&(this.thickness=e.thickness),e.attenuationDistance!==void 0&&(this.attenuationDistance=e.attenuationDistance),e.attenuationColor!==void 0&&this.attenuationColor!==void 0&&this.attenuationColor.setHex(e.attenuationColor),e.anisotropy!==void 0&&(this.anisotropy=e.anisotropy),e.anisotropyRotation!==void 0&&(this.anisotropyRotation=e.anisotropyRotation),e.fog!==void 0&&(this.fog=e.fog),e.flatShading!==void 0&&(this.flatShading=e.flatShading),e.blending!==void 0&&(this.blending=e.blending),e.combine!==void 0&&(this.combine=e.combine),e.side!==void 0&&(this.side=e.side),e.shadowSide!==void 0&&(this.shadowSide=e.shadowSide),e.opacity!==void 0&&(this.opacity=e.opacity),e.transparent!==void 0&&(this.transparent=e.transparent),e.alphaTest!==void 0&&(this.alphaTest=e.alphaTest),e.alphaHash!==void 0&&(this.alphaHash=e.alphaHash),e.depthFunc!==void 0&&(this.depthFunc=e.depthFunc),e.depthTest!==void 0&&(this.depthTest=e.depthTest),e.depthWrite!==void 0&&(this.depthWrite=e.depthWrite),e.colorWrite!==void 0&&(this.colorWrite=e.colorWrite),e.clippingPlanes!==void 0&&(this.clippingPlanes=e.clippingPlanes.map(e=>new sg().fromJSON(e))),e.clipIntersection!==void 0&&(this.clipIntersection=e.clipIntersection),e.clipShadows!==void 0&&(this.clipShadows=e.clipShadows),e.depthPacking!==void 0&&(this.depthPacking=e.depthPacking),e.blendSrc!==void 0&&(this.blendSrc=e.blendSrc),e.blendDst!==void 0&&(this.blendDst=e.blendDst),e.blendEquation!==void 0&&(this.blendEquation=e.blendEquation),e.blendSrcAlpha!==void 0&&(this.blendSrcAlpha=e.blendSrcAlpha),e.blendDstAlpha!==void 0&&(this.blendDstAlpha=e.blendDstAlpha),e.blendEquationAlpha!==void 0&&(this.blendEquationAlpha=e.blendEquationAlpha),e.blendColor!==void 0&&this.blendColor!==void 0&&this.blendColor.setHex(e.blendColor),e.blendAlpha!==void 0&&(this.blendAlpha=e.blendAlpha),e.stencilWriteMask!==void 0&&(this.stencilWriteMask=e.stencilWriteMask),e.stencilFunc!==void 0&&(this.stencilFunc=e.stencilFunc),e.stencilRef!==void 0&&(this.stencilRef=e.stencilRef),e.stencilFuncMask!==void 0&&(this.stencilFuncMask=e.stencilFuncMask),e.stencilFail!==void 0&&(this.stencilFail=e.stencilFail),e.stencilZFail!==void 0&&(this.stencilZFail=e.stencilZFail),e.stencilZPass!==void 0&&(this.stencilZPass=e.stencilZPass),e.stencilWrite!==void 0&&(this.stencilWrite=e.stencilWrite),e.wireframe!==void 0&&(this.wireframe=e.wireframe),e.wireframeLinewidth!==void 0&&(this.wireframeLinewidth=e.wireframeLinewidth),e.wireframeLinecap!==void 0&&(this.wireframeLinecap=e.wireframeLinecap),e.wireframeLinejoin!==void 0&&(this.wireframeLinejoin=e.wireframeLinejoin),e.rotation!==void 0&&(this.rotation=e.rotation),e.linewidth!==void 0&&(this.linewidth=e.linewidth),e.linecap!==void 0&&(this.linecap=e.linecap),e.linejoin!==void 0&&(this.linejoin=e.linejoin),e.dashSize!==void 0&&(this.dashSize=e.dashSize),e.gapSize!==void 0&&(this.gapSize=e.gapSize),e.scale!==void 0&&(this.scale=e.scale),e.polygonOffset!==void 0&&(this.polygonOffset=e.polygonOffset),e.polygonOffsetFactor!==void 0&&(this.polygonOffsetFactor=e.polygonOffsetFactor),e.polygonOffsetUnits!==void 0&&(this.polygonOffsetUnits=e.polygonOffsetUnits),e.dithering!==void 0&&(this.dithering=e.dithering),e.alphaToCoverage!==void 0&&(this.alphaToCoverage=e.alphaToCoverage),e.premultipliedAlpha!==void 0&&(this.premultipliedAlpha=e.premultipliedAlpha),e.forceSinglePass!==void 0&&(this.forceSinglePass=e.forceSinglePass),e.allowOverride!==void 0&&(this.allowOverride=e.allowOverride),e.visible!==void 0&&(this.visible=e.visible),e.toneMapped!==void 0&&(this.toneMapped=e.toneMapped),e.userData!==void 0&&(this.userData=e.userData),e.vertexColors!==void 0&&(this.vertexColors=typeof e.vertexColors==`number`?e.vertexColors>0:e.vertexColors),e.size!==void 0&&(this.size=e.size),e.sizeAttenuation!==void 0&&(this.sizeAttenuation=e.sizeAttenuation),e.map!==void 0&&(this.map=t[e.map]||null),e.matcap!==void 0&&(this.matcap=t[e.matcap]||null),e.alphaMap!==void 0&&(this.alphaMap=t[e.alphaMap]||null),e.bumpMap!==void 0&&(this.bumpMap=t[e.bumpMap]||null),e.bumpScale!==void 0&&(this.bumpScale=e.bumpScale),e.normalMap!==void 0&&(this.normalMap=t[e.normalMap]||null),e.normalMapType!==void 0&&(this.normalMapType=e.normalMapType),e.normalScale!==void 0){let t=e.normalScale;Array.isArray(t)===!1&&(t=[t,t]),this.normalScale=new tm().fromArray(t)}return e.displacementMap!==void 0&&(this.displacementMap=t[e.displacementMap]||null),e.displacementScale!==void 0&&(this.displacementScale=e.displacementScale),e.displacementBias!==void 0&&(this.displacementBias=e.displacementBias),e.roughnessMap!==void 0&&(this.roughnessMap=t[e.roughnessMap]||null),e.metalnessMap!==void 0&&(this.metalnessMap=t[e.metalnessMap]||null),e.emissiveMap!==void 0&&(this.emissiveMap=t[e.emissiveMap]||null),e.emissiveIntensity!==void 0&&(this.emissiveIntensity=e.emissiveIntensity),e.specularMap!==void 0&&(this.specularMap=t[e.specularMap]||null),e.specularIntensityMap!==void 0&&(this.specularIntensityMap=t[e.specularIntensityMap]||null),e.specularColorMap!==void 0&&(this.specularColorMap=t[e.specularColorMap]||null),e.envMap!==void 0&&(this.envMap=t[e.envMap]||null),e.envMapRotation!==void 0&&this.envMapRotation.fromArray(e.envMapRotation),e.envMapIntensity!==void 0&&(this.envMapIntensity=e.envMapIntensity),e.reflectivity!==void 0&&(this.reflectivity=e.reflectivity),e.refractionRatio!==void 0&&(this.refractionRatio=e.refractionRatio),e.lightMap!==void 0&&(this.lightMap=t[e.lightMap]||null),e.lightMapIntensity!==void 0&&(this.lightMapIntensity=e.lightMapIntensity),e.aoMap!==void 0&&(this.aoMap=t[e.aoMap]||null),e.aoMapIntensity!==void 0&&(this.aoMapIntensity=e.aoMapIntensity),e.gradientMap!==void 0&&(this.gradientMap=t[e.gradientMap]||null),e.clearcoatMap!==void 0&&(this.clearcoatMap=t[e.clearcoatMap]||null),e.clearcoatRoughnessMap!==void 0&&(this.clearcoatRoughnessMap=t[e.clearcoatRoughnessMap]||null),e.clearcoatNormalMap!==void 0&&(this.clearcoatNormalMap=t[e.clearcoatNormalMap]||null),e.clearcoatNormalScale!==void 0&&(this.clearcoatNormalScale=new tm().fromArray(e.clearcoatNormalScale)),e.iridescenceMap!==void 0&&(this.iridescenceMap=t[e.iridescenceMap]||null),e.iridescenceThicknessMap!==void 0&&(this.iridescenceThicknessMap=t[e.iridescenceThicknessMap]||null),e.transmissionMap!==void 0&&(this.transmissionMap=t[e.transmissionMap]||null),e.thicknessMap!==void 0&&(this.thicknessMap=t[e.thicknessMap]||null),e.anisotropyMap!==void 0&&(this.anisotropyMap=t[e.anisotropyMap]||null),e.sheenColorMap!==void 0&&(this.sheenColorMap=t[e.sheenColorMap]||null),e.sheenRoughnessMap!==void 0&&(this.sheenRoughnessMap=t[e.sheenRoughnessMap]||null),this}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;let t=e.clippingPlanes,n=null;if(t!==null){let e=t.length;n=Array(e);for(let r=0;r!==e;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:`dispose`})}set needsUpdate(e){e===!0&&this.version++}},ug=new Q,dg=new Q,fg=new Q,pg=new Q,mg=class{constructor(e=new Q,t=new Q(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,ug)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);let n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){let t=ug.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(ug.copy(this.origin).addScaledVector(this.direction,t),ug.distanceToSquared(e))}distanceSqToSegment(e,t,n,r){dg.copy(e).add(t).multiplyScalar(.5),fg.copy(t).sub(e).normalize(),pg.copy(this.origin).sub(dg);let i=e.distanceTo(t)*.5,a=-this.direction.dot(fg),o=pg.dot(this.direction),s=-pg.dot(fg),c=pg.lengthSq(),l=Math.abs(1-a*a),u,d,f,p;if(l>0){if(u=a*s-o,d=a*o-s,p=i*l,u>=0){if(d>=-p){if(d<=p){let e=1/l;u*=e,d*=e,f=u*(u+a*d+2*o)+d*(a*u+d+2*s)+c}else d=i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c}else d=-i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c}else d<=-p?(u=Math.max(0,-(-a*i+o)),d=u>0?-i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c):d<=p?(u=0,d=Math.min(Math.max(-i,-s),i),f=d*(d+2*s)+c):(u=Math.max(0,-(a*i+o)),d=u>0?i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c)}else d=a>0?-i:i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),r&&r.copy(dg).addScaledVector(fg,d),f}intersectSphere(e,t){if(e.radius<0)return null;ug.subVectors(e.center,this.origin);let n=ug.dot(this.direction),r=ug.dot(ug)-n*n,i=e.radius*e.radius;if(r>i)return null;let a=Math.sqrt(i-r),o=n-a,s=n+a;return s<0?null:o<0?this.at(s,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){let t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){let n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){let t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,r,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,r=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,r=(e.min.x-d.x)*c),l>=0?(i=(e.min.y-d.y)*l,a=(e.max.y-d.y)*l):(i=(e.max.y-d.y)*l,a=(e.min.y-d.y)*l),n>a||i>r||((i>n||isNaN(n))&&(n=i),(a<r||isNaN(r))&&(r=a),u>=0?(o=(e.min.z-d.z)*u,s=(e.max.z-d.z)*u):(o=(e.max.z-d.z)*u,s=(e.min.z-d.z)*u),n>s||o>r)||((o>n||n!==n)&&(n=o),(s<r||r!==r)&&(r=s),r<0)?null:this.at(n>=0?n:r,t)}intersectsBox(e){return this.intersectBox(e,ug)!==null}intersectTriangle(e,t,n,r,i){let a=this.origin,o=this.direction,s=o.x,c=o.y,l=o.z,u=e.x-a.x,d=e.y-a.y,f=e.z-a.z,p=t.x-a.x,m=t.y-a.y,h=t.z-a.z,g=n.x-a.x,_=n.y-a.y,v=n.z-a.z,y=Math.abs(s),b=Math.abs(c),x=Math.abs(l),S,C,w,T,E,D,O,k,A,j,ee,M;if(y>=b&&y>=x?(w=s,D=u,A=p,M=g,s>=0?(S=c,C=l,T=d,E=f,O=m,k=h,j=_,ee=v):(S=l,C=c,T=f,E=d,O=h,k=m,j=v,ee=_)):b>=x?(w=c,D=d,A=m,M=_,c>=0?(S=l,C=s,T=f,E=u,O=h,k=p,j=v,ee=g):(S=s,C=l,T=u,E=f,O=p,k=h,j=g,ee=v)):(w=l,D=f,A=h,M=v,l>=0?(S=s,C=c,T=u,E=d,O=p,k=m,j=g,ee=_):(S=c,C=s,T=d,E=u,O=m,k=p,j=_,ee=g)),w===0)return null;let N=S/w,P=C/w,F=1/w,te=T-N*D,I=E-P*D,ne=O-N*A,L=k-P*A,re=j-N*M,ie=ee-P*M,ae=re*L-ie*ne,oe=te*ie-I*re,se=ne*I-L*te;if(r){if(ae<0||oe<0||se<0)return null}else if((ae<0||oe<0||se<0)&&(ae>0||oe>0||se>0))return null;let ce=ae+oe+se;if(ce===0)return null;let le=F*(ae*D+oe*A+se*M);return(ce>0?le<0:le>0)?null:this.at(le/ce,i)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},hg=class extends lg{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type=`MeshBasicMaterial`,this.color=new sh(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Im,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap=`round`,this.wireframeLinejoin=`round`,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}},gg=new Em,_g=new mg,vg=new Yh,yg=new Q,bg=new Q,xg=new Q,Sg=new Q,Cg=new Q,wg=new Q,Tg=new Q,Eg=new Q,Dg=class extends $m{constructor(e=new rg,t=new hg){super(),this.isMesh=!0,this.type=`Mesh`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){let e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e<t;e++){let t=n[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=e}}}}getVertexPosition(e,t){let n=this.geometry,r=n.attributes.position,i=n.morphAttributes.position,a=n.morphTargetsRelative;t.fromBufferAttribute(r,e);let o=this.morphTargetInfluences;if(i&&o){wg.set(0,0,0);for(let n=0,r=i.length;n<r;n++){let r=o[n],s=i[n];r!==0&&(Cg.fromBufferAttribute(s,e),a?wg.addScaledVector(Cg,r):wg.addScaledVector(Cg.sub(t),r))}t.add(wg)}return t}intersectsFrustum(e){return e.intersectsObject(this)}raycast(e,t){let n=this.geometry,r=this.material,i=this.matrixWorld;r!==void 0&&(n.boundingSphere===null&&n.computeBoundingSphere(),vg.copy(n.boundingSphere),vg.applyMatrix4(i),_g.copy(e.ray).recast(e.near),!(vg.containsPoint(_g.origin)===!1&&(_g.intersectSphere(vg,yg)===null||_g.origin.distanceToSquared(yg)>(e.far-e.near)**2))&&(gg.copy(i).invert(),_g.copy(e.ray).applyMatrix4(gg),(n.boundingBox===null||_g.intersectsBox(n.boundingBox)!==!1)&&this._computeIntersections(e,t,_g)))}_computeIntersections(e,t,n){let r,i=this.geometry,a=this.material,o=i.index,s=i.attributes.position,c=i.attributes.uv,l=i.attributes.uv1,u=i.attributes.normal,d=i.groups,f=i.drawRange;if(o!==null){if(Array.isArray(a))for(let i=0,s=d.length;i<s;i++){let s=d[i],p=a[s.materialIndex],m=Math.max(s.start,f.start),h=Math.min(o.count,Math.min(s.start+s.count,f.start+f.count));for(let i=m,a=h;i<a;i+=3){let a=o.getX(i),d=o.getX(i+1),f=o.getX(i+2);r=kg(this,p,e,n,c,l,u,a,d,f),r&&(r.faceIndex=Math.floor(i/3),r.face.materialIndex=s.materialIndex,t.push(r))}}else{let i=Math.max(0,f.start),s=Math.min(o.count,f.start+f.count);for(let d=i,f=s;d<f;d+=3){let i=o.getX(d),s=o.getX(d+1),f=o.getX(d+2);r=kg(this,a,e,n,c,l,u,i,s,f),r&&(r.faceIndex=Math.floor(d/3),t.push(r))}}}else if(s!==void 0){if(Array.isArray(a))for(let i=0,o=d.length;i<o;i++){let o=d[i],p=a[o.materialIndex],m=Math.max(o.start,f.start),h=Math.min(s.count,Math.min(o.start+o.count,f.start+f.count));for(let i=m,a=h;i<a;i+=3){let a=i,s=i+1,d=i+2;r=kg(this,p,e,n,c,l,u,a,s,d),r&&(r.faceIndex=Math.floor(i/3),r.face.materialIndex=o.materialIndex,t.push(r))}}else{let i=Math.max(0,f.start),o=Math.min(s.count,f.start+f.count);for(let s=i,d=o;s<d;s+=3){let i=s,o=s+1,d=s+2;r=kg(this,a,e,n,c,l,u,i,o,d),r&&(r.faceIndex=Math.floor(s/3),t.push(r))}}}}};function Og(e,t,n,r,i,a,o,s){let c;if(c=t.side===1?r.intersectTriangle(o,a,i,!0,s):r.intersectTriangle(i,a,o,t.side===0,s),c===null)return null;Eg.copy(s),Eg.applyMatrix4(e.matrixWorld);let l=n.ray.origin.distanceTo(Eg);return l<n.near||l>n.far?null:{distance:l,point:Eg.clone(),object:e}}function kg(e,t,n,r,i,a,o,s,c,l){e.getVertexPosition(s,bg),e.getVertexPosition(c,xg),e.getVertexPosition(l,Sg);let u=Og(e,t,n,r,bg,xg,Sg,Tg);if(u){let e=new Q;Ch.getBarycoord(Tg,bg,xg,Sg,e),i&&(u.uv=Ch.getInterpolatedAttribute(i,s,c,l,e,new tm)),a&&(u.uv1=Ch.getInterpolatedAttribute(a,s,c,l,e,new tm)),o&&(u.normal=Ch.getInterpolatedAttribute(o,s,c,l,e,new Q),u.normal.dot(r.direction)>0&&u.normal.multiplyScalar(-1));let t={a:s,b:c,c:l,normal:new Q,materialIndex:0};Ch.getNormal(bg,xg,Sg,t.normal),u.face=t,u.barycoord=e}return u}var Ag=class extends bm{constructor(e=null,t=1,n=1,r,i,a,o,s,c=lf,l=lf,u,d){super(null,a,o,s,c,l,r,i,u,d),this.isDataTexture=!0,this.image={data:e,width:t,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}},jg=new Yh,Mg=new tm(.5,.5),Ng=new Q,Pg=class{constructor(e=new sg,t=new sg,n=new sg,r=new sg,i=new sg,a=new sg){this.planes=[e,t,n,r,i,a]}set(e,t,n,r,i,a){let o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this}copy(e){let t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=Pp,n=!1){let r=this.planes,i=e.elements,a=i[0],o=i[1],s=i[2],c=i[3],l=i[4],u=i[5],d=i[6],f=i[7],p=i[8],m=i[9],h=i[10],g=i[11],_=i[12],v=i[13],y=i[14],b=i[15];if(r[0].setComponents(c-a,f-l,g-p,b-_).normalize(),r[1].setComponents(c+a,f+l,g+p,b+_).normalize(),r[2].setComponents(c+o,f+u,g+m,b+v).normalize(),r[3].setComponents(c-o,f-u,g-m,b-v).normalize(),n)r[4].setComponents(s,d,h,y).normalize(),r[5].setComponents(c-s,f-d,g-h,b-y).normalize();else if(r[4].setComponents(c-s,f-d,g-h,b-y).normalize(),t===2e3)r[5].setComponents(c+s,f+d,g+h,b+y).normalize();else if(t===2001)r[5].setComponents(s,d,h,y).normalize();else throw Error(`THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: `+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),jg.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{let t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),jg.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(jg)}intersectsSprite(e){return jg.center.set(0,0,0),jg.radius=.7071067811865476+Mg.distanceTo(e.center),jg.applyMatrix4(e.matrixWorld),this.intersectsSphere(jg)}intersectsSphere(e){let t=this.planes,n=e.center,r=-e.radius;for(let e=0;e<6;e++)if(t[e].distanceToPoint(n)<r)return!1;return!0}intersectsBox(e){let t=this.planes;for(let n=0;n<6;n++){let r=t[n];if(Ng.x=r.normal.x>0?e.max.x:e.min.x,Ng.y=r.normal.y>0?e.max.y:e.min.y,Ng.z=r.normal.z>0?e.max.z:e.min.z,r.distanceToPoint(Ng)<0)return!1}return!0}containsPoint(e){let t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}},Fg=class extends lg{constructor(e){super(),this.isPointsMaterial=!0,this.type=`PointsMaterial`,this.color=new sh(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}},Ig=new Em,Lg=new mg,Rg=new Yh,zg=new Q,Bg=class extends $m{constructor(e=new rg,t=new Fg){super(),this.isPoints=!0,this.type=`Points`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}intersectsFrustum(e){return e.intersectsObject(this)}raycast(e,t){let n=this.geometry,r=this.matrixWorld,i=e.params.Points.threshold,a=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),Rg.copy(n.boundingSphere),Rg.applyMatrix4(r),Rg.radius+=i,e.ray.intersectsSphere(Rg)===!1)return;Ig.copy(r).invert(),Lg.copy(e.ray).applyMatrix4(Ig);let o=i/((this.scale.x+this.scale.y+this.scale.z)/3),s=o*o,c=n.index,l=n.attributes.position;if(c!==null){let n=Math.max(0,a.start),i=Math.min(c.count,a.start+a.count);for(let a=n,o=i;a<o;a++){let n=c.getX(a);zg.fromBufferAttribute(l,n),Vg(zg,n,s,r,e,t,this)}}else{let n=Math.max(0,a.start),i=Math.min(l.count,a.start+a.count);for(let a=n,o=i;a<o;a++)zg.fromBufferAttribute(l,a),Vg(zg,a,s,r,e,t,this)}}updateMorphTargets(){let e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e<t;e++){let t=n[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=e}}}}};function Vg(e,t,n,r,i,a,o){let s=Lg.distanceSqToPoint(e);if(s<n){let n=new Q;Lg.closestPointToPoint(e,n),n.applyMatrix4(r);let c=i.ray.origin.distanceTo(n);if(c<i.near||c>i.far)return;a.push({distance:c,distanceToRay:Math.sqrt(s),point:n,index:t,face:null,faceIndex:null,barycoord:null,object:o})}}var Hg=class extends bm{constructor(e=[],t=301,n,r,i,a,o,s,c,l){super(e,t,n,r,i,a,o,s,c,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}},Ug=class extends bm{constructor(e,t,n=bf,r,i,a,o=lf,s=lf,c,l=jf,u=1){if(l!==1026&&l!==1027)throw Error(`THREE.DepthTexture: format must be either THREE.DepthFormat or THREE.DepthStencilFormat`);super({width:e,height:t,depth:u},r,i,a,o,s,l,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new gm(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){let t=super.toJSON(e);return t.compareFunction=this.compareFunction,t}},Wg=class extends Ug{constructor(e,t=bf,n=301,r,i,a=lf,o=lf,s,c=jf){let l={width:e,height:e,depth:1},u=[l,l,l,l,l,l];super(e,e,t,n,r,i,a,o,s,c),this.image=u,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}},Gg=class extends bm{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}},Kg=class e extends rg{constructor(e=1,t=1,n=1,r=1,i=1,a=1){super(),this.type=`BoxGeometry`,this.parameters={width:e,height:t,depth:n,widthSegments:r,heightSegments:i,depthSegments:a};let o=this;r=Math.floor(r),i=Math.floor(i),a=Math.floor(a);let s=[],c=[],l=[],u=[],d=0,f=0;p(`z`,`y`,`x`,-1,-1,n,t,e,a,i,0),p(`z`,`y`,`x`,1,-1,n,t,-e,a,i,1),p(`x`,`z`,`y`,1,1,e,n,t,r,a,2),p(`x`,`z`,`y`,1,-1,e,n,-t,r,a,3),p(`x`,`y`,`z`,1,-1,e,t,n,r,i,4),p(`x`,`y`,`z`,-1,-1,e,t,-n,r,i,5),this.setIndex(s),this.setAttribute(`position`,new Gh(c,3)),this.setAttribute(`normal`,new Gh(l,3)),this.setAttribute(`uv`,new Gh(u,2));function p(e,t,n,r,i,a,p,m,h,g,_){let v=a/h,y=p/g,b=a/2,x=p/2,S=m/2,C=h+1,w=g+1,T=0,E=0,D=new Q;for(let a=0;a<w;a++){let o=a*y-x;for(let s=0;s<C;s++)D[e]=(s*v-b)*r,D[t]=o*i,D[n]=S,c.push(D.x,D.y,D.z),D[e]=0,D[t]=0,D[n]=m>0?1:-1,l.push(D.x,D.y,D.z),u.push(s/h),u.push(1-a/g),T+=1}for(let e=0;e<g;e++)for(let t=0;t<h;t++){let n=d+t+C*e,r=d+t+C*(e+1),i=d+(t+1)+C*(e+1),a=d+(t+1)+C*e;s.push(n,r,a),s.push(r,i,a),E+=6}o.addGroup(f,E,_),f+=E,d+=T}}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(t){return new e(t.width,t.height,t.depth,t.widthSegments,t.heightSegments,t.depthSegments)}},qg=class e extends rg{constructor(e=1,t=1,n=1,r=1){super(),this.type=`PlaneGeometry`,this.parameters={width:e,height:t,widthSegments:n,heightSegments:r};let i=e/2,a=t/2,o=Math.floor(n),s=Math.floor(r),c=o+1,l=s+1,u=e/o,d=t/s,f=[],p=[],m=[],h=[];for(let e=0;e<l;e++){let t=e*d-a;for(let n=0;n<c;n++){let r=n*u-i;p.push(r,-t,0),m.push(0,0,1),h.push(n/o),h.push(1-e/s)}}for(let e=0;e<s;e++)for(let t=0;t<o;t++){let n=t+c*e,r=t+c*(e+1),i=t+1+c*(e+1),a=t+1+c*e;f.push(n,r,a),f.push(r,i,a)}this.setIndex(f),this.setAttribute(`position`,new Gh(p,3)),this.setAttribute(`normal`,new Gh(m,3)),this.setAttribute(`uv`,new Gh(h,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(t){return new e(t.width,t.height,t.widthSegments,t.heightSegments)}};function Jg(e){let t={};for(let n in e){t[n]={};for(let r in e[n]){let i=e[n][r];if(Xg(i))i.isRenderTargetTexture?(X(`UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().`),t[n][r]=null):t[n][r]=i.clone();else if(Array.isArray(i)){if(Xg(i[0])){let e=[];for(let t=0,n=i.length;t<n;t++)e[t]=i[t].clone();t[n][r]=e}else t[n][r]=i.slice()}else t[n][r]=i}}return t}function Yg(e){let t={};for(let n=0;n<e.length;n++){let r=Jg(e[n]);for(let e in r)t[e]=r[e]}return t}function Xg(e){return e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture||e.isQuaternion)}function Zg(e){let t=[];for(let n=0;n<e.length;n++)t.push(e[n].clone());return t}function Qg(e){let t=e.getRenderTarget();return t===null?e.outputColorSpace:t.isXRRenderTarget===!0?t.texture.colorSpace:um.workingColorSpace}var $g={clone:Jg,merge:Yg},e_=`void main() {
|
|
68
68
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
@@ -4384,7 +4384,7 @@ void main() {
|
|
|
4384
4384
|
float v = body * 0.35 + plasma * 0.7 + rim * 1.1 + halo + ripple;
|
|
4385
4385
|
gl_FragColor = vec4(uColor * v * uBright, clamp(v * uBright, 0.0, 1.0));
|
|
4386
4386
|
}
|
|
4387
|
-
`,wx=class{host;core;renderer;scene=new lh;camera=new N_(-1,1,1,-1,0,1);material;geometry=new qg(2,2);raf=0;last=0;ro;disposed=!1;constructor(e,t,n){this.host=e,this.core=new af({reducedMotion:n}),this.renderer=new hx({alpha:!0,antialias:!1}),this.renderer.setClearColor(0,0),this.renderer.domElement.style.cssText=`width:100%;height:100%;display:block`,e.appendChild(this.renderer.domElement),this.material=new n_({vertexShader:Sx,fragmentShader:Cx,transparent:!0,depthWrite:!1,blending:2,uniforms:{uPhase:{value:0},uAmp:{value:0},uBright:{value:.85},uNoise:{value:.05},uTighten:{value:0},uAspect:{value:1},uColor:{value:new sh(t)}}}),this.scene.add(new Dg(this.geometry,this.material)),this.ro=new ResizeObserver(()=>this.resize()),this.ro.observe(e),this.resize(),this.raf=requestAnimationFrame(this.frame)}resize(){let e=Math.max(1,this.host.clientWidth),t=Math.max(1,this.host.clientHeight);this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),this.renderer.setSize(e,t,!1),this.material.uniforms.uAspect.value=e/t}frame=e=>{if(this.disposed)return;if(this.raf=requestAnimationFrame(this.frame),document.hidden){this.last=e;return}let t=this.last?Math.min((e-this.last)/1e3,.1):.016;this.last=e,this.core.tick(t);let n=this.core.uniforms(),r=this.material.uniforms;r.uPhase.value=n.phase,r.uAmp.value=n.amplitude,r.uBright.value=n.brightness,r.uNoise.value=n.noise,r.uTighten.value=n.tighten,this.renderer.render(this.scene,this.camera)};setState(e){this.core.setState(e)}setAmplitude(e){this.core.setAmplitude(e)}setMode(e){this.resize()}setAccent(e){this.material.uniforms.uColor.value.set(e)}setIntensity(e){this.core.setIntensity(e)}dispose(){this.disposed=!0,cancelAnimationFrame(this.raf),this.ro.disconnect(),this.geometry.dispose(),this.material.dispose(),this.renderer.dispose(),this.renderer.domElement.remove()}},Tx=e=>Number.isFinite(e)?e:0;function Ex(e,t,n,r){let i=Tx(t),a=Math.min(1,Math.max(0,Tx(n))),o=Math.min(1,Math.max(0,Tx(r)));return Array.from({length:Math.max(0,Math.floor(e))},(e,t)=>{let n=.12+.18*(.5+.5*Math.sin(t*.31+i*2.2))+o*(.5+.5*Math.sin(t*.9+i*4)),r=a*(.35+.65*(.5+.5*Math.sin(t*2.1+i*9)));return Math.min(1,Math.max(0,n+r))})}var Dx=96,Ox=class{host;core;canvas=document.createElement(`canvas`);ctx;raf=0;last=0;ro=null;disposed=!1;accent;constructor(e,t,n){this.host=e,this.core=new af({reducedMotion:n}),this.accent=t,this.canvas.style.cssText=`width:100%;height:100%;display:block`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas),this.ctx&&(typeof ResizeObserver<`u`&&(this.ro=new ResizeObserver(()=>this.resize()),this.ro.observe(e)),this.resize(),this.raf=requestAnimationFrame(this.frame))}resize(){let e=Math.min(window.devicePixelRatio||1,2);this.canvas.width=Math.max(1,this.host.clientWidth)*e,this.canvas.height=Math.max(1,this.host.clientHeight)*e}frame=e=>{if(this.disposed||!this.ctx)return;if(this.raf=requestAnimationFrame(this.frame),document.hidden){this.last=e;return}let t=this.last?Math.min((e-this.last)/1e3,.1):.016;this.last=e,this.core.tick(t);let n=this.core.uniforms(),r=this.ctx,{width:i,height:a}=this.canvas,o=Math.min(i,a);r.clearRect(0,0,i,a);let s=o*.27*(1-n.tighten),c=o*.2,l=Ex(Dx,n.phase,n.amplitude,n.noise);r.save(),r.translate(i/2,a/2),r.rotate(n.angle),r.lineCap=`round`,r.strokeStyle=this.accent,r.shadowColor=this.accent,r.shadowBlur=o*.02*n.brightness,r.lineWidth=Math.max(2,o*.008);let u=this.core.state===`thinking`;for(let e=0;e<Dx;e++){let t=e/Dx*Math.PI*2,i=u?.25+.75*Math.abs(Math.sin((t-n.phase*2)/2)):1;r.globalAlpha=Math.min(1,(.35+l[e]*.65)*n.brightness*i);let a=o*.012+l[e]*c;r.beginPath(),r.moveTo(Math.cos(t)*s,Math.sin(t)*s),r.lineTo(Math.cos(t)*(s+a),Math.sin(t)*(s+a)),r.stroke()}r.globalAlpha=.28*n.brightness,r.shadowBlur=0,r.lineWidth=Math.max(1,o*.003),r.beginPath(),r.arc(0,0,s*.9,0,Math.PI*2),r.stroke(),r.restore()};setState(e){this.core.setState(e)}setAmplitude(e){this.core.setAmplitude(e)}setMode(e){this.resize()}setAccent(e){this.accent=e}setIntensity(e){this.core.setIntensity(e)}dispose(){this.disposed=!0,cancelAnimationFrame(this.raf),this.ro?.disconnect(),this.canvas.remove()}};function kx(e,t,n){let r=ef({...n.env??tf(),reducedMotion:n.reducedMotion}),i=()=>new xx(t,r||8e3,n.accent,n.reducedMotion);if(e===`ring`)return new Ox(t,n.accent,n.reducedMotion);if(r===0)return i();try{return e===`orb`?new wx(t,n.accent,n.reducedMotion):new bx(t,r,n.accent,n.reducedMotion)}catch{return i()}}function Ax({state:e,amplitude:t,pulse:n=0,mode:r,accent:i=`#3fd8ff`,style:a=`sphere`,intensity:o=.6,scale:s=1}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)({state:e,amplitude:t,mode:r,accent:i,intensity:o});return d.current={state:e,amplitude:t,mode:r,accent:i,intensity:o},(0,l.useEffect)(()=>{let e=d.current,t=kx(a,c.current,{accent:e.accent,reducedMotion:tf().reducedMotion});return t.setState(e.state),t.setAmplitude(e.amplitude),t.setIntensity(e.intensity),t.setMode(e.mode),u.current=t,()=>{t.dispose(),u.current=null}},[a]),(0,l.useEffect)(()=>u.current?.setState(e),[e]),(0,l.useEffect)(()=>u.current?.setAmplitude(t),[t,n]),(0,l.useEffect)(()=>u.current?.setMode(r),[r]),(0,l.useEffect)(()=>u.current?.setAccent(i),[i]),(0,l.useEffect)(()=>u.current?.setIntensity(o),[o]),(0,p.jsx)(`div`,{ref:c,"data-presence":!0,"data-mode":r,"data-style":a,"data-state":e,"data-amplitude":t.toFixed(2),className:`presence presence-${r}`,style:r===`full`&&s!==1?{transform:`scale(${s})`}:void 0,"aria-hidden":`true`})}var jx=e=>.25+Math.min(1,Math.max(0,e))/.7*.75;function Mx({look:e}){let[t,n]=(0,l.useState)(.4),[r,i]=(0,l.useState)(0);(0,l.useEffect)(()=>{let e=setInterval(()=>{n(.3+Math.random()*.5),i(e=>e+1)},600);return()=>clearInterval(e)},[]);let a=jx(e.reactivity);return(0,p.jsxs)(`div`,{className:`look-preview`,"data-testid":`look-preview`,role:`img`,"aria-label":`Preview of the voice presence`,children:[e.ambient&&(0,p.jsx)(`div`,{className:`look-preview-glow`,style:{opacity:.35+.65*e.intensity,"--accent":e.accent}}),(0,p.jsx)(`div`,{className:`look-preview-stage`,style:{"--accent":e.accent},children:(0,p.jsx)(Ax,{state:`speaking`,amplitude:Math.min(1,t*a),pulse:r,mode:`full`,accent:e.accent,style:e.style,intensity:e.intensity,scale:e.size})}),e.captions&&(0,p.jsx)(`p`,{className:`look-preview-caption captions-${e.captionSize}`,children:`This is how my words will look.`})]})}var Nx=async e=>{let t;try{t=await fetch(`/api/account/secret`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)})}catch{throw Error(`Could not reach Friend. Check the connection.`)}let n={};try{n=await t.json()}catch{}if(!t.ok){let e=typeof n.triesLeft==`number`&&n.triesLeft>0?` ${n.triesLeft} ${n.triesLeft===1?`try`:`tries`} left.`:``;throw Error((n.error??(t.status===401?`Please sign in again.`:`The request failed (${t.status}).`))+e)}return{signedOutOthers:!!n.signedOutOthers}};function Px({change:e=Nx}){let[t,n]=(0,l.useState)(``),[r,i]=(0,l.useState)(``),[a,o]=(0,l.useState)(``),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),[v,y]=(0,l.useState)(null),b=r!==``||a!==``,x=s!==``||u!==``,S=async()=>{if(_(null),y(null),!t)return _(`Type your current password.`);if(!b&&!x)return _(`Type a new password or a new PIN.`);if(b&&r.length<8)return _(`The new password must be at least 8 characters.`);if(b&&r!==a)return _(`The two new passwords are not the same.`);if(x&&!/^\d{6,}$/.test(s))return _(`The new PIN must be at least 6 digits.`);if(x&&s!==u)return _(`The two new PINs are not the same.`);h(!0);try{let a=await e({current:t,...b?{newPassword:r}:{},...x?{newPin:s}:{}});y([b&&`Password changed.`,x&&`PIN changed.`,b&&a.signedOutOthers&&`Other browsers and phones were signed out.`].filter(Boolean).join(` `)),n(``),i(``),o(``),c(``),f(``)}catch(e){_(e.message),n(``)}finally{h(!1)}};return(0,p.jsxs)(`form`,{className:`settings-section`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,p.jsx)(`h3`,{children:`Password and PIN`}),(0,p.jsx)(`p`,{className:`auth-note`,children:`Change either one or both. Your current password is always needed. Forgot it? On this PC run: friend password`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Current password`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`current-password`,value:t,disabled:m,onChange:e=>n(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New password`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`new-password`,value:r,disabled:m,onChange:e=>i(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New password again`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`new-password`,value:a,disabled:m,onChange:e=>o(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New PIN`}),(0,p.jsx)(`input`,{type:`password`,inputMode:`numeric`,autoComplete:`off`,value:s,disabled:m,onChange:e=>c(e.target.value.replace(/\D/g,``)),style:d})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The PIN is at least 6 digits. It is asked before risky actions.`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New PIN again`}),(0,p.jsx)(`input`,{type:`password`,inputMode:`numeric`,autoComplete:`off`,value:u,disabled:m,onChange:e=>f(e.target.value.replace(/\D/g,``)),style:d})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),v&&(0,p.jsx)(`p`,{role:`status`,className:`auth-note`,children:v}),(0,p.jsx)(`button`,{type:`submit`,className:`primary`,style:d,disabled:m,children:m?`Saving…`:`Change`})]})}var Fx=[{id:`read`,label:`Read only`,note:`Friend can look at your portfolio, funds, positions and orders, and send you reports. It cannot place, change or cancel any order. This is the only level in this version.`,locked:!1},{id:`orders`,label:`Orders with my confirmation (later version)`,note:`Friend would prepare an order and wait for you to confirm it with your PIN.`,locked:!0},{id:`limits`,label:`Orders within limits (later version)`,note:`Friend would place small orders on its own, inside limits you set.`,locked:!0}];function Ix({level:e=`read`}){return(0,p.jsxs)(`div`,{className:`settings-section`,role:`radiogroup`,"aria-label":`What Friend may do with money`,children:[(0,p.jsx)(`h3`,{children:`What may Friend do with your trading account?`}),Fx.map(t=>(0,p.jsxs)(`label`,{className:`settings-check`,style:{alignItems:`flex-start`,opacity:t.locked?.55:1},children:[(0,p.jsx)(`input`,{type:`radio`,name:`trading`,value:t.id,checked:!t.locked&&e===t.id,disabled:t.locked,readOnly:!0,onChange:()=>{}}),(0,p.jsxs)(`span`,{children:[(0,p.jsx)(`b`,{children:t.label}),(0,p.jsx)(`br`,{}),(0,p.jsx)(`small`,{className:`auth-note`,children:t.note})]})]},t.id)),(0,p.jsx)(`small`,{className:`auth-note`,children:`The assistant can never change this, even with your PIN. Orders will only arrive in a later version, with their own safeguards.`})]})}var Lx=async()=>{let e=await fetch(`/api/music/host/check`,{cache:`no-store`});if(!e.ok)throw Error(e.status===401?`Please sign in again.`:`The request failed (${e.status}).`);return await e.json()},Rx={url:`Open an address`,prompt:`Ask the assistant`,panel:`Open a panel`,music:`Control the music`},zx=e=>e===`panel`?zu[0]:e===`music`?Bu[0]:``;function Bx({music:e,hud:t,onMusic:n,onHud:r,checkHost:i=Lx}){let[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(!1),u=()=>{c(!0),o(null),i().then(e=>o(e.found?`mpv ${e.version} found (${e.path}).`:e.install)).catch(e=>o(e.message)).finally(()=>c(!1))},d=t.launcher,f=(e,t)=>r({launcher:d.map((n,r)=>r===e?{...n,...t}:n)}),m=(e,t)=>{let n=e+t;if(n<0||n>=d.length)return;let i=[...d];[i[e],i[n]]=[i[n],i[e]],r({launcher:i})};return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsx)(`h3`,{children:`Music player`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Music folder`}),(0,p.jsx)(`input`,{type:`text`,value:e.folder,placeholder:`C:\\Users\\you\\Music`,onChange:e=>n({folder:e.target.value})}),(0,p.jsx)(`small`,{className:`auth-note`,children:`A folder on the PC that runs Friend. Its sub-folders are searched too. Saving checks that it exists.`})]}),(0,p.jsxs)(`fieldset`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`File types to look for`}),Lu.map(t=>(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.extensions.includes(t),onChange:r=>{let i=r.target.checked?[...e.extensions,t]:e.extensions.filter(e=>e!==t);i.length&&n({extensions:Lu.filter(e=>i.includes(e))})}}),(0,p.jsx)(`span`,{children:t})]},t))]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsxs)(`span`,{children:[`Start volume (`,e.volume,`%)`]}),(0,p.jsx)(`input`,{type:`range`,min:Ru.volume.min,max:Ru.volume.max,value:e.volume,onChange:e=>n({volume:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Repeat`}),(0,p.jsxs)(`select`,{value:e.repeat,onChange:e=>n({repeat:e.target.value}),children:[(0,p.jsx)(`option`,{value:`off`,children:`Off`}),(0,p.jsx)(`option`,{value:`all`,children:`The whole list`}),(0,p.jsx)(`option`,{value:`one`,children:`One track`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Starts as`}),(0,p.jsxs)(`select`,{value:e.startView,onChange:e=>n({startView:e.target.value}),children:[(0,p.jsx)(`option`,{value:`mini`,children:`Small player`}),(0,p.jsx)(`option`,{value:`full`,children:`Big player with the playlist`})]})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.shuffle,onChange:e=>n({shuffle:e.target.checked})}),(0,p.jsx)(`span`,{children:`Shuffle`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.visualizer,onChange:e=>n({visualizer:e.target.checked})}),(0,p.jsx)(`span`,{children:`Moving bars around the dial`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Where music comes from, when the assistant is not told`}),(0,p.jsxs)(`select`,{value:e.defaultSource,onChange:e=>n({defaultSource:e.target.value}),children:[(0,p.jsx)(`option`,{value:`local`,children:`The music folder`}),(0,p.jsx)(`option`,{value:`spotify`,children:`Spotify`}),(0,p.jsx)(`option`,{value:`soundcloud`,children:`SoundCloud`}),(0,p.jsx)(`option`,{value:`audius`,children:`Audius`}),(0,p.jsx)(`option`,{value:`any`,children:`All`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Spotify, SoundCloud and Audius are added from Plugins. Playing from Spotify needs Spotify Premium on your account.`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Most results from a service such as Spotify`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.searchLimit.min,max:Ru.searchLimit.max,value:e.searchLimit,onChange:e=>n({searchLimit:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Where the sound comes out`}),(0,p.jsxs)(`select`,{value:e.output,onChange:e=>n({output:e.target.value}),children:[(0,p.jsx)(`option`,{value:`screen`,children:`The screen (the browser plays it)`}),(0,p.jsx)(`option`,{value:`host`,children:`This PC's speakers (no browser needed)`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The PC's speakers play your folder's music through mpv, a free player you install once. Spotify plays on a Spotify device you name below.`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Program that plays the folder's music on the PC (empty: find mpv automatically)`}),(0,p.jsx)(`input`,{type:`text`,value:e.hostPlayer,maxLength:260,placeholder:`mpv`,onChange:e=>n({hostPlayer:e.target.value})}),Uu(e.hostPlayer.trim())&&(0,p.jsx)(`small`,{role:`alert`,className:`auth-error`,children:Uu(e.hostPlayer.trim())})]}),(0,p.jsxs)(`div`,{className:`settings-field`,children:[(0,p.jsx)(`button`,{type:`button`,disabled:s,onClick:u,children:`Check mpv`}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Looks for mpv with the saved program setting, or automatically when it is empty.`}),a&&(0,p.jsx)(`small`,{role:`status`,className:`auth-note`,children:a})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Spotify device on the PC to play on`}),(0,p.jsx)(`input`,{type:`text`,value:e.spotifyDevice,maxLength:100,placeholder:`the name Spotify shows for that device`,onChange:e=>n({spotifyDevice:e.target.value})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Most tracks to list`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.maxTracks.min,max:Ru.maxTracks.max,value:e.maxTracks,onChange:e=>n({maxTracks:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`How many folders deep to search`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.scanDepth.min,max:Ru.scanDepth.max,value:e.scanDepth,onChange:e=>n({scanDepth:Number(e.target.value)})})]}),(0,p.jsx)(`h3`,{children:`Screen widgets`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Name on the profile tag`}),(0,p.jsx)(`input`,{type:`text`,maxLength:24,value:t.terminalLabel,onChange:e=>r({terminalLabel:e.target.value})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Animations`}),(0,p.jsxs)(`select`,{value:t.animations,onChange:e=>r({animations:e.target.value}),children:[(0,p.jsx)(`option`,{value:`full`,children:`Full`}),(0,p.jsx)(`option`,{value:`reduced`,children:`Reduced (only answers to hover and press)`}),(0,p.jsx)(`option`,{value:`off`,children:`Off`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`If the device is set to reduce motion, the screen stays still whatever this says.`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:t.clock.hour12,onChange:e=>r({clock:{...t.clock,hour12:e.target.checked}})}),(0,p.jsx)(`span`,{children:`12-hour clock`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:t.clock.seconds,onChange:e=>r({clock:{...t.clock,seconds:e.target.checked}})}),(0,p.jsx)(`span`,{children:`Show seconds`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Date language (empty: the device's own)`}),(0,p.jsx)(`input`,{type:`text`,value:t.clock.locale,maxLength:35,placeholder:`en-GB`,onChange:e=>r({clock:{...t.clock,locale:e.target.value}})})]}),(0,p.jsx)(`h3`,{children:`Quick-launch buttons`}),d.length===0&&(0,p.jsx)(`small`,{className:`auth-note`,children:`No buttons yet.`}),d.map((e,t)=>{let n=Hu(e);return(0,p.jsxs)(`div`,{className:`settings-field`,role:`group`,"aria-label":`Button ${t+1}`,children:[(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:[(0,p.jsx)(`input`,{type:`text`,"aria-label":`Icon`,style:{width:56},value:e.icon,onChange:e=>f(t,{icon:e.target.value})}),(0,p.jsx)(`input`,{type:`text`,"aria-label":`Label`,maxLength:24,style:{flex:1,minWidth:100},value:e.label,onChange:e=>f(t,{label:e.target.value})}),(0,p.jsx)(`select`,{"aria-label":`What it does`,value:e.action.type,onChange:e=>{let n=e.target.value;f(t,{action:{type:n,value:zx(n)}})},children:Object.keys(Rx).map(e=>(0,p.jsx)(`option`,{value:e,children:Rx[e]},e))})]}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:[e.action.type===`panel`||e.action.type===`music`?(0,p.jsx)(`select`,{"aria-label":`Which`,style:{flex:1},value:e.action.value,onChange:n=>f(t,{action:{...e.action,value:n.target.value}}),children:(e.action.type===`panel`?zu:Bu).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}):(0,p.jsx)(`input`,{type:`text`,"aria-label":e.action.type===`url`?`Address`:`Question`,style:{flex:1},value:e.action.value,placeholder:e.action.type===`url`?`https://…`:`What should it ask?`,onChange:n=>f(t,{action:{...e.action,value:n.target.value}})}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Move up`,disabled:t===0,onClick:()=>m(t,-1),children:`↑`}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Move down`,disabled:t===d.length-1,onClick:()=>m(t,1),children:`↓`}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Remove button`,onClick:()=>r({launcher:d.filter((e,n)=>n!==t)}),children:`Remove`})]}),n&&(0,p.jsx)(`small`,{role:`alert`,className:`auth-error`,children:n})]},e.id??t)}),(0,p.jsxs)(`button`,{type:`button`,disabled:d.length>=12,onClick:()=>r({launcher:[...d,{label:`New`,icon:`+`,action:{type:`panel`,value:`chat`}}]}),children:[`Add a button (`,d.length,`/`,12,`)`]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The assistant can never change the music folder, these buttons or the animations, even with your PIN.`})]})}var Vx=[`#3fd8ff`,`#2b7bff`,`#a066ff`,`#ff6fae`,`#ff5a5a`,`#ff9b3d`,`#ffd23d`,`#3dff8c`,`#e8f4ff`],Hx=[{id:`sphere`,name:`Sphere`,note:`A cloud of particles`},{id:`orb`,name:`Orb`,note:`A glowing plasma ball`},{id:`ring`,name:`Ring`,note:`Radial bars, like a voice meter`}],Ux=(e,t)=>e.style===t.style&&e.accent.toLowerCase()===t.accent&&Math.abs(e.intensity-t.intensity)<.005,Wx=[{id:`manual`,label:`Ask me (manual)`,note:`Friend asks before anything that changes your PC or leaves the safe zone. The most careful.`},{id:`edits`,label:`Auto-approve file work (edits)`,note:`Reading and writing files, and the sandboxed code runner, go ahead without asking. Commands still ask.`},{id:`auto`,label:`Auto-approve everything safe (auto)`,note:`Commands, files and tools go ahead without asking. The most convenient, and the most trust: Friend acts on its own.`}],Gx=[{id:`claude-code`,label:`Claude subscription (Claude Code)`,note:`Uses the Claude Code app you are signed in to. No API key.`},{id:`claude`,label:`Claude API key`,note:`Pay per use with an Anthropic API key.`},{id:`ollama`,label:`Local model (Ollama)`,note:`Runs on this PC. Free and private, but slower.`},{id:`openai`,label:`OpenAI-compatible server (OmniRoute, LM Studio…)`,note:`Any server that speaks the OpenAI chat API. OmniRoute is one address that routes to many models, many of them free.`}],Kx={"voice.enabled":`Speech on/off`};function qx({label:e,children:t,hint:n}){return(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:e}),t,n&&(0,p.jsx)(`small`,{className:`auth-note`,children:n})]})}function Jx({api:e=ht,onClose:t,initialTab:n=`model`,preview:r=gt,variant:i=`classic`}){let[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(null),[u,f]=(0,l.useState)(n),[m,h]=(0,l.useState)(``),[g,_]=(0,l.useState)(``),[v,y]=(0,l.useState)(!1),[x,S]=(0,l.useState)(``),[C,w]=(0,l.useState)(!1),[E,D]=(0,l.useState)(null),[O,k]=(0,l.useState)(null),[A,j]=(0,l.useState)(null),[ee,M]=(0,l.useState)(null),N=(0,l.useRef)(!0);(0,l.useEffect)(()=>(N.current=!0,e.get().then(e=>{N.current&&(o(e),c(structuredClone(e)))}).catch(e=>N.current&&D(e.message)),()=>{N.current=!1}),[e]);let P=(e,n=!1,r={})=>i===`holo`?(0,p.jsx)(b,{label:`Settings`,title:r.title??Se.find(e=>e.id===u)?.label??`Settings`,page:r.page,help:r.help,onApply:r.onApply,onUndo:r.onUndo,dirty:r.dirty,busy:C,onDone:t,children:e}):(0,p.jsxs)(`div`,{className:`approval settings glass${n?` settings-wide`:``}`,role:`dialog`,"aria-label":`Settings`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Settings`})}),e]});if(!s||!a)return P((0,p.jsxs)(p.Fragment,{children:[E?(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}):(0,p.jsx)(`p`,{className:`auth-note`,children:`Loading…`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Close`})})]}));let F=_t(a,s,m,g),te=Object.keys(F).length>0,I=(e,t,n)=>c({...s,[e]:{...s[e],[t]:n}}),ne=s.look,L=(e,t)=>{t&&(j(e),M(e===`main`?null:`The first time, the voice downloads (about 64 MB). Please wait…`),r(t).then(()=>N.current&&M(`Playing…`)).catch(e=>N.current&&M(e.message)).finally(()=>N.current&&j(null)))},re=async t=>{D(null),w(!0);try{let n=await e.save(F,t);if(!N.current)return;o(n.settings),c(structuredClone(n.settings)),h(``),_(``),y(!1);let r=F.voice&&F.voice.ttsVoice!==void 0,i=F.voice&&F.voice.sttModel!==void 0;k(n.restart.length?`Saved. Restart Friend for: ${n.restart.map(e=>Kx[e]??e).join(`, `)}.`:i?`Saved. The listening model is being downloaded in the background (the first time only); Friend keeps listening with the old one and tells you when the new one is ready.`:r?`Saved. The new voice is loading; you will get a message when it is ready (the first time it downloads about 60 MB).`:pt(F)?`Saved. It is in use now.`:`Saved. Every open screen has changed.`)}catch(e){N.current&&D(e.message)}finally{N.current&&(w(!1),S(``))}};if(v)return P((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Enter your PIN to save these changes.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:()=>!C&&void re(x)}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:C||x.length<6,onClick:()=>void re(x),children:`Save`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{y(!1),S(``),D(null)},children:`Back`})]})]}));let ie=Gx.find(e=>e.id===s.provider),ae=e=>{let t=Se.findIndex(e=>e.id===u),n=e.key===`ArrowDown`||e.key===`ArrowRight`?(t+1)%Se.length:e.key===`ArrowUp`||e.key===`ArrowLeft`?(t+Se.length-1)%Se.length:e.key===`Home`?0:e.key===`End`?Se.length-1:-1;n<0||(e.preventDefault(),f(Se[n].id),document.getElementById(`settings-tab-${Se[n].id}`)?.focus())},oe=(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Where Friend thinks`}),(0,p.jsx)(qx,{label:`Model provider`,hint:ie.note,children:(0,p.jsx)(`select`,{value:s.provider,onChange:e=>c({...s,provider:e.target.value}),children:Gx.map(e=>(0,p.jsx)(`option`,{value:e.id,children:e.label},e.id))})}),s.provider===`claude-code`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(qx,{label:`Claude model`,hint:`sonnet, haiku, opus, or a full model name`,children:[(0,p.jsx)(`input`,{list:`cc-models`,value:s.claudeCode.model,onChange:e=>I(`claudeCode`,`model`,e.target.value)}),(0,p.jsxs)(`datalist`,{id:`cc-models`,children:[(0,p.jsx)(`option`,{value:`sonnet`}),(0,p.jsx)(`option`,{value:`haiku`}),(0,p.jsx)(`option`,{value:`opus`})]})]}),(0,p.jsx)(qx,{label:`If Claude is unavailable`,hint:`For example when the plan's usage limit is reached.`,children:(0,p.jsxs)(`select`,{value:s.claudeCode.fallback,onChange:e=>I(`claudeCode`,`fallback`,e.target.value),children:[(0,p.jsx)(`option`,{value:`ollama`,children:`Answer with the local model (Ollama)`}),(0,p.jsx)(`option`,{value:`none`,children:`Show an error`})]})}),(0,p.jsx)(qx,{label:`Claude Code command`,hint:`Leave as it is unless the program is somewhere else.`,children:(0,p.jsx)(`input`,{value:s.claudeCode.command,onChange:e=>I(`claudeCode`,`command`,e.target.value)})})]}),s.provider===`claude`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(qx,{label:`Claude model`,children:(0,p.jsx)(`input`,{value:s.model,onChange:e=>c({...s,model:e.target.value})})}),(0,p.jsx)(qx,{label:`API key`,hint:a.apiKeySet?`A key is saved. Type a new one only to replace it.`:`No key saved yet.`,children:(0,p.jsx)(`input`,{type:`password`,autoComplete:`off`,placeholder:a.apiKeySet?`saved`:`sk-ant-…`,value:m,onChange:e=>h(e.target.value)})})]}),s.provider===`openai`&&s.openai&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(qx,{label:`Server address`,hint:`Ends in /v1. OmniRoute: http://localhost:20128/v1 (install it with npm install -g omniroute, then run omniroute).`,children:(0,p.jsx)(`input`,{value:s.openai.url,onChange:e=>c({...s,openai:{...s.openai,url:e.target.value}})})}),(0,p.jsx)(qx,{label:`Model`,hint:`The name that server knows. OmniRoute answers to auto.`,children:(0,p.jsx)(`input`,{value:s.openai.model,onChange:e=>c({...s,openai:{...s.openai,model:e.target.value}})})}),(0,p.jsx)(qx,{label:`API key`,hint:a.openai?.apiKeySet?`A key is saved. Type a new one only to replace it.`:`Leave empty if the server asks for none.`,children:(0,p.jsx)(`input`,{type:`password`,autoComplete:`off`,placeholder:a.openai?.apiKeySet?`saved`:``,value:g,onChange:e=>_(e.target.value)})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.openai.vision,onChange:e=>c({...s,openai:{...s.openai,vision:e.target.checked}})}),` This model can look at pictures`]})]}),(s.provider===`ollama`||s.provider===`claude-code`&&s.claudeCode.fallback===`ollama`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Local model (Ollama)`}),(0,p.jsx)(qx,{label:`Address`,children:(0,p.jsx)(`input`,{value:s.ollama.url,onChange:e=>I(`ollama`,`url`,e.target.value)})}),(0,p.jsx)(qx,{label:`Model`,children:(0,p.jsx)(`input`,{value:s.ollama.model,onChange:e=>I(`ollama`,`model`,e.target.value)})}),(0,p.jsx)(qx,{label:`Memory window (tokens)`,children:(0,p.jsx)(`input`,{type:`number`,min:1024,max:131072,step:1024,value:s.ollama.contextTokens,onChange:e=>I(`ollama`,`contextTokens`,Number(e.target.value))})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.ollama.vision,onChange:e=>I(`ollama`,`vision`,e.target.checked)}),` This model can look at pictures`]})]})]}),se=(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Speaking and listening`}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.voice.speakTyped,onChange:e=>I(`voice`,`speakTyped`,e.target.checked)}),` Also speak the replies to typed messages`]}),(0,p.jsx)(qx,{label:`Spoken language`,hint:`Leave empty to detect it by itself: best when you mix English, Hindi and Marathi. Or force one: en, hi, mr.`,children:(0,p.jsx)(`input`,{value:s.voice.language??``,maxLength:10,onChange:e=>I(`voice`,`language`,e.target.value.trim()===``?null:e.target.value.trim())})}),(0,p.jsx)(qx,{label:`Speaking voice`,hint:`Female or male. The first time a voice is used it downloads about 60 MB, then it works without internet.`,children:(0,p.jsxs)(`select`,{value:s.voice.ttsVoice,onChange:e=>I(`voice`,`ttsVoice`,e.target.value),children:[(0,p.jsx)(`optgroup`,{label:`Female`,children:uu.filter(e=>e.gender===`female`).map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.accent,e.note?` · ${e.note}`:``]},e.id))}),(0,p.jsx)(`optgroup`,{label:`Male`,children:uu.filter(e=>e.gender===`male`).map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.accent,e.note?` · ${e.note}`:``]},e.id))}),(0,p.jsx)(`optgroup`,{label:`Original`,children:(0,p.jsxs)(`option`,{value:pu.id,children:[pu.name,` · `,pu.accent,` · `,pu.note]})}),!mu(s.voice.ttsVoice)&&(0,p.jsx)(`optgroup`,{label:`Other`,children:(0,p.jsx)(`option`,{value:s.voice.ttsVoice,children:s.voice.ttsVoice})})]})}),(0,p.jsx)(qx,{label:`Hindi voice`,hint:`Reads Hindi (Devanagari) text; English words in the same sentence still use the voice above. The first time it downloads about 64 MB.`,children:(0,p.jsxs)(`select`,{value:s.voice.hindiVoice??``,onChange:e=>I(`voice`,`hindiVoice`,e.target.value),children:[(0,p.jsx)(`option`,{value:``,children:`Same as the voice above`}),du.map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.gender,e.note?` · ${e.note}`:``]},e.id))]})}),(0,p.jsx)(qx,{label:`Marathi voice`,hint:`Reads Marathi text. Friend tells Marathi from Hindi by the words used.`,children:(0,p.jsxs)(`select`,{value:s.voice.marathiVoice??``,onChange:e=>I(`voice`,`marathiVoice`,e.target.value),children:[(0,p.jsx)(`option`,{value:``,children:`Same as the voice above`}),fu.map(e=>(0,p.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),(0,p.jsxs)(`div`,{className:`voice-hear`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null,onClick:()=>L(`main`,s.voice.ttsVoice),children:A===`main`?`Loading the voice…`:`Hear it`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null||!s.voice.hindiVoice,onClick:()=>L(`hindi`,s.voice.hindiVoice??``),children:A===`hindi`?`Loading the voice…`:`Hear the Hindi voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null||!s.voice.marathiVoice,onClick:()=>L(`marathi`,s.voice.marathiVoice??``),children:A===`marathi`?`Loading the voice…`:`Hear the Marathi voice`}),ee&&(0,p.jsx)(`small`,{className:`auth-note`,role:`status`,children:ee})]}),(0,p.jsx)(qx,{label:`Listening model`,hint:`Bigger hears more accurately, from further away and in Hindi and Marathi, but is slower. It downloads once, in the background, and Friend keeps listening meanwhile. No restart.`,children:(0,p.jsxs)(`select`,{value:s.voice.sttModel,onChange:e=>I(`voice`,`sttModel`,e.target.value),children:[!hu.some(e=>e.id===s.voice.sttModel)&&(0,p.jsx)(`option`,{value:s.voice.sttModel,children:s.voice.sttModel}),hu.map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,gu(e.mb).replace(`about `,``),` · `,e.note]},e.id))]})}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Who is speaking`}),(0,p.jsx)(qx,{label:`"It is me" match level: ${s.voice.accept.toFixed(2)}`,hint:`Higher is stricter. Only matters after you enrolled your voice.`,children:(0,p.jsx)(`input`,{type:`range`,min:.3,max:.95,step:.01,value:s.voice.accept,onChange:e=>I(`voice`,`accept`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`"Ask for my PIN" level: ${s.voice.challenge.toFixed(2)}`,hint:`Voices between this and the level above must be confirmed with the PIN.`,children:(0,p.jsx)(`input`,{type:`range`,min:.2,max:.9,step:.01,value:s.voice.challenge,onChange:e=>I(`voice`,`challenge`,Number(e.target.value))})})]}),ce=(0,p.jsxs)(`div`,{className:`look-tab`,children:[(0,p.jsxs)(`div`,{className:`look-side`,children:[(0,p.jsx)(Mx,{look:ne}),(0,p.jsx)(`p`,{className:`auth-note`,children:`This is a live preview. Nothing changes on the screen until you save.`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>c({...s,look:{...dt}}),children:`Back to the default look`})]}),(0,p.jsxs)(`div`,{className:`look-controls`,children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Themes`}),(0,p.jsx)(`div`,{className:`theme-grid`,role:`group`,"aria-label":`Themes`,children:_u.map(e=>(0,p.jsxs)(`button`,{type:`button`,className:`theme-card${Ux(ne,e)?` on`:``}`,"aria-pressed":Ux(ne,e),style:{"--swatch":e.accent},onClick:()=>c({...s,look:{...ne,style:e.style,accent:e.accent,intensity:e.intensity}}),children:[(0,p.jsx)(`i`,{"aria-hidden":`true`}),(0,p.jsx)(`b`,{children:e.name}),(0,p.jsx)(`small`,{children:e.style})]},e.id))}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Shape`}),(0,p.jsx)(`div`,{className:`style-row`,role:`radiogroup`,"aria-label":`Style`,children:Hx.map(e=>(0,p.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":ne.style===e.id,className:`style-choice${ne.style===e.id?` on`:``}`,onClick:()=>I(`look`,`style`,e.id),children:[(0,p.jsx)(`b`,{children:e.name}),(0,p.jsx)(`small`,{children:e.note})]},e.id))}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Colour and light`}),(0,p.jsxs)(`div`,{className:`swatch-row`,role:`group`,"aria-label":`Colour`,children:[Vx.map(e=>(0,p.jsx)(`button`,{type:`button`,"aria-label":`Colour ${e}`,"aria-pressed":ne.accent.toLowerCase()===e,className:`swatch${ne.accent.toLowerCase()===e?` on`:``}`,style:{background:e},onClick:()=>I(`look`,`accent`,e)},e)),(0,p.jsxs)(`label`,{className:`swatch-custom`,children:[(0,p.jsx)(`span`,{children:`Other`}),(0,p.jsx)(`input`,{type:`color`,"aria-label":`Pick another colour`,value:ne.accent,onChange:e=>I(`look`,`accent`,e.target.value.toLowerCase())})]})]}),(0,p.jsx)(qx,{label:`Brightness: ${Math.round(ne.intensity*100)}%`,children:(0,p.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:ne.intensity,onChange:e=>I(`look`,`intensity`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`Size: ${Math.round(ne.size*100)}%`,hint:`How big it is in the middle of the screen.`,children:(0,p.jsx)(`input`,{type:`range`,min:.5,max:1.5,step:.05,value:ne.size,onChange:e=>I(`look`,`size`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`Reaction to my voice: ${Math.round(ne.reactivity*100)}%`,hint:`Low is calm, high moves a lot when anyone speaks.`,children:(0,p.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:ne.reactivity,onChange:e=>I(`look`,`reactivity`,Number(e.target.value))})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.ambient,onChange:e=>I(`look`,`ambient`,e.target.checked)}),` Soft glow behind everything`]}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Words on the screen`}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.captions,onChange:e=>I(`look`,`captions`,e.target.checked)}),` Show the live words while Friend speaks`]}),(0,p.jsx)(qx,{label:`Caption size`,children:(0,p.jsxs)(`select`,{value:ne.captionSize,disabled:!ne.captions,onChange:e=>I(`look`,`captionSize`,e.target.value),children:[(0,p.jsx)(`option`,{value:`small`,children:`Small`}),(0,p.jsx)(`option`,{value:`medium`,children:`Medium`}),(0,p.jsx)(`option`,{value:`large`,children:`Large`})]})}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`What is on the screen`}),(0,p.jsx)(qx,{label:`Your name`,hint:`Shown on the badge in the corner, next to the shield, while you are signed in. Empty shows Owner.`,children:(0,p.jsx)(`input`,{value:s.ownerName??``,maxLength:40,placeholder:`Owner`,onChange:e=>c({...s,ownerName:e.target.value})})}),(0,p.jsx)(qx,{label:`View`,hint:`Minimal: only the voice presence. Companion: plus a status line and a clock. Workspace: also the chat and the schedule. Drag any panel to move it.`,children:(0,p.jsxs)(`select`,{value:s.view,onChange:e=>c({...s,view:e.target.value}),children:[(0,p.jsx)(`option`,{value:`minimal`,children:`Minimal`}),(0,p.jsx)(`option`,{value:`companion`,children:`Companion`}),(0,p.jsx)(`option`,{value:`workspace`,children:`Workspace`})]})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.aiMayChange,onChange:e=>I(`look`,`aiMayChange`,e.target.checked)}),` Let the AI change the shape, colour and brightness to suit a topic`]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Off keeps exactly the look you chose. You can still ask it to change the look yourself.`})]})]}),le=s.approvals??`manual`,ue=(0,p.jsxs)(`div`,{className:`settings-section`,role:`radiogroup`,"aria-label":`How much Friend asks before acting`,children:[(0,p.jsx)(`h3`,{children:`How much should Friend ask?`}),Wx.map(e=>(0,p.jsxs)(`label`,{className:`settings-check`,style:{alignItems:`flex-start`},children:[(0,p.jsx)(`input`,{type:`radio`,name:`approvals`,value:e.id,checked:le===e.id,onChange:()=>c({...s,approvals:e.id})}),(0,p.jsxs)(`span`,{children:[(0,p.jsx)(`b`,{children:e.label}),(0,p.jsx)(`br`,{}),(0,p.jsx)(`small`,{className:`auth-note`,children:e.note})]})]},e.id)),(0,p.jsx)(`small`,{className:`auth-note`,children:`Whatever you pick, these still ask: risky commands (they need your PIN), the camera, adding connectors or plugins, and anything in Friend's own data folder. Changing this needs your PIN.`})]}),de=(0,p.jsxs)(p.Fragment,{children:[u===`model`&&oe,u===`voice`&&se,u===`look`&&ce,u===`approvals`&&ue,u===`trading`&&(0,p.jsx)(Ix,{level:s.trading?.level??`read`}),u===`widgets`&&s.music&&s.hud&&(0,p.jsx)(Bx,{music:s.music,hud:s.hud,onMusic:e=>c({...s,music:{...s.music,...e}}),onHud:e=>c({...s,hud:{...s.hud,...e}})}),u===`security`&&(0,p.jsx)(Px,{})]}),R=()=>{k(null),D(null),pt(F)?y(!0):re()},z=()=>{c(structuredClone(a)),h(``),_(``)},B=(0,p.jsxs)(p.Fragment,{children:[O&&!te&&(0,p.jsx)(`p`,{className:`auth-note`,children:O}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E})]});if(i===`holo`){let e=Se.findIndex(e=>e.id===u),t=e=>f(Se[(e+Se.length)%Se.length].id);return P((0,p.jsxs)(p.Fragment,{children:[de,B]}),!0,{title:Se[e].label,page:{index:e,total:Se.length,onPrev:()=>t(e-1),onNext:()=>t(e+1)},dirty:te,onApply:R,onUndo:z,help:(0,p.jsxs)(p.Fragment,{children:[`Fill in the settings and press `,(0,p.jsx)(`b`,{children:`Apply`}),` to save them. Network, folders and safety rules are not here on purpose: change those in the terminal with friend config set.`]})})}return P((0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`settings-layout`,children:[(0,p.jsx)(`div`,{className:`settings-tabs`,role:`tablist`,"aria-label":`Settings sections`,"aria-orientation":`vertical`,onKeyDown:ae,children:Se.map(e=>(0,p.jsxs)(`button`,{id:`settings-tab-${e.id}`,type:`button`,role:`tab`,"aria-selected":u===e.id,"aria-controls":`settings-panel-${e.id}`,tabIndex:u===e.id?0:-1,className:`settings-tab${u===e.id?` on`:``}`,onClick:()=>f(e.id),children:[(0,p.jsx)(`b`,{children:e.label}),(0,p.jsx)(`small`,{children:e.note})]},e.id))}),(0,p.jsx)(`div`,{className:`settings-body`,role:`tabpanel`,id:`settings-panel-${u}`,"aria-labelledby":`settings-tab-${u}`,children:de})]}),O&&!te&&(0,p.jsx)(`p`,{className:`auth-note`,children:O}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!te||C,onClick:R,children:te&&!pt(F)?`Save`:`Save…`}),te&&(0,p.jsx)(`button`,{type:`button`,style:d,onClick:z,children:`Undo changes`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Close`})]}),(0,p.jsx)(`p`,{className:`auth-note`,children:`Network, folders and safety rules are not here on purpose. Change those in the terminal: friend config set.`})]}),!0)}var Yx=e=>e instanceof HTMLElement&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable);function Xx({onSend:e,requestOpen:t,slash:n,onOpenChange:r}){let[i,a]=(0,l.useState)(!1),o=(0,l.useRef)(r);o.current=r,(0,l.useEffect)(()=>o.current?.(i),[i]);let[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)(0),f=(0,l.useRef)(null);if((0,l.useEffect)(()=>{t>0&&a(!0)},[t]),(0,l.useEffect)(()=>{let e=e=>{i||Yx(e.target)||e.ctrlKey||e.metaKey||e.altKey||e.key.length===1&&(e.preventDefault(),c(e.key),d(0),a(!0))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),(0,l.useEffect)(()=>{i&&f.current?.focus()},[i]),!i)return null;let m=n?F(n.commands,s):[],h=m[Math.min(u,Math.max(m.length-1,0))],g=()=>{c(``),d(0),a(!1)},_=()=>{let t=s.trim();if(n&&P(t)){let e=/^\/\S*\s/.test(t);n.run(!e&&h?`/${h.name}`:t)}else t&&e(I(t));g()};return(0,p.jsxs)(`form`,{className:`command-bar`,onSubmit:e=>{e.preventDefault(),_()},children:[m.length>0&&(0,p.jsx)(`ul`,{className:`slash-list`,role:`listbox`,"aria-label":`Commands`,children:m.map((e,t)=>(0,p.jsxs)(`li`,{role:`option`,"aria-selected":e===h,className:e===h?`on`:void 0,onMouseDown:n=>{n.preventDefault(),c(`/${e.name} `),f.current?.focus(),d(t)},children:[(0,p.jsxs)(`b`,{children:[`/`,e.name]}),e.usage&&(0,p.jsx)(`i`,{children:e.usage}),(0,p.jsx)(`span`,{children:e.description})]},e.name))}),(0,p.jsx)(`input`,{ref:f,"aria-label":`Message`,value:s,placeholder:`Talk to me… or type / for commands`,autoComplete:`off`,onChange:e=>{c(e.target.value),d(0)},onKeyDown:e=>{e.key===`Escape`?(e.stopPropagation(),g()):m.length>0&&(e.key===`ArrowDown`||e.key===`ArrowUp`)?(e.preventDefault(),d(t=>(t+(e.key===`ArrowDown`?1:m.length-1))%m.length)):e.key===`Tab`&&h&&(e.preventDefault(),c(`/${h.name} `))}}),(0,p.jsx)(`button`,{type:`submit`,"aria-label":`Send`,children:`↵`})]})}var Zx={width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.8,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},Qx=(e,t)=>e===`listening`?t?`Listening… tap to send`:`Listening… let go to send`:e===`transcribing`?`Understanding…`:e===`speaking`?`Tap to talk over me`:`Hold to talk, or tap once`;function $x({voice:e,mode:t,onType:n,onMenu:r}){let i=(0,l.useRef)(null),a=(0,l.useRef)(!1),[o,s]=(0,l.useState)(!1),c=e=>{a.current=e,s(e)},u=(0,l.useRef)(t);u.current=t,(0,l.useEffect)(()=>{t!==`listening`&&!i.current&&c(!1)},[t]);let d=t=>{if((t.pointerType!==`mouse`||t.button===0)&&!i.current){if(a.current&&u.current===`listening`){c(!1),e.pressEnd();return}c(!1),i.current={at:Date.now(),id:t.pointerId};try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}e.pressStart()}},f=t=>{let n=i.current;n&&n.id===t.pointerId&&(i.current=null,Date.now()-n.at>=450?e.pressEnd():c(!0))},m=t=>{let n=i.current;n&&n.id===t.pointerId&&(i.current=null,c(!1),e.blur?.())},h=t===`listening`;return(0,p.jsxs)(`div`,{className:`touch-controls`,"data-testid":`touch-controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`touch-side`,"aria-label":`Open the menu`,onClick:r,children:(0,p.jsx)(`svg`,{...Zx,children:(0,p.jsx)(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}),(0,p.jsxs)(`div`,{className:`touch-talk`,children:[(0,p.jsx)(`button`,{type:`button`,className:`touch-mic${h?` on`:``}`,"aria-label":`Talk to Friend`,"aria-pressed":h,onPointerDown:d,onPointerUp:f,onPointerCancel:m,onContextMenu:e=>e.preventDefault(),children:(0,p.jsxs)(`svg`,{...Zx,width:30,height:30,children:[(0,p.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`11`,rx:`3`}),(0,p.jsx)(`path`,{d:`M5 11a7 7 0 0 0 14 0M12 18v3`})]})}),(0,p.jsx)(`span`,{className:`touch-hint`,"aria-live":`polite`,children:Qx(t,o)})]}),(0,p.jsx)(`button`,{type:`button`,className:`touch-side`,"aria-label":`Type a message`,onClick:n,children:(0,p.jsxs)(`svg`,{...Zx,children:[(0,p.jsx)(`rect`,{x:`3`,y:`6`,width:`18`,height:`12`,rx:`2`}),(0,p.jsx)(`path`,{d:`M7 10h.01M11 10h.01M15 10h.01M7 14h10`})]})})]})}function eS(e,t){this.v=e,this.k=t}function tS(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function nS(e){if(Array.isArray(e))return e}function rS(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function iS(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
4387
|
+
`,wx=class{host;core;renderer;scene=new lh;camera=new N_(-1,1,1,-1,0,1);material;geometry=new qg(2,2);raf=0;last=0;ro;disposed=!1;constructor(e,t,n){this.host=e,this.core=new af({reducedMotion:n}),this.renderer=new hx({alpha:!0,antialias:!1}),this.renderer.setClearColor(0,0),this.renderer.domElement.style.cssText=`width:100%;height:100%;display:block`,e.appendChild(this.renderer.domElement),this.material=new n_({vertexShader:Sx,fragmentShader:Cx,transparent:!0,depthWrite:!1,blending:2,uniforms:{uPhase:{value:0},uAmp:{value:0},uBright:{value:.85},uNoise:{value:.05},uTighten:{value:0},uAspect:{value:1},uColor:{value:new sh(t)}}}),this.scene.add(new Dg(this.geometry,this.material)),this.ro=new ResizeObserver(()=>this.resize()),this.ro.observe(e),this.resize(),this.raf=requestAnimationFrame(this.frame)}resize(){let e=Math.max(1,this.host.clientWidth),t=Math.max(1,this.host.clientHeight);this.renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),this.renderer.setSize(e,t,!1),this.material.uniforms.uAspect.value=e/t}frame=e=>{if(this.disposed)return;if(this.raf=requestAnimationFrame(this.frame),document.hidden){this.last=e;return}let t=this.last?Math.min((e-this.last)/1e3,.1):.016;this.last=e,this.core.tick(t);let n=this.core.uniforms(),r=this.material.uniforms;r.uPhase.value=n.phase,r.uAmp.value=n.amplitude,r.uBright.value=n.brightness,r.uNoise.value=n.noise,r.uTighten.value=n.tighten,this.renderer.render(this.scene,this.camera)};setState(e){this.core.setState(e)}setAmplitude(e){this.core.setAmplitude(e)}setMode(e){this.resize()}setAccent(e){this.material.uniforms.uColor.value.set(e)}setIntensity(e){this.core.setIntensity(e)}dispose(){this.disposed=!0,cancelAnimationFrame(this.raf),this.ro.disconnect(),this.geometry.dispose(),this.material.dispose(),this.renderer.dispose(),this.renderer.domElement.remove()}},Tx=e=>Number.isFinite(e)?e:0;function Ex(e,t,n,r){let i=Tx(t),a=Math.min(1,Math.max(0,Tx(n))),o=Math.min(1,Math.max(0,Tx(r)));return Array.from({length:Math.max(0,Math.floor(e))},(e,t)=>{let n=.12+.18*(.5+.5*Math.sin(t*.31+i*2.2))+o*(.5+.5*Math.sin(t*.9+i*4)),r=a*(.35+.65*(.5+.5*Math.sin(t*2.1+i*9)));return Math.min(1,Math.max(0,n+r))})}var Dx=96,Ox=class{host;core;canvas=document.createElement(`canvas`);ctx;raf=0;last=0;ro=null;disposed=!1;accent;constructor(e,t,n){this.host=e,this.core=new af({reducedMotion:n}),this.accent=t,this.canvas.style.cssText=`width:100%;height:100%;display:block`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas),this.ctx&&(typeof ResizeObserver<`u`&&(this.ro=new ResizeObserver(()=>this.resize()),this.ro.observe(e)),this.resize(),this.raf=requestAnimationFrame(this.frame))}resize(){let e=Math.min(window.devicePixelRatio||1,2);this.canvas.width=Math.max(1,this.host.clientWidth)*e,this.canvas.height=Math.max(1,this.host.clientHeight)*e}frame=e=>{if(this.disposed||!this.ctx)return;if(this.raf=requestAnimationFrame(this.frame),document.hidden){this.last=e;return}let t=this.last?Math.min((e-this.last)/1e3,.1):.016;this.last=e,this.core.tick(t);let n=this.core.uniforms(),r=this.ctx,{width:i,height:a}=this.canvas,o=Math.min(i,a);r.clearRect(0,0,i,a);let s=o*.27*(1-n.tighten),c=o*.2,l=Ex(Dx,n.phase,n.amplitude,n.noise);r.save(),r.translate(i/2,a/2),r.rotate(n.angle),r.lineCap=`round`,r.strokeStyle=this.accent,r.shadowColor=this.accent,r.shadowBlur=o*.02*n.brightness,r.lineWidth=Math.max(2,o*.008);let u=this.core.state===`thinking`;for(let e=0;e<Dx;e++){let t=e/Dx*Math.PI*2,i=u?.25+.75*Math.abs(Math.sin((t-n.phase*2)/2)):1;r.globalAlpha=Math.min(1,(.35+l[e]*.65)*n.brightness*i);let a=o*.012+l[e]*c;r.beginPath(),r.moveTo(Math.cos(t)*s,Math.sin(t)*s),r.lineTo(Math.cos(t)*(s+a),Math.sin(t)*(s+a)),r.stroke()}r.globalAlpha=.28*n.brightness,r.shadowBlur=0,r.lineWidth=Math.max(1,o*.003),r.beginPath(),r.arc(0,0,s*.9,0,Math.PI*2),r.stroke(),r.restore()};setState(e){this.core.setState(e)}setAmplitude(e){this.core.setAmplitude(e)}setMode(e){this.resize()}setAccent(e){this.accent=e}setIntensity(e){this.core.setIntensity(e)}dispose(){this.disposed=!0,cancelAnimationFrame(this.raf),this.ro?.disconnect(),this.canvas.remove()}};function kx(e,t,n){let r=ef({...n.env??tf(),reducedMotion:n.reducedMotion}),i=()=>new xx(t,r||8e3,n.accent,n.reducedMotion);if(e===`ring`)return new Ox(t,n.accent,n.reducedMotion);if(r===0)return i();try{return e===`orb`?new wx(t,n.accent,n.reducedMotion):new bx(t,r,n.accent,n.reducedMotion)}catch{return i()}}function Ax({state:e,amplitude:t,pulse:n=0,mode:r,accent:i=`#3fd8ff`,style:a=`sphere`,intensity:o=.6,scale:s=1}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)({state:e,amplitude:t,mode:r,accent:i,intensity:o});return d.current={state:e,amplitude:t,mode:r,accent:i,intensity:o},(0,l.useEffect)(()=>{let e=d.current,t=kx(a,c.current,{accent:e.accent,reducedMotion:tf().reducedMotion});return t.setState(e.state),t.setAmplitude(e.amplitude),t.setIntensity(e.intensity),t.setMode(e.mode),u.current=t,()=>{t.dispose(),u.current=null}},[a]),(0,l.useEffect)(()=>u.current?.setState(e),[e]),(0,l.useEffect)(()=>u.current?.setAmplitude(t),[t,n]),(0,l.useEffect)(()=>u.current?.setMode(r),[r]),(0,l.useEffect)(()=>u.current?.setAccent(i),[i]),(0,l.useEffect)(()=>u.current?.setIntensity(o),[o]),(0,p.jsx)(`div`,{ref:c,"data-presence":!0,"data-mode":r,"data-style":a,"data-state":e,"data-amplitude":t.toFixed(2),className:`presence presence-${r}`,style:r===`full`&&s!==1?{transform:`scale(${s})`}:void 0,"aria-hidden":`true`})}var jx=e=>.25+Math.min(1,Math.max(0,e))/.7*.75;function Mx({look:e}){let[t,n]=(0,l.useState)(.4),[r,i]=(0,l.useState)(0);(0,l.useEffect)(()=>{let e=setInterval(()=>{n(.3+Math.random()*.5),i(e=>e+1)},600);return()=>clearInterval(e)},[]);let a=jx(e.reactivity);return(0,p.jsxs)(`div`,{className:`look-preview`,"data-testid":`look-preview`,role:`img`,"aria-label":`Preview of the voice presence`,children:[e.ambient&&(0,p.jsx)(`div`,{className:`look-preview-glow`,style:{opacity:.35+.65*e.intensity,"--accent":e.accent}}),(0,p.jsx)(`div`,{className:`look-preview-stage`,style:{"--accent":e.accent},children:(0,p.jsx)(Ax,{state:`speaking`,amplitude:Math.min(1,t*a),pulse:r,mode:`full`,accent:e.accent,style:e.style,intensity:e.intensity,scale:e.size})}),e.captions&&(0,p.jsx)(`p`,{className:`look-preview-caption captions-${e.captionSize}`,children:`This is how my words will look.`})]})}var Nx=async e=>{let t;try{t=await fetch(`/api/account/secret`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)})}catch{throw Error(`Could not reach Friend. Check the connection.`)}let n={};try{n=await t.json()}catch{}if(!t.ok){let e=typeof n.triesLeft==`number`&&n.triesLeft>0?` ${n.triesLeft} ${n.triesLeft===1?`try`:`tries`} left.`:``;throw Error((n.error??(t.status===401?`Please sign in again.`:`The request failed (${t.status}).`))+e)}return{signedOutOthers:!!n.signedOutOthers}};function Px({change:e=Nx}){let[t,n]=(0,l.useState)(``),[r,i]=(0,l.useState)(``),[a,o]=(0,l.useState)(``),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),[v,y]=(0,l.useState)(null),b=r!==``||a!==``,x=s!==``||u!==``,S=async()=>{if(_(null),y(null),!t)return _(`Type your current password.`);if(!b&&!x)return _(`Type a new password or a new PIN.`);if(b&&r.length<8)return _(`The new password must be at least 8 characters.`);if(b&&r!==a)return _(`The two new passwords are not the same.`);if(x&&!/^\d{6,}$/.test(s))return _(`The new PIN must be at least 6 digits.`);if(x&&s!==u)return _(`The two new PINs are not the same.`);h(!0);try{let a=await e({current:t,...b?{newPassword:r}:{},...x?{newPin:s}:{}});y([b&&`Password changed.`,x&&`PIN changed.`,b&&a.signedOutOthers&&`Other browsers and phones were signed out.`].filter(Boolean).join(` `)),n(``),i(``),o(``),c(``),f(``)}catch(e){_(e.message),n(``)}finally{h(!1)}};return(0,p.jsxs)(`form`,{className:`settings-section`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,p.jsx)(`h3`,{children:`Password and PIN`}),(0,p.jsx)(`p`,{className:`auth-note`,children:`Change either one or both. Your current password is always needed. Forgot it? On this PC run: friend password`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Current password`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`current-password`,value:t,disabled:m,onChange:e=>n(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New password`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`new-password`,value:r,disabled:m,onChange:e=>i(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New password again`}),(0,p.jsx)(`input`,{type:`password`,autoComplete:`new-password`,value:a,disabled:m,onChange:e=>o(e.target.value),style:d})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New PIN`}),(0,p.jsx)(`input`,{type:`password`,inputMode:`numeric`,autoComplete:`off`,value:s,disabled:m,onChange:e=>c(e.target.value.replace(/\D/g,``)),style:d})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The PIN is at least 6 digits. It is asked before risky actions.`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`New PIN again`}),(0,p.jsx)(`input`,{type:`password`,inputMode:`numeric`,autoComplete:`off`,value:u,disabled:m,onChange:e=>f(e.target.value.replace(/\D/g,``)),style:d})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),v&&(0,p.jsx)(`p`,{role:`status`,className:`auth-note`,children:v}),(0,p.jsx)(`button`,{type:`submit`,className:`primary`,style:d,disabled:m,children:m?`Saving…`:`Change`})]})}var Fx=[{id:`read`,label:`Read only`,note:`Friend can look at your portfolio, funds, positions and orders, and send you reports. It cannot place, change or cancel any order. This is the only level in this version.`,locked:!1},{id:`orders`,label:`Orders with my confirmation (later version)`,note:`Friend would prepare an order and wait for you to confirm it with your PIN.`,locked:!0},{id:`limits`,label:`Orders within limits (later version)`,note:`Friend would place small orders on its own, inside limits you set.`,locked:!0}];function Ix({level:e=`read`}){return(0,p.jsxs)(`div`,{className:`settings-section`,role:`radiogroup`,"aria-label":`What Friend may do with money`,children:[(0,p.jsx)(`h3`,{children:`What may Friend do with your trading account?`}),Fx.map(t=>(0,p.jsxs)(`label`,{className:`settings-check`,style:{alignItems:`flex-start`,opacity:t.locked?.55:1},children:[(0,p.jsx)(`input`,{type:`radio`,name:`trading`,value:t.id,checked:!t.locked&&e===t.id,disabled:t.locked,readOnly:!0,onChange:()=>{}}),(0,p.jsxs)(`span`,{children:[(0,p.jsx)(`b`,{children:t.label}),(0,p.jsx)(`br`,{}),(0,p.jsx)(`small`,{className:`auth-note`,children:t.note})]})]},t.id)),(0,p.jsx)(`small`,{className:`auth-note`,children:`The assistant can never change this, even with your PIN. Orders will only arrive in a later version, with their own safeguards.`})]})}var Lx=async()=>{let e=await fetch(`/api/music/host/check`,{cache:`no-store`});if(!e.ok)throw Error(e.status===401?`Please sign in again.`:`The request failed (${e.status}).`);return await e.json()},Rx={url:`Open an address`,prompt:`Ask the assistant`,panel:`Open a panel`,music:`Control the music`},zx=e=>e===`panel`?zu[0]:e===`music`?Bu[0]:``;function Bx({music:e,hud:t,onMusic:n,onHud:r,checkHost:i=Lx}){let[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(!1),u=()=>{c(!0),o(null),i().then(e=>o(e.found?`mpv ${e.version} found (${e.path}).`:e.install)).catch(e=>o(e.message)).finally(()=>c(!1))},d=t.launcher,f=(e,t)=>r({launcher:d.map((n,r)=>r===e?{...n,...t}:n)}),m=(e,t)=>{let n=e+t;if(n<0||n>=d.length)return;let i=[...d];[i[e],i[n]]=[i[n],i[e]],r({launcher:i})};return(0,p.jsxs)(`div`,{className:`settings-section`,children:[(0,p.jsx)(`h3`,{children:`Music player`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Music folder`}),(0,p.jsx)(`input`,{type:`text`,value:e.folder,placeholder:`C:\\Users\\you\\Music`,onChange:e=>n({folder:e.target.value})}),(0,p.jsx)(`small`,{className:`auth-note`,children:`A folder on the PC that runs Friend. Its sub-folders are searched too. Saving checks that it exists.`})]}),(0,p.jsxs)(`fieldset`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`File types to look for`}),Lu.map(t=>(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.extensions.includes(t),onChange:r=>{let i=r.target.checked?[...e.extensions,t]:e.extensions.filter(e=>e!==t);i.length&&n({extensions:Lu.filter(e=>i.includes(e))})}}),(0,p.jsx)(`span`,{children:t})]},t))]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsxs)(`span`,{children:[`Start volume (`,e.volume,`%)`]}),(0,p.jsx)(`input`,{type:`range`,min:Ru.volume.min,max:Ru.volume.max,value:e.volume,onChange:e=>n({volume:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Repeat`}),(0,p.jsxs)(`select`,{value:e.repeat,onChange:e=>n({repeat:e.target.value}),children:[(0,p.jsx)(`option`,{value:`off`,children:`Off`}),(0,p.jsx)(`option`,{value:`all`,children:`The whole list`}),(0,p.jsx)(`option`,{value:`one`,children:`One track`})]})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Starts as`}),(0,p.jsxs)(`select`,{value:e.startView,onChange:e=>n({startView:e.target.value}),children:[(0,p.jsx)(`option`,{value:`mini`,children:`Small player`}),(0,p.jsx)(`option`,{value:`full`,children:`Big player with the playlist`})]})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.shuffle,onChange:e=>n({shuffle:e.target.checked})}),(0,p.jsx)(`span`,{children:`Shuffle`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:e.visualizer,onChange:e=>n({visualizer:e.target.checked})}),(0,p.jsx)(`span`,{children:`Moving bars around the dial`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Where music comes from, when the assistant is not told`}),(0,p.jsxs)(`select`,{value:e.defaultSource,onChange:e=>n({defaultSource:e.target.value}),children:[(0,p.jsx)(`option`,{value:`local`,children:`The music folder`}),(0,p.jsx)(`option`,{value:`spotify`,children:`Spotify`}),(0,p.jsx)(`option`,{value:`soundcloud`,children:`SoundCloud`}),(0,p.jsx)(`option`,{value:`audius`,children:`Audius`}),(0,p.jsx)(`option`,{value:`any`,children:`All`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Spotify, SoundCloud and Audius are added from Plugins. Playing from Spotify needs Spotify Premium on your account.`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Most results from a service such as Spotify`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.searchLimit.min,max:Ru.searchLimit.max,value:e.searchLimit,onChange:e=>n({searchLimit:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Where the sound comes out`}),(0,p.jsxs)(`select`,{value:e.output,onChange:e=>n({output:e.target.value}),children:[(0,p.jsx)(`option`,{value:`screen`,children:`The screen (the browser plays it)`}),(0,p.jsx)(`option`,{value:`host`,children:`This PC's speakers (no browser needed)`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The PC's speakers play your folder's music through mpv, a free player you install once. Spotify plays on a Spotify device you name below.`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Program that plays the folder's music on the PC (empty: find mpv automatically)`}),(0,p.jsx)(`input`,{type:`text`,value:e.hostPlayer,maxLength:260,placeholder:`mpv`,onChange:e=>n({hostPlayer:e.target.value})}),Uu(e.hostPlayer.trim())&&(0,p.jsx)(`small`,{role:`alert`,className:`auth-error`,children:Uu(e.hostPlayer.trim())})]}),(0,p.jsxs)(`div`,{className:`settings-field`,children:[(0,p.jsx)(`button`,{type:`button`,disabled:s,onClick:u,children:`Check mpv`}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Looks for mpv with the saved program setting, or automatically when it is empty.`}),a&&(0,p.jsx)(`small`,{role:`status`,className:`auth-note`,children:a})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Spotify device on the PC to play on`}),(0,p.jsx)(`input`,{type:`text`,value:e.spotifyDevice,maxLength:100,placeholder:`the name Spotify shows for that device`,onChange:e=>n({spotifyDevice:e.target.value})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Most tracks to list`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.maxTracks.min,max:Ru.maxTracks.max,value:e.maxTracks,onChange:e=>n({maxTracks:Number(e.target.value)})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`How many folders deep to search`}),(0,p.jsx)(`input`,{type:`number`,min:Ru.scanDepth.min,max:Ru.scanDepth.max,value:e.scanDepth,onChange:e=>n({scanDepth:Number(e.target.value)})})]}),(0,p.jsx)(`h3`,{children:`Screen widgets`}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Name on the profile tag`}),(0,p.jsx)(`input`,{type:`text`,maxLength:24,value:t.terminalLabel,onChange:e=>r({terminalLabel:e.target.value})})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Animations`}),(0,p.jsxs)(`select`,{value:t.animations,onChange:e=>r({animations:e.target.value}),children:[(0,p.jsx)(`option`,{value:`full`,children:`Full`}),(0,p.jsx)(`option`,{value:`reduced`,children:`Reduced (only answers to hover and press)`}),(0,p.jsx)(`option`,{value:`off`,children:`Off`})]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`If the device is set to reduce motion, the screen stays still whatever this says.`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:t.clock.hour12,onChange:e=>r({clock:{...t.clock,hour12:e.target.checked}})}),(0,p.jsx)(`span`,{children:`12-hour clock`})]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:t.clock.seconds,onChange:e=>r({clock:{...t.clock,seconds:e.target.checked}})}),(0,p.jsx)(`span`,{children:`Show seconds`})]}),(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Date language (empty: the device's own)`}),(0,p.jsx)(`input`,{type:`text`,value:t.clock.locale,maxLength:35,placeholder:`en-GB`,onChange:e=>r({clock:{...t.clock,locale:e.target.value}})})]}),(0,p.jsx)(`h3`,{children:`Quick-launch buttons`}),d.length===0&&(0,p.jsx)(`small`,{className:`auth-note`,children:`No buttons yet.`}),d.map((e,t)=>{let n=Hu(e);return(0,p.jsxs)(`div`,{className:`settings-field`,role:`group`,"aria-label":`Button ${t+1}`,children:[(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:[(0,p.jsx)(`input`,{type:`text`,"aria-label":`Icon`,style:{width:56},value:e.icon,onChange:e=>f(t,{icon:e.target.value})}),(0,p.jsx)(`input`,{type:`text`,"aria-label":`Label`,maxLength:24,style:{flex:1,minWidth:100},value:e.label,onChange:e=>f(t,{label:e.target.value})}),(0,p.jsx)(`select`,{"aria-label":`What it does`,value:e.action.type,onChange:e=>{let n=e.target.value;f(t,{action:{type:n,value:zx(n)}})},children:Object.keys(Rx).map(e=>(0,p.jsx)(`option`,{value:e,children:Rx[e]},e))})]}),(0,p.jsxs)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:[e.action.type===`panel`||e.action.type===`music`?(0,p.jsx)(`select`,{"aria-label":`Which`,style:{flex:1},value:e.action.value,onChange:n=>f(t,{action:{...e.action,value:n.target.value}}),children:(e.action.type===`panel`?zu:Bu).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}):(0,p.jsx)(`input`,{type:`text`,"aria-label":e.action.type===`url`?`Address`:`Question`,style:{flex:1},value:e.action.value,placeholder:e.action.type===`url`?`https://…`:`What should it ask?`,onChange:n=>f(t,{action:{...e.action,value:n.target.value}})}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Move up`,disabled:t===0,onClick:()=>m(t,-1),children:`↑`}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Move down`,disabled:t===d.length-1,onClick:()=>m(t,1),children:`↓`}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Remove button`,onClick:()=>r({launcher:d.filter((e,n)=>n!==t)}),children:`Remove`})]}),n&&(0,p.jsx)(`small`,{role:`alert`,className:`auth-error`,children:n})]},e.id??t)}),(0,p.jsxs)(`button`,{type:`button`,disabled:d.length>=12,onClick:()=>r({launcher:[...d,{label:`New`,icon:`+`,action:{type:`panel`,value:`chat`}}]}),children:[`Add a button (`,d.length,`/`,12,`)`]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`The assistant can never change the music folder, these buttons or the animations, even with your PIN.`})]})}var Vx=[`#3fd8ff`,`#2b7bff`,`#a066ff`,`#ff6fae`,`#ff5a5a`,`#ff9b3d`,`#ffd23d`,`#3dff8c`,`#e8f4ff`],Hx=[{id:`sphere`,name:`Sphere`,note:`A cloud of particles`},{id:`orb`,name:`Orb`,note:`A glowing plasma ball`},{id:`ring`,name:`Ring`,note:`Radial bars, like a voice meter`}],Ux=(e,t)=>e.style===t.style&&e.accent.toLowerCase()===t.accent&&Math.abs(e.intensity-t.intensity)<.005,Wx=[{id:`manual`,label:`Ask me (manual)`,note:`Friend asks before anything that changes your PC or leaves the safe zone. The most careful.`},{id:`edits`,label:`Auto-approve file work (edits)`,note:`Reading and writing files, and the sandboxed code runner, go ahead without asking. Commands still ask.`},{id:`auto`,label:`Auto-approve everything safe (auto)`,note:`Commands, files and tools go ahead without asking. The most convenient, and the most trust: Friend acts on its own.`}],Gx=[{id:`claude-code`,label:`Claude subscription (Claude Code)`,note:`Uses the Claude Code app you are signed in to. No API key.`},{id:`claude`,label:`Claude API key`,note:`Pay per use with an Anthropic API key.`},{id:`ollama`,label:`Local model (Ollama)`,note:`Runs on this PC. Free and private, but slower.`},{id:`openai`,label:`OpenAI-compatible server (OmniRoute, LM Studio…)`,note:`Any server that speaks the OpenAI chat API. OmniRoute is one address that routes to many models, many of them free.`}],Kx={"voice.enabled":`Speech on/off`};function qx({label:e,children:t,hint:n}){return(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:e}),t,n&&(0,p.jsx)(`small`,{className:`auth-note`,children:n})]})}function Jx({api:e=ht,onClose:t,initialTab:n=`model`,preview:r=gt,variant:i=`classic`}){let[a,o]=(0,l.useState)(null),[s,c]=(0,l.useState)(null),[u,f]=(0,l.useState)(n),[m,h]=(0,l.useState)(``),[g,_]=(0,l.useState)(``),[v,y]=(0,l.useState)(!1),[x,S]=(0,l.useState)(``),[C,w]=(0,l.useState)(!1),[E,D]=(0,l.useState)(null),[O,k]=(0,l.useState)(null),[A,j]=(0,l.useState)(null),[ee,M]=(0,l.useState)(null),N=(0,l.useRef)(!0);(0,l.useEffect)(()=>(N.current=!0,e.get().then(e=>{N.current&&(o(e),c(structuredClone(e)))}).catch(e=>N.current&&D(e.message)),()=>{N.current=!1}),[e]);let P=(e,n=!1,r={})=>i===`holo`?(0,p.jsx)(b,{label:`Settings`,title:r.title??Se.find(e=>e.id===u)?.label??`Settings`,page:r.page,help:r.help,onApply:r.onApply,onUndo:r.onUndo,dirty:r.dirty,busy:C,onDone:t,children:e}):(0,p.jsxs)(`div`,{className:`approval settings glass${n?` settings-wide`:``}`,role:`dialog`,"aria-label":`Settings`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Settings`})}),e]});if(!s||!a)return P((0,p.jsxs)(p.Fragment,{children:[E?(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}):(0,p.jsx)(`p`,{className:`auth-note`,children:`Loading…`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Close`})})]}));let F=_t(a,s,m,g),te=Object.keys(F).length>0,I=(e,t,n)=>c({...s,[e]:{...s[e],[t]:n}}),ne=s.look,L=(e,t)=>{t&&(j(e),M(e===`main`?null:`The first time, the voice downloads (about 64 MB). Please wait…`),r(t).then(()=>N.current&&M(`Playing…`)).catch(e=>N.current&&M(e.message)).finally(()=>N.current&&j(null)))},re=async t=>{D(null),w(!0);try{let n=await e.save(F,t);if(!N.current)return;o(n.settings),c(structuredClone(n.settings)),h(``),_(``),y(!1);let r=F.voice&&F.voice.ttsVoice!==void 0,i=F.voice&&F.voice.sttModel!==void 0;k(n.restart.length?`Saved. Restart Friend for: ${n.restart.map(e=>Kx[e]??e).join(`, `)}.`:i?`Saved. The listening model is being downloaded in the background (the first time only); Friend keeps listening with the old one and tells you when the new one is ready.`:r?`Saved. The new voice is loading; you will get a message when it is ready (the first time it downloads about 60 MB).`:pt(F)?`Saved. It is in use now.`:`Saved. Every open screen has changed.`)}catch(e){N.current&&D(e.message)}finally{N.current&&(w(!1),S(``))}};if(v)return P((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Enter your PIN to save these changes.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:()=>!C&&void re(x)}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:C||x.length<6,onClick:()=>void re(x),children:`Save`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{y(!1),S(``),D(null)},children:`Back`})]})]}));let ie=Gx.find(e=>e.id===s.provider),ae=e=>{let t=Se.findIndex(e=>e.id===u),n=e.key===`ArrowDown`||e.key===`ArrowRight`?(t+1)%Se.length:e.key===`ArrowUp`||e.key===`ArrowLeft`?(t+Se.length-1)%Se.length:e.key===`Home`?0:e.key===`End`?Se.length-1:-1;n<0||(e.preventDefault(),f(Se[n].id),document.getElementById(`settings-tab-${Se[n].id}`)?.focus())},oe=(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Where Friend thinks`}),(0,p.jsx)(qx,{label:`Model provider`,hint:ie.note,children:(0,p.jsx)(`select`,{value:s.provider,onChange:e=>c({...s,provider:e.target.value}),children:Gx.map(e=>(0,p.jsx)(`option`,{value:e.id,children:e.label},e.id))})}),s.provider===`claude-code`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(qx,{label:`Claude model`,hint:`sonnet, haiku, opus, or a full model name`,children:[(0,p.jsx)(`input`,{list:`cc-models`,value:s.claudeCode.model,onChange:e=>I(`claudeCode`,`model`,e.target.value)}),(0,p.jsxs)(`datalist`,{id:`cc-models`,children:[(0,p.jsx)(`option`,{value:`sonnet`}),(0,p.jsx)(`option`,{value:`haiku`}),(0,p.jsx)(`option`,{value:`opus`})]})]}),(0,p.jsx)(qx,{label:`If Claude is unavailable`,hint:`For example when the plan's usage limit is reached.`,children:(0,p.jsxs)(`select`,{value:s.claudeCode.fallback,onChange:e=>I(`claudeCode`,`fallback`,e.target.value),children:[(0,p.jsx)(`option`,{value:`ollama`,children:`Answer with the local model (Ollama)`}),(0,p.jsx)(`option`,{value:`none`,children:`Show an error`})]})}),(0,p.jsx)(qx,{label:`Claude Code command`,hint:`Leave as it is unless the program is somewhere else.`,children:(0,p.jsx)(`input`,{value:s.claudeCode.command,onChange:e=>I(`claudeCode`,`command`,e.target.value)})})]}),s.provider===`claude`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(qx,{label:`Claude model`,children:(0,p.jsx)(`input`,{value:s.model,onChange:e=>c({...s,model:e.target.value})})}),(0,p.jsx)(qx,{label:`API key`,hint:a.apiKeySet?`A key is saved. Type a new one only to replace it.`:`No key saved yet.`,children:(0,p.jsx)(`input`,{type:`password`,autoComplete:`off`,placeholder:a.apiKeySet?`saved`:`sk-ant-…`,value:m,onChange:e=>h(e.target.value)})})]}),s.provider===`openai`&&s.openai&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(qx,{label:`Server address`,hint:`Ends in /v1. OmniRoute: http://localhost:20128/v1 (install it with npm install -g omniroute, then run omniroute).`,children:(0,p.jsx)(`input`,{value:s.openai.url,onChange:e=>c({...s,openai:{...s.openai,url:e.target.value}})})}),(0,p.jsx)(qx,{label:`Model`,hint:`The name that server knows. OmniRoute answers to auto.`,children:(0,p.jsx)(`input`,{value:s.openai.model,onChange:e=>c({...s,openai:{...s.openai,model:e.target.value}})})}),(0,p.jsx)(qx,{label:`API key`,hint:a.openai?.apiKeySet?`A key is saved. Type a new one only to replace it.`:`Leave empty if the server asks for none.`,children:(0,p.jsx)(`input`,{type:`password`,autoComplete:`off`,placeholder:a.openai?.apiKeySet?`saved`:``,value:g,onChange:e=>_(e.target.value)})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.openai.vision,onChange:e=>c({...s,openai:{...s.openai,vision:e.target.checked}})}),` This model can look at pictures`]})]}),(s.provider===`ollama`||s.provider===`claude-code`&&s.claudeCode.fallback===`ollama`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Local model (Ollama)`}),(0,p.jsx)(qx,{label:`Address`,children:(0,p.jsx)(`input`,{value:s.ollama.url,onChange:e=>I(`ollama`,`url`,e.target.value)})}),(0,p.jsx)(qx,{label:`Model`,children:(0,p.jsx)(`input`,{value:s.ollama.model,onChange:e=>I(`ollama`,`model`,e.target.value)})}),(0,p.jsx)(qx,{label:`Memory window (tokens)`,children:(0,p.jsx)(`input`,{type:`number`,min:1024,max:131072,step:1024,value:s.ollama.contextTokens,onChange:e=>I(`ollama`,`contextTokens`,Number(e.target.value))})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.ollama.vision,onChange:e=>I(`ollama`,`vision`,e.target.checked)}),` This model can look at pictures`]})]})]}),se=(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Speaking and listening`}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.voice.speakTyped,onChange:e=>I(`voice`,`speakTyped`,e.target.checked)}),` Also speak the replies to typed messages`]}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:s.voice.duck??!0,onChange:e=>I(`voice`,`duck`,e.target.checked)}),` Turn music and video down while I talk and while Friend speaks`]}),(0,p.jsx)(qx,{label:`Volume while talking: ${s.voice.duckPercent??25}%`,hint:`How loud music and video are then, compared with how loud you have them. They come back as they were when nothing is happening.`,children:(0,p.jsx)(`input`,{type:`range`,min:0,max:100,step:5,value:s.voice.duckPercent??25,disabled:s.voice.duck===!1,onChange:e=>I(`voice`,`duckPercent`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`Spoken language`,hint:`Leave empty to detect it by itself: best when you mix English, Hindi and Marathi. Or force one: en, hi, mr.`,children:(0,p.jsx)(`input`,{value:s.voice.language??``,maxLength:10,onChange:e=>I(`voice`,`language`,e.target.value.trim()===``?null:e.target.value.trim())})}),(0,p.jsx)(qx,{label:`Speaking voice`,hint:`Female or male. The first time a voice is used it downloads about 60 MB, then it works without internet.`,children:(0,p.jsxs)(`select`,{value:s.voice.ttsVoice,onChange:e=>I(`voice`,`ttsVoice`,e.target.value),children:[(0,p.jsx)(`optgroup`,{label:`Female`,children:uu.filter(e=>e.gender===`female`).map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.accent,e.note?` · ${e.note}`:``]},e.id))}),(0,p.jsx)(`optgroup`,{label:`Male`,children:uu.filter(e=>e.gender===`male`).map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.accent,e.note?` · ${e.note}`:``]},e.id))}),(0,p.jsx)(`optgroup`,{label:`Original`,children:(0,p.jsxs)(`option`,{value:pu.id,children:[pu.name,` · `,pu.accent,` · `,pu.note]})}),!mu(s.voice.ttsVoice)&&(0,p.jsx)(`optgroup`,{label:`Other`,children:(0,p.jsx)(`option`,{value:s.voice.ttsVoice,children:s.voice.ttsVoice})})]})}),(0,p.jsx)(qx,{label:`Hindi voice`,hint:`Reads Hindi (Devanagari) text; English words in the same sentence still use the voice above. The first time it downloads about 64 MB.`,children:(0,p.jsxs)(`select`,{value:s.voice.hindiVoice??``,onChange:e=>I(`voice`,`hindiVoice`,e.target.value),children:[(0,p.jsx)(`option`,{value:``,children:`Same as the voice above`}),du.map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,e.gender,e.note?` · ${e.note}`:``]},e.id))]})}),(0,p.jsx)(qx,{label:`Marathi voice`,hint:`Reads Marathi text. Friend tells Marathi from Hindi by the words used.`,children:(0,p.jsxs)(`select`,{value:s.voice.marathiVoice??``,onChange:e=>I(`voice`,`marathiVoice`,e.target.value),children:[(0,p.jsx)(`option`,{value:``,children:`Same as the voice above`}),fu.map(e=>(0,p.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),(0,p.jsxs)(`div`,{className:`voice-hear`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null,onClick:()=>L(`main`,s.voice.ttsVoice),children:A===`main`?`Loading the voice…`:`Hear it`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null||!s.voice.hindiVoice,onClick:()=>L(`hindi`,s.voice.hindiVoice??``),children:A===`hindi`?`Loading the voice…`:`Hear the Hindi voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:A!==null||!s.voice.marathiVoice,onClick:()=>L(`marathi`,s.voice.marathiVoice??``),children:A===`marathi`?`Loading the voice…`:`Hear the Marathi voice`}),ee&&(0,p.jsx)(`small`,{className:`auth-note`,role:`status`,children:ee})]}),(0,p.jsx)(qx,{label:`Listening model`,hint:`Bigger hears more accurately, from further away and in Hindi and Marathi, but is slower. It downloads once, in the background, and Friend keeps listening meanwhile. No restart.`,children:(0,p.jsxs)(`select`,{value:s.voice.sttModel,onChange:e=>I(`voice`,`sttModel`,e.target.value),children:[!hu.some(e=>e.id===s.voice.sttModel)&&(0,p.jsx)(`option`,{value:s.voice.sttModel,children:s.voice.sttModel}),hu.map(e=>(0,p.jsxs)(`option`,{value:e.id,children:[e.name,` · `,gu(e.mb).replace(`about `,``),` · `,e.note]},e.id))]})}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Who is speaking`}),(0,p.jsx)(qx,{label:`"It is me" match level: ${s.voice.accept.toFixed(2)}`,hint:`Higher is stricter. Only matters after you enrolled your voice.`,children:(0,p.jsx)(`input`,{type:`range`,min:.3,max:.95,step:.01,value:s.voice.accept,onChange:e=>I(`voice`,`accept`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`"Ask for my PIN" level: ${s.voice.challenge.toFixed(2)}`,hint:`Voices between this and the level above must be confirmed with the PIN.`,children:(0,p.jsx)(`input`,{type:`range`,min:.2,max:.9,step:.01,value:s.voice.challenge,onChange:e=>I(`voice`,`challenge`,Number(e.target.value))})})]}),ce=(0,p.jsxs)(`div`,{className:`look-tab`,children:[(0,p.jsxs)(`div`,{className:`look-side`,children:[(0,p.jsx)(Mx,{look:ne}),(0,p.jsx)(`p`,{className:`auth-note`,children:`This is a live preview. Nothing changes on the screen until you save.`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>c({...s,look:{...dt}}),children:`Back to the default look`})]}),(0,p.jsxs)(`div`,{className:`look-controls`,children:[(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Themes`}),(0,p.jsx)(`div`,{className:`theme-grid`,role:`group`,"aria-label":`Themes`,children:_u.map(e=>(0,p.jsxs)(`button`,{type:`button`,className:`theme-card${Ux(ne,e)?` on`:``}`,"aria-pressed":Ux(ne,e),style:{"--swatch":e.accent},onClick:()=>c({...s,look:{...ne,style:e.style,accent:e.accent,intensity:e.intensity}}),children:[(0,p.jsx)(`i`,{"aria-hidden":`true`}),(0,p.jsx)(`b`,{children:e.name}),(0,p.jsx)(`small`,{children:e.style})]},e.id))}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Shape`}),(0,p.jsx)(`div`,{className:`style-row`,role:`radiogroup`,"aria-label":`Style`,children:Hx.map(e=>(0,p.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":ne.style===e.id,className:`style-choice${ne.style===e.id?` on`:``}`,onClick:()=>I(`look`,`style`,e.id),children:[(0,p.jsx)(`b`,{children:e.name}),(0,p.jsx)(`small`,{children:e.note})]},e.id))}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Colour and light`}),(0,p.jsxs)(`div`,{className:`swatch-row`,role:`group`,"aria-label":`Colour`,children:[Vx.map(e=>(0,p.jsx)(`button`,{type:`button`,"aria-label":`Colour ${e}`,"aria-pressed":ne.accent.toLowerCase()===e,className:`swatch${ne.accent.toLowerCase()===e?` on`:``}`,style:{background:e},onClick:()=>I(`look`,`accent`,e)},e)),(0,p.jsxs)(`label`,{className:`swatch-custom`,children:[(0,p.jsx)(`span`,{children:`Other`}),(0,p.jsx)(`input`,{type:`color`,"aria-label":`Pick another colour`,value:ne.accent,onChange:e=>I(`look`,`accent`,e.target.value.toLowerCase())})]})]}),(0,p.jsx)(qx,{label:`Brightness: ${Math.round(ne.intensity*100)}%`,children:(0,p.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:ne.intensity,onChange:e=>I(`look`,`intensity`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`Size: ${Math.round(ne.size*100)}%`,hint:`How big it is in the middle of the screen.`,children:(0,p.jsx)(`input`,{type:`range`,min:.5,max:1.5,step:.05,value:ne.size,onChange:e=>I(`look`,`size`,Number(e.target.value))})}),(0,p.jsx)(qx,{label:`Reaction to my voice: ${Math.round(ne.reactivity*100)}%`,hint:`Low is calm, high moves a lot when anyone speaks.`,children:(0,p.jsx)(`input`,{type:`range`,min:0,max:1,step:.05,value:ne.reactivity,onChange:e=>I(`look`,`reactivity`,Number(e.target.value))})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.ambient,onChange:e=>I(`look`,`ambient`,e.target.checked)}),` Soft glow behind everything`]}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`Words on the screen`}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.captions,onChange:e=>I(`look`,`captions`,e.target.checked)}),` Show the live words while Friend speaks`]}),(0,p.jsx)(qx,{label:`Caption size`,children:(0,p.jsxs)(`select`,{value:ne.captionSize,disabled:!ne.captions,onChange:e=>I(`look`,`captionSize`,e.target.value),children:[(0,p.jsx)(`option`,{value:`small`,children:`Small`}),(0,p.jsx)(`option`,{value:`medium`,children:`Medium`}),(0,p.jsx)(`option`,{value:`large`,children:`Large`})]})}),(0,p.jsx)(`h4`,{className:`plugins-heading`,children:`What is on the screen`}),(0,p.jsx)(qx,{label:`Your name`,hint:`Shown on the badge in the corner, next to the shield, while you are signed in. Empty shows Owner.`,children:(0,p.jsx)(`input`,{value:s.ownerName??``,maxLength:40,placeholder:`Owner`,onChange:e=>c({...s,ownerName:e.target.value})})}),(0,p.jsx)(qx,{label:`View`,hint:`Minimal: only the voice presence. Companion: plus a status line and a clock. Workspace: also the chat and the schedule. Drag any panel to move it.`,children:(0,p.jsxs)(`select`,{value:s.view,onChange:e=>c({...s,view:e.target.value}),children:[(0,p.jsx)(`option`,{value:`minimal`,children:`Minimal`}),(0,p.jsx)(`option`,{value:`companion`,children:`Companion`}),(0,p.jsx)(`option`,{value:`workspace`,children:`Workspace`})]})}),(0,p.jsxs)(`label`,{className:`settings-check`,children:[(0,p.jsx)(`input`,{type:`checkbox`,checked:ne.aiMayChange,onChange:e=>I(`look`,`aiMayChange`,e.target.checked)}),` Let the AI change the shape, colour and brightness to suit a topic`]}),(0,p.jsx)(`small`,{className:`auth-note`,children:`Off keeps exactly the look you chose. You can still ask it to change the look yourself.`})]})]}),le=s.approvals??`manual`,ue=(0,p.jsxs)(`div`,{className:`settings-section`,role:`radiogroup`,"aria-label":`How much Friend asks before acting`,children:[(0,p.jsx)(`h3`,{children:`How much should Friend ask?`}),Wx.map(e=>(0,p.jsxs)(`label`,{className:`settings-check`,style:{alignItems:`flex-start`},children:[(0,p.jsx)(`input`,{type:`radio`,name:`approvals`,value:e.id,checked:le===e.id,onChange:()=>c({...s,approvals:e.id})}),(0,p.jsxs)(`span`,{children:[(0,p.jsx)(`b`,{children:e.label}),(0,p.jsx)(`br`,{}),(0,p.jsx)(`small`,{className:`auth-note`,children:e.note})]})]},e.id)),(0,p.jsx)(`small`,{className:`auth-note`,children:`Whatever you pick, these still ask: risky commands (they need your PIN), the camera, adding connectors or plugins, and anything in Friend's own data folder. Changing this needs your PIN.`})]}),de=(0,p.jsxs)(p.Fragment,{children:[u===`model`&&oe,u===`voice`&&se,u===`look`&&ce,u===`approvals`&&ue,u===`trading`&&(0,p.jsx)(Ix,{level:s.trading?.level??`read`}),u===`widgets`&&s.music&&s.hud&&(0,p.jsx)(Bx,{music:s.music,hud:s.hud,onMusic:e=>c({...s,music:{...s.music,...e}}),onHud:e=>c({...s,hud:{...s.hud,...e}})}),u===`security`&&(0,p.jsx)(Px,{})]}),R=()=>{k(null),D(null),pt(F)?y(!0):re()},z=()=>{c(structuredClone(a)),h(``),_(``)},B=(0,p.jsxs)(p.Fragment,{children:[O&&!te&&(0,p.jsx)(`p`,{className:`auth-note`,children:O}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E})]});if(i===`holo`){let e=Se.findIndex(e=>e.id===u),t=e=>f(Se[(e+Se.length)%Se.length].id);return P((0,p.jsxs)(p.Fragment,{children:[de,B]}),!0,{title:Se[e].label,page:{index:e,total:Se.length,onPrev:()=>t(e-1),onNext:()=>t(e+1)},dirty:te,onApply:R,onUndo:z,help:(0,p.jsxs)(p.Fragment,{children:[`Fill in the settings and press `,(0,p.jsx)(`b`,{children:`Apply`}),` to save them. Network, folders and safety rules are not here on purpose: change those in the terminal with friend config set.`]})})}return P((0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`settings-layout`,children:[(0,p.jsx)(`div`,{className:`settings-tabs`,role:`tablist`,"aria-label":`Settings sections`,"aria-orientation":`vertical`,onKeyDown:ae,children:Se.map(e=>(0,p.jsxs)(`button`,{id:`settings-tab-${e.id}`,type:`button`,role:`tab`,"aria-selected":u===e.id,"aria-controls":`settings-panel-${e.id}`,tabIndex:u===e.id?0:-1,className:`settings-tab${u===e.id?` on`:``}`,onClick:()=>f(e.id),children:[(0,p.jsx)(`b`,{children:e.label}),(0,p.jsx)(`small`,{children:e.note})]},e.id))}),(0,p.jsx)(`div`,{className:`settings-body`,role:`tabpanel`,id:`settings-panel-${u}`,"aria-labelledby":`settings-tab-${u}`,children:de})]}),O&&!te&&(0,p.jsx)(`p`,{className:`auth-note`,children:O}),E&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:E}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:!te||C,onClick:R,children:te&&!pt(F)?`Save`:`Save…`}),te&&(0,p.jsx)(`button`,{type:`button`,style:d,onClick:z,children:`Undo changes`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:t,children:`Close`})]}),(0,p.jsx)(`p`,{className:`auth-note`,children:`Network, folders and safety rules are not here on purpose. Change those in the terminal: friend config set.`})]}),!0)}var Yx=e=>e instanceof HTMLElement&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable);function Xx({onSend:e,requestOpen:t,slash:n,onOpenChange:r}){let[i,a]=(0,l.useState)(!1),o=(0,l.useRef)(r);o.current=r,(0,l.useEffect)(()=>o.current?.(i),[i]);let[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)(0),f=(0,l.useRef)(null);if((0,l.useEffect)(()=>{t>0&&a(!0)},[t]),(0,l.useEffect)(()=>{let e=e=>{i||Yx(e.target)||e.ctrlKey||e.metaKey||e.altKey||e.key.length===1&&(e.preventDefault(),c(e.key),d(0),a(!0))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),(0,l.useEffect)(()=>{i&&f.current?.focus()},[i]),!i)return null;let m=n?F(n.commands,s):[],h=m[Math.min(u,Math.max(m.length-1,0))],g=()=>{c(``),d(0),a(!1)},_=()=>{let t=s.trim();if(n&&P(t)){let e=/^\/\S*\s/.test(t);n.run(!e&&h?`/${h.name}`:t)}else t&&e(I(t));g()};return(0,p.jsxs)(`form`,{className:`command-bar`,onSubmit:e=>{e.preventDefault(),_()},children:[m.length>0&&(0,p.jsx)(`ul`,{className:`slash-list`,role:`listbox`,"aria-label":`Commands`,children:m.map((e,t)=>(0,p.jsxs)(`li`,{role:`option`,"aria-selected":e===h,className:e===h?`on`:void 0,onMouseDown:n=>{n.preventDefault(),c(`/${e.name} `),f.current?.focus(),d(t)},children:[(0,p.jsxs)(`b`,{children:[`/`,e.name]}),e.usage&&(0,p.jsx)(`i`,{children:e.usage}),(0,p.jsx)(`span`,{children:e.description})]},e.name))}),(0,p.jsx)(`input`,{ref:f,"aria-label":`Message`,value:s,placeholder:`Talk to me… or type / for commands`,autoComplete:`off`,onChange:e=>{c(e.target.value),d(0)},onKeyDown:e=>{e.key===`Escape`?(e.stopPropagation(),g()):m.length>0&&(e.key===`ArrowDown`||e.key===`ArrowUp`)?(e.preventDefault(),d(t=>(t+(e.key===`ArrowDown`?1:m.length-1))%m.length)):e.key===`Tab`&&h&&(e.preventDefault(),c(`/${h.name} `))}}),(0,p.jsx)(`button`,{type:`submit`,"aria-label":`Send`,children:`↵`})]})}var Zx={width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.8,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},Qx=(e,t)=>e===`listening`?t?`Listening… tap to send`:`Listening… let go to send`:e===`transcribing`?`Understanding…`:e===`speaking`?`Tap to talk over me`:`Hold to talk, or tap once`;function $x({voice:e,mode:t,onType:n,onMenu:r}){let i=(0,l.useRef)(null),a=(0,l.useRef)(!1),[o,s]=(0,l.useState)(!1),c=e=>{a.current=e,s(e)},u=(0,l.useRef)(t);u.current=t,(0,l.useEffect)(()=>{t!==`listening`&&!i.current&&c(!1)},[t]);let d=t=>{if((t.pointerType!==`mouse`||t.button===0)&&!i.current){if(a.current&&u.current===`listening`){c(!1),e.pressEnd();return}c(!1),i.current={at:Date.now(),id:t.pointerId};try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}e.pressStart()}},f=t=>{let n=i.current;n&&n.id===t.pointerId&&(i.current=null,Date.now()-n.at>=450?e.pressEnd():c(!0))},m=t=>{let n=i.current;n&&n.id===t.pointerId&&(i.current=null,c(!1),e.blur?.())},h=t===`listening`;return(0,p.jsxs)(`div`,{className:`touch-controls`,"data-testid":`touch-controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`touch-side`,"aria-label":`Open the menu`,onClick:r,children:(0,p.jsx)(`svg`,{...Zx,children:(0,p.jsx)(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}),(0,p.jsxs)(`div`,{className:`touch-talk`,children:[(0,p.jsx)(`button`,{type:`button`,className:`touch-mic${h?` on`:``}`,"aria-label":`Talk to Friend`,"aria-pressed":h,onPointerDown:d,onPointerUp:f,onPointerCancel:m,onContextMenu:e=>e.preventDefault(),children:(0,p.jsxs)(`svg`,{...Zx,width:30,height:30,children:[(0,p.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`11`,rx:`3`}),(0,p.jsx)(`path`,{d:`M5 11a7 7 0 0 0 14 0M12 18v3`})]})}),(0,p.jsx)(`span`,{className:`touch-hint`,"aria-live":`polite`,children:Qx(t,o)})]}),(0,p.jsx)(`button`,{type:`button`,className:`touch-side`,"aria-label":`Type a message`,onClick:n,children:(0,p.jsxs)(`svg`,{...Zx,children:[(0,p.jsx)(`rect`,{x:`3`,y:`6`,width:`18`,height:`12`,rx:`2`}),(0,p.jsx)(`path`,{d:`M7 10h.01M11 10h.01M15 10h.01M7 14h10`})]})})]})}function eS(e,t){this.v=e,this.k=t}function tS(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function nS(e){if(Array.isArray(e))return e}function rS(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function iS(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
4388
4388
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function aS(e,t){return nS(e)||rS(e,t)||oS(e,t)||iS()}function oS(e,t){if(e){if(typeof e==`string`)return tS(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?tS(e,t):void 0}}function sS(e){var t,n;function r(t,n){try{var a=e[t](n),o=a.value,s=o instanceof eS;Promise.resolve(s?o.v:o).then(function(n){if(s){var c=t===`return`&&o.k?t:`next`;if(!o.k||n.done)return r(c,n);n=e[c](n).value}i(!!a.done,n)},function(e){r(`throw`,e)})}catch(e){i(2,e)}}function i(e,i){e===2?t.reject(i):t.resolve({value:i,done:e}),(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,i){return new Promise(function(a,o){var s={key:e,arg:i,resolve:a,reject:o,next:null};n?n=n.next=s:(t=n=s,r(e,i))})},typeof e.return!=`function`&&(this.return=void 0)}sS.prototype[typeof Symbol==`function`&&Symbol.asyncIterator||`@@asyncIterator`]=function(){return this},sS.prototype.next=function(e){return this._invoke(`next`,e)},sS.prototype.throw=function(e){return this._invoke(`throw`,e)},sS.prototype.return=function(e){return this._invoke(`return`,e)};var cS=Object.entries,lS=Object.setPrototypeOf,uS=Object.isFrozen,dS=Object.getPrototypeOf,fS=Object.getOwnPropertyDescriptor,pS=Object.freeze,mS=Object.seal,hS=Object.create,gS=typeof Reflect<`u`&&Reflect,_S=gS.apply,vS=gS.construct;pS||=function(e){return e},mS||=function(e){return e},_S||=function(e,t){var n=[...arguments].slice(2);return e.apply(t,n)},vS||=function(e){return new e(...[...arguments].slice(1))};var yS=zS(Array.prototype.forEach);Array.prototype.indexOf;var bS=zS(Array.prototype.lastIndexOf),xS=zS(Array.prototype.pop),SS=zS(Array.prototype.push);Array.prototype.slice;var CS=zS(Array.prototype.splice),wS=Array.isArray,TS=zS(String.prototype.toLowerCase),ES=zS(String.prototype.toString),DS=zS(String.prototype.match),OS=zS(String.prototype.replace),kS=zS(String.prototype.indexOf),AS=zS(String.prototype.trim),jS=zS(Number.prototype.toString),MS=zS(Boolean.prototype.toString),NS=typeof BigInt>`u`?null:zS(BigInt.prototype.toString),PS=typeof Symbol>`u`?null:zS(Symbol.prototype.toString),FS=zS(Object.prototype.hasOwnProperty),IS=zS(Object.prototype.toString),LS=zS(RegExp.prototype.test),RS=BS(TypeError);function zS(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return _S(e,t,n)}}function BS(e){return function(){return vS(e,[...arguments])}}function VS(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:TS;if(lS&&lS(e,null),!wS(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(uS(t)||(t[r]=e),i=e)}e[i]=!0}return e}function HS(e){for(let t=0;t<e.length;t++)FS(e,t)||(e[t]=null);return e}function US(e){let t=hS(null);for(let r of cS(e)){var n=aS(r,2);let i=n[0],a=n[1];FS(e,i)&&(t[i]=wS(a)?HS(a):a&&typeof a==`object`&&a.constructor===Object?US(a):a)}return t}function WS(e){switch(typeof e){case`string`:return e;case`number`:return jS(e);case`boolean`:return MS(e);case`bigint`:return NS?NS(e):`0`;case`symbol`:return PS?PS(e):`Symbol()`;case`undefined`:return IS(e);case`function`:case`object`:{if(e===null)return IS(e);let t=e,n=GS(t,`toString`);if(typeof n==`function`){let e=n(t);return typeof e==`string`?e:IS(e)}return IS(e)}default:return IS(e)}}function GS(e,t){for(;e!==null;){let n=fS(e,t);if(n){if(n.get)return zS(n.get);if(typeof n.value==`function`)return zS(n.value)}e=dS(e)}function n(){return null}return n}function KS(e){try{return LS(e,``),!0}catch{return!1}}var qS=pS(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),JS=pS(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),YS=pS([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),XS=pS([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),ZS=pS(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),QS=pS([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),$S=pS([`#text`]),eC=pS(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.background.bgcolor.border.capture.cellpadding.cellspacing.checked.cite.class.clear.color.cols.colspan.command.commandfor.controls.controlslist.coords.crossorigin.datetime.decoding.default.dir.disabled.disablepictureinpicture.disableremoteplayback.download.draggable.enctype.enterkeyhint.exportparts.face.for.headers.height.hidden.high.href.hreflang.id.inert.inputmode.integrity.ismap.kind.label.lang.list.loading.loop.low.max.maxlength.media.method.min.minlength.multiple.muted.name.nonce.noshade.novalidate.nowrap.open.optimum.part.pattern.placeholder.playsinline.popover.popovertarget.popovertargetaction.poster.preload.pubdate.radiogroup.readonly.rel.required.rev.reversed.role.rows.rowspan.spellcheck.scope.selected.shape.size.sizes.slot.span.srclang.start.src.srcset.step.style.summary.tabindex.title.translate.type.usemap.valign.value.width.wrap.xmlns`.split(`.`)),tC=pS(`accent-height.accumulate.additive.alignment-baseline.amplitude.ascent.attributename.attributetype.azimuth.basefrequency.baseline-shift.begin.bias.by.class.clip.clippathunits.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.cx.cy.d.dx.dy.diffuseconstant.direction.display.divisor.dominant-baseline.dur.edgemode.elevation.end.exponent.fill.fill-opacity.fill-rule.filter.filterunits.flood-color.flood-opacity.font-family.font-size.font-size-adjust.font-stretch.font-style.font-variant.font-weight.fx.fy.g1.g2.glyph-name.glyphref.gradientunits.gradienttransform.height.href.id.image-rendering.in.in2.intercept.k.k1.k2.k3.k4.kerning.keypoints.keysplines.keytimes.lang.lengthadjust.letter-spacing.kernelmatrix.kernelunitlength.lighting-color.local.marker-end.marker-mid.marker-start.markerheight.markerunits.markerwidth.maskcontentunits.maskunits.max.mask.mask-type.media.method.mode.min.name.numoctaves.offset.operator.opacity.order.orient.orientation.origin.overflow.paint-order.path.pathlength.patterncontentunits.patterntransform.patternunits.pointer-events.points.preservealpha.preserveaspectratio.primitiveunits.r.rx.ry.radius.refx.refy.repeatcount.repeatdur.restart.result.rotate.scale.seed.shape-rendering.slope.specularconstant.specularexponent.spreadmethod.startoffset.stddeviation.stitchtiles.stop-color.stop-opacity.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke.stroke-width.style.surfacescale.systemlanguage.tabindex.tablevalues.targetx.targety.transform.transform-origin.text-anchor.text-decoration.text-orientation.text-rendering.textlength.type.u1.u2.unicode.values.vector-effect.viewbox.visibility.version.vert-adv-y.vert-origin-x.vert-origin-y.width.word-spacing.wrap.writing-mode.xchannelselector.ychannelselector.x.x1.x2.xmlns.y.y1.y2.z.zoomandpan`.split(`.`)),nC=pS(`accent.accentunder.align.bevelled.close.columnalign.columnlines.columnspacing.columnspan.denomalign.depth.dir.display.displaystyle.encoding.fence.frame.height.href.id.largeop.length.linethickness.lquote.lspace.mathbackground.mathcolor.mathsize.mathvariant.maxsize.minsize.movablelimits.notation.numalign.open.rowalign.rowlines.rowspacing.rowspan.rspace.rquote.scriptlevel.scriptminsize.scriptsizemultiplier.selection.separator.separators.stretchy.subscriptshift.supscriptshift.symmetric.voffset.width.xmlns`.split(`.`)),rC=pS([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]),iC=mS(/{{[\w\W]*|^[\w\W]*}}/g),aC=mS(/<%[\w\W]*|^[\w\W]*%>/g),oC=mS(/\${[\w\W]*/g),sC=mS(/^data-[\-\w.\u00B7-\uFFFF]+$/),cC=mS(/^aria-[\-\w]+$/),lC=mS(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),uC=mS(/^(?:\w+script|data):/i),dC=mS(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),fC=mS(/^html$/i),pC=mS(/^[a-z][.\w]*(-[.\w]+)+$/i),mC=mS(/<[/\w!]/g),hC=mS(/<[/\w]/g),gC=mS(/<\/no(script|embed|frames)/i),_C=mS(/\/>/i),vC={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},yC=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],bC=pS(VS({},yC)),xC=function(){let e={};return yS(yC,t=>{e[t]=mS(RegExp(`</`+t+`(?=[\\t\\n\\f\\r />])`,`i`))}),pS(e)}(),SC=function(){return typeof window>`u`?null:window},CC=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},wC=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},TC=function(e,t,n,r){return FS(e,t)&&wS(e[t])?VS(r.base?US(r.base):{},e[t],r.transform):n},EC=function(e,t,n){let r=FS(e,t)?e[t]:void 0;return r&&typeof r==`object`?US(r):n()};function DC(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:SC(),t=e=>DC(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==vC.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=GS(d,`cloneNode`),p=GS(d,`remove`),m=GS(d,`removeAttributeNode`),h=GS(d,`nextSibling`),g=GS(d,`childNodes`),_=GS(d,`parentNode`),v=GS(d,`shadowRoot`),y=GS(d,`attributes`),b=o&&o.prototype?GS(o.prototype,`nodeType`):null,x=o&&o.prototype?GS(o.prototype,`nodeName`):null,S=o&&o.prototype?GS(o.prototype,`ownerDocument`):null,C=function(e){return b?b(e):e.nodeType},w=function(e){return x?x(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let T,E=``,D,O=!1,k=0,A=function(){if(k>0)throw RS(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},j=function(e){A(),k++;try{return T.createHTML(e)}finally{k--}},ee=function(e){A(),k++;try{return T.createScriptURL(e)}finally{k--}},M=function(){return O||=(D=CC(u,i),!0),D},N=n,P=N.implementation,F=N.createNodeIterator,te=N.createDocumentFragment,I=N.getElementsByTagName,ne=r.importNode,L=wC();t.isSupported=typeof cS==`function`&&typeof _==`function`&&P&&P.createHTMLDocument!==void 0;let re=iC,ie=aC,ae=oC,oe=sC,se=cC,ce=uC,le=dC,ue=pC,de=lC,R=null,z=VS({},[...qS,...JS,...YS,...ZS,...$S]),B=null,fe=VS({},[...eC,...tC,...nC,...rC]),pe=Object.seal(hS(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),me=null,he=null,ge=Object.seal(hS(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),V=!0,_e=!0,ve=!1,ye=!0,H=!1,be=!0,U=!1,xe=!1,Se=null,Ce=null,we=!1,Te=!1,Ee=!1,De=!1,Oe=!0,ke=!1,Ae=`user-content-`,je=!0,Me=!1,Ne={},Pe=null,Fe=VS({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Ie=null,Le=VS({},[`audio`,`video`,`img`,`source`,`image`,`track`]),Re=null,ze=VS({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),Be=`http://www.w3.org/1998/Math/MathML`,Ve=`http://www.w3.org/2000/svg`,He=`http://www.w3.org/1999/xhtml`,Ue=He,We=!1,Ge=null,Ke=VS({},[Be,Ve,He],ES),qe=pS([`mi`,`mo`,`mn`,`ms`,`mtext`]),Je=VS({},qe),Ye=pS([`annotation-xml`]),Xe=VS({},Ye),Ze=VS({},[`title`,`style`,`font`,`a`,`script`]),Qe=null,$e=[`application/xhtml+xml`,`text/html`],et=null,tt=null,nt=n.createElement(`form`),rt=function(e){return e instanceof RegExp||e instanceof Function},it=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(tt&&tt===e)return;(!e||typeof e!=`object`)&&(e={}),e=US(e),Qe=$e.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,et=Qe===`application/xhtml+xml`?ES:TS,R=TC(e,`ALLOWED_TAGS`,z,{transform:et}),B=TC(e,`ALLOWED_ATTR`,fe,{transform:et}),Ge=TC(e,`ALLOWED_NAMESPACES`,Ke,{transform:ES}),Re=TC(e,`ADD_URI_SAFE_ATTR`,ze,{transform:et,base:ze}),Ie=TC(e,`ADD_DATA_URI_TAGS`,Le,{transform:et,base:Le}),Pe=TC(e,`FORBID_CONTENTS`,Fe,{transform:et}),me=TC(e,`FORBID_TAGS`,US({}),{transform:et}),he=TC(e,`FORBID_ATTR`,US({}),{transform:et}),Ne=FS(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?US(e.USE_PROFILES):e.USE_PROFILES:!1,V=e.ALLOW_ARIA_ATTR!==!1,_e=e.ALLOW_DATA_ATTR!==!1,ve=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ye=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,H=e.SAFE_FOR_TEMPLATES||!1,be=e.SAFE_FOR_XML!==!1,U=e.WHOLE_DOCUMENT||!1,Te=e.RETURN_DOM||!1,Ee=e.RETURN_DOM_FRAGMENT||!1,De=e.RETURN_TRUSTED_TYPE||!1,we=e.FORCE_BODY||!1,Oe=e.SANITIZE_DOM!==!1,ke=e.SANITIZE_NAMED_PROPS||!1,je=e.KEEP_CONTENT!==!1,Me=e.IN_PLACE||!1,de=KS(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:lC,Ue=typeof e.NAMESPACE==`string`?e.NAMESPACE:He,Je=EC(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>VS({},qe)),Xe=EC(e,`HTML_INTEGRATION_POINTS`,()=>VS({},Ye));let t=EC(e,`CUSTOM_ELEMENT_HANDLING`,()=>hS(null));if(pe=hS(null),FS(t,`tagNameCheck`)&&rt(t.tagNameCheck)&&(pe.tagNameCheck=t.tagNameCheck),FS(t,`attributeNameCheck`)&&rt(t.attributeNameCheck)&&(pe.attributeNameCheck=t.attributeNameCheck),FS(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(pe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),mS(pe),H&&(_e=!1),Ee&&(Te=!0),Ne&&(R=VS({},$S),B=hS(null),Ne.html===!0&&(VS(R,qS),VS(B,eC)),Ne.svg===!0&&(VS(R,JS),VS(B,tC),VS(B,rC)),Ne.svgFilters===!0&&(VS(R,YS),VS(B,tC),VS(B,rC)),Ne.mathMl===!0&&(VS(R,ZS),VS(B,nC),VS(B,rC))),ge.tagCheck=null,ge.attributeCheck=null,FS(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?ge.tagCheck=e.ADD_TAGS:wS(e.ADD_TAGS)&&(R===z&&(R=US(R)),VS(R,e.ADD_TAGS,et))),FS(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?ge.attributeCheck=e.ADD_ATTR:wS(e.ADD_ATTR)&&(B===fe&&(B=US(B)),VS(B,e.ADD_ATTR,et))),FS(e,`ADD_FORBID_CONTENTS`)&&wS(e.ADD_FORBID_CONTENTS)&&(Pe===Fe&&(Pe=US(Pe)),VS(Pe,e.ADD_FORBID_CONTENTS,et)),je&&(R[`#text`]=!0),U&&VS(R,[`html`,`head`,`body`]),R.table&&(VS(R,[`tbody`]),delete me.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw RS(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw RS(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=j(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=M()),T&&typeof E==`string`&&(E=j(``)));pS&&pS(e),tt=e},at=VS({},[...JS,...YS,...XS]),ot=VS({},[...ZS,...QS]),st=function(e,t,n){return t.namespaceURI===He?e===`svg`:t.namespaceURI===Be?e===`svg`&&(n===`annotation-xml`||Je[n]):!!at[e]},ct=function(e,t,n){return t.namespaceURI===He?e===`math`:t.namespaceURI===Ve?e===`math`&&Xe[n]:!!ot[e]},lt=function(e,t,n){return t.namespaceURI===Ve&&!Xe[n]||t.namespaceURI===Be&&!Je[n]?!1:!ot[e]&&(Ze[e]||!at[e])},ut=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:Ue,tagName:`template`});let n=TS(e.tagName),r=TS(t.tagName);return Ge[e.namespaceURI]?e.namespaceURI===Ve?st(n,t,r):e.namespaceURI===Be?ct(n,t,r):e.namespaceURI===He?lt(n,t,r):!!(Qe===`application/xhtml+xml`&&Ge[e.namespaceURI]):!1},dt=function(e){SS(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw RS(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},ft=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},pt=function(e){gt(e);let t=g(e);if(t){let e=[];yS(t,t=>{SS(e,t)}),yS(e,e=>{try{p(e)}catch{}})}let n=y(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&ft(e,r,i)}},mt=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}SS(t.removed,{attribute:r||null,from:n});try{r?m(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(Te||Ee)try{dt(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},ht=function(e){let t=y(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||B[et(i)]||ft(e,r,i)}},gt=function(e){let t=[e];for(;t.length>0;){let e=t.pop();C(e)===vC.element&&ht(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},_t=function(e,t){return be?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},vt=function(e){if(!be)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=C(e);if(n===vC.processingInstruction||n===vC.comment&&LS(hC,e.data)){try{p(e)}catch{}continue}if(n===vC.element){let t=e,n=et(w(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&_t(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=g(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},yt=function(e){let t=null,r=null;if(we)e=`<remove></remove>`+e;else{let t=DS(e,/^[\r\n\t ]+/);r=t&&t[0]}Qe===`application/xhtml+xml`&&Ue===He&&(e=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+e+`</body></html>`);let i=T?j(e):e;if(Ue===He)try{t=new l().parseFromString(i,Qe)}catch{}if(!t||!t.documentElement){t=P.createDocument(Ue,`template`,null);try{t.documentElement.innerHTML=We?E:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),Ue===He?I.call(t,U?`html`:`body`)[0]:U?t.documentElement:a},bt=function(e){let t=S?S(e):e.ownerDocument;return F.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},xt=function(e){return e=OS(e,re,` `),e=OS(e,ie,` `),e=OS(e,ae,` `),e},St=function(e){e.normalize();let t=S?S(e):e.ownerDocument,n=F.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=xt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&yS(i,e=>{wt(e.content)&&St(e.content)})},Ct=function(e){let t=x?x(e):null;return typeof t!=`string`||et(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==y(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==b(e)||e.childNodes!==g(e)},wt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return b(e)===vC.documentFragment}catch{return!1}},Tt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Et(e,n,r){e.length!==0&&yS(e,e=>{e.call(t,n,r,tt)})}let Dt=function(e,t){return!!(be&&e.hasChildNodes()&&!Tt(e.firstElementChild)&&LS(mC,e.textContent)&&LS(mC,e.innerHTML)||be&&e.namespaceURI===He&&bC[t]&&(Tt(e.firstElementChild)||typeof e.textContent==`string`&&LS(xC[t],e.textContent))||e.nodeType===vC.processingInstruction||be&&e.nodeType===vC.comment&&LS(hC,e.data))},Ot=function(e,t){return e instanceof RegExp?LS(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},kt=function(e,t,n){if(!me[t]&&Ft(t)&&Ot(pe.tagNameCheck,t))return!1;if(je&&!Pe[t]){let t=_(e),r=g(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,h(e))}}}return dt(e),!0},At=function(e,t,n,r){return e.length===0?t:t===n||t===r?US(t):t},jt=function(e,t){return e===t||_(e)!==null?!1:(Me&>(e),!0)},Mt=function(e,n){if(Et(L.beforeSanitizeElements,e,null),jt(e,n))return!0;if(Ct(e))return dt(e),!0;let r=et(w(e));if(R=At(L.uponSanitizeElement,R,z,Se),Et(L.uponSanitizeElement,e,{tagName:r,allowedTags:R}),jt(e,n))return!0;if(Dt(e,r))return dt(e),!0;if(me[r]||!(ge.tagCheck instanceof Function&&ge.tagCheck(r))&&!R[r]){let t=kt(e,r,n);return t===!1&&(Et(L.afterSanitizeElements,e,null),jt(e,n))?!0:t}if(C(e)===vC.element&&!ut(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&LS(gC,e.innerHTML))return dt(e),!0;if(H&&e.nodeType===vC.text){let n=xt(e.textContent);e.textContent!==n&&(SS(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Et(L.afterSanitizeElements,e,null),jt(e,n)},Nt=function(e,t,r){if(he[t]||_t(t,e)||Oe&&(t===`id`||t===`name`)&&(r in n||r in nt))return!1;let i=B[t]||ge.attributeCheck instanceof Function&&ge.attributeCheck(t,e);return _e&&LS(oe,t)||V&&LS(se,t)?!0:i?Re[t]||LS(de,OS(r,le,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&kS(r,`data:`)===0&&Ie[e]||ve&&!LS(ce,OS(r,le,``))?!0:!r:Ft(e)&&Ot(pe.tagNameCheck,e)&&Ot(pe.attributeNameCheck,t,e)||t===`is`&&pe.allowCustomizedBuiltInElements&&Ot(pe.tagNameCheck,r)},Pt=VS({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),Ft=function(e){return!Pt[TS(e)]&&LS(ue,e)},It=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return j(r);case`TrustedScriptURL`:return ee(r)}return r},Lt=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!Ct(e)||(dt(e),!1)}catch{return mt(t,e),!1}},Rt=function(e,n){if(Et(L.beforeSanitizeAttributes,e,null),jt(e,n))return;let r=e.attributes;if(!r||Ct(e))return;B=At(L.uponSanitizeAttribute,B,fe,Ce);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:B,forceKeepAttr:void 0},a=r.length,o=et(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=et(s),d=l,f=s===`value`?d:AS(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,Et(L.uponSanitizeAttribute,e,i),f=i.attrValue,ke&&(u===`id`||u===`name`)&&kS(f,Ae)!==0&&(mt(s,e,n),f=Ae+f,p=!0),be&&LS(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){mt(s,e,n);continue}if(u===`attributename`&&DS(f,`href`)){mt(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){mt(s,e,n);continue}if(!ye&&LS(_C,f)){mt(s,e,n);continue}if(H&&(f=xt(f)),!Nt(o,u,f)){mt(s,e,n);continue}f=It(o,u,c,f),f!==d&&Lt(e,s,c,f)&&p&&xS(t.removed)}}Et(L.afterSanitizeAttributes,e,null),jt(e,n)},zt=function(e){let t=null,n=bt(e);for(Et(L.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Et(L.uponSanitizeShadowNode,t,null),Mt(t,e),Rt(t,e),wt(t.content)&&zt(t.content),C(t)===vC.element){let e=v(t);wt(e)&&(Bt(e),zt(e))}Et(L.afterSanitizeShadowDOM,e,null)},Bt=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){zt(e.shadow);continue}let n=e.node,r=C(n)===vC.element,i=g(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=x?x(n):null;if(typeof e==`string`&&et(e)===`template`){let e=n.content;wt(e)&&t.push({node:e,shadow:null})}}if(r){let e=v(n);wt(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(We=!e,We&&(e=`<!-->`),typeof e!=`string`&&!Tt(e)&&(e=WS(e),typeof e!=`string`))throw RS(`dirty is not a string, aborting`);if(!t.isSupported)return e;xe?(R=Se,B=Ce):it(n),(L.uponSanitizeElement.length>0||L.uponSanitizeAttribute.length>0)&&(R=US(R)),L.uponSanitizeAttribute.length>0&&(B=US(B)),t.removed=[];let c=Me&&typeof e!=`string`&&Tt(e);if(c){vt(e);let t=w(e);if(typeof t==`string`){let n=et(t);if(!R[n]||me[n])throw pt(e),RS(`root node is forbidden and cannot be sanitized in-place`)}if(Ct(e))throw pt(e),RS(`root node is clobbered and cannot be sanitized in-place`);try{Bt(e)}catch(t){throw pt(e),t}}else if(Tt(e))i=yt(`<!---->`),a=i.ownerDocument.importNode(e,!0),a.nodeType===vC.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),Bt(i);else{if(!Te&&!H&&!U&&e.indexOf(`<`)===-1)return T&&De?j(e):e;if(i=yt(e),!i)return Te?null:De?E:``}i&&we&&dt(i.firstChild);let l=c?e:i;try{let e=bt(l);for(;o=e.nextNode();)Mt(o,l),Rt(o,l),wt(o.content)&&zt(o.content)}catch(n){throw c&&(pt(e),yS(t.removed,e=>{e.element&>(e.element)})),n}if(c){let n=!1;if(yS(t.removed,t=>{t.element&&(t.element===e&&(n=!0),gt(t.element))}),n)throw RS(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return H&&St(e),e}if(Te){if(H&&St(i),Ee)for(s=te.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(B.shadowroot||B.shadowrootmode)&&(s=ne.call(r,s,!0)),s}let u=U?i.outerHTML:i.innerHTML;return U&&R[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&LS(fC,i.ownerDocument.doctype.name)&&(u=`<!DOCTYPE `+i.ownerDocument.doctype.name+`>
|
|
4389
4389
|
`+u),H&&(u=xt(u)),T&&De?j(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};it(e),xe=!0,Se=R,Ce=B},t.clearConfig=function(){tt=null,xe=!1,Se=null,Ce=null,T=D,E=``},t.isValidAttribute=function(e,t,n){tt||it({});let r=et(e),i=et(t);return Nt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&FS(L,e)&&SS(L[e],t)},t.removeHook=function(e,t){if(FS(L,e)){if(t!==void 0){let n=bS(L[e],t);return n===-1?void 0:CS(L[e],n,1)[0]}return xS(L[e])}},t.removeHooks=function(e){FS(L,e)&&(L[e]=[])},t.removeAllHooks=function(){L=wC()},t}var OC=DC();function kC(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var AC=kC();function jC(e){AC=e}var MC={exec:()=>null};function NC(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function PC(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(IC.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var FC=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),IC={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:NC(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:NC(e=>RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:NC(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:NC(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:NC(e=>RegExp(`^ {0,${e}}(?:</?(?:${ZC})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,`i`)),blockquoteBeginRegex:NC(e=>RegExp(`^ {0,${e}}>`))},LC=/^(?:[ \t]*(?:\n|$))+/,RC=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zC=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,BC=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,VC=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,HC=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,UC=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,WC=PC(UC).replace(/bull/g,HC).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),GC=PC(UC).replace(/bull/g,HC).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),KC=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,qC=/^[^\n]+/,JC=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,YC=PC(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,JC).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),XC=PC(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,HC).getRegex(),ZC=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,QC=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,$C=PC(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,QC).replace(`tag`,ZC).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ew=e=>PC(KC).replace(`hr`,BC).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,e).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,ZC).getRegex(),tw=ew(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),nw=ew(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),rw={blockquote:PC(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,nw).getRegex(),code:RC,def:YC,fences:zC,heading:VC,hr:BC,html:$C,lheading:WC,list:XC,newline:LC,paragraph:tw,table:MC,text:qC},iw=PC(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,BC).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,ZC).getRegex(),aw={...rw,lheading:GC,table:iw,paragraph:PC(KC).replace(`hr`,BC).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,iw).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,ZC).getRegex()},ow={...rw,html:PC(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,QC).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:MC,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:PC(KC).replace(`hr`,BC).replace(`heading`,` *#{1,6} *[^
|
|
4390
4390
|
]`).replace(`lheading`,WC).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},sw=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,cw=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,lw=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,uw=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,dw=/[\p{P}\p{S}]/u,fw=/[\s\p{P}\p{S}]/u,pw=/[^\s\p{P}\p{S}]/u,mw=PC(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,fw).getRegex(),hw=/[\p{Pi}\p{Ps}"']/u,gw=/(?!~)[\p{P}\p{S}]/u,_w=/(?!~)[\s\p{P}\p{S}]/u,vw=/(?:[^\s\p{P}\p{S}]|~)/u,yw=PC(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,FC?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),bw=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,xw=PC(bw,`u`).replace(/punct/g,dw).getRegex(),Sw=PC(bw,`u`).replace(/punct/g,gw).getRegex(),Cw=PC(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,hw).replace(/punct/g,dw).getRegex(),ww=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,Tw=PC(ww,`gu`).replace(/notPunctSpace/g,pw).replace(/punctSpace/g,fw).replace(/punct/g,dw).getRegex(),Ew=PC(ww,`gu`).replace(/notPunctSpace/g,vw).replace(/punctSpace/g,_w).replace(/punct/g,gw).getRegex(),Dw=PC(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,pw).replace(/punctSpace/g,fw).replace(/punct/g,dw).getRegex(),Ow=PC(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,pw).replace(/punctSpace/g,fw).replace(/punct/g,dw).getRegex(),kw=PC(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,pw).replace(/punctSpace/g,fw).replace(/punct/g,dw).getRegex(),Aw=PC(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,dw).getRegex(),jw=PC(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,pw).replace(/punctSpace/g,fw).replace(/punct/g,dw).getRegex(),Mw=PC(/\\(punct)/,`gu`).replace(/punct/g,dw).getRegex(),Nw=PC(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Pw=PC(QC).replace(`(?:-->|$)`,`-->`).getRegex(),Fw=PC(`^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,Pw).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Iw=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,Lw=PC(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,Iw).getRegex(),Rw=PC(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace(`label`,Lw).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),zw=PC(/^!?\[(label)\]\[(ref)\]/).replace(`label`,Lw).replace(`ref`,JC).getRegex(),Bw=PC(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,JC).getRegex(),Vw=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,Hw=PC(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace(`brackets`,Iw).getRegex(),Uw=PC(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,PC(/^!?\[(label)\]\[(ref)\]/).replace(`label`,Hw).replace(`ref`,Vw).getRegex()).replace(`nolink`,PC(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,Vw).getRegex()).getRegex(),Ww=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Gw=PC(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),Kw={_backpedal:MC,anyPunctuation:Mw,autolink:Nw,blockSkip:yw,br:lw,code:cw,del:MC,delLDelim:MC,delRDelim:MC,emStrongLDelim:xw,emStrongRDelimAst:Tw,emStrongRDelimUnd:Ow,escape:sw,link:Rw,nolink:Bw,punctuation:mw,reflink:zw,reflinkSearch:Uw,tag:Fw,text:uw,url:MC},qw={...Kw,emStrongLDelim:Cw,emStrongRDelimAst:Dw,emStrongRDelimUnd:kw,link:PC(/^!?\[(label)\]\((.*?)\)/).replace(`label`,Lw).getRegex(),reflink:PC(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,Lw).getRegex()},Jw={...Kw,emStrongRDelimAst:Ew,emStrongLDelim:Sw,delLDelim:Aw,delRDelim:jw,url:PC(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`emailProtocol`,Gw).replace(`protocol`,Ww).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:PC(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace(`protocol`,Ww).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},Yw={...Jw,br:PC(lw).replace(`{2,}`,`*`).getRegex(),text:PC(Jw.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},Xw={normal:rw,gfm:aw,pedantic:ow},Zw={normal:Kw,gfm:Jw,breaks:Yw,pedantic:qw},Qw={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},$w=e=>Qw[e];function eT(e,t){if(t){if(IC.escapeTest.test(e))return e.replace(IC.escapeReplace,$w)}else if(IC.escapeTestNoEncode.test(e))return e.replace(IC.escapeReplaceNoEncode,$w);return e}function tT(e){return e.replace(IC.numericCharacterReference,(e,t,n)=>{let r=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return r===0||r>1114111||r>=55296&&r<=57343?`�`:String.fromCodePoint(r)})}function nT(e){try{e=encodeURI(e).replace(IC.percentDecode,`%`)}catch{return null}return e}function rT(e,t){let n=e.replace(IC.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(IC.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``)}for(;r<n.length;r++)n[r]=n[r].trim().replace(IC.slashPipe,`|`);return n}function iT(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function aT(e){let t=e.split(`
|
|
@@ -4452,5 +4452,5 @@ ${this.parser.parse(e)}</blockquote>
|
|
|
4452
4452
|
${e}</tr>
|
|
4453
4453
|
`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
|
|
4454
4454
|
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${eT(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:r,autolink:i}){let a=i?eT(n,!0):this.parser.parseInline(r),o=nT(e);if(o===null)return a;e=eT(o,i);let s=`<a href="`+e+`"`;return t&&(s+=` title="`+eT(t)+`"`),s+=`>`+a+`</a>`,s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=nT(e);if(i===null)return eT(n);e=i;let a=`<img src="${eT(e)}" alt="${eT(n)}"`;return t&&(a+=` title="${eT(t)}"`),a+=`>`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:eT(e.text)}},hT=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},gT=class e{options;renderer;textRenderer;constructor(e){this.options=e||AC,this.options.renderer=this.options.renderer||new mT,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new hT}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(n!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`checkbox`,`html`,`def`,`paragraph`,`text`].includes(e.type)){t+=n||``;continue}}let i=r;switch(i.type){case`space`:t+=this.renderer.space(i);break;case`hr`:t+=this.renderer.hr(i);break;case`heading`:t+=this.renderer.heading(i);break;case`code`:t+=this.renderer.code(i);break;case`table`:t+=this.renderer.table(i);break;case`blockquote`:t+=this.renderer.blockquote(i);break;case`list`:t+=this.renderer.list(i);break;case`checkbox`:t+=this.renderer.checkbox(i);break;case`html`:t+=this.renderer.html(i);break;case`def`:t+=this.renderer.def(i);break;case`paragraph`:t+=this.renderer.paragraph(i);break;case`text`:t+=this.renderer.text(i);break;default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`checkbox`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`checkbox`:n+=t.checkbox(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},_T=class{options;block;constructor(e){this.options=e||AC}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?pT.lex:pT.lexInline}provideParser(e=this.block){return e?gT.parse:gT.parseInline}},vT=new class{defaults=kC();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=gT;Renderer=mT;TextRenderer=hT;Lexer=pT;Tokenizer=fT;Hooks=_T;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new mT(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new fT(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new _T;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=_T.passThroughHooks.has(n)?e=>{if(this.defaults.async&&_T.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return pT.lex(e,t??this.defaults)}parser(e,t){return gT.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?pT.lex:pT.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?gT.parse:gT.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?pT.lex:pT.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?gT.parse:gT.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`
|
|
4455
|
-
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+eT(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function yT(e,t){return vT.parse(e,t)}yT.options=yT.setOptions=function(e){return vT.setOptions(e),yT.defaults=vT.defaults,jC(yT.defaults),yT},yT.getDefaults=kC,yT.defaults=AC;function bT(...e){return vT.use(...e),yT.defaults=vT.defaults,jC(yT.defaults),yT}yT.use=bT,yT.walkTokens=function(e,t){return vT.walkTokens(e,t)},yT.parseInline=vT.parseInline,yT.Parser=gT,yT.parser=gT.parse,yT.Renderer=mT,yT.TextRenderer=hT,yT.Lexer=pT,yT.lexer=pT.lex,yT.Tokenizer=fT,yT.Hooks=_T,yT.parse=yT,yT.options,yT.setOptions,yT.walkTokens,yT.parseInline,gT.parse,pT.lex;var xT=!1;function ST(){xT||(xT=!0,OC.addHook(`afterSanitizeAttributes`,e=>{e instanceof Element&&e.tagName===`A`&&(e.setAttribute(`rel`,`noopener noreferrer`),e.setAttribute(`target`,`_blank`))}))}function CT(e){ST();let t=yT.parse(e,{async:!1,breaks:!0});return OC.sanitize(t,{ALLOWED_TAGS:[`p`,`br`,`strong`,`em`,`code`,`pre`,`ul`,`ol`,`li`,`a`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`blockquote`,`hr`,`del`,`table`,`thead`,`tbody`,`tr`,`th`,`td`],ALLOWED_ATTR:[`href`,`rel`,`target`],ALLOWED_URI_REGEXP:/^(?:https?:|mailto:)/i})}var wT=e=>Number.isFinite(e);function TT(e){let t=Math.floor(Math.log10(e)),n=e/10**t;return(n<=1?1:n<=2?2:n<=2.5?2.5:n<=5?5:10)*10**t}function ET(e,t,n=5){let r=wT(e)?e:0,i=wT(t)?t:r+1;r>i&&([r,i]=[i,r]),r===i&&(i=r+(Math.abs(r)||1));let a=TT((i-r)/Math.max(1,n-1)),o=Math.floor(r/a)*a,s=Math.ceil(i/a)*a,c=[];for(let e=o;e<=s+a/2;e+=a)c.push(Math.round(e*1e9)/1e9);return{min:o,max:s,ticks:c}}function DT(e,t){let[n,r]=e,[i,a]=t;return r===n?()=>i:e=>i+(e-n)/(r-n)*(a-i)}function OT(e){return e.map(([e,t],n)=>`${n===0?`M`:`L`}${e.toFixed(2)} ${t.toFixed(2)}`).join(` `)}function kT(e,t,n,r,i){let a=r=>{let i=r*Math.PI/180;return`${(e+n*Math.cos(i)).toFixed(2)} ${(t+n*Math.sin(i)).toFixed(2)}`},o=+(Math.abs(i-r)>180);return`M ${a(r)} A ${n} ${n} 0 ${o} 1 ${a(i)}`}function AT(e,t,n){return!wT(e)||!wT(t)||!wT(n)||n<=t?0:Math.min(1,Math.max(0,(e-t)/(n-t)))*240}function jT(e,t,n,r){let i=t.x-e.x,a=t.y-e.y,o=Math.hypot(i,a);if(o===0||o<=n+r)return{from:{...e},to:{...t}};let s=i/o,c=a/o;return{from:{x:e.x+s*n,y:e.y+c*n},to:{x:t.x-s*r,y:t.y-c*r}}}function MT(e,t,n){if(e<=0)return[];if(e===1)return[{x:t/2,y:n/2}];let r=Math.min(t,n)*.36;return Array.from({length:e},(i,a)=>{let o=-Math.PI/2+a*2*Math.PI/e;return{x:t/2+r*Math.cos(o),y:n/2+r*Math.sin(o)}})}var NT=e=>typeof e==`object`&&!!e&&!Array.isArray(e),PT=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,FT=e=>Array.isArray(e)?e:[],IT=e=>typeof e==`number`?Number.isFinite(e)?e:null:typeof e==`string`&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):null,LT=(e,t)=>e.length>t?e.slice(0,t)+`…`:e,RT=[`var(--accent)`,`#ffb454`,`#7b8cff`,`#5ef0b0`,`#ff6b7a`,`#c792ea`],zT=({text:e})=>e?(0,p.jsx)(`h3`,{className:`obj-title`,children:e}):null,BT=({text:e=`No data`})=>(0,p.jsx)(`p`,{className:`obj-empty`,children:e}),VT=400,HT=220,UT={l:44,r:12,t:10,b:28};function WT({props:e}){let t=e.kind===`bar`||e.kind===`area`?e.kind:`line`,n=FT(e.labels).slice(0,120).map(PT),r=FT(e.series).slice(0,6).map((e,t)=>{let n=NT(e)?e:{},r=FT(n.values).slice(0,120).map((e,t)=>({idx:t,v:IT(e)})).filter(e=>e.v!==null);return{name:PT(n.name)||`series ${t+1}`,points:r}}).filter(e=>e.points.length>0);if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{})]});let i=r.flatMap(e=>e.points.map(e=>e.v)),a=Math.min(...i),o=Math.max(...i),s=ET(t===`line`?a:Math.min(0,a),t===`line`?o:Math.max(0,o),5),c=Math.max(n.length,...r.map(e=>e.points[e.points.length-1].idx+1),2),l=DT([s.min,s.max],[HT-UT.b,UT.t]),u=DT([0,c-1],[UT.l,VT-UT.r]),d=(VT-UT.l-UT.r)/c,f=Math.max(1,d*.7/r.length),m=(e,t)=>UT.l+e*d+d*.15+t*f,h=Math.max(1,Math.ceil(c/6)),g=PT(e.unit);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-chart`,viewBox:`0 0 ${VT} ${HT}`,role:`img`,"aria-label":PT(e.title)||`chart`,children:[s.ticks.map(e=>(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:`grid`,x1:UT.l,x2:VT-UT.r,y1:l(e),y2:l(e)}),(0,p.jsxs)(`text`,{className:`tick`,x:UT.l-6,y:l(e)+3,textAnchor:`end`,children:[e,g&&e===s.max?g:``]})]},e)),Array.from({length:c},(e,t)=>t).filter(e=>e%h===0&&n[e]).map(e=>(0,p.jsx)(`text`,{className:`tick`,x:t===`bar`?m(e,0)+f*r.length/2:u(e),y:212,textAnchor:`middle`,children:LT(n[e],8)},e)),r.map((e,n)=>{let r=RT[n%RT.length];if(t===`bar`)return(0,p.jsx)(`g`,{children:e.points.map(e=>(0,p.jsx)(`rect`,{className:`bar`,x:m(e.idx,n),y:Math.min(l(e.v),l(0)),width:f,height:Math.abs(l(e.v)-l(0)),fill:r},e.idx))},n);let i=e.points.map(e=>[u(e.idx),l(e.v)]),a=OT(i),o=`${a} L${i[i.length-1][0].toFixed(2)} ${l(s.min).toFixed(2)} L${i[0][0].toFixed(2)} ${l(s.min).toFixed(2)} Z`;return(0,p.jsxs)(`g`,{children:[t===`area`&&(0,p.jsx)(`path`,{className:`series-area`,d:o,fill:r,opacity:.18}),(0,p.jsx)(`path`,{className:`series-line`,d:a,fill:`none`,stroke:r,strokeWidth:2,strokeLinejoin:`round`})]},n)})]}),r.length>1&&(0,p.jsx)(`ul`,{className:`legend`,children:r.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`i`,{style:{background:RT[t%RT.length]}}),(0,p.jsx)(`span`,{children:e.name})]},t))})]})}function GT({props:e}){let t=IT(e.min)??0,n=IT(e.max)??100,r=IT(e.value)??t,i=AT(r,t,n),a=i/240;return(0,p.jsxs)(`div`,{className:`obj-gauge ${a>.95?`gauge-crit`:a>.8?`gauge-warn`:``}`,children:[(0,p.jsxs)(`svg`,{viewBox:`0 0 200 150`,role:`img`,"aria-label":`${PT(e.label)} ${r}`,children:[(0,p.jsx)(`path`,{className:`track`,d:kT(100,100,70,150,390),fill:`none`,strokeWidth:12,strokeLinecap:`round`}),i>0&&(0,p.jsx)(`path`,{className:`value`,d:kT(100,100,70,150,150+i),fill:`none`,strokeWidth:12,strokeLinecap:`round`})]}),(0,p.jsxs)(`div`,{className:`gauge-read`,children:[(0,p.jsx)(`span`,{className:`gauge-value`,children:String(Math.round(r*100)/100)}),PT(e.unit)&&(0,p.jsx)(`small`,{className:`gauge-unit`,children:PT(e.unit)})]}),(0,p.jsx)(`span`,{className:`obj-label`,children:PT(e.label)})]})}function KT({props:e}){let t=FT(e.items).slice(0,30).map(e=>NT(e)?e:{}).map(e=>({time:PT(e.time),title:PT(e.title),detail:PT(e.detail)})).filter(e=>e.title||e.time);return t.length===0?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{text:`Nothing to show`})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(`ol`,{className:`obj-timeline`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`time`,{children:e.time}),(0,p.jsx)(`strong`,{children:e.title}),e.detail&&(0,p.jsx)(`span`,{children:e.detail})]},t))})]})}var qT=400,JT=300,YT=12;function XT({props:e}){let t=(0,l.useId)(),n=new Set,r=[];for(let t of FT(e.nodes)){let e=NT(t)?t:{},i=PT(e.id);if(i&&!n.has(i)&&(n.add(i),r.push({id:i,label:PT(e.label)||i}),r.length>=40))break}if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{text:`Nothing to show`})]});let i=new Map(r.map((e,t)=>[e.id,MT(r.length,qT,JT)[t]])),a=[];for(let t of FT(e.edges)){let e=NT(t)?t:{},n=PT(e.from),r=PT(e.to);if(i.has(n)&&i.has(r)&&n!==r&&(a.push({from:n,to:r,label:PT(e.label)}),a.length>=80))break}return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-graph`,viewBox:`0 0 ${qT} ${JT}`,role:`img`,"aria-label":PT(e.title)||`graph`,children:[(0,p.jsx)(`defs`,{children:(0,p.jsx)(`marker`,{id:t,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`,children:(0,p.jsx)(`path`,{d:`M0 0 L10 5 L0 10 z`,className:`arrow`})})}),a.map((e,n)=>{let{from:r,to:a}=jT(i.get(e.from),i.get(e.to),14,17),o=(r.x+a.x)/2+(qT/2-(r.x+a.x)/2)*.25,s=(r.y+a.y)/2+(JT/2-(r.y+a.y)/2)*.25;return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`path`,{className:`edge`,d:`M ${r.x.toFixed(1)} ${r.y.toFixed(1)} Q ${o.toFixed(1)} ${s.toFixed(1)} ${a.x.toFixed(1)} ${a.y.toFixed(1)}`,fill:`none`,markerEnd:`url(#${t})`}),e.label&&(0,p.jsx)(`text`,{className:`edge-label`,x:o,y:s,textAnchor:`middle`,children:LT(e.label,12)})]},n)}),r.map(e=>{let t=i.get(e.id);return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`circle`,{className:`node`,cx:t.x,cy:t.y,r:YT}),(0,p.jsx)(`text`,{className:`node-label`,x:t.x,y:t.y+26,textAnchor:`middle`,children:LT(e.label,18)})]},e.id)})]})]})}var ZT=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,QT=e=>Array.isArray(e)?e:[],$T=e=>typeof e==`object`&&e?e:{},eE=/^\/api\/media\/[0-9a-f]{32}$/,tE=e=>typeof e==`string`&&eE.test(e)?e:null,nE=/^\/api\/video\/[0-9a-f]{32}$/,rE=e=>typeof e==`string`&&nE.test(e)?e:null,iE=({props:e})=>ZT(e.title)?(0,p.jsx)(`h3`,{className:`obj-title`,children:ZT(e.title)}):null;function aE({props:e}){let t=(0,l.useMemo)(()=>CT(ZT(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(iE,{props:e}),(0,p.jsx)(`div`,{className:`obj-md obj-doc`,dangerouslySetInnerHTML:{__html:t}})]})}function oE({props:e}){let t=Math.min(100,Math.max(0,Number(e.value)||0));return(0,p.jsxs)(`div`,{className:`obj-progress`,children:[(0,p.jsxs)(`div`,{className:`obj-progress-head`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:ZT(e.label)}),(0,p.jsxs)(`span`,{className:`obj-progress-pct`,children:[Math.round(t),`%`]})]}),(0,p.jsx)(`div`,{className:`obj-progress-bar`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(t),"aria-label":ZT(e.label)||`Progress`,children:(0,p.jsx)(`i`,{style:{width:`${t}%`}})}),ZT(e.detail)&&(0,p.jsx)(`span`,{className:`obj-progress-detail`,children:ZT(e.detail)})]})}function sE({props:e}){let t=QT(e.items).map(e=>$T(typeof e==`object`&&e?e:{text:e})),n=t.filter(e=>e.done===!0).length;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(iE,{props:e}),(0,p.jsx)(`ul`,{className:`obj-checklist`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{className:e.done===!0?`done`:void 0,children:[(0,p.jsx)(`span`,{className:`box`,"aria-hidden":`true`,children:e.done===!0?`✓`:``}),(0,p.jsx)(`span`,{children:ZT(e.text)})]},t))}),t.length>0&&(0,p.jsxs)(`small`,{className:`obj-progress-detail`,children:[n,` of `,t.length,` done`]})]})}function cE({props:e}){return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(iE,{props:e}),(0,p.jsx)(`dl`,{className:`obj-kv`,children:QT(e.rows).map((e,t)=>{let n=$T(e);return(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`dt`,{children:ZT(n.key)}),(0,p.jsx)(`dd`,{children:ZT(n.value)})]},t)})})]})}var lE=e=>String(Math.floor(e)).padStart(2,`0`);function uE(e){let t=Math.max(0,Math.ceil(e));return`${lE(t/3600)}:${lE(t%3600/60)}:${lE(t%60)}`}function dE({props:e}){let t=(0,l.useRef)(null);if(t.current===null){let n=typeof e.to==`string`?Date.parse(e.to):NaN,r=Number(e.seconds);t.current=Number.isFinite(n)?n:Date.now()+(Number.isFinite(r)?r:0)*1e3}let[n,r]=(0,l.useState)(Date.now());(0,l.useEffect)(()=>{let e=setInterval(()=>r(Date.now()),250);return()=>clearInterval(e)},[]);let i=(t.current-n)/1e3;return(0,p.jsxs)(`div`,{className:`obj-countdown${i<=0?` done`:``}`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:ZT(e.title)||ZT(e.label)}),(0,p.jsx)(`span`,{className:`obj-countdown-time`,role:`timer`,children:uE(i)})]})}function fE({props:e}){let t=tE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(iE,{props:e}),t?(0,p.jsx)(`img`,{src:t,alt:ZT(e.title)||`Picture`,loading:`lazy`}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This picture is not available.`})]})}function pE({src:e,web:t,title:n}){let[r,i]=(0,l.useState)(t?`loading`:`ready`);return r===`failed`?(0,p.jsx)(`p`,{className:`obj-empty`,children:`This video could not be played. Ask Friend to try again, or to play it in a window on the PC.`}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`video`,{src:e,controls:!0,playsInline:!0,autoPlay:t,preload:t?`auto`:`metadata`,"aria-label":n,onLoadedData:()=>i(`ready`),onError:()=>i(`failed`)}),t&&r===`loading`&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Preparing the video…`})]})}var mE=/^[A-Za-z0-9_-]{11}$/;function hE({id:e,start:t,title:n}){let[r,i]=(0,l.useState)(!1),a=new URLSearchParams({autoplay:`1`,rel:`0`,playsinline:`1`,modestbranding:`1`});return t>0&&a.set(`start`,String(t)),(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{className:`obj-youtube`,src:`https://www.youtube-nocookie.com/embed/${e}?${a.toString()}`,title:n,allow:`autoplay; encrypted-media; fullscreen; picture-in-picture`,allowFullScreen:!0,referrerPolicy:`strict-origin-when-cross-origin`,onLoad:()=>i(!0)}),!r&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Loading the player…`})]})}function gE({props:e}){if(e.embed!==void 0){let t=typeof e.embed==`string`&&mE.test(e.embed)?e.embed:null,n=typeof e.start==`number`&&e.start>0&&e.start<=86400?Math.floor(e.start):0;return(0,p.jsxs)(`div`,{className:`obj-media obj-media-fill`,children:[(0,p.jsx)(iE,{props:e}),t?(0,p.jsx)(hE,{id:t,start:n,title:ZT(e.title)||`YouTube video`},`${t}-${n}`):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}let t=rE(e.src),n=t??tE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(iE,{props:e}),n?(0,p.jsx)(pE,{src:n,web:t!==null,title:ZT(e.title)||`Video`},n):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}function _E({props:e}){let t=tE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media obj-pdf`,children:[(0,p.jsx)(iE,{props:e}),t?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{src:t,title:ZT(e.title)||`Document`}),(0,p.jsx)(`a`,{className:`obj-open`,href:t,target:`_blank`,rel:`noopener noreferrer`,children:`Open in a new tab`})]}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This document is not available.`})]})}function vE({props:e}){let t=QT(e.items).map($T).filter(e=>tE(e.src)),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1)),a=t[i];if(!a)return(0,p.jsx)(`p`,{className:`obj-empty`,children:`Nothing to show.`});let o=tE(a.src),s=a.kind===`video`;return(0,p.jsxs)(`div`,{className:`obj-media obj-gallery`,children:[(0,p.jsx)(iE,{props:e}),s?(0,p.jsx)(`video`,{src:o,controls:!0,playsInline:!0,preload:`metadata`},o):(0,p.jsx)(`img`,{src:o,alt:ZT(a.caption)||`Picture ${i+1}`},o),(0,p.jsxs)(`div`,{className:`obj-gallery-bar`,children:[(0,p.jsx)(`button`,{type:`button`,"aria-label":`Previous`,disabled:t.length<2,onClick:()=>r((i+t.length-1)%t.length),children:`‹`}),(0,p.jsxs)(`span`,{children:[ZT(a.caption),(0,p.jsxs)(`small`,{children:[i+1,` / `,t.length]})]}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Next`,disabled:t.length<2,onClick:()=>r((i+1)%t.length),children:`›`})]})]})}var yE=[`default-src 'none'`,`script-src 'unsafe-inline'`,`style-src 'unsafe-inline'`,`img-src data: blob:`,`form-action 'none'`,`base-uri 'none'`].join(`; `),bE=`html,body{margin:0;min-height:100%;background:#050b10;color:var(--ink,#d8f6ff);font:15px/1.5 var(--ui,system-ui,sans-serif)}`,xE=[`--accent`,`--ink`,`--muted`,`--ok`,`--warn`,`--bad`,`--glass`,`--edge`,`--ui`,`--mono`],SE=/^[\w\s#().,%'"/-]+$/;function CE(){if(typeof document>`u`)return``;let e=getComputedStyle(document.documentElement),t=xE.map(t=>[t,e.getPropertyValue(t).trim()]).filter(([,e])=>e&&SE.test(e));return t.length?`:root{${t.map(([e,t])=>`${e}:${t}`).join(`;`)}}`:``}function wE(e,t=``){return`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${yE}"><meta name="viewport" content="width=device-width,initial-scale=1"><style>${t}${bE}</style></head><body>${e}</body></html>`}function TE({props:e}){let t=typeof e.html==`string`?e.html:``,n=typeof e.title==`string`?e.title:``,r=(0,l.useMemo)(()=>wE(t,CE()),[t]);return(0,p.jsxs)(`div`,{className:`obj-sandbox`,children:[n&&(0,p.jsx)(`h3`,{className:`obj-title`,children:n}),(0,p.jsx)(`iframe`,{title:n||`Page made by Friend`,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,allow:``,srcDoc:r})]})}var EE=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,DE=e=>Array.isArray(e)?e:[];function OE({props:e}){let t=(0,l.useMemo)(()=>CT(EE(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`div`,{className:`obj-md`,dangerouslySetInnerHTML:{__html:t}})]})}function kE({props:e}){return(0,p.jsxs)(`div`,{className:`obj-stat`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:EE(e.label)}),(0,p.jsxs)(`span`,{className:`obj-value`,children:[(0,p.jsx)(`span`,{children:EE(e.value)}),EE(e.unit)&&(0,p.jsx)(`small`,{children:EE(e.unit)})]}),EE(e.delta)&&(0,p.jsx)(`span`,{className:`obj-delta`,children:EE(e.delta)})]})}function AE({props:e}){return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`ul`,{className:`obj-list`,children:DE(e.items).map((e,t)=>{let n=typeof e==`object`&&e?e:{text:e};return(0,p.jsx)(`li`,{className:n.done?`done`:void 0,children:EE(n.text)},t)})})]})}function jE({props:e}){let t=DE(e.columns),n=DE(e.rows);return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`div`,{className:`obj-table-wrap`,children:(0,p.jsxs)(`table`,{className:`obj-table`,children:[(0,p.jsx)(`thead`,{children:(0,p.jsx)(`tr`,{children:t.map((e,t)=>(0,p.jsx)(`th`,{children:EE(e)},t))})}),(0,p.jsx)(`tbody`,{children:n.map((e,t)=>(0,p.jsx)(`tr`,{children:DE(e).map((e,t)=>(0,p.jsx)(`td`,{children:EE(e)},t))},t))})]})})]})}function ME({props:e}){return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`pre`,{className:`obj-code`,"data-lang":EE(e.language),children:(0,p.jsx)(`code`,{children:EE(e.code)})})]})}function NE({part:e}){let t=typeof e==`object`&&e?e:{},n=typeof t.type==`string`?t.type:``;if(n===`group`||n===`tabs`||n===`sandbox`)return null;let r=IE[n];return r?(0,p.jsx)(`div`,{className:`obj-part obj-part-${n}`,children:(0,p.jsx)(r,{props:typeof t.props==`object`&&t.props!==null?t.props:{}})}):null}function PE({props:e}){let t=e.layout===`row`||e.layout===`column`?e.layout:`grid`;return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`div`,{className:`obj-group obj-group-${t}`,children:DE(e.items).map((e,t)=>(0,p.jsx)(NE,{part:e},t))})]})}function FE({props:e}){let t=DE(e.tabs).map(e=>typeof e==`object`&&e?e:{}),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1));return(0,p.jsxs)(p.Fragment,{children:[EE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:EE(e.title)}),(0,p.jsx)(`div`,{className:`obj-tabs`,role:`tablist`,children:t.map((e,t)=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t===i,className:t===i?`on`:void 0,onClick:()=>r(t),children:EE(e.title)||`Tab ${t+1}`},t))}),t[i]&&(0,p.jsx)(NE,{part:t[i]})]})}var IE={card:OE,stat:kE,list:AE,table:jE,code:ME,chart:WT,gauge:GT,timeline:KT,graph:XT,sandbox:TE,markdown:aE,image:fE,video:gE,pdf:_E,gallery:vE,group:PE,tabs:FE,progress:oE,checklist:sE,countdown:dE,kv:cE};function LE(e,t){let n=new Map(t.map(e=>[e.id,e])),r=[],i=new Set;for(let t of e){if(i.has(t.object.id))continue;i.add(t.object.id);let e=n.get(t.object.id);r.push(e?{object:e,leaving:!1}:{object:t.object,leaving:!0})}for(let e of t)i.has(e.id)||(i.add(e.id),r.push({object:e,leaving:!1}));return r}function RE(e,t){let[n,r]=(0,l.useState)(()=>e.map(e=>({object:e,leaving:!1}))),i=(0,l.useRef)(new Map);return(0,l.useEffect)(()=>{r(n=>{let a=LE(n,e),o=new Set(n.filter(e=>e.leaving).map(e=>e.object.id));for(let e of a){let n=i.current.get(e.object.id);if(!e.leaving)n&&clearTimeout(n),i.current.delete(e.object.id);else if(!o.has(e.object.id)&&!n){let n=e.object.id;i.current.set(n,setTimeout(()=>{i.current.delete(n),r(e=>e.filter(e=>!(e.object.id===n&&e.leaving)))},Math.max(t,0)))}}return t<=0?a.filter(e=>!e.leaving):a})},[e,t]),(0,l.useEffect)(()=>()=>{for(let e of i.current.values())clearTimeout(e);i.current.clear()},[]),n}var zE=.12,BE=.1,VE=.02,HE=(e,t,n)=>Math.min(Math.max(e,t),n);function UE(e){let t=HE(e.w,zE,1),n=HE(e.h,BE,1);return{x:HE(e.x,0,1-t),y:HE(e.y,0,1-n),w:t,h:n}}function WE(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();return n.width<=0||n.height<=0?null:UE({x:(r.left-n.left)/n.width,y:(r.top-n.top)/n.height,w:r.width/n.width,h:r.height/n.height})}function GE(e,t,n){let r=(0,l.useRef)(null),[i,a]=(0,l.useState)(null),o=(0,l.useCallback)((n,r)=>{let i=UE(r);t({type:`object.place`,id:n,placement:{x:i.x,y:i.y,w:i.w,h:i.h}}),e({type:`stage.move`,objectId:n,rect:i})},[e,t]),s=(0,l.useCallback)((e,t,i)=>{if(e.pointerType===`mouse`&&e.button!==0)return;let o=n(),s=e.currentTarget.closest(`[data-object]`);if(!o||!s||r.current)return;let c=WE(s,o);if(!c)return;let l=o.getBoundingClientRect();r.current={id:t.id,mode:i,pointer:e.pointerId,startX:e.clientX,startY:e.clientY,from:c,stageW:l.width,stageH:l.height};try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}e.stopPropagation(),e.preventDefault(),a({id:t.id,box:c})},[n]),c=(e,t)=>{let n=(t.clientX-e.startX)/e.stageW,r=(t.clientY-e.startY)/e.stageH;return e.mode===`move`?UE({...e.from,x:e.from.x+n,y:e.from.y+r}):UE({...e.from,w:e.from.w+n,h:e.from.h+r})};return{preview:i,begin:s,move:(0,l.useCallback)(e=>{let t=r.current;t&&t.pointer===e.pointerId&&a({id:t.id,box:c(t,e)})},[]),end:(0,l.useCallback)((e,t)=>{let n=r.current;n&&n.pointer===e.pointerId&&(r.current=null,a(null),t||o(n.id,c(n,e)))},[o]),key:(0,l.useCallback)((e,t)=>{let r={ArrowLeft:[-.02,0],ArrowRight:[VE,0],ArrowUp:[0,-.02],ArrowDown:[0,VE]}[e.key],i=n(),a=e.currentTarget.closest(`[data-object]`);if(!r||!i||!a)return;let s=WE(a,i);s&&(e.preventDefault(),o(t.id,e.shiftKey?{...s,w:s.w+r[0],h:s.h+r[1]}:{...s,x:s.x+r[0],y:s.y+r[1]}))},[o,n])}}function KE(e,t){if(e===`auto`)return{position:`relative`};if(t.w<600)return{position:`relative`,width:`100%`};let[n,r,i,a]=typeof e==`string`?lu[e]:[e.x*100,e.y*100,e.w*100,e.h*100],o={position:`absolute`,left:`${n}%`,top:`${r}%`,width:`${i}%`};return e===`top`||e===`bottom`?{...o,maxHeight:`${a}%`}:{...o,height:`${a}%`}}var qE=350,JE=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,YE=class extends l.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?null:this.props.children}};function XE(){let e=()=>({w:window.innerWidth,h:window.innerHeight}),[t,n]=(0,l.useState)(e);return(0,l.useEffect)(()=>{let t=()=>n(e());return window.addEventListener(`resize`,t),()=>window.removeEventListener(`resize`,t)},[]),t}var ZE=350;function QE({state:e,send:t,dispatch:n,voice:r,slash:i,onMenu:a}){let o=XE(),[s,c]=(0,l.useState)(0),[u,d]=(0,l.useState)(!1),f=ae(),m=o.w<600,h=e.scene===`focus`||e.scene===`multi`,g={"--accent":e.mood.accent,"--intensity":e.mood.intensity},_=e.voice.mode,v=_===`listening`?`listening`:_===`speaking`?`speaking`:_===`transcribing`?`thinking`:e.presence.state,y=jx(e.look.reactivity),b=Math.min(1,(_===`listening`||_===`speaking`?e.voice.level:e.presence.amplitude)*y),x=(0,l.useRef)({timer:null,down:!1,talking:!1,id:null}),S=e=>{if(!(e.target===e.currentTarget||e.target.closest(`[data-presence]`))||e.pointerType===`mouse`&&e.button!==0)return;let t=x.current;if(!(t.down&&t.id!==null&&e.pointerId!==t.id)){t.timer&&clearTimeout(t.timer),t.down=!0,t.talking=!1,t.id=typeof e.pointerId==`number`?e.pointerId:null;try{t.id!==null&&e.currentTarget.setPointerCapture?.(t.id)}catch{}t.timer=r?setTimeout(()=>{t.down&&(t.talking=!0,r.pressStart())},ZE):null}},C=(e,t)=>{let n=x.current;n.down&&(n.id===null||typeof e.pointerId!=`number`||e.pointerId===n.id)&&(n.down=!1,n.id=null,n.timer&&clearTimeout(n.timer),n.timer=null,n.talking?(n.talking=!1,t?r?.blur?.():r?.pressEnd()):t||c(e=>e+1))},w=(0,l.useRef)(null),T=GE(t,n,()=>w.current),E=RE(e.objects,JE()?0:qE),D=E.filter(e=>e.object.layer===`overlay`),O=E.filter(e=>e.object.layer!==`overlay`&&e.object.placement===`auto`),k=E.filter(e=>e.object.layer!==`overlay`&&e.object.placement!==`auto`),A=({object:e,leaving:r})=>{let i=IE[e.type];if(!i)return null;let a=e.layer===`overlay`,s=!m&&!r&&!a,c=T.preview?.id===e.id?T.preview.box:null,l=c?{x:c.x,y:c.y,w:c.w,h:c.h}:e.placement;return(0,p.jsxs)(`section`,{"data-object":e.id,className:`obj glass${e.style===`alert`?` alert`:``}${a?` overlay`:``}${e.pinned?` pinned`:``}${c?` dragging`:``}${r?` leaving`:``}`,style:a?void 0:KE(l,o),children:[s&&(0,p.jsx)(`div`,{className:`obj-grip`,role:`button`,tabIndex:0,"aria-label":`Move ${e.id}. Drag, or use the arrow keys; hold Shift to resize.`,onPointerDown:t=>T.begin(t,e,`move`),onPointerMove:T.move,onPointerUp:e=>T.end(e,!1),onPointerCancel:e=>T.end(e,!0),onKeyDown:t=>T.key(t,e)}),!a&&(0,p.jsx)(`button`,{className:`obj-pin${e.pinned?` on`:``}`,"aria-label":e.pinned?`Unpin ${e.id}`:`Pin ${e.id} to the screen`,"aria-pressed":!!e.pinned,title:e.pinned?`Pinned: stays on the screen. Click to unpin.`:`Pin: keep this on the screen.`,disabled:r,onClick:()=>t({type:`stage.pin`,objectId:e.id,pinned:!e.pinned}),children:(0,p.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:e.pinned?`currentColor`:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(0,p.jsx)(`path`,{d:`M12 17v5M9 3h6l-1 7 3 3H7l3-3-1-7z`})})}),(0,p.jsx)(`button`,{className:`obj-close`,"aria-label":`Dismiss ${e.id}`,title:e.pinned?`Remove this widget`:`Dismiss`,disabled:r,onClick:()=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})},children:`×`}),s&&(0,p.jsx)(`div`,{className:`obj-resize`,"aria-hidden":`true`,onPointerDown:t=>T.begin(t,e,`resize`),onPointerMove:T.move,onPointerUp:e=>T.end(e,!1),onPointerCancel:e=>T.end(e,!0)}),(0,p.jsx)(YE,{children:(0,p.jsx)(i,{props:e.props})})]},e.id)};return(0,p.jsxs)(`div`,{ref:w,"data-testid":`stage`,className:`stage`,style:g,onPointerDown:S,onPointerUp:e=>C(e,!1),onPointerCancel:e=>C(e,!0),onContextMenu:e=>r&&e.preventDefault(),children:[e.look.ambient&&(0,p.jsx)(`div`,{className:`ambient`,"aria-hidden":`true`,style:{opacity:.35+.65*e.mood.intensity}}),(0,p.jsx)(Ax,{state:v,amplitude:b,pulse:e.presence.pulse,mode:h?`corner`:`full`,accent:e.mood.accent,style:e.presence.style,intensity:e.mood.intensity,scale:e.look.size}),(0,p.jsxs)(`div`,{className:m?`objects objects-stack`:`objects`,style:{zIndex:10},children:[O.length>0&&(0,p.jsx)(`div`,{className:`auto-grid`,children:O.map(A)}),k.map(A)]}),D.length>0&&(0,p.jsxs)(`div`,{className:`overlay-layer`,"data-testid":`overlay`,children:[(0,p.jsx)(`div`,{className:`overlay-backdrop`,onClick:()=>D.forEach(({object:e})=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})})}),D.map(A)]}),e.look.captions&&e.captions&&(0,p.jsx)(`p`,{className:`captions captions-${e.look.captionSize}${e.captionDone?` done`:``}`,"aria-live":`polite`,children:e.captions}),f&&r&&!u&&(0,p.jsx)($x,{voice:r,mode:_,onType:()=>c(e=>e+1),onMenu:()=>a?.()}),(0,p.jsx)(Xx,{requestOpen:s,slash:i,onOpenChange:d,onSend:e=>t({type:`chat.send`,text:e})})]})}function $E(){let e=()=>Math.random().toString(36).slice(2,12)+Date.now().toString(36);try{let t=sessionStorage.getItem(`friend.tab`);return t||(t=e(),sessionStorage.setItem(`friend.tab`,t)),t}catch{return e()}}function eD(){return`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`}function tD(e=eD()){let t=null,n=`connecting`,r=!1,i=0,a=!1,o=$E(),s=null,c=new Set,l=new Set,u=e=>{n=e,l.forEach(t=>t(e))};function d(){if(r)return;u(`connecting`);let n=new WebSocket(`${e}${e.includes(`?`)?`&`:`?`}tab=${o}${a?`&takeover=1`:``}`);t=n,n.onopen=()=>{i=0,a=!1,u(`open`)},n.onmessage=e=>{try{let t=JSON.parse(String(e.data));c.forEach(e=>e(t))}catch{}},n.onclose=e=>{if(!r){if(e.code===4401)return u(`unauthorized`);if(e.code===4409||e.code===4410)return u(`elsewhere`);u(`closed`),s=setTimeout(d,Math.min(500*2**i++,8e3))}},n.onerror=()=>{}}return d(),{send(e){t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},onMessage(e){return c.add(e),()=>c.delete(e)},onState(e){return l.add(e),()=>l.delete(e)},state:()=>n,takeOver(){r||n!==`elsewhere`||(a=!0,i=0,d())},close(){r=!0,s&&clearTimeout(s),t?.close()}}}var nD={scene:`conversation`,objects:[],captions:``,captionDone:!0,presence:{state:`idle`,style:`sphere`,amplitude:0,pulse:0},mood:{accent:`#3fd8ff`,intensity:.6},approval:null,alerts:[],connection:`connecting`,chat:[],chatLive:!1,view:`companion`,look:{size:1,reactivity:.7,ambient:!0,captions:!0,captionSize:`medium`},viewKnown:!1,busy:!1,activity:null,deviceOnline:!1,voice:{mode:`idle`,level:0,available:!1,enrolled:!1},challenge:null,camera:{enabled:!1,stream:null},speaker:null,ownerName:``,assistantName:``,hud:null,music:null,hostMusic:null,musicCmd:null,uiOpen:null},rD=200,iD=e=>e.length>rD?e.slice(-200):e,aD=0,oD=e=>Math.min(1,Math.max(0,e));function sD(e,t){switch(t.cmd){case`scene`:return{...e,scene:t.mode};case`show`:{let n=e.objects.findIndex(e=>e.id===t.object.id),r=n===-1?[...e.objects,t.object]:e.objects.map((e,r)=>r===n?t.object:e);return{...e,objects:r}}case`update`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,props:{...e.props,...t.props}}:e)};case`hide`:return{...e,objects:e.objects.filter(e=>e.id!==t.id)};case`clear`:return{...e,objects:e.objects.filter(e=>e.pinned),scene:`conversation`};case`pin`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,pinned:!0}:e)};case`unpin`:return{...e,objects:e.objects.map(e=>e.id===t.id?(({pinned:e,...t})=>t)(e):e)};case`place`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,placement:t.placement}:e)};case`presence`:return{...e,presence:{...e.presence,state:t.state??e.presence.state,style:t.style??e.presence.style}};case`mood`:return{...e,mood:{accent:t.accent??e.mood.accent,intensity:t.intensity??e.mood.intensity}}}}function cD(e,t){let n=t;if(n&&typeof n==`object`){if(n.type===`conn`)return{...e,connection:n.value};if(n.type===`chat.seed`){let t=Array.isArray(n.lines)?n.lines:[];return e.chat.length===0?{...e,chat:iD(t)}:{...e,chat:iD([...t,...e.chat])}}if(n.type===`alert.add`)return{...e,alerts:[...e.alerts.slice(-3),{id:++aD,level:n.level,text:n.text}]};if(n.type===`camera.enable`)return{...e,camera:{enabled:n.value,stream:n.value?e.camera.stream:null}};if(n.type===`camera.open`)return{...e,camera:{...e.camera,stream:n.stream}};if(n.type===`camera.closed`)return{...e,camera:{...e.camera,stream:null}};if(n.type===`challenge.dismiss`)return e.challenge?.id===n.id?{...e,challenge:null}:e;if(n.type===`voice.mode`)return{...e,voice:{...e.voice,mode:n.mode,level:n.mode===`idle`?0:e.voice.level}};if(n.type===`voice.level`){let t=Number.isFinite(n.level)?Math.min(1,Math.max(0,n.level)):0;return{...e,voice:{...e.voice,level:t}}}if(n.type===`object.dismiss`)return{...e,objects:e.objects.filter(e=>e.id!==n.id)};if(n.type===`object.place`)return{...e,objects:e.objects.map(e=>e.id===n.id?{...e,placement:n.placement}:e)};if(n.type===`alert.dismiss`)return{...e,alerts:e.alerts.filter(e=>e.id!==n.id)}}let r=Mu.safeParse(t);if(!r.success)return e;let i=r.data;switch(i.type){case`snapshot`:return{...e,scene:i.stage.scene,objects:i.stage.objects,presence:{...e.presence,state:i.stage.presence.state,style:i.stage.presence.style},mood:i.stage.mood,approval:i.pendingApproval??null};case`stage`:return sD(e,i.command);case`chat.user`:return{...e,chat:iD([...e.chat,{role:`user`,text:i.text}]),chatLive:!1};case`ui.open`:return{...e,uiOpen:{n:(e.uiOpen?.n??0)+1,...i.integration?{integration:i.integration}:{}}};case`ui`:return{...e,view:i.view,look:i.look??e.look,ownerName:i.ownerName??e.ownerName,assistantName:i.assistantName??e.assistantName,hud:i.hud??e.hud,music:i.music??e.music,viewKnown:!0};case`music.host`:return{...e,hostMusic:i.state};case`music.command`:{let{type:t,...n}=i;return{...e,musicCmd:{n:(e.musicCmd?.n??0)+1,command:n}}}case`caption.delta`:{let t=e.captionDone,n=e.chat.at(-1),r=e.chatLive&&n?.role===`assistant`?[...e.chat.slice(0,-1),{role:`assistant`,text:n.text+i.text}]:iD([...e.chat,{role:`assistant`,text:i.text}]);return{...e,chat:r,chatLive:!0,captions:(t?``:e.captions)+i.text,captionDone:!1,presence:{...e.presence,amplitude:oD(.3+i.text.length*.04),pulse:e.presence.pulse+1}}}case`caption.end`:return{...e,chatLive:!1,captionDone:!0,presence:{...e.presence,amplitude:0}};case`approval.request`:{let{type:t,...n}=i;return{...e,approval:n}}case`approval.resolved`:return e.approval?.id===i.id?{...e,approval:null}:e;case`alert`:return{...e,alerts:[...e.alerts.slice(-3),{id:++aD,level:i.level,text:i.text}]};case`activity`:return{...e,activity:i.text};case`status`:return{...e,busy:i.busy,activity:i.busy?e.activity:null,deviceOnline:i.deviceOnline,voice:{...e.voice,available:i.voiceAvailable??e.voice.available,enrolled:i.voiceEnrolled??e.voice.enrolled}};case`error`:return{...e,alerts:[...e.alerts.slice(-3),{id:++aD,level:`error`,text:i.message}]};case`voice.heard`:return{...e,captions:i.trust===`guest`?`Guest: ${i.text}`:i.trust===`member`&&i.speaker?`${i.speaker}: ${i.text}`:i.text,captionDone:!0,speaker:{name:i.trust===`member`?i.speaker??null:null,trust:i.trust??`unverified`,seq:(e.speaker?.seq??0)+1}};case`voice.challenge`:return{...e,challenge:{id:i.id,text:i.text}};case`voice.challenge.end`:return e.challenge?.id===i.id?{...e,challenge:null}:e;case`audio.chunk`:case`audio.stop`:return e;case`camera.request`:case`camera.cancel`:case`screen.request`:case`screen.cancel`:return e}}var lD=1024,uD=.8,dD=300;function fD(e,t){let n=Math.min(1,lD/Math.max(e,t));return{width:Math.round(e*n),height:Math.round(t*n)}}function pD(e){let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`permission`:t===`NotFoundError`||t===`OverconstrainedError`?`no-camera`:`busy`}async function mD(){if(!navigator.mediaDevices?.getUserMedia)throw Object.assign(Error(`This browser cannot use the camera here (use localhost or HTTPS).`),{name:`NotFoundError`});return navigator.mediaDevices.getUserMedia({video:{width:{ideal:1280}},audio:!1})}async function hD(e,t=dD){let n=document.createElement(`video`);n.muted=!0,n.playsInline=!0,n.srcObject=e,await n.play(),await new Promise(e=>setTimeout(e,t));let{width:r,height:i}=fD(n.videoWidth||640,n.videoHeight||480),a=document.createElement(`canvas`);return a.width=r,a.height=i,a.getContext(`2d`).drawImage(n,0,0,r,i),n.srcObject=null,new Promise((e,t)=>a.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,uD))}var gD=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`camera.cancel`){let t=this.active;t&&t.id===e.id&&(t.cancelled=!0,this.release(t));return}if(!this.opts.enabled())return this.opts.send({type:`camera.denied`,id:e.id,reason:`off`});if(this.active)return this.opts.send({type:`camera.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1,stream:null,opened:!1,released:!1};this.active=t;try{let n=await(this.opts.open??mD)();if(t.stream=n,t.cancelled){n.getTracks().forEach(e=>e.stop());return}t.opened=!0,this.opts.dispatch({type:`camera.open`,stream:n});let r=await(this.opts.frame??(e=>hD(e)))(n);if(t.cancelled)return;this.release(t);try{await this.opts.upload(e.id,r)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the camera picture to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`camera.denied`,id:e.id,reason:pD(n)})}finally{this.release(t),this.active===t&&(this.active=null)}}dispose(){let e=this.active;e&&(e.cancelled=!0,this.release(e))}release(e){e.released||(e.released=!0,e.stream?.getTracks().forEach(e=>e.stop()),e.opened&&this.opts.dispatch({type:`camera.closed`}))}};function _D(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement(`base`),i=n.createElement(`a`);return n.head.appendChild(r),n.body.appendChild(i),t&&(r.href=t),i.href=e,i.href}var vD=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function yD(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var bD=null;function xD(e={}){return bD||(e.includeStyleProperties?(bD=e.includeStyleProperties,bD):(bD=yD(window.getComputedStyle(document.documentElement)),bD))}function SD(e,t){let n=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return n?parseFloat(n.replace(`px`,``)):0}function CD(e){let t=SD(e,`border-left-width`),n=SD(e,`border-right-width`);return e.clientWidth+t+n}function wD(e){let t=SD(e,`border-top-width`),n=SD(e,`border-bottom-width`);return e.clientHeight+t+n}function TD(e,t={}){return{width:t.width||CD(e),height:t.height||wD(e)}}function ED(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var DD=16384;function OD(e){(e.width>DD||e.height>DD)&&(e.width>DD&&e.height>DD?e.width>e.height?(e.height*=DD/e.width,e.width=DD):(e.width*=DD/e.height,e.height=DD):e.width>DD?(e.height*=DD/e.width,e.width=DD):(e.width*=DD/e.height,e.height=DD))}function kD(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin=`anonymous`,r.decoding=`async`,r.src=e})}async function AD(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function jD(e,t,n){let r=`http://www.w3.org/2000/svg`,i=document.createElementNS(r,`svg`),a=document.createElementNS(r,`foreignObject`);return i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${n}`),i.setAttribute(`viewBox`,`0 0 ${t} ${n}`),a.setAttribute(`width`,`100%`),a.setAttribute(`height`,`100%`),a.setAttribute(`x`,`0`),a.setAttribute(`y`,`0`),a.setAttribute(`externalResourcesRequired`,`true`),i.appendChild(a),a.appendChild(e),AD(i)}var MD=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||MD(n,t)};function ND(e){let t=e.getPropertyValue(`content`);return`${e.cssText} content: '${t.replace(/'|"/g,``)}';`}function PD(e,t){return xD(t).map(t=>`${t}: ${e.getPropertyValue(t)}${e.getPropertyPriority(t)?` !important`:``};`).join(` `)}function FD(e,t,n,r){let i=`.${e}:${t}`,a=n.cssText?ND(n):PD(n,r);return document.createTextNode(`${i}{${a}}`)}function ID(e,t,n,r){let i=window.getComputedStyle(e,n),a=i.getPropertyValue(`content`);if(a===``||a===`none`)return;let o=vD();try{t.className=`${t.className} ${o}`}catch{return}let s=document.createElement(`style`);s.appendChild(FD(o,n,i,r)),t.appendChild(s)}function LD(e,t,n){ID(e,t,`:before`,n),ID(e,t,`:after`,n)}var RD=`application/font-woff`,zD=`image/jpeg`,BD={woff:RD,woff2:RD,ttf:`application/font-truetype`,eot:`application/vnd.ms-fontobject`,png:`image/png`,jpg:zD,jpeg:zD,gif:`image/gif`,tiff:`image/tiff`,svg:`image/svg+xml`,webp:`image/webp`};function VD(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:``}function HD(e){return BD[VD(e).toLowerCase()]||``}function UD(e){return e.split(/,/)[1]}function WD(e){return e.search(/^(data:)/)!==-1}function GD(e,t){return`data:${t};base64,${e}`}async function KD(e,t,n){let r=await fetch(e,t);if(r.status===404)throw Error(`Resource "${r.url}" not found`);let i=await r.blob();return new Promise((e,t)=>{let a=new FileReader;a.onerror=t,a.onloadend=()=>{try{e(n({res:r,result:a.result}))}catch(e){t(e)}},a.readAsDataURL(i)})}var qD={};function JD(e,t,n){let r=e.replace(/\?.*/,``);return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,``)),t?`[${t}]${r}`:r}async function YD(e,t,n){let r=JD(e,t,n.includeQueryParams);if(qD[r]!=null)return qD[r];n.cacheBust&&(e+=(/\?/.test(e)?`&`:`?`)+new Date().getTime());let i;try{i=GD(await KD(e,n.fetchRequestInit,({res:e,result:n})=>(t||=e.headers.get(`Content-Type`)||``,UD(n))),t)}catch(t){i=n.imagePlaceholder||``;let r=`Failed to fetch resource: ${e}`;t&&(r=typeof t==`string`?t:t.message),r&&console.warn(r)}return qD[r]=i,i}async function XD(e){let t=e.toDataURL();return t===`data:,`?e.cloneNode(!1):kD(t)}async function ZD(e,t){if(e.currentSrc){let t=document.createElement(`canvas`),n=t.getContext(`2d`);return t.width=e.clientWidth,t.height=e.clientHeight,n?.drawImage(e,0,0,t.width,t.height),kD(t.toDataURL())}let n=e.poster;return kD(await YD(n,HD(n),t))}async function QD(e,t){try{if(e?.contentDocument?.body)return await cO(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function $D(e,t){return MD(e,HTMLCanvasElement)?XD(e):MD(e,HTMLVideoElement)?ZD(e,t):MD(e,HTMLIFrameElement)?QD(e,t):e.cloneNode(tO(e))}var eO=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SLOT`,tO=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SVG`;async function nO(e,t,n){if(tO(t))return t;let r=[];return r=eO(e)&&e.assignedNodes?yD(e.assignedNodes()):MD(e,HTMLIFrameElement)&&e.contentDocument?.body?yD(e.contentDocument.body.childNodes):yD((e.shadowRoot??e).childNodes),r.length===0||MD(e,HTMLVideoElement)||await r.reduce((e,r)=>e.then(()=>cO(r,n)).then(e=>{e&&t.appendChild(e)}),Promise.resolve()),t}function rO(e,t,n){let r=t.style;if(!r)return;let i=window.getComputedStyle(e);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):xD(n).forEach(n=>{let a=i.getPropertyValue(n);n===`font-size`&&a.endsWith(`px`)&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),MD(e,HTMLIFrameElement)&&n===`display`&&a===`inline`&&(a=`block`),n===`d`&&t.getAttribute(`d`)&&(a=`path(${t.getAttribute(`d`)})`),r.setProperty(n,a,i.getPropertyPriority(n))})}function iO(e,t){MD(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),MD(e,HTMLInputElement)&&t.setAttribute(`value`,e.value)}function aO(e,t){if(MD(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(t=>e.value===t.getAttribute(`value`));r&&r.setAttribute(`selected`,``)}}function oO(e,t,n){return MD(t,Element)&&(rO(e,t,n),LD(e,t,n),iO(e,t),aO(e,t)),t}async function sO(e,t){let n=e.querySelectorAll?e.querySelectorAll(`use`):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let a=n[i].getAttribute(`xlink:href`);if(a){let n=e.querySelector(a),i=document.querySelector(a);!n&&i&&!r[a]&&(r[a]=await cO(i,t,!0))}}let i=Object.values(r);if(i.length){let t=`http://www.w3.org/1999/xhtml`,n=document.createElementNS(t,`svg`);n.setAttribute(`xmlns`,t),n.style.position=`absolute`,n.style.width=`0`,n.style.height=`0`,n.style.overflow=`hidden`,n.style.display=`none`;let r=document.createElementNS(t,`defs`);n.appendChild(r);for(let e=0;e<i.length;e++)r.appendChild(i[e]);e.appendChild(n)}return e}async function cO(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(e=>$D(e,t)).then(n=>nO(e,n,t)).then(n=>oO(e,n,t)).then(e=>sO(e,t))}var lO=/url\((['"]?)([^'"]+?)\1\)/g,uO=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,dO=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function fO(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,`\\$1`);return RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,`g`)}function pO(e){let t=[];return e.replace(lO,(e,n,r)=>(t.push(r),e)),t.filter(e=>!WD(e))}async function mO(e,t,n,r,i){try{let a=n?_D(t,n):t,o=HD(t),s;return s=i?GD(await i(a),o):await YD(a,o,r),e.replace(fO(t),`$1${s}$3`)}catch{}return e}function hO(e,{preferredFontFormat:t}){return t?e.replace(dO,e=>{for(;;){let[n,,r]=uO.exec(e)||[];if(!r)return``;if(r===t)return`src: ${n};`}}):e}function gO(e){return e.search(lO)!==-1}async function _O(e,t,n){if(!gO(e))return e;let r=hO(e,n);return pO(r).reduce((e,r)=>e.then(e=>mO(e,r,t,n)),Promise.resolve(r))}async function vO(e,t,n){let r=t.style?.getPropertyValue(e);if(r){let i=await _O(r,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function yO(e,t){await vO(`background`,e,t)||await vO(`background-image`,e,t),await vO(`mask`,e,t)||await vO(`-webkit-mask`,e,t)||await vO(`mask-image`,e,t)||await vO(`-webkit-mask-image`,e,t)}async function bO(e,t){let n=MD(e,HTMLImageElement);if((!n||WD(e.src))&&(!MD(e,SVGImageElement)||WD(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,i=await YD(r,HD(r),t);await new Promise((r,a)=>{e.onload=r,e.onerror=t.onImageErrorHandler?(...e)=>{try{r(t.onImageErrorHandler(...e))}catch(e){a(e)}}:a;let o=e;o.decode&&=r,o.loading===`lazy`&&(o.loading=`eager`),n?(e.srcset=``,e.src=i):e.href.baseVal=i})}async function xO(e,t){let n=yD(e.childNodes).map(e=>SO(e,t));await Promise.all(n).then(()=>e)}async function SO(e,t){MD(e,Element)&&(await yO(e,t),await bO(e,t),await xO(e,t))}function CO(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(e=>{n[e]=r[e]}),e}var wO={};async function TO(e){let t=wO[e];return t??(t={url:e,cssText:await(await fetch(e)).text()},wO[e]=t,t)}async function EO(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,`$1`);return a.startsWith(`https://`)||(a=new URL(a,e.url).href),KD(a,t.fetchRequestInit,({result:e})=>(n=n.replace(i,`url(${e})`),[i,e]))});return Promise.all(i).then(()=>n)}function DO(e){if(e==null)return[];let t=[],n=e.replace(/(\/\*[\s\S]*?\*\/)/gi,``),r=RegExp(`((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})`,`gi`);for(;;){let e=r.exec(n);if(e===null)break;t.push(e[0])}n=n.replace(r,``);let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a=RegExp(`((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})`,`gi`);for(;;){let e=i.exec(n);if(e===null){if(e=a.exec(n),e===null)break;i.lastIndex=a.lastIndex}else a.lastIndex=i.lastIndex;t.push(e[0])}return t}async function OO(e,t){let n=[],r=[];return e.forEach(n=>{if(`cssRules`in n)try{yD(n.cssRules||[]).forEach((e,i)=>{if(e.type===CSSRule.IMPORT_RULE){let a=i+1,o=e.href,s=TO(o).then(e=>EO(e,t)).then(e=>DO(e).forEach(e=>{try{n.insertRule(e,e.startsWith(`@import`)?a+=1:n.cssRules.length)}catch(t){console.error(`Error inserting rule from remote css`,{rule:e,error:t})}})).catch(e=>{console.error(`Error loading remote css`,e.toString())});r.push(s)}})}catch(i){let a=e.find(e=>e.href==null)||document.styleSheets[0];n.href!=null&&r.push(TO(n.href).then(e=>EO(e,t)).then(e=>DO(e).forEach(e=>{a.insertRule(e,a.cssRules.length)})).catch(e=>{console.error(`Error loading remote stylesheet`,e)})),console.error(`Error inlining remote css file`,i)}}),Promise.all(r).then(()=>(e.forEach(e=>{if(`cssRules`in e)try{yD(e.cssRules||[]).forEach(e=>{n.push(e)})}catch(t){console.error(`Error while reading CSS rules from ${e.href}`,t)}}),n))}function kO(e){return e.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>gO(e.style.getPropertyValue(`src`)))}async function AO(e,t){if(e.ownerDocument==null)throw Error(`Provided element is not within a Document`);return kO(await OO(yD(e.ownerDocument.styleSheets),t))}function jO(e){return e.trim().replace(/["']/g,``)}function MO(e){let t=new Set;function n(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(`,`).forEach(e=>{t.add(jO(e))}),Array.from(e.children).forEach(e=>{e instanceof HTMLElement&&n(e)})}return n(e),t}async function NO(e,t){let n=await AO(e,t),r=MO(e);return(await Promise.all(n.filter(e=>r.has(jO(e.style.fontFamily))).map(e=>{let n=e.parentStyleSheet?e.parentStyleSheet.href:null;return _O(e.cssText,n,t)}))).join(`
|
|
4456
|
-
`)}async function PO(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await NO(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function FO(e,t={}){let{width:n,height:r}=TD(e,t),i=await cO(e,t,!0);return await PO(i,t),await SO(i,t),CO(i,t),await jD(i,n,r)}async function IO(e,t={}){let{width:n,height:r}=TD(e,t),i=await kD(await FO(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||ED(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||OD(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}var LO=1600,RO=.85;function zO(e,t){let n=Math.min(1,LO/Math.max(e,t,1));return{width:Math.max(1,Math.round(e*n)),height:Math.max(1,Math.round(t*n))}}async function BO(){let e=document.documentElement.getBoundingClientRect(),t=await IO(document.body,{width:Math.round(e.width),height:Math.round(e.height),pixelRatio:1,backgroundColor:`#050b10`,filter:e=>!(e instanceof HTMLElement&&e.dataset.noCapture!==void 0)}),n=zO(t.width,t.height),r=document.createElement(`canvas`);return r.width=n.width,r.height=n.height,r.getContext(`2d`).drawImage(t,0,0,n.width,n.height),new Promise((e,t)=>r.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,RO))}var VO=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`screen.cancel`){this.active&&this.active.id===e.id&&(this.active.cancelled=!0);return}if(this.active)return this.opts.send({type:`screen.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1};this.active=t;try{let n=await(this.opts.capture??BO)();if(t.cancelled)return;try{await this.opts.upload(e.id,n)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the picture of the screen to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`screen.denied`,id:e.id,reason:HO(n)})}finally{this.active===t&&(this.active=null)}}dispose(){this.active&&(this.active.cancelled=!0)}};function HO(e){return e?.name===`NotSupportedError`?`unsupported`:`failed`}var UO={401:`Please sign in again.`,413:`That recording was too long.`,409:`Friend is busy with the last request. Try again in a moment.`,429:`You're talking too fast. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function WO(e,t,n){let r;try{r=await fetch(e,{method:`POST`,headers:{"content-type":t.type||`audio/webm`},body:t,signal:n})}catch(e){throw e.name===`AbortError`?e:Error(`Could not reach Friend. Check the connection.`)}if(!r.ok){let e=``;try{e=(await r.json()).error??``}catch{}throw Error(e||UO[r.status]||`The voice request failed (${r.status}).`)}let i=await r.json();return{text:typeof i.text==`string`?i.text:``,wake:i.wake===!0}}async function GO(e,t){return{text:(await WO(`/api/voice/utterance`,e,t)).text}}async function KO(e,t){let n=await WO(`/api/voice/utterance?wake=1`,e,t);return{text:n.text,wake:n.wake===!0}}var qO=null;function JO(){try{qO??=new AudioContext,qO.resume().catch(()=>{});let e=qO.currentTime;for(let[t,n]of[660,990].entries()){let r=qO.createOscillator(),i=qO.createGain();r.frequency.value=n,i.gain.setValueAtTime(0,e+t*.11),i.gain.linearRampToValueAtTime(.18,e+t*.11+.02),i.gain.exponentialRampToValueAtTime(.001,e+t*.11+.14),r.connect(i).connect(qO.destination),r.start(e+t*.11),r.stop(e+t*.11+.16)}}catch{}}var YO=/busy with the last request|talking too fast/i,XO=3e4,ZO=50,QO=class{deps;listener=null;awakeNow=!1;showing=!1;busyWithOne=!1;clock=null;meter=null;abort=null;lastAlert=0;constructor(e){this.deps=e}get enabled(){return this.listener!==null}get awake(){return this.awakeNow}async enable(){if(this.listener)return;let e=this.deps.makeListener({onUtterance:e=>void this.heard(e),onError:e=>{this.drop(),this.alert(e,!0)}});try{await e.start()}catch(e){this.alert(e.message,!0);return}this.listener=e}disable(){this.drop()}sync(){let e=this.listener;if(!e)return;let t=this.busyOther();if(e.pause(t),!this.awakeNow||t){this.clearClock(),this.stopMeter();return}this.deps.mode()===`idle`&&this.show(),this.clock||this.startClock(),this.startMeter()}busyOther(){let e=this.deps.mode();return e!==`listening`&&(this.showing=!1),e===`speaking`||e===`transcribing`||e===`listening`&&!this.showing}show(){this.showing=!0,this.deps.dispatch({type:`voice.mode`,mode:`listening`})}wakeUp(e){this.awakeNow=!0,e&&this.deps.chime(),this.clearClock(),this.show(),this.startClock(),this.startMeter()}sleep(){this.awakeNow=!1,this.clearClock(),this.stopMeter(),this.showing&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.showing=!1}drop(){let e=this.listener;this.listener=null,this.abort?.abort(),this.abort=null,this.busyWithOne=!1,this.sleep(),e?.stop()}startClock(){this.clearClock(),this.clock=setTimeout(()=>{this.clock=null,this.sleep()},this.deps.awakeMs??3e4)}clearClock(){this.clock&&clearTimeout(this.clock),this.clock=null}startMeter(){this.meter||=setInterval(()=>this.deps.dispatch({type:`voice.level`,level:this.listener?.level()??0}),ZO)}stopMeter(){this.meter&&clearInterval(this.meter),this.meter=null}async heard(e){if(!this.listener||this.busyWithOne||this.busyOther())return;this.busyWithOne=!0;let t=new AbortController;this.abort=t;try{this.awakeNow?await this.request(e,t.signal):await this.check(e,t.signal)}catch(e){e.name!==`AbortError`&&!YO.test(e.message)&&this.alert(e.message,!1)}finally{this.abort===t&&(this.abort=null),this.busyWithOne=!1,this.listener&&this.awakeNow&&(this.clearClock(),this.deps.mode()===`transcribing`&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.sync())}}async check(e,t){let n=await this.deps.wake(e,t);this.listener&&n.wake&&this.wakeUp(!n.text)}async request(e,t){this.clearClock(),this.stopMeter(),this.showing=!1,this.deps.dispatch({type:`voice.mode`,mode:`transcribing`}),await this.deps.command(e,t)}alert(e,t){let n=Date.now();!t&&n-this.lastAlert<XO||(this.lastAlert=n,this.deps.dispatch({type:`alert.add`,level:`error`,text:e}))}},$O=0,ek=new Set;function tk(e){return ek.add(e),()=>ek.delete(e)}var nk=e=>ek.forEach(t=>{try{t(e)}catch{}}),rk=e=>/not compatible|audio capture|audiosession/i.test(String(e?.message??e));function ik(e){try{let t=navigator.audioSession;t&&t.type!==e&&(t.type=e)}catch{}}function ak(){$O===0&&ik(`playback`)}function ok(){$O++,$O===1&&nk(!0),ik(`play-and-record`);let e=!1;return()=>{e||(e=!0,$O=Math.max(0,$O-1),$O===0&&(ik(`playback`),nk(!1)))}}var sk=3,ck=.02,lk=.04,uk=class{minSpeechMs;endSilenceMs;maxMs;floor=null;loudSince=null;speaking=!1;startedAt=0;lastLoud=0;lastFeed=0;speechMs=0;constructor(e={}){this.minSpeechMs=e.minSpeechMs??300,this.endSilenceMs=e.endSilenceMs??800,this.maxMs=e.maxMs??8e3}get inSpeech(){return this.speaking}get maybeSpeech(){return this.loudSince!==null}feed(e,t){this.floor===null&&(this.floor=e);let n=e>Math.max(this.floor*sk+ck,lk),r=Math.min(100,Math.max(0,t-this.lastFeed));if(this.lastFeed=t,!this.speaking)return n?(this.loudSince??=t,t-this.loudSince<this.minSpeechMs?null:(this.speaking=!0,this.startedAt=this.loudSince,this.lastLoud=t,this.speechMs=t-this.loudSince,{type:`start`})):(this.loudSince=null,this.floor+=(e-this.floor)*(e<this.floor?.3:.02),null);n&&(this.lastLoud=t,this.speechMs+=r);let i=t-this.startedAt>=this.maxMs;if(!i&&t-this.lastLoud<this.endSilenceMs)return null;let a={type:`end`,ms:t-this.startedAt,speechMs:this.speechMs,forced:i};return this.speaking=!1,this.loudSince=null,i&&n&&(this.floor=e),a}reset(){this.speaking=!1,this.loudSince=null}},dk=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],fk=50,pk=2e3,mk=2e3,hk=400,gk=e=>{let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`Microphone permission was denied. Allow it in the browser to use hands-free.`:t===`NotFoundError`||t===`OverconstrainedError`?`No microphone was found.`:e?.message||`Could not open the microphone.`},_k=class{opts;stream=null;ctx=null;analyser=null;rec=null;chunks=[];recStartedAt=0;timer=null;seg;leaveSession=null;paused=!1;starting=!1;finishing=!1;opened=!1;now;constructor(e){this.opts=e,this.seg=new uk(e),this.now=e.now??(()=>Date.now())}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get listening(){return this.opened}async start(){if(!(this.opened||this.starting)){this.starting=!0;try{this.leaveSession=ok();try{this.stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}})}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Error(gk(e))}for(let e of this.stream.getTracks())e.onended=()=>this.broke(`The microphone stopped working.`);try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(this.stream).connect(this.analyser),this.ctx.resume().catch(()=>{})}catch{throw this.release(),Error(`This browser cannot listen continuously here.`)}this.seg.reset(),this.beginRecording(),this.opened=!0,this.timer=setInterval(()=>this.tick(),fk)}finally{this.starting=!1}}}stop(){this.opened=!1,this.release()}pause(e){this.paused!==e&&(this.paused=e,this.seg.reset(),!e&&this.opened&&this.restartRecording())}level(){if(!this.analyser)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}tick(){if(!this.opened)return;let e=this.now();if(this.ctx&&this.ctx.state!==`running`&&this.ctx.resume().catch(()=>{}),this.paused){e-this.recStartedAt>=pk&&this.restartRecording();return}let t=this.seg.feed(this.level(),e);t?.type===`end`?this.finish(t.ms,t.speechMs):!t&&!this.seg.inSpeech&&!this.seg.maybeSpeech&&e-this.recStartedAt>=pk&&this.restartRecording()}beginRecording(){if(!this.stream)return;let e=dk.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.broke(`The microphone stopped working.`),t.start(250),this.rec=t,this.recStartedAt=this.now()}restartRecording(){let e=this.rec;if(this.rec=null,e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.opened&&this.beginRecording()}async finish(e,t){let n=this.rec;if(!n||this.finishing)return;this.finishing=!0;let r=n.mimeType||`audio/webm`,i=await new Promise(e=>{let t=!1,i=()=>{t||(t=!0,e(new Blob(this.chunks,{type:r})))},a=setTimeout(i,mk);n.onstop=()=>{clearTimeout(a),i()};try{n.state===`inactive`?i():n.stop()}catch{i()}});this.finishing=!1,this.rec=null,this.opened&&(this.beginRecording(),!this.paused&&e>=hk&&t>=hk/2&&i.size>0&&this.opts.onUtterance(i))}broke(e){this.opened&&(this.stop(),this.opts.onError(e))}release(){if(this.timer&&clearInterval(this.timer),this.timer=null,this.rec){this.rec.ondataavailable=null,this.rec.onstop=null,this.rec.onerror=null;try{this.rec.state!==`inactive`&&this.rec.stop()}catch{}}this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.ctx=null,this.analyser=null,this.rec=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},vk=4096,yk=8,bk=20,xk=6e6;function Sk(e){try{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch{return null}}var Ck=class{ctx=null;analyser=null;pending=new Map;queue=[];current=null;busy=!1;gen=0;isPlaying=!1;unwatch=null;listeners=new Set;unlock(){ak();let e=this.ensureContext();e.state!==`running`&&e.resume().catch(()=>{})}locked(){return!this.ctx||this.ctx.state!==`running`}enqueue(e){if(!Number.isInteger(e.seq)||e.seq<0||e.seq>vk)return;let t=Sk(e.data);if(!t)return;let n=this.pending.get(e.id);if(n||(this.pending.size>=yk&&this.pending.delete(this.pending.keys().next().value),n={parts:new Map,lastSeq:null,bytes:0},this.pending.set(e.id,n)),n.bytes+=t.length,n.bytes>xk){this.pending.delete(e.id);return}if(n.parts.set(e.seq,t),e.last&&(n.lastSeq=e.seq),n.lastSeq===null||n.parts.size!==n.lastSeq+1)return;this.pending.delete(e.id);let r=new Uint8Array([...n.parts.values()].reduce((e,t)=>e+t.length,0)),i=0;for(let e=0;e<=n.lastSeq;e++){let t=n.parts.get(e);if(!t)return;r.set(t,i),i+=t.length}for(this.queue.push(r.buffer);this.queue.length>bk;)this.queue.shift();this.pump()}stop(){this.gen++,this.queue=[],this.pending.clear(),this.busy=!1;let e=this.current;if(this.current=null,e){e.onended=null;try{e.stop()}catch{}}this.setPlaying(!1)}dispose(){this.stop(),this.ctx?.close().catch(()=>{}),this.unwatch?.(),this.unwatch=null,this.ctx=null,this.analyser=null}playing(){return this.isPlaying}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}level(){if(!this.analyser||!this.isPlaying)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}ensureContext(){if(!this.ctx){let e=window.AudioContext??window.webkitAudioContext;this.ctx=new e,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.analyser.connect(this.ctx.destination);let t=this.ctx;this.unwatch?.(),this.unwatch=tk(e=>{e&&t.state===`running`?t.suspend().catch(()=>{}):!e&&t.state!==`running`&&t.state!==`closed`&&t.resume().catch(()=>{})})}return this.ctx}setPlaying(e){this.isPlaying!==e&&(this.isPlaying=e,this.listeners.forEach(t=>t(e)))}async pump(){if(this.busy)return;let e=this.queue.shift();if(!e){this.setPlaying(!1);return}this.busy=!0;let t=this.gen;try{let n=this.ensureContext();if(n.state!==`running`){try{await n.resume()}catch{}if(t!==this.gen)return;if(n.state!==`running`){this.queue.unshift(e),this.busy=!1;return}}let r=await n.decodeAudioData(e);if(t!==this.gen)return;let i=n.createBufferSource();i.buffer=r,i.connect(this.analyser),i.onended=()=>{this.current===i&&(this.current=null,this.busy=!1,this.pump())},this.current=i,this.setPlaying(!0),i.start()}catch{if(t!==this.gen)return;this.busy=!1,this.pump()}}},wk=e=>new Promise(t=>setTimeout(t,e)),Tk=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],Ek=3e3;function Dk(e){let t=e;return t?.name===`NotAllowedError`||t?.name===`SecurityError`?Error(`Microphone permission was denied. Allow it in the browser to talk.`):t?.name===`NotFoundError`||t?.name===`OverconstrainedError`?Error(`No microphone was found.`):Error(t?.message||`Could not open the microphone.`)}var Ok=class e{opts;stream=null;rec=null;chunks=[];ctx=null;analyser=null;timer=null;starting=!1;leaveSession=null;constructor(e={}){this.opts=e}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get active(){return this.rec!==null}async start(){if(!(this.rec||this.starting)){if(!e.supported())throw Error(`This browser cannot record audio here (use localhost or HTTPS).`);this.starting=!0;try{this.leaveSession=ok();try{let e=()=>navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});try{this.stream=await e()}catch(t){if(!rk(t))throw t;await wk(250),this.leaveSession?.(),this.leaveSession=ok(),this.stream=await e()}}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Dk(e)}try{let e=Tk.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.failed();for(let e of this.stream.getTracks())e.onended=()=>this.failed();this.openMeter(this.stream),t.start(250),this.rec=t,this.opts.maxMs&&(this.timer=setTimeout(()=>{this.timer=null,this.opts.onLimit?.()},this.opts.maxMs))}catch(e){throw this.release(),Dk(e)}}finally{this.starting=!1}}}stop(){let e=this.rec;return e?new Promise(t=>{let n=!1,r=null,i=()=>{if(n)return;n=!0,r&&clearTimeout(r);let i=new Blob(this.chunks,{type:e.mimeType||`audio/webm`});this.release(),t(i)};if(r=setTimeout(i,Ek),e.onstop=i,e.state===`inactive`)return i();try{e.stop()}catch{i()}}):Promise.reject(Error(`Not recording.`))}cancel(){let e=this.rec;if(e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.release()}level(){if(!this.analyser||!this.rec)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}failed(){this.rec&&(this.cancel(),this.opts.onError?.())}openMeter(e){try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(e).connect(this.analyser)}catch{this.analyser=null}}release(){this.timer&&clearTimeout(this.timer),this.timer=null,this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.rec=null,this.ctx=null,this.analyser=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},kk=2e3,Ak=()=>typeof window<`u`&&window.isSecureContext===!1,jk=50,Mk=class{deps;recorder;player;mode=`idle`;pressed=!1;disposed=!1;uploads=0;toldAboutSound=!1;abort=null;poll=null;unsubscribe;constructor(e){this.deps=e;let t=()=>this.recorderFailed();this.recorder=e.recorder??e.makeRecorder?.(t)??new Ok({maxMs:6e4,onLimit:()=>void this.pressEnd(),onError:t}),this.player=e.player??new Ck,this.unsubscribe=this.player.onChange(e=>{this.mode!==`listening`&&this.mode!==`transcribing`&&this.setMode(e?`speaking`:`idle`)})}async pressStart(){if(!(this.pressed||this.disposed)){if(!this.deps.available()){this.alert(`warn`,`Voice is not available. Run: friend voice setup`);return}if(!(this.deps.supported?.()??Ok.supported())){this.alert(`warn`,Ak()?`This page is not secure, so the browser blocks the microphone. On the PC run: friend lan https on, restart Friend, and open the https:// address.`:`This browser cannot record audio here (use localhost or HTTPS).`);return}this.pressed=!0,this.player.unlock(),this.player.playing()&&(this.deps.send({type:`voice.interrupt`}),this.player.stop());try{await this.recorder.start()}catch(e){this.pressed=!1,this.alert(`error`,e.message),this.setMode(`idle`);return}if(!this.pressed){this.recorder.cancel(),this.setMode(`idle`);return}this.setMode(`listening`)}}async pressEnd(){if(!this.pressed||(this.pressed=!1,!this.recorder.active))return;let e=await this.recorder.stop();if(e.size<kk){this.alert(`info`,`Hold the key a little longer while you speak.`),this.setMode(`idle`);return}this.setMode(`transcribing`);let t=new AbortController;this.abort=t,this.uploads++;try{let{text:n}=await this.deps.post(e,t.signal);n.trim()||this.alert(`info`,`I didn't catch that.`)}catch(e){e.name!==`AbortError`&&this.alert(`error`,e.message)}finally{this.uploads--,this.abort===t&&(this.abort=null),this.settle()}}blur(){this.pressed&&(this.pressed=!1,this.recorder.cancel(),this.setMode(`idle`))}handleServer(e){if(e.type!==`audio.chunk`)return this.player.stop();this.player.enqueue(e),!this.toldAboutSound&&this.player.locked?.()&&(this.toldAboutSound=!0,this.deps.dispatch({type:`alert.add`,level:`info`,text:`Sound is blocked by the browser. Click or press a key once anywhere on the page to hear me.`}))}unlock(){this.player.unlock()}dispose(){this.disposed=!0,this.pressed=!1,this.stopPolling(),this.abort?.abort(),this.recorder.cancel(),this.player.stop(),this.player.dispose?.(),this.unsubscribe()}recorderFailed(){this.pressed=!1,this.recorder.cancel(),this.alert(`error`,`The microphone stopped working.`),this.setMode(`idle`)}settle(){this.uploads>0||this.mode!==`transcribing`||this.setMode(this.player.playing()?`speaking`:`idle`)}setMode(e){this.disposed||(this.mode=e,this.deps.dispatch({type:`voice.mode`,mode:e}),e===`listening`||e===`speaking`?this.startPolling():this.stopPolling())}startPolling(){this.stopPolling(),this.poll=setInterval(()=>{let e=this.mode===`listening`?this.recorder.level():this.player.level();this.deps.dispatch({type:`voice.level`,level:e})},jk)}stopPolling(){this.poll&&clearInterval(this.poll),this.poll=null}alert(e,t){this.disposed||this.deps.dispatch({type:`alert.add`,level:e,text:t})}};function Nk(e){let[t,n]=(0,l.useReducer)(cD,nD),r=(0,l.useRef)(null),i=(0,l.useRef)(null),a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(!1),u=(0,l.useRef)(e);u.current=e;let d=(0,l.useRef)(t);d.current=t,(0,l.useEffect)(()=>{let e=tD();r.current=e;let t=new Mk({send:t=>e.send(t),dispatch:e=>n(e),post:GO,available:()=>d.current.voice.available});i.current=t;let s=new QO({makeListener:e=>new _k(e),wake:KO,command:GO,mode:()=>d.current.voice.mode,chime:JO,dispatch:e=>n(e)});o.current=s;let l=new gD({send:t=>e.send(t),dispatch:e=>n(e),enabled:()=>d.current.camera.enabled,upload:async(e,t)=>{let n=await fetch(`/api/camera/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}});a.current=l;let f=new VO({send:t=>e.send(t),dispatch:e=>n(e),upload:async(e,t)=>{let n=await fetch(`/api/screen/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}}),p=e.onMessage(e=>{n(e);let r=e?.type,i=e?.id;(r===`camera.request`||r===`camera.cancel`)&&typeof i==`string`&&l.handle({type:r,id:i}),(r===`screen.request`||r===`screen.cancel`)&&typeof i==`string`&&f.handle({type:r,id:i}),(r===`audio.chunk`||r===`audio.stop`)&&t.handleServer(e)}),m=e.onState(e=>{n({type:`conn`,value:e}),e===`unauthorized`&&u.current(),e===`elsewhere`&&(s.disable(),c(!1),t.blur(),l.dispose(),f.dispose())});return()=>{p(),m(),s.disable(),o.current=null,t.dispose(),l.dispose(),f.dispose(),e.close(),i.current=null,a.current=null,r.current=null}},[]),(0,l.useEffect)(()=>{t.camera.enabled||a.current?.dispose()},[t.camera.enabled]),(0,l.useEffect)(()=>{o.current?.sync()},[t.voice.mode]);let f=(0,l.useCallback)(async e=>{let t=o.current;if(t){e?await t.enable():t.disable(),c(t.enabled);try{localStorage.setItem(`friend.handsFree`,t.enabled?`1`:`0`)}catch{}}},[]),p=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!p.current&&t.voice.available){p.current=!0;try{localStorage.getItem(`friend.handsFree`)===`1`&&_k.supported()&&f(!0)}catch{}}},[t.voice.available,f]);let m=(0,l.useMemo)(()=>({on:s,supported:_k.supported(),toggle:()=>void f(!o.current?.enabled)}),[s,f]);return{state:t,send:(0,l.useCallback)(e=>r.current?.send(e),[]),dispatch:(0,l.useCallback)(e=>n(e),[]),voice:(0,l.useMemo)(()=>({pressStart:()=>void i.current?.pressStart(),pressEnd:()=>void i.current?.pressEnd(),blur:()=>i.current?.blur(),unlock:()=>i.current?.unlock()}),[]),handsFree:m,useHere:(0,l.useCallback)(()=>r.current?.takeOver(),[])}}var Pk={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function Fk(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||Pk[n.status]||`The request failed (${n.status}).`)}return await n.json()}var Ik=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Lk={state:()=>Fk(`/api/voice/enroll`,{}),sample:e=>Fk(`/api/voice/enroll/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>Fk(`/api/voice/enroll/finish`,Ik(`POST`,{pin:e})),cancel:async()=>{await Fk(`/api/voice/enroll/cancel`,Ik(`POST`,{}))},remove:async e=>{await Fk(`/api/voice/enroll`,Ik(`DELETE`,{pin:e}))}},Rk=[`Friend, good evening. It is a pleasant day to get things done.`,`Open my projects and show me what changed today.`,`My voice is my key, so please remember it well.`,`Check the weather and read me the latest headlines.`,`Always protect the boss, and never trust a stranger.`],zk=15e3;function Bk({api:e=Lk,createRecorder:t=e=>new Ok(e),onClose:n,who:r}){let[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(0),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(`record`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(``),C=(0,l.useRef)(!0),w=(0,l.useRef)(null);(0,l.useEffect)(()=>(C.current=!0,e.state().then(e=>{C.current&&(a(e),s(e.samples))}).catch(e=>C.current&&b(e.message)),()=>{C.current=!1,w.current?.cancel(),w.current=null}),[e]);let E=(0,l.useCallback)(async()=>{let t=w.current;if(t){w.current=null,g(!1),v(!0);try{let n=await t.stop(),r=await e.sample(n);if(!C.current)return;s(r.count),u(r.note)}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}}},[e]),D=async()=>{b(null),u(null);let e=t({maxMs:zk,onLimit:()=>void E(),onError:()=>{w.current=null,C.current&&(g(!1),b(`The microphone stopped working. Try again.`))}});try{await e.start()}catch(e){C.current&&b(e.message);return}if(!C.current)return e.cancel();w.current=e,g(!0)},O=async e=>{b(null),v(!0);try{await e()}catch(e){C.current&&b(e.message)}finally{C.current&&(v(!1),S(``))}},k=async()=>{w.current?.cancel(),w.current=null,await e.cancel().catch(()=>{}),n()},A=i?.min??3,j=o%Rk.length,ee=o<Rk.length?`Phrase ${o+1} of ${Rk.length}`:`Extra recording (${o} so far)`;return(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Voice enrollment`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:r?`Teach Friend ${r}'s voice`:`Teach Friend your voice`})}),f===`record`&&(0,p.jsxs)(p.Fragment,{children:[!r&&i?.enrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Your voice is already saved. Saving a new one replaces it.`}),r&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Hand the device to `,r,`. `,r,` reads each sentence aloud, close to the microphone, in a quiet room.`]}),(0,p.jsxs)(`p`,{className:`auth-note`,children:[ee,`. Press Record, read this aloud in a quiet room, then press Stop.`]}),(0,p.jsx)(`pre`,{className:`approval-summary`,"data-testid":`enroll-phrase`,style:{whiteSpace:`pre-wrap`},children:Rk[j]}),(0,p.jsxs)(`div`,{role:`status`,className:`auth-note`,children:[o,` recorded`,o>=A?` — enough to save`:` — at least ${A} needed`,`.`,c?` ${c}`:``]}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[h?(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>void E(),children:`Stop`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||!i||o>=(i?.max??8),onClick:()=>void D(),children:_?`Uploading…`:`Record`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:h||_||o<A,onClick:()=>m(`pin-save`),children:r?`Save ${r}'s voice`:`Save my voice`}),!r&&i?.enrolled&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:h||_,onClick:()=>m(`pin-delete`),children:`Delete my voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>void k(),children:`Cancel`})]})]}),(f===`pin-save`||f===`pin-delete`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`pin-save`?r?`Enter your PIN to save ${r}'s voice.`:`Enter your PIN to save your voice.`:`Enter your PIN to delete your saved voice.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:f===`pin-save`?()=>!_&&void O(async()=>{await e.finish(x),C.current&&m(`saved`)}):void 0}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[f===`pin-save`?(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.finish(x),C.current&&m(`saved`)}),children:`Save`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.remove(x),C.current&&m(`deleted`)}),children:`Delete`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{S(``),b(null),m(`record`)},children:`Back`})]})]}),(f===`saved`||f===`deleted`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`saved`?r?`${r}'s voice is saved. From now on I will know when ${r} is talking.`:`Your voice is saved. From now on I will tell you apart from other speakers.`:`Your voice was deleted. Every voice is treated as yours until you enroll again.`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:n,children:`Done`})})]})]})}var Vk=new Set([`INPUT`,`TEXTAREA`,`SELECT`,`BUTTON`,`A`,`SUMMARY`]),Hk=new Set([`button`,`checkbox`,`switch`,`tab`,`menuitem`,`link`,`radio`,`option`,`textbox`,`combobox`,`slider`]),Uk=e=>e instanceof HTMLElement&&(Vk.has(e.tagName)||e.isContentEditable||Hk.has(e.getAttribute(`role`)??``)),Wk=e=>e.code===`Space`||e.key===` `;function Gk(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=!1,n=n=>{!Wk(n)||n.ctrlKey||n.metaKey||n.altKey||Uk(n.target)||Uk(document.activeElement)||(n.preventDefault(),!(n.repeat||e)&&(e=!0,t.current.pressStart()))},r=n=>{Wk(n)&&e&&(e=!1,n.preventDefault(),t.current.pressEnd())},i=()=>{e=!1,t.current.blur()},a=()=>{document.hidden&&i()};return window.addEventListener(`keydown`,n),window.addEventListener(`keyup`,r),window.addEventListener(`blur`,i),document.addEventListener(`visibilitychange`,a),()=>{window.removeEventListener(`keydown`,n),window.removeEventListener(`keyup`,r),window.removeEventListener(`blur`,i),document.removeEventListener(`visibilitychange`,a)}},[])}function Kk(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=()=>t.current.unlock(),n=[`pointerdown`,`keydown`,`touchend`];for(let t of n)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of n)window.removeEventListener(t,e)}},[])}function qk({onUseHere:e}){return(0,p.jsx)(`div`,{className:`elsewhere`,role:`alertdialog`,"aria-labelledby":`elsewhere-title`,"data-testid":`elsewhere`,children:(0,p.jsxs)(`div`,{className:`elsewhere-card`,children:[(0,p.jsx)(`h2`,{id:`elsewhere-title`,children:`Friend is open in another window`}),(0,p.jsx)(`p`,{children:`Friend works in one window at a time. Click “Use here” to use it in this window instead; the other one will stop.`}),(0,p.jsx)(`button`,{type:`button`,className:`elsewhere-btn`,onClick:e,autoFocus:!0,children:`Use here`})]})})}function Jk(e,t,n){let r=Math.max(100,Math.round(e)),i=Math.max(100,Math.round(t));return{width:r,height:i,kind:r<=599?`phone`:n||r<1024?`tablet`:`desktop`,orientation:i>r?`portrait`:`landscape`,touch:n}}var Yk=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches;function Xk(){return Jk(window.innerWidth,window.innerHeight,Yk())}var Zk=(e,t)=>!!e&&e.width===t.width&&e.height===t.height&&e.kind===t.kind&&e.orientation===t.orientation&&e.touch===t.touch;function Qk(e,t){let n=(0,l.useRef)(null),r=(0,l.useRef)(e);r.current=e,(0,l.useEffect)(()=>{if(t!==`open`){n.current=null;return}let e=()=>{let e=Xk();Zk(n.current,e)||(n.current=e,r.current({type:`ui.screen`,...e}))};e();let i=null,a=()=>{i&&clearTimeout(i),i=setTimeout(e,400)};return window.addEventListener(`resize`,a),window.addEventListener(`orientationchange`,a),()=>{i&&clearTimeout(i),window.removeEventListener(`resize`,a),window.removeEventListener(`orientationchange`,a)}},[t])}var $k={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function eA(e,t={}){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||$k[n.status]||`The request failed (${n.status}).`)}return await n.json()}var tA=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),nA={overview:()=>eA(`/api/voice/people`),begin:e=>eA(`/api/voice/people/begin`,tA(`POST`,{name:e})),recording:{state:async()=>(await eA(`/api/voice/people`)).enrolling??{enrolled:!1,samples:0,min:3,max:8},sample:e=>eA(`/api/voice/people/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>eA(`/api/voice/people/finish`,tA(`POST`,{pin:e})),cancel:async()=>{await eA(`/api/voice/people/cancel`,tA(`POST`,{}))},remove:async()=>{}},removePerson:async(e,t)=>{await eA(`/api/voice/people/${e}`,tA(`DELETE`,{pin:t}))}};function rA({api:e=nA,createRecorder:t,onClose:n}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)({kind:`list`}),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>{e.overview().then(e=>v.current&&i(e)).catch(e=>v.current&&_(e.message))},[e]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async()=>{_(null),h(!0);try{let t=await e.begin(s.trim());v.current&&o({kind:`record`,name:t.name})}catch(e){v.current&&_(e.message)}finally{v.current&&h(!1)}},x=async t=>{_(null),h(!0);try{if(await e.removePerson(t.id,u),!v.current)return;o({kind:`list`}),y()}catch(e){v.current&&_(e.message)}finally{v.current&&(h(!1),f(``))}};return a.kind===`record`?(0,p.jsx)(Bk,{api:e.recording,who:a.name,...t?{createRecorder:t}:{},onClose:()=>{c(``),o({kind:`list`}),y()}}):(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Family voices`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Family voices`})}),a.kind===`list`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend knows your voice. Add the people at home, so it knows who is talking and answers them by name. They can chat and ask for the weather, but cannot use your PC or see your private things.`}),r&&!r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`First teach Friend your own voice (Esc, then Enroll my voice).`}),r&&r.people.length===0&&r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Nobody added yet.`}),r&&r.people.length>0&&(0,p.jsx)(`ul`,{className:`household-list`,"aria-label":`People Friend knows`,children:r.people.map(e=>(0,p.jsxs)(`li`,{className:`household-row`,children:[(0,p.jsx)(`span`,{children:e.name}),(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>o({kind:`remove`,person:e}),"aria-label":`Remove ${e.name}`,children:`Remove`})]},e.id))}),r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Add a person`}),(0,p.jsx)(`input`,{value:s,maxLength:40,placeholder:`Name, for example Priya`,onChange:e=>c(e.target.value),onKeyDown:e=>e.key===`Enter`&&s.trim()&&!m&&void b()})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:m||!s.trim(),onClick:()=>void b(),children:`Record their voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:n,children:`Close`})]})]}),a.kind===`remove`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to remove `,a.person.name,`’s voice. Friend will treat their voice as a stranger’s.`]}),(0,p.jsx)(T,{pin:u,onChange:f}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:m||u.length<6,onClick:()=>void x(a.person),children:`Remove`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{f(``),_(null),o({kind:`list`})},children:`Back`})]})]})]})}var iA=`▌▍▎▏█▓▒░<>/\\|+-=*#%&0123456789ABCDEF`;function aA(e,t,n=Math.random){let r=[...e];if(t>=1)return e;let i=Math.floor(r.length*Math.max(0,t));return r.map((e,t)=>t<i||e===` `?e:iA[Math.floor(n()*36)]).join(``)}var oA=e=>e.length===0?0:Math.min(24,Math.max(6,Math.ceil([...e].length/2)));function sA(e,t){let[n,r]=(0,l.useState)(e),i=(0,l.useRef)(e);return(0,l.useEffect)(()=>{if(!t||e===i.current){i.current=e,r(e);return}i.current=e;let n=oA(e);if(n===0){r(e);return}let a=0,o=setInterval(()=>{a++,r(aA(e,a/n)),a>=n&&clearInterval(o)},320/n);return()=>clearInterval(o)},[e,t]),n}function cA(e){let t=e.currentTarget,n=t.getBoundingClientRect(),r=document.createElement(`span`);r.className=`hud-ripple`;let i=Math.max(n.width,n.height)*2;r.style.width=r.style.height=`${i}px`,r.style.left=`${e.clientX-n.left-i/2}px`,r.style.top=`${e.clientY-n.top-i/2}px`,t.appendChild(r),r.addEventListener(`animationend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),900)}function lA({items:e,animations:t,onAction:n}){let[r,i]=(0,l.useState)(null),a=(0,l.useRef)(void 0);if((0,l.useEffect)(()=>()=>clearTimeout(a.current),[]),e.length===0)return null;let o=e=>{t!==`off`&&(i(e.id),clearTimeout(a.current),a.current=setTimeout(()=>i(null),650)),n(e)};return(0,p.jsxs)(he,{id:`launcher`,label:`Quick launch`,wholeBox:!0,testId:`launcher`,className:`hud hud-launcher${t===`full`?` hud-boot`:``}`,children:[(0,p.jsx)(`div`,{className:`hud-kicker`,children:`Quick launch`}),(0,p.jsx)(`ul`,{className:`hud-stack`,children:e.map((e,n)=>(0,p.jsx)(`li`,{className:`hud-tab hud-cut${r===e.id?` engaged`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":n+1},children:(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-label":e.label,onPointerDown:t===`off`?void 0:cA,onClick:()=>o(e),children:[(0,p.jsx)(`span`,{className:`hud-icon`,"aria-hidden":`true`,children:e.icon}),(0,p.jsx)(`span`,{className:`hud-tab-label`,children:e.label}),(0,p.jsx)(`span`,{className:`hud-tab-engaged`,"aria-hidden":`true`,children:`ENGAGED`}),(0,p.jsx)(`span`,{className:`hud-sweep`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`hud-scan`,"aria-hidden":`true`})]})},e.id))})]})}var uA=(e,t=18)=>(0,p.jsx)(`svg`,{width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e}),dA=()=>uA((0,p.jsx)(`path`,{d:`M7 4.5v15l12-7.5z`,fill:`currentColor`})),fA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`rect`,{x:`6`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`}),(0,p.jsx)(`rect`,{x:`14`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`})]})),pA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M5 5v14l10-7z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M18 5v14`})]})),mA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M19 5v14L9 12z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M6 5v14`})]})),hA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M3 7h3.5c3 0 4 2 5.5 5s2.500 5 5.500 5H21`}),(0,p.jsx)(`path`,{d:`M3 17h3.5c1.500 0 2.500-.6 3.400-1.800M13.500 8.800C14.500 7.600 15.500 7 17 7h4`}),(0,p.jsx)(`path`,{d:`m18.500 4.500 2.500 2.500-2.500 2.500M18.500 14.500l2.500 2.500-2.500 2.500`})]})),gA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M17 3l3 3-3 3`}),(0,p.jsx)(`path`,{d:`M4 11V9a3 3 0 0 1 3-3h13M7 21l-3-3 3-3`}),(0,p.jsx)(`path`,{d:`M20 13v2a3 3 0 0 1-3 3H4`})]})),_A=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M15.500 9a4 4 0 0 1 0 6M18 6.500a7.500 7.500 0 0 1 0 11`})]})),vA=()=>uA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`m16 9 5 6M21 9l-5 6`})]})),yA=()=>uA((0,p.jsx)(`path`,{d:`M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5`})),bA=()=>uA((0,p.jsx)(`path`,{d:`M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5`})),xA=()=>uA((0,p.jsx)(`path`,{d:`M6 6l12 12M18 6 6 18`})),SA=()=>uA((0,p.jsx)(`path`,{d:`M9 18V6l10-2v12`}),22),CA=56,wA=()=>({bars:new Float32Array(CA),bass:0,left:0,right:0});function TA(e,t,n,r,i){let a=n?.82:.9;if(t&&n){t.getByteFrequencyData(i);let n=Math.min(i.length,96);for(let t=0;t<CA;t++){let r=Math.min(n-1,Math.floor((t/CA)**1.6*n));e.bars[t]=Math.max((i[r]??0)/255,e.bars[t]*a)}}else if(n)for(let t=0;t<CA;t++)e.bars[t]=Math.max(.12+.28*Math.abs(Math.sin(r/420+t*.55)*Math.cos(r/900+t*.21)),e.bars[t]*a);else for(let t=0;t<CA;t++)e.bars[t]=e.bars[t]*a;let o=0;for(let t=0;t<6;t++)o+=e.bars[t];e.bass=Math.min(1,o/6*1.15);let s=0,c=0;for(let t=0;t<CA/2;t++)s+=e.bars[t],c+=e.bars[t+CA/2];e.left=Math.min(1,s/(CA/2)*1.6),e.right=Math.min(1,c/(CA/2)*3.2)}function EA({progress:e,playing:t,cover:n,analyser:r,levels:i,visualizer:a,animate:o,size:s}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)(new Uint8Array(new ArrayBuffer(128)));(0,l.useEffect)(()=>{let e=c.current,n=e?.getContext(`2d`);if(!e||!n||!o)return;let l=0,f=Math.min(2,window.devicePixelRatio||1);e.width=e.height=Math.round(s*f);let p=getComputedStyle(e).getPropertyValue(`--accent`).trim()||`#3fd8ff`,m=e=>{if(TA(i,r,t,e,d.current),u.current?.style.setProperty(`--bass`,i.bass.toFixed(3)),n.setTransform(f,0,0,f,0,0),n.clearRect(0,0,s,s),a){let e=s/2,t=s*.335,r=s*.135;n.lineCap=`round`,n.lineWidth=Math.max(1.5,s/90);for(let a=0;a<CA;a++){let o=a/CA*Math.PI*2-Math.PI/2,s=i.bars[a],c=2+s*r;n.strokeStyle=p,n.globalAlpha=.35+s*.65,n.beginPath(),n.moveTo(e+Math.cos(o)*t,e+Math.sin(o)*t),n.lineTo(e+Math.cos(o)*(t+c),e+Math.sin(o)*(t+c)),n.stroke()}n.globalAlpha=1}(t||!i.bars.every(e=>e<.01)||a)&&(l=requestAnimationFrame(m))};return l=requestAnimationFrame(m),()=>cancelAnimationFrame(l)},[r,t,a,o,s,i]);let f=Math.max(0,Math.min(1,e))*100;return(0,p.jsxs)(`div`,{ref:u,className:`hud-dial${t?` playing`:``}`,style:{width:s,height:s},role:`img`,"aria-label":`Playback dial`,children:[(0,p.jsxs)(`svg`,{className:`hud-dial-svg`,viewBox:`0 0 200 200`,"aria-hidden":`true`,children:[(0,p.jsx)(`circle`,{className:`hud-dial-ticks`,cx:`100`,cy:`100`,r:`96`}),(0,p.jsx)(`circle`,{className:`hud-dial-track`,cx:`100`,cy:`100`,r:`88`}),(0,p.jsx)(`circle`,{className:`hud-dial-arc`,cx:`100`,cy:`100`,r:`88`,pathLength:`100`,strokeDasharray:`${f} 100`,transform:`rotate(-90 100 100)`}),(0,p.jsx)(`circle`,{className:`hud-dial-inner`,cx:`100`,cy:`100`,r:`62`}),(0,p.jsxs)(`g`,{className:`hud-needle`,children:[(0,p.jsx)(`line`,{x1:`100`,y1:`100`,x2:`100`,y2:`14`}),(0,p.jsx)(`circle`,{cx:`100`,cy:`14`,r:`2.500`})]})]}),(0,p.jsx)(`canvas`,{ref:c,className:`hud-spectrum`,style:{width:s,height:s},"aria-hidden":`true`}),(0,p.jsx)(`div`,{className:`hud-cover`,style:n?{backgroundImage:`url("${n}")`}:void 0,children:!n&&(0,p.jsx)(SA,{})})]})}var DA=e=>{let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},OA=new Map,kA=e=>{let t=Su(e);return t&&t.source===`local`?t.id:null},AA=e=>Su(e)?.source===`spotify`,jA=e=>Su(e)?.source===`soundcloud`,MA=e=>Su(e)?.source===`audius`,NA={spotify:`Spotify`,soundcloud:`SoundCloud`,audius:`Audius`};function PA(e){let[t,n]=(0,l.useState)(e?OA.get(e)??!1:!1);return(0,l.useEffect)(()=>{if(!e)return n(!1);if(OA.has(e))return n(OA.get(e));let t=!0,r=new Image;r.onload=()=>{OA.set(e,!0),t&&n(!0)},r.onerror=()=>{OA.set(e,!1),t&&n(!1)};let i=kA(e);return i?(r.src=`/api/music/cover/${i}`,()=>{t=!1}):n(!1)},[e]),e&&t?`/api/music/cover/${kA(e)}`:null}async function FA(e,t){let n=await fetch(`/api/music/library?q=${encodeURIComponent(e)}&limit=${t}`);return n.ok?await n.json():{tracks:[],total:0}}function IA(){let[e,t]=(0,l.useState)(null);return(0,l.useEffect)(()=>{let e=!0;return fetch(`/api/music/sources`).then(e=>e.ok?e.json():null).then(n=>{let r={};for(let e of[`spotify`,`soundcloud`,`audius`]){let t=n?.sources?.find(t=>t.id===e)?.status;t&&(r[e]={connected:t.connected,needs:t.needs})}e&&n&&t(r)}).catch(()=>{}),()=>{e=!1}},[]),e}async function LA(e,t,n){let r=await fetch(`/api/music/search?q=${encodeURIComponent(t)}&source=${e}&limit=${n}`);if(!r.ok)return{tracks:[],total:0};let i=((await r.json()).tracks??[]).map(e=>({id:e.ref,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec}));return{tracks:i,total:i.length}}var RA=e=>({id:e.id,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec});function zA({levels:e,animate:t,side:n}){let r=(0,l.useRef)(null);return(0,l.useEffect)(()=>{if(!t)return;let i=0,a=r.current,o=()=>{if(a){let t=n===`left`?e.left:e.right,r=Math.round(t*12);a.querySelectorAll(`i`).forEach((e,t)=>e.classList.toggle(`on`,t<r))}i=requestAnimationFrame(o)};return i=requestAnimationFrame(o),()=>cancelAnimationFrame(i)},[e,t,n]),(0,p.jsx)(`div`,{ref:r,className:`hud-levels ${n}`,"aria-hidden":`true`,children:Array.from({length:12},(e,t)=>(0,p.jsx)(`i`,{},t))})}function BA({player:e,anim:t}){let{state:n,dispatch:r}=e,i=(0,l.useCallback)(async()=>{if(n.queue.length>0)return r({type:`resume`});let e=await FA(``,500);r({type:`play`,tracks:e.tracks.map(RA),mode:`replace`,...n.shuffle?{shuffle:!0}:{}})},[n.queue.length,n.shuffle,r]),a=e=>n=>{t!==`off`&&cA(n),e()};return(0,p.jsxs)(`div`,{className:`hud-controls`,role:`group`,"aria-label":`Player controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Shuffle`,"aria-pressed":n.shuffle,title:`Shuffle`,onClick:()=>r({type:`shuffle`}),children:(0,p.jsx)(hA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Previous track`,title:`Previous`,onPointerDown:a(()=>{}),onClick:()=>r({type:`previous`}),children:(0,p.jsx)(mA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn hud-btn-main`,"aria-label":n.playing?`Pause`:`Play`,title:n.playing?`Pause`:`Play`,onPointerDown:a(()=>{}),onClick:()=>n.playing?r({type:`pause`}):void i(),children:n.playing?(0,p.jsx)(fA,{}):(0,p.jsx)(dA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Next track`,title:`Next`,onPointerDown:a(()=>{}),onClick:()=>r({type:`next`}),children:(0,p.jsx)(pA,{})}),(0,p.jsxs)(`button`,{type:`button`,className:`hud-btn${n.repeat===`off`?``:` on`}`,"aria-label":`Repeat: ${n.repeat}`,title:`Repeat: ${n.repeat}`,onClick:()=>r({type:`repeat`,mode:n.repeat===`off`?`all`:n.repeat===`all`?`one`:`off`}),children:[(0,p.jsx)(gA,{}),n.repeat===`one`&&(0,p.jsx)(`sup`,{children:`1`})]})]})}function VA({player:e}){let{state:t,dispatch:n}=e,r=t.duration>0?t.position/t.duration*100:0;return(0,p.jsxs)(`div`,{className:`hud-timeline`,children:[(0,p.jsx)(`span`,{className:`hud-time`,children:DA(t.position)}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Position`,min:0,max:Math.max(1,Math.floor(t.duration)),step:1,value:Math.min(Math.floor(t.position),Math.max(1,Math.floor(t.duration))),style:{"--fill":`${r}%`},disabled:t.duration<=0,onChange:e=>n({type:`seek`,seconds:Number(e.target.value)})}),(0,p.jsxs)(`span`,{className:`hud-time`,children:[`-`,DA(Math.max(0,t.duration-t.position))]})]})}function HA({player:e}){let{state:t,dispatch:n}=e;return(0,p.jsxs)(`div`,{className:`hud-volume`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":t.muted?`Unmute`:`Mute`,onClick:()=>n({type:`mute`}),children:t.muted||t.volume===0?(0,p.jsx)(vA,{}):(0,p.jsx)(_A,{})}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Volume`,min:0,max:100,value:t.muted?0:t.volume,style:{"--fill":`${t.muted?0:t.volume}%`},onChange:e=>n({type:`volume`,level:Number(e.target.value)})})]})}function UA({player:e,anim:t}){let{state:n,dispatch:r}=e,[i,a]=(0,l.useState)(n.queue.length?`queue`:`library`),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(`folder`),[d,f]=(0,l.useState)(null),m=IA(),h=[`spotify`,`soundcloud`,`audius`].filter(e=>m?.[e]?.connected),g=c!==`folder`&&h.includes(c)?c:null,_=g?m?.[g]?.needs:null;(0,l.useEffect)(()=>{if(i!==`library`)return;let e=!0;if(g&&!o.trim()){f(null);return}let t=()=>g?LA(g,o.trim(),30):FA(o,100),n=setTimeout(()=>void t().then(t=>e&&f(t)),o?250:0);return()=>{e=!1,clearTimeout(n)}},[i,o,g]);let v=i===`queue`?n.queue.map((e,t)=>({track:e,index:t})):(d?.tracks??[]).map((e,t)=>({track:RA(e),index:t}));return(0,p.jsxs)(`div`,{className:`hud-playlist`,children:[(0,p.jsxs)(`div`,{className:`hud-tabs`,role:`tablist`,children:[[`queue`,`library`].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":i===e,className:`hud-chip${i===e?` on`:``}`,onClick:()=>a(e),children:e===`queue`?`Queue (${n.queue.length})`:`Library`},e)),i===`queue`&&n.queue.length>0&&(0,p.jsx)(`button`,{type:`button`,className:`hud-chip`,onClick:()=>r({type:`clear`}),children:`Clear`})]}),i===`library`&&h.length>0&&(0,p.jsx)(`div`,{className:`hud-tabs`,role:`tablist`,"aria-label":`Where to look`,children:[`folder`,...h].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":c===e,className:`hud-chip${c===e?` on`:``}`,onClick:()=>{u(e),f(null)},children:e===`folder`?`Folder`:NA[e]},e))}),i===`library`&&(0,p.jsx)(`input`,{className:`hud-search`,type:`search`,placeholder:`Search title, artist or album`,"aria-label":`Search the music`,value:o,onChange:e=>s(e.target.value)}),(0,p.jsxs)(`ul`,{className:`hud-list`,children:[v.length===0&&(0,p.jsx)(`li`,{className:`hud-empty`,children:i===`queue`?`The queue is empty.`:g&&!o.trim()?`Type to search ${NA[g]}.`:d?`No music matches.`:`Loading…`}),i===`library`&&g&&_&&(0,p.jsx)(`li`,{className:`hud-empty`,children:_}),v.map(({track:e,index:a},o)=>{let s=i===`queue`&&a===n.index;return(0,p.jsxs)(`li`,{className:`hud-tab hud-cut${s?` current`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":Math.min(o,12)},children:[(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-current":s?`true`:void 0,onPointerDown:t===`off`?void 0:cA,onClick:()=>r(i===`queue`?{type:`jump`,index:a}:{type:`play`,tracks:(d?.tracks??[]).map(RA),mode:`replace`,start:a}),children:[(0,p.jsx)(`span`,{className:`hud-tab-title`,children:e.title}),(0,p.jsxs)(`small`,{children:[e.artist||e.album,AA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),jA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),MA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`})]})]}),i===`library`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Add ${e.title} to the queue`,title:`Add to the queue`,onClick:()=>r({type:`play`,tracks:[e],mode:`add`}),children:`+`}),i===`queue`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Remove ${e.title} from the queue`,title:`Remove`,onClick:()=>r({type:`remove`,index:a}),children:`×`})]},`${e.id}-${a}`)})]})]})}function WA({player:e,music:t,animations:n}){let{state:r,dispatch:i,current:a,blocked:o,notice:s,analyser:c,unlock:u}=e,d=(0,l.useMemo)(wA,[]),f=PA(a?.id),m=r.view===`full`,h=sA(a?.title??``,n===`full`);if(!t?.folderSet||r.view===`hidden`)return null;let g=r.duration>0?r.position/r.duration:0,_=n!==`off`;return(0,p.jsxs)(he,{id:`music`,label:`Music player`,wholeBox:!0,testId:`music`,className:`hud hud-music hud-cut ${m?`full`:`mini`}${r.playing?` playing`:``}${n===`full`?` hud-boot`:``}`,children:[(0,p.jsxs)(`header`,{className:`hud-music-head`,children:[(0,p.jsx)(`span`,{className:`hud-kicker`,children:`Media player`}),(0,p.jsxs)(`span`,{className:`hud-head-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":m?`Smaller player`:`Bigger player`,title:m?`Smaller`:`Bigger`,onClick:()=>i({type:`view`,view:m?`mini`:`full`}),children:m?(0,p.jsx)(bA,{}):(0,p.jsx)(yA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Hide the player`,title:`Hide (the music keeps playing)`,onClick:()=>i({type:`view`,view:`hidden`}),children:(0,p.jsx)(xA,{})})]})]}),(0,p.jsxs)(`div`,{className:`hud-music-body`,children:[(0,p.jsxs)(`div`,{className:`hud-music-left`,children:[m&&(0,p.jsx)(zA,{levels:d,animate:_,side:`left`}),(0,p.jsx)(EA,{progress:g,playing:r.playing,cover:f,analyser:c,levels:d,visualizer:t.visualizer,animate:_,size:m?250:112}),m&&(0,p.jsx)(zA,{levels:d,animate:_,side:`right`})]}),(0,p.jsxs)(`div`,{className:`hud-music-main`,children:[(0,p.jsxs)(`div`,{className:`hud-now`,"aria-live":`polite`,children:[(0,p.jsx)(`b`,{className:`hud-title`,children:a?h:`Nothing playing`}),(0,p.jsxs)(`small`,{className:`hud-sub`,children:[a?[a.artist,a.album].filter(Boolean).join(` — `):`Press play, or ask for some music.`,a&&AA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),a&&jA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),a&&MA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`}),e.remote&&(0,p.jsx)(`em`,{className:`hud-source`,children:`THIS PC`})]})]}),(0,p.jsx)(VA,{player:e}),(0,p.jsx)(BA,{player:e,anim:n}),m&&(0,p.jsx)(HA,{player:e}),s&&(0,p.jsx)(`p`,{className:`hud-notice`,role:`status`,children:s}),o&&(0,p.jsx)(`button`,{type:`button`,className:`hud-unlock`,onClick:u,children:`Tap to enable sound`})]}),m&&(0,p.jsx)(UA,{player:e,anim:n})]})]})}var GA=/^spotify:/,KA=class{local;makeSpotify;active;spotify=null;listeners=new Map;wrapped=new Map;vol=1;mute=!1;pre=``;constructor(e,t){this.local=e,this.makeSpotify=t,this.active=e}get element(){return this.local}get error(){return this.active.error??null}wrap(e){let t=this.wrapped.get(e);return t||(t={local:()=>{this.active===this.local&&e()},spot:()=>{this.spotify&&this.active===this.spotify&&e()}},this.wrapped.set(e,t)),t}spot(){if(!this.spotify){let e=this.makeSpotify();e.volume=this.vol,e.muted=this.mute,e.preload=this.pre;for(let[t,n]of this.listeners)for(let r of n)e.addEventListener(t,this.wrap(r).spot);this.spotify=e}return this.spotify}dispose(){this.spotify?.dispose?.(),this.spotify=null,this.active=this.local}get src(){return this.active.src}set src(e){let t=GA.test(e)?this.spot():this.local;t===this.active?e===``&&this.active.pause():(this.active.pause(),this.active=t),this.active.src=e}get currentTime(){return this.active.currentTime}set currentTime(e){this.active.currentTime=e}get duration(){return this.active.duration}get paused(){return this.active.paused}get volume(){return this.vol}set volume(e){this.vol=e,this.local.volume=e,this.spotify&&(this.spotify.volume=e)}get muted(){return this.mute}set muted(e){this.mute=e,this.local.muted=e,this.spotify&&(this.spotify.muted=e)}get preload(){return this.pre}set preload(e){this.pre=e,this.local.preload=e,this.spotify&&(this.spotify.preload=e)}play(){return this.active.play()}pause(){this.active.pause()}addEventListener(e,t){let n=this.listeners.get(e);n||this.listeners.set(e,n=new Set),n.add(t);let r=this.wrap(t);this.local.addEventListener(e,r.local),this.spotify?.addEventListener(e,r.spot)}removeEventListener(e,t){this.listeners.get(e)?.delete(t);let n=this.wrap(t);this.local.removeEventListener(e,n.local),this.spotify?.removeEventListener(e,n.spot)}},qA=/^spotify:([A-Za-z0-9_-]{1,64})$/,JA=`Spotify Premium is needed to play on this screen.`;async function YA(){let e=await fetch(`/api/music/spotify/token`,{cache:`no-store`});if(!e.ok)throw Error(`Spotify is not connected.`);return(await e.json()).accessToken}function XA(){let e=window;return e.Spotify?Promise.resolve(e.Spotify):new Promise((t,n)=>{e.onSpotifyWebPlaybackSDKReady=()=>e.Spotify?t(e.Spotify):n(Error(`no sdk`));let r=document.createElement(`script`);r.src=`https://sdk.scdn.co/spotify-player.js`,r.async=!0,r.onerror=()=>n(Error(`blocked`)),document.head.appendChild(r)})}function ZA(e){let t=e.fetch??((...e)=>fetch(...e)),n=e.now??Date.now,r=new Map,i=null,a=null,o=null,s=null,c=!1,l=null,u=null,d=0,f=0,p=0,m=!0,h=1,g=!1,_,v=e=>{for(let t of r.get(e)??[])t()},y=()=>g?0:h,b=()=>{_&&clearInterval(_),_=void 0},x=()=>{_||=setInterval(()=>v(`timeupdate`),250)},S={error:null,preload:``,get src(){return s??``},set src(e){let t=qA.exec(e);c=e!==``&&!t,s=t?e:null,l=null,u=null,d=0,p=0,S.error=null,t||b()},get currentTime(){return m?d:d+(n()-f)/1e3},set currentTime(e){d=e,f=n(),i?.seek(Math.round(e*1e3)).catch(()=>{})},get duration(){return p},get paused(){return m},get volume(){return h},set volume(e){h=e,i?.setVolume(y()).catch(()=>{})},get muted(){return g},set muted(e){g=e,i?.setVolume(y()).catch(()=>{})},async play(){if(c||!s)throw Error(`That is not a Spotify track.`);let r=qA.exec(s),a=s,o=await T();if(s!==a)return;if(l===s){await i?.resume().catch(()=>{}),m=!1,f=n(),x();return}let u=await e.getToken().catch(()=>null);if(!u)throw C(`Spotify is not connected. Connect it in Plugins, Spotify.`);let d;try{d=await t(`https://api.spotify.com/v1/me/player/play?device_id=${encodeURIComponent(o)}`,{method:`PUT`,headers:{authorization:`Bearer ${u}`,"content-type":`application/json`},body:JSON.stringify({uris:[`spotify:track:${r[1]}`]})})}catch{throw C(`Friend could not reach Spotify right now.`)}if(d.status===403)throw C(JA);if(d.status===401)throw C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`);if(d.status===404)throw C(`Spotify could not find this screen or that track.`);if(d.status===429)throw C(`Spotify is asking Friend to slow down. Try again in a minute.`);if(!d.ok)throw C(`Spotify could not play that.`);s===a&&(l=a,m=!1,f=n(),x())},pause(){m=!0,d+=(n()-f)/1e3,f=n(),b(),i?.pause().catch(()=>{})},dispose(){b();try{i?.disconnect()}catch{}i=null,a=null,s=null,l=null},addEventListener(e,t){let n=r.get(e);n||r.set(e,n=new Set),n.add(t)},removeEventListener(e,t){r.get(e)?.delete(t)}};function C(e){S.error=e,m=!0,b(),v(`error`);let t=Error(e),n=o;return o=null,n?.reject(t),t}function w(e){if(!e)return;d=e.position/1e3,f=n(),p=e.duration/1e3,m=e.paused,v(`timeupdate`),v(`loadedmetadata`),v(`durationchange`);let t=s?qA.exec(s)?.[1]:void 0;t&&e.paused&&e.position===0&&u!==s&&(e.track_window.previous_tracks??[]).some(e=>e.id===t)&&(u=s,b(),v(`ended`))}function T(){if(a)return Promise.resolve(a);if(o)return o.promise;let t,n,r=new Promise((e,r)=>{t=e,n=r}),s={promise:r,resolve:t,reject:n};o=s;let c=setTimeout(()=>{o===s&&C(`Spotify's player did not start. Check that this browser allows Spotify's player, then try again.`)},e.readyTimeoutMs??15e3),l=()=>clearTimeout(c);return r.then(l,l),(async()=>{try{if(!i){let t;try{t=await(e.loadSdk??XA)()}catch{o===s&&C(`Spotify's player could not be loaded. Check that nothing blocks sdk.scdn.co.`);return}let n=new t.Player({name:e.deviceName??`Friend`,volume:y(),getOAuthToken:t=>{e.getToken().then(t,()=>{})}});i=n,n.addListener(`ready`,(e=>{a=e.device_id;let t=o;o=null,t?.resolve(e.device_id)})),n.addListener(`not_ready`,(()=>{a=null})),n.addListener(`player_state_changed`,(e=>w(e))),n.addListener(`account_error`,(()=>void C(JA))),n.addListener(`authentication_error`,(()=>void C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`))),n.addListener(`initialization_error`,(()=>void C(`Spotify's player does not work in this browser.`))),n.addListener(`playback_error`,(()=>void C(`Spotify could not play that.`)))}!await i.connect()&&o===s&&C(`Spotify's player could not connect.`)}catch{o===s&&C(`Spotify's player could not connect.`)}})(),r}return S}var QA=e=>{let t=Su(e);return t?t.source===`local`?`/api/music/track/${t.id}`:t.source===`soundcloud`||t.source===`audius`?`/api/music/stream/${e}`:e:`/api/music/track/${e}`},$A=(e,t)=>Xu(e,t),ej=`friend.music`,tj=1e3,nj=1.5,rj=()=>{try{return JSON.parse(localStorage.getItem(ej)??`{}`)}catch{return{}}},ij=e=>{try{localStorage.setItem(ej,JSON.stringify({volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view}))}catch{}};function aj({music:e,cmd:t,send:n,connection:r,createAudio:i,createSpotify:a,remote:o=!1}){let[s,c]=(0,l.useReducer)($A,void 0,()=>{let e=rj();return Ku({volume:e.volume??70,shuffle:e.shuffle??!1,repeat:e.repeat??`all`,view:e.view??`mini`})}),[u,d]=(0,l.useState)(!1),[f,p]=(0,l.useState)(null),[m,h]=(0,l.useState)(null),g=(0,l.useRef)(null),_=(0,l.useRef)(!1),v=(0,l.useRef)(s);v.current=s;let y=(0,l.useRef)(!1),b=(0,l.useRef)(null),x=(0,l.useRef)(0),S=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!e||S.current)return;S.current=!0;let t=rj();c({type:`volume`,level:t.volume??e.volume}),c({type:`repeat`,mode:t.repeat??e.repeat}),(t.shuffle??e.shuffle)&&c({type:`shuffle`,on:!0}),c({type:`view`,view:t.view??e.startView}),t.muted&&c({type:`mute`,on:!0})},[e]);let C=()=>{if(!g.current){let e=new KA(i?i():new Audio,a??(()=>ZA({getToken:YA})));e.preload=`auto`,g.current=e}return g.current},w=(0,l.useRef)(!1),T=(0,l.useCallback)(()=>{let e=g.current;if(e&&e.src){w.current=!0;try{let t=e.play();t&&typeof t.then==`function`?t.then(()=>{w.current=!1,d(!1)},()=>{w.current=!1;let e=g.current?.error??null;e?p(e):d(!0)}):(w.current=!1,d(!1))}catch{w.current=!1,d(!0)}E.current||O()}},[]),E=(0,l.useRef)(!1),D=(0,l.useRef)(null),O=()=>{let e=g.current,t=e instanceof KA?e.element:e,n=typeof window<`u`?window.AudioContext??window.webkitAudioContext:void 0;if(t&&n&&typeof t.play==`function`)try{let e=new n;D.current=e;let r=e.createMediaElementSource(t),i=e.createAnalyser();i.fftSize=256,i.smoothingTimeConstant=.82,r.connect(i),i.connect(e.destination),E.current=!0,h(i)}catch{E.current=!0}};(0,l.useEffect)(()=>{if(o)return;let e=C(),t=0,n=()=>{let n=Date.now();n-t<250||(t=n,c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}))},r=()=>c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}),i=()=>c({type:`ended`}),a=()=>{let t=e.error??null;p(t),c(t?{type:`pause`}:{type:`failed`})};return e.addEventListener(`timeupdate`,n),e.addEventListener(`loadedmetadata`,r),e.addEventListener(`durationchange`,r),e.addEventListener(`ended`,i),e.addEventListener(`error`,a),()=>{e.removeEventListener(`timeupdate`,n),e.removeEventListener(`loadedmetadata`,r),e.removeEventListener(`durationchange`,r),e.removeEventListener(`ended`,i),e.removeEventListener(`error`,a),e.pause(),D.current?.close().catch(()=>{}),D.current=null,e.dispose(),b.current=null,g.current=null,E.current=!1,h(null)}},[o]),(0,l.useEffect)(()=>{o&&c({type:`stop`})},[o]);let k=s.index>=0?s.queue[s.index]??null:null;(0,l.useEffect)(()=>{let e=g.current;if(o||!e)return;let t=k?.id??null;if(t!==b.current){if(b.current=t,!t){e.pause(),e.src=``;return}p(null),e.src=QA(t),s.playing&&T()}},[k?.id,s.playing,T,o]),(0,l.useEffect)(()=>{let e=g.current;!o&&e&&e.src&&(s.playing&&e.paused&&!_.current&&!w.current?T():!s.playing&&!e.paused&&e.pause())},[s.playing,s.position,T,o]),(0,l.useEffect)(()=>{let e=g.current;e&&(e.volume=s.volume/100,e.muted=s.muted)},[s.volume,s.muted]),(0,l.useEffect)(()=>{let e=g.current;e&&e.src&&Math.abs((e.currentTime||0)-s.position)>nj&&(e.currentTime=s.position)},[s.position]),(0,l.useEffect)(()=>ij(s),[s.volume,s.muted,s.shuffle,s.repeat,s.view]),(0,l.useEffect)(()=>{if(!t||t.n===x.current)return;x.current=t.n;let e=Zu(t.command);e&&c(e)},[t]),(0,l.useEffect)(()=>{let e=()=>{y.current=!0,_.current&&T()};return window.addEventListener(`pointerdown`,e,{passive:!0}),window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,e)}},[T]),_.current=u;let A=(0,l.useRef)(0);return(0,l.useEffect)(()=>{if(r!==`open`||o)return;let e=()=>{let e=v.current,t=e.index>=0?e.queue[e.index]:void 0;A.current=Date.now(),n({type:`music.state`,state:{playing:e.playing,trackId:t?.id??null,title:t?.title??``,artist:t?.artist??``,album:t?.album??``,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view,queue:e.queue.slice(0,50).map(e=>({id:e.id,title:e.title.slice(0,200)})),index:e.index,active:(typeof document>`u`||document.visibilityState===`visible`)&&y.current}})};e();let t=setInterval(()=>s.playing&&Date.now()-A.current>=tj&&e(),tj);return()=>clearInterval(t)},[r,o,k?.id,s.playing,s.volume,s.muted,s.shuffle,s.repeat,s.view,s.queue.length,s.index]),(0,l.useEffect)(()=>{let e=typeof navigator<`u`?navigator.mediaSession:void 0;if(e&&!o)try{k&&typeof MediaMetadata<`u`&&(e.metadata=new MediaMetadata({title:k.title,artist:k.artist,album:k.album,artwork:[{src:`/api/music/cover/${k.id}`}]})),e.playbackState=s.playing?`playing`:k?`paused`:`none`,e.setActionHandler(`play`,()=>c({type:`resume`})),e.setActionHandler(`pause`,()=>c({type:`pause`})),e.setActionHandler(`previoustrack`,()=>c({type:`previous`})),e.setActionHandler(`nexttrack`,()=>c({type:`next`})),e.setActionHandler(`seekto`,e=>typeof e.seekTime==`number`&&c({type:`seek`,seconds:e.seekTime}))}catch{}},[k?.id,s.playing,o]),{remote:!1,state:s,dispatch:c,current:k,blocked:u,notice:f,analyser:m,unlock:T,audio:g}}function oj(e,t){if(!e)return{state:{queue:[],index:-1,playing:!1,position:0,duration:0,volume:70,muted:!1,shuffle:!1,repeat:`all`,view:t},current:null};let n=e.queue.map((t,n)=>n===e.index?{id:t.id,title:e.title||t.title,artist:e.artist,album:e.album,durationSec:e.duration>0?e.duration:null}:{id:t.id,title:t.title,artist:``,album:``,durationSec:null});return{state:{queue:n,index:e.index,playing:e.playing,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:t},current:e.index>=0?n[e.index]??null:null}}function sj({local:e,host:t,send:n}){let r=e.state.view,{state:i,current:a}=(0,l.useMemo)(()=>oj(t,r),[t,r]),o=e.dispatch,s=(0,l.useCallback)(e=>{if(e.type===`view`)return o(e);let t=Qu(e);t&&n({type:`music.remote`,command:t})},[o,n]);return(0,l.useMemo)(()=>({...e,remote:!0,state:i,dispatch:s,current:a,blocked:!1,notice:null,analyser:null,unlock:()=>{}}),[e,i,s,a])}function cj(e){let t=new URLSearchParams(e).get(`music`);return t===`connected`?{level:`info`,text:`Spotify is connected. Ask Friend to play something.`}:t===`failed`?{level:`warn`,text:`Spotify did not connect. Open Plugins, Spotify and press Connect again.`}:null}function lj({onSignedOut:e}){let{state:t,send:n,dispatch:r,voice:i,handsFree:a,useHere:o}=Nk(e);Gk(i),Kk(i),Qk(n,t.connection);let[s,c]=(0,l.useState)(!1),[u,d]=(0,l.useState)(!1),[f,m]=(0,l.useState)(!1),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(void 0),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(be),C=e=>{U(e),S(e)},w=x===`orb`?We:xe,[T,E]=(0,l.useState)(!1),[D,O]=(0,l.useState)(0),[k,A]=(0,l.useState)(null),j=fe(t.view),ee=t.music?.output===`host`,M=aj({music:t.music,cmd:t.musicCmd,send:n,connection:t.connection,remote:ee}),P=sj({local:M,host:t.hostMusic,send:n}),F=ee?P:M,te=t.hud?.animations??`full`,I=e=>{let{type:i,value:a}=e.action;if(i===`url`)window.open(a,`_blank`,`noopener,noreferrer`);else if(i===`prompt`)n({type:`chat.send`,text:a});else if(i===`music`||i===`panel`&&a===`music`){if(!t.music?.folderSet){r({type:`alert.add`,level:`info`,text:`No music folder is chosen yet. Pick one in Settings, Widgets, and the player opens.`}),b(`widgets`);return}if(i===`panel`){j.toggle(`music`,!0),F.state.view===`hidden`&&F.dispatch({type:`view`,view:`mini`});return}let e=Zu({action:a});e&&F.dispatch(e)}else a===`plugins`?g(!0):a===`settings`?b(`model`):(a===`chat`||a===`tasks`)&&j.toggle(a,!0)},ne=(0,l.useMemo)(()=>s?{...t,objects:[],captions:``}:t,[s,t]),ie=(0,l.useRef)(!1);(0,l.useEffect)(()=>{ie.current||!t.voice.available||t.voice.enrolled||(ie.current=!0,r({type:`alert.add`,level:`info`,text:`Voice recognition is not set up. Press Esc, then Enroll my voice.`}))},[t.voice.available,t.voice.enrolled,r]);let oe=ae(),se=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!oe||se.current||t.connection!==`open`)return;se.current=!0;let e=!1;try{e=localStorage.getItem(`friend.touchHint`)===`1`,localStorage.setItem(`friend.touchHint`,`1`)}catch{}e||r({type:`alert.add`,level:`info`,text:`Hold the round mic button to talk, or tap it once to start and again to send. The keyboard button types; the menu button opens settings.`})},[oe,t.connection,r]);let ce=t.uiOpen?.n??0,le=t.uiOpen?.integration;(0,l.useEffect)(()=>{ce!==0&&(v(le),g(!0))},[ce,le]);let ue=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(ue.current)return;ue.current=!0;let e=cj(window.location.search);e&&(r({type:`alert.add`,level:e.level,text:e.text}),window.history.replaceState(null,``,window.location.pathname))},[r]);let de=(0,l.useRef)(!1);(0,l.useEffect)(()=>{de.current||t.connection!==`open`||(de.current=!0,fetch(`/api/history`).then(e=>e.ok?e.json():[]).then(e=>r({type:`chat.seed`,lines:e})).catch(()=>{}))},[t.connection,r]),(0,l.useEffect)(()=>{t.connection===`open`&&n({type:`ui.panels`,open:[...j.show.chat?[`chat`]:[],...j.show.tasks?[`tasks`]:[]]})},[t.connection,j.show.chat,j.show.tasks,n]);let R=(0,l.useRef)(!1);(0,l.useEffect)(()=>{t.viewKnown&&t.view===`minimal`&&!R.current&&(R.current=!0,r({type:`alert.add`,level:`info`,text:`The view is Minimal, so the status line and clock are hidden. Press Esc, then View, to bring them back.`}))},[t.viewKnown,t.view,r]);let z=e=>{ht.save({view:e}).catch(e=>r({type:`alert.add`,level:`warn`,text:e.message}))},pe=(0,l.useMemo)(()=>L({notify:e=>r({type:`alert.add`,level:`info`,text:e}),openSettings:()=>b(`model`),openLook:()=>b(`look`),openConnectors:()=>E(!0),openPlugins:()=>g(!0),openVoice:t.voice.available?()=>d(!0):null,muted:s,setMuted:c,cameraOn:t.camera.enabled,setCamera:e=>r({type:`camera.enable`,value:e}),clearScreen:()=>{for(let e of t.objects)n({type:`stage.event`,objectId:e.id,event:`dismiss`})},statusLine:()=>nt({connection:t.connection,deviceOnline:t.deviceOnline,approval:t.approval,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity}).text,endSession:t=>{fetch(t===`lock`?`/api/lock`:`/api/logout`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).catch(()=>{}).finally(e)},panelOn:e=>j.show[e],setPanel:(e,t)=>j.toggle(e,t),view:t.view,setView:z,openHelp:A,resetLayout:()=>{B(),window.location.reload()}}),[r,n,s,e,j.show,j.toggle,t.view,t.voice.available,t.voice.mode,t.camera.enabled,t.objects,t.connection,t.deviceOnline,t.approval,t.busy,t.activity]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(QE,{state:ne,send:n,dispatch:r,voice:i,slash:pe,onMenu:()=>O(e=>e+1)}),(0,p.jsxs)(at,{approval:t.approval,challenge:t.challenge,cameraStream:t.camera.stream,alerts:t.alerts,connection:t.connection,deviceOnline:t.deviceOnline,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity,showStatus:t.viewKnown&&j.show.status,showClock:t.viewKnown&&j.show.clock,profile:t.viewKnown&&j.show.profile?{ownerName:t.ownerName,speaker:t.speaker}:null,assistantName:t.assistantName,hud:t.hud,send:n,dispatch:r,children:[t.viewKnown&&j.show.chat&&(0,p.jsx)(ge,{lines:t.chat,live:t.chatLive,onSend:e=>n({type:`chat.send`,text:e}),onClose:()=>j.toggle(`chat`,!1)}),t.viewKnown&&j.show.tasks&&(0,p.jsx)(ve,{busy:t.busy,onClose:()=>j.toggle(`tasks`,!1)}),t.viewKnown&&j.show.launcher&&t.hud&&(0,p.jsx)(lA,{items:t.hud.launcher,animations:te,onAction:I}),t.viewKnown&&j.show.music&&(0,p.jsx)(WA,{player:F,music:t.music,animations:te}),u&&(0,p.jsx)(Bk,{onClose:()=>d(!1)}),f&&(0,p.jsx)(rA,{onClose:()=>m(!1)}),h&&(0,p.jsx)($d,{variant:x===`orb`?`holo`:`classic`,..._?{initialConfigure:_}:{},onClose:()=>{g(!1),v(void 0)}}),y&&(0,p.jsx)(Jx,{initialTab:y,variant:x===`orb`?`holo`:`classic`,onClose:()=>b(null)}),T&&(0,p.jsx)(N,{variant:x===`orb`?`holo`:`classic`,onClose:()=>E(!1)}),k&&(0,p.jsx)(re,{commands:k,onClose:()=>A(null)})]}),(0,p.jsx)(w,{voiceMode:t.voice.mode,busy:t.busy,onClassic:()=>C(`classic`),onOrb:()=>C(`orb`),muted:s,onToggleMute:()=>c(e=>!e),onSignedOut:e,voiceAvailable:t.voice.available,voiceEnrolled:t.voice.enrolled,onEnroll:()=>d(!0),onHousehold:()=>m(!0),handsFreeOn:a.on,onToggleHandsFree:a.supported?a.toggle:void 0,assistantName:t.assistantName,onPlugins:()=>g(!0),onSettings:e=>b(e??`model`),onConnectors:()=>E(!0),cameraOn:t.camera.enabled,onToggleCamera:()=>r({type:`camera.enable`,value:!t.camera.enabled}),chatOn:j.show.chat,onToggleChat:()=>j.toggle(`chat`),tasksOn:j.show.tasks,onToggleTasks:()=>j.toggle(`tasks`),musicOn:j.show.music,onToggleMusic:()=>j.toggle(`music`),launcherOn:j.show.launcher,onToggleLauncher:()=>j.toggle(`launcher`),view:t.view,onView:z,openRequest:D}),t.connection===`elsewhere`&&(0,p.jsx)(qk,{onUseHere:o})]})}function uj(){let[e,t]=(0,l.useState)(`loading`);return(0,l.useEffect)(()=>{let e=!0,n=n=>e&&t(n);return(async()=>{try{if(!(await(await fetch(`/api/state`)).json()).hasOwner)return n(`setup`);let e=await(await fetch(`/api/session`,{cache:`no-store`})).json();n(e.signedIn===!0?`stage`:`login`)}catch{n(`login`)}})(),()=>{e=!1}},[]),e===`loading`?(0,p.jsx)(`div`,{className:`boot`,"aria-busy":`true`}):e===`setup`?(0,p.jsx)(g,{onDone:()=>t(`login`)}):e===`login`?(0,p.jsx)(h,{onLoggedIn:()=>t(`stage`)}):(0,p.jsx)(lj,{onSignedOut:()=>t(`login`)})}(0,u.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(l.StrictMode,{children:(0,p.jsx)(uj,{})}));
|
|
4455
|
+
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+eT(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function yT(e,t){return vT.parse(e,t)}yT.options=yT.setOptions=function(e){return vT.setOptions(e),yT.defaults=vT.defaults,jC(yT.defaults),yT},yT.getDefaults=kC,yT.defaults=AC;function bT(...e){return vT.use(...e),yT.defaults=vT.defaults,jC(yT.defaults),yT}yT.use=bT,yT.walkTokens=function(e,t){return vT.walkTokens(e,t)},yT.parseInline=vT.parseInline,yT.Parser=gT,yT.parser=gT.parse,yT.Renderer=mT,yT.TextRenderer=hT,yT.Lexer=pT,yT.lexer=pT.lex,yT.Tokenizer=fT,yT.Hooks=_T,yT.parse=yT,yT.options,yT.setOptions,yT.walkTokens,yT.parseInline,gT.parse,pT.lex;var xT=!1;function ST(){xT||(xT=!0,OC.addHook(`afterSanitizeAttributes`,e=>{e instanceof Element&&e.tagName===`A`&&(e.setAttribute(`rel`,`noopener noreferrer`),e.setAttribute(`target`,`_blank`))}))}function CT(e){ST();let t=yT.parse(e,{async:!1,breaks:!0});return OC.sanitize(t,{ALLOWED_TAGS:[`p`,`br`,`strong`,`em`,`code`,`pre`,`ul`,`ol`,`li`,`a`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`blockquote`,`hr`,`del`,`table`,`thead`,`tbody`,`tr`,`th`,`td`],ALLOWED_ATTR:[`href`,`rel`,`target`],ALLOWED_URI_REGEXP:/^(?:https?:|mailto:)/i})}var wT=e=>Number.isFinite(e);function TT(e){let t=Math.floor(Math.log10(e)),n=e/10**t;return(n<=1?1:n<=2?2:n<=2.5?2.5:n<=5?5:10)*10**t}function ET(e,t,n=5){let r=wT(e)?e:0,i=wT(t)?t:r+1;r>i&&([r,i]=[i,r]),r===i&&(i=r+(Math.abs(r)||1));let a=TT((i-r)/Math.max(1,n-1)),o=Math.floor(r/a)*a,s=Math.ceil(i/a)*a,c=[];for(let e=o;e<=s+a/2;e+=a)c.push(Math.round(e*1e9)/1e9);return{min:o,max:s,ticks:c}}function DT(e,t){let[n,r]=e,[i,a]=t;return r===n?()=>i:e=>i+(e-n)/(r-n)*(a-i)}function OT(e){return e.map(([e,t],n)=>`${n===0?`M`:`L`}${e.toFixed(2)} ${t.toFixed(2)}`).join(` `)}function kT(e,t,n,r,i){let a=r=>{let i=r*Math.PI/180;return`${(e+n*Math.cos(i)).toFixed(2)} ${(t+n*Math.sin(i)).toFixed(2)}`},o=+(Math.abs(i-r)>180);return`M ${a(r)} A ${n} ${n} 0 ${o} 1 ${a(i)}`}function AT(e,t,n){return!wT(e)||!wT(t)||!wT(n)||n<=t?0:Math.min(1,Math.max(0,(e-t)/(n-t)))*240}function jT(e,t,n,r){let i=t.x-e.x,a=t.y-e.y,o=Math.hypot(i,a);if(o===0||o<=n+r)return{from:{...e},to:{...t}};let s=i/o,c=a/o;return{from:{x:e.x+s*n,y:e.y+c*n},to:{x:t.x-s*r,y:t.y-c*r}}}function MT(e,t,n){if(e<=0)return[];if(e===1)return[{x:t/2,y:n/2}];let r=Math.min(t,n)*.36;return Array.from({length:e},(i,a)=>{let o=-Math.PI/2+a*2*Math.PI/e;return{x:t/2+r*Math.cos(o),y:n/2+r*Math.sin(o)}})}var NT=e=>typeof e==`object`&&!!e&&!Array.isArray(e),PT=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,FT=e=>Array.isArray(e)?e:[],IT=e=>typeof e==`number`?Number.isFinite(e)?e:null:typeof e==`string`&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):null,LT=(e,t)=>e.length>t?e.slice(0,t)+`…`:e,RT=[`var(--accent)`,`#ffb454`,`#7b8cff`,`#5ef0b0`,`#ff6b7a`,`#c792ea`],zT=({text:e})=>e?(0,p.jsx)(`h3`,{className:`obj-title`,children:e}):null,BT=({text:e=`No data`})=>(0,p.jsx)(`p`,{className:`obj-empty`,children:e}),VT=400,HT=220,UT={l:44,r:12,t:10,b:28};function WT({props:e}){let t=e.kind===`bar`||e.kind===`area`?e.kind:`line`,n=FT(e.labels).slice(0,120).map(PT),r=FT(e.series).slice(0,6).map((e,t)=>{let n=NT(e)?e:{},r=FT(n.values).slice(0,120).map((e,t)=>({idx:t,v:IT(e)})).filter(e=>e.v!==null);return{name:PT(n.name)||`series ${t+1}`,points:r}}).filter(e=>e.points.length>0);if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{})]});let i=r.flatMap(e=>e.points.map(e=>e.v)),a=Math.min(...i),o=Math.max(...i),s=ET(t===`line`?a:Math.min(0,a),t===`line`?o:Math.max(0,o),5),c=Math.max(n.length,...r.map(e=>e.points[e.points.length-1].idx+1),2),l=DT([s.min,s.max],[HT-UT.b,UT.t]),u=DT([0,c-1],[UT.l,VT-UT.r]),d=(VT-UT.l-UT.r)/c,f=Math.max(1,d*.7/r.length),m=(e,t)=>UT.l+e*d+d*.15+t*f,h=Math.max(1,Math.ceil(c/6)),g=PT(e.unit);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-chart`,viewBox:`0 0 ${VT} ${HT}`,role:`img`,"aria-label":PT(e.title)||`chart`,children:[s.ticks.map(e=>(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:`grid`,x1:UT.l,x2:VT-UT.r,y1:l(e),y2:l(e)}),(0,p.jsxs)(`text`,{className:`tick`,x:UT.l-6,y:l(e)+3,textAnchor:`end`,children:[e,g&&e===s.max?g:``]})]},e)),Array.from({length:c},(e,t)=>t).filter(e=>e%h===0&&n[e]).map(e=>(0,p.jsx)(`text`,{className:`tick`,x:t===`bar`?m(e,0)+f*r.length/2:u(e),y:212,textAnchor:`middle`,children:LT(n[e],8)},e)),r.map((e,n)=>{let r=RT[n%RT.length];if(t===`bar`)return(0,p.jsx)(`g`,{children:e.points.map(e=>(0,p.jsx)(`rect`,{className:`bar`,x:m(e.idx,n),y:Math.min(l(e.v),l(0)),width:f,height:Math.abs(l(e.v)-l(0)),fill:r},e.idx))},n);let i=e.points.map(e=>[u(e.idx),l(e.v)]),a=OT(i),o=`${a} L${i[i.length-1][0].toFixed(2)} ${l(s.min).toFixed(2)} L${i[0][0].toFixed(2)} ${l(s.min).toFixed(2)} Z`;return(0,p.jsxs)(`g`,{children:[t===`area`&&(0,p.jsx)(`path`,{className:`series-area`,d:o,fill:r,opacity:.18}),(0,p.jsx)(`path`,{className:`series-line`,d:a,fill:`none`,stroke:r,strokeWidth:2,strokeLinejoin:`round`})]},n)})]}),r.length>1&&(0,p.jsx)(`ul`,{className:`legend`,children:r.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`i`,{style:{background:RT[t%RT.length]}}),(0,p.jsx)(`span`,{children:e.name})]},t))})]})}function GT({props:e}){let t=IT(e.min)??0,n=IT(e.max)??100,r=IT(e.value)??t,i=AT(r,t,n),a=i/240;return(0,p.jsxs)(`div`,{className:`obj-gauge ${a>.95?`gauge-crit`:a>.8?`gauge-warn`:``}`,children:[(0,p.jsxs)(`svg`,{viewBox:`0 0 200 150`,role:`img`,"aria-label":`${PT(e.label)} ${r}`,children:[(0,p.jsx)(`path`,{className:`track`,d:kT(100,100,70,150,390),fill:`none`,strokeWidth:12,strokeLinecap:`round`}),i>0&&(0,p.jsx)(`path`,{className:`value`,d:kT(100,100,70,150,150+i),fill:`none`,strokeWidth:12,strokeLinecap:`round`})]}),(0,p.jsxs)(`div`,{className:`gauge-read`,children:[(0,p.jsx)(`span`,{className:`gauge-value`,children:String(Math.round(r*100)/100)}),PT(e.unit)&&(0,p.jsx)(`small`,{className:`gauge-unit`,children:PT(e.unit)})]}),(0,p.jsx)(`span`,{className:`obj-label`,children:PT(e.label)})]})}function KT({props:e}){let t=FT(e.items).slice(0,30).map(e=>NT(e)?e:{}).map(e=>({time:PT(e.time),title:PT(e.title),detail:PT(e.detail)})).filter(e=>e.title||e.time);return t.length===0?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{text:`Nothing to show`})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(`ol`,{className:`obj-timeline`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`time`,{children:e.time}),(0,p.jsx)(`strong`,{children:e.title}),e.detail&&(0,p.jsx)(`span`,{children:e.detail})]},t))})]})}var qT=400,JT=300,YT=12;function XT({props:e}){let t=(0,l.useId)(),n=new Set,r=[];for(let t of FT(e.nodes)){let e=NT(t)?t:{},i=PT(e.id);if(i&&!n.has(i)&&(n.add(i),r.push({id:i,label:PT(e.label)||i}),r.length>=40))break}if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsx)(BT,{text:`Nothing to show`})]});let i=new Map(r.map((e,t)=>[e.id,MT(r.length,qT,JT)[t]])),a=[];for(let t of FT(e.edges)){let e=NT(t)?t:{},n=PT(e.from),r=PT(e.to);if(i.has(n)&&i.has(r)&&n!==r&&(a.push({from:n,to:r,label:PT(e.label)}),a.length>=80))break}return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(zT,{text:PT(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-graph`,viewBox:`0 0 ${qT} ${JT}`,role:`img`,"aria-label":PT(e.title)||`graph`,children:[(0,p.jsx)(`defs`,{children:(0,p.jsx)(`marker`,{id:t,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`,children:(0,p.jsx)(`path`,{d:`M0 0 L10 5 L0 10 z`,className:`arrow`})})}),a.map((e,n)=>{let{from:r,to:a}=jT(i.get(e.from),i.get(e.to),14,17),o=(r.x+a.x)/2+(qT/2-(r.x+a.x)/2)*.25,s=(r.y+a.y)/2+(JT/2-(r.y+a.y)/2)*.25;return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`path`,{className:`edge`,d:`M ${r.x.toFixed(1)} ${r.y.toFixed(1)} Q ${o.toFixed(1)} ${s.toFixed(1)} ${a.x.toFixed(1)} ${a.y.toFixed(1)}`,fill:`none`,markerEnd:`url(#${t})`}),e.label&&(0,p.jsx)(`text`,{className:`edge-label`,x:o,y:s,textAnchor:`middle`,children:LT(e.label,12)})]},n)}),r.map(e=>{let t=i.get(e.id);return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`circle`,{className:`node`,cx:t.x,cy:t.y,r:YT}),(0,p.jsx)(`text`,{className:`node-label`,x:t.x,y:t.y+26,textAnchor:`middle`,children:LT(e.label,18)})]},e.id)})]})]})}var ZT=30,QT=e=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,$T=new class{current=1;goal=1;from=1;steps=1;n=0;timer=null;subs=new Set;get level(){return this.current}set(e,t=250){if(this.goal=QT(e),t<=0||this.goal===this.current){this.stop(),this.move(this.goal);return}this.from=this.current,this.steps=Math.max(1,Math.ceil(t/ZT)),this.n=0,this.timer??=setInterval(()=>this.tick(),ZT)}subscribe(e){return this.subs.add(e),()=>void this.subs.delete(e)}tick(){this.n++,this.n>=this.steps?(this.stop(),this.move(this.goal)):this.move(this.from+(this.goal-this.from)*this.n/this.steps)}stop(){this.timer&&clearInterval(this.timer),this.timer=null}move(e){if(e!==this.current){this.current=e;for(let t of[...this.subs])t(e)}}};function eE(e,t=$T){let n=e.volume,r=e.volume,i=!0,a=t=>{i&&(r=QT(n*t),e.volume=r)},o=()=>{if(!i||Math.abs(e.volume-r)<=.002)return;let a=t.level;a>.001&&(n=QT(e.volume/a)),r=e.volume};e.addEventListener(`volumechange`,o);let s=t.subscribe(a);return a(t.level),()=>{i=!1,s(),e.removeEventListener(`volumechange`,o),e.volume=n}}var tE=`https://www.youtube-nocookie.com`;function nE(e,t=$T,n=window){let r=100,i=null,a=!1,o=!0,s=!1,c=t=>e.contentWindow?.postMessage(JSON.stringify(t),tE),l=()=>c({event:`listening`,id:1,channel:`widget`}),u=e=>{i=e,c({event:`command`,func:`setVolume`,args:[e]})},d=e=>{o&&(e<.999?(a=!0,u(Math.round(r*e))):a&&(a=!1,u(Math.round(r))))},f=n=>{if(!o||n.source!==e.contentWindow)return;let c;try{c=JSON.parse(String(n.data)).info}catch{return}if(typeof c?.volume!=`number`)return;s=!0;let l=c.volume;if(i!==null&&Math.abs(l-i)<=1)return;let u=t.level;r=a&&u>.001?l/u:l,i=l};n.addEventListener(`message`,f),e.addEventListener?.(`load`,l),l();let p=setInterval(()=>s?clearInterval(p):l(),1e3),m=t.subscribe(d);return d(t.level),()=>{o=!1,clearInterval(p),m(),n.removeEventListener(`message`,f),e.removeEventListener?.(`load`,l),a&&rE(e,r)}}function rE(e,t){try{e.contentWindow?.postMessage(JSON.stringify({event:`command`,func:`setVolume`,args:[Math.round(t)]}),tE)}catch{}}var iE=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,aE=e=>Array.isArray(e)?e:[],oE=e=>typeof e==`object`&&e?e:{},sE=/^\/api\/media\/[0-9a-f]{32}$/,cE=e=>typeof e==`string`&&sE.test(e)?e:null,lE=/^\/api\/video\/[0-9a-f]{32}$/,uE=e=>typeof e==`string`&&lE.test(e)?e:null,dE=({props:e})=>iE(e.title)?(0,p.jsx)(`h3`,{className:`obj-title`,children:iE(e.title)}):null;function fE({props:e}){let t=(0,l.useMemo)(()=>CT(iE(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(dE,{props:e}),(0,p.jsx)(`div`,{className:`obj-md obj-doc`,dangerouslySetInnerHTML:{__html:t}})]})}function pE({props:e}){let t=Math.min(100,Math.max(0,Number(e.value)||0));return(0,p.jsxs)(`div`,{className:`obj-progress`,children:[(0,p.jsxs)(`div`,{className:`obj-progress-head`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:iE(e.label)}),(0,p.jsxs)(`span`,{className:`obj-progress-pct`,children:[Math.round(t),`%`]})]}),(0,p.jsx)(`div`,{className:`obj-progress-bar`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(t),"aria-label":iE(e.label)||`Progress`,children:(0,p.jsx)(`i`,{style:{width:`${t}%`}})}),iE(e.detail)&&(0,p.jsx)(`span`,{className:`obj-progress-detail`,children:iE(e.detail)})]})}function mE({props:e}){let t=aE(e.items).map(e=>oE(typeof e==`object`&&e?e:{text:e})),n=t.filter(e=>e.done===!0).length;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(dE,{props:e}),(0,p.jsx)(`ul`,{className:`obj-checklist`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{className:e.done===!0?`done`:void 0,children:[(0,p.jsx)(`span`,{className:`box`,"aria-hidden":`true`,children:e.done===!0?`✓`:``}),(0,p.jsx)(`span`,{children:iE(e.text)})]},t))}),t.length>0&&(0,p.jsxs)(`small`,{className:`obj-progress-detail`,children:[n,` of `,t.length,` done`]})]})}function hE({props:e}){return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(dE,{props:e}),(0,p.jsx)(`dl`,{className:`obj-kv`,children:aE(e.rows).map((e,t)=>{let n=oE(e);return(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`dt`,{children:iE(n.key)}),(0,p.jsx)(`dd`,{children:iE(n.value)})]},t)})})]})}var gE=e=>String(Math.floor(e)).padStart(2,`0`);function _E(e){let t=Math.max(0,Math.ceil(e));return`${gE(t/3600)}:${gE(t%3600/60)}:${gE(t%60)}`}function vE({props:e}){let t=(0,l.useRef)(null);if(t.current===null){let n=typeof e.to==`string`?Date.parse(e.to):NaN,r=Number(e.seconds);t.current=Number.isFinite(n)?n:Date.now()+(Number.isFinite(r)?r:0)*1e3}let[n,r]=(0,l.useState)(Date.now());(0,l.useEffect)(()=>{let e=setInterval(()=>r(Date.now()),250);return()=>clearInterval(e)},[]);let i=(t.current-n)/1e3;return(0,p.jsxs)(`div`,{className:`obj-countdown${i<=0?` done`:``}`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:iE(e.title)||iE(e.label)}),(0,p.jsx)(`span`,{className:`obj-countdown-time`,role:`timer`,children:_E(i)})]})}function yE({props:e}){let t=cE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(dE,{props:e}),t?(0,p.jsx)(`img`,{src:t,alt:iE(e.title)||`Picture`,loading:`lazy`}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This picture is not available.`})]})}function bE({src:e,web:t,title:n}){let[r,i]=(0,l.useState)(t?`loading`:`ready`),a=(0,l.useRef)(null);return(0,l.useEffect)(()=>a.current?eE(a.current):void 0,[r===`failed`]),r===`failed`?(0,p.jsx)(`p`,{className:`obj-empty`,children:`This video could not be played. Ask Friend to try again, or to play it in a window on the PC.`}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`video`,{ref:a,src:e,controls:!0,playsInline:!0,autoPlay:t,preload:t?`auto`:`metadata`,"aria-label":n,onLoadedData:()=>i(`ready`),onError:()=>i(`failed`)}),t&&r===`loading`&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Preparing the video…`})]})}var xE=/^[A-Za-z0-9_-]{11}$/;function SE({id:e,start:t,title:n}){let[r,i]=(0,l.useState)(!1),a=(0,l.useRef)(null);(0,l.useEffect)(()=>a.current?nE(a.current):void 0,[e]);let o=new URLSearchParams({autoplay:`1`,rel:`0`,playsinline:`1`,modestbranding:`1`,enablejsapi:`1`});return t>0&&o.set(`start`,String(t)),(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{ref:a,className:`obj-youtube`,src:`https://www.youtube-nocookie.com/embed/${e}?${o.toString()}`,title:n,allow:`autoplay; encrypted-media; fullscreen; picture-in-picture`,allowFullScreen:!0,referrerPolicy:`strict-origin-when-cross-origin`,onLoad:()=>i(!0)}),!r&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Loading the player…`})]})}function CE({props:e}){if(e.embed!==void 0){let t=typeof e.embed==`string`&&xE.test(e.embed)?e.embed:null,n=typeof e.start==`number`&&e.start>0&&e.start<=86400?Math.floor(e.start):0;return(0,p.jsxs)(`div`,{className:`obj-media obj-media-fill`,children:[(0,p.jsx)(dE,{props:e}),t?(0,p.jsx)(SE,{id:t,start:n,title:iE(e.title)||`YouTube video`},`${t}-${n}`):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}let t=uE(e.src),n=t??cE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(dE,{props:e}),n?(0,p.jsx)(bE,{src:n,web:t!==null,title:iE(e.title)||`Video`},n):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}function wE({props:e}){let t=cE(e.src);return(0,p.jsxs)(`div`,{className:`obj-media obj-pdf`,children:[(0,p.jsx)(dE,{props:e}),t?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{src:t,title:iE(e.title)||`Document`}),(0,p.jsx)(`a`,{className:`obj-open`,href:t,target:`_blank`,rel:`noopener noreferrer`,children:`Open in a new tab`})]}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This document is not available.`})]})}function TE({props:e}){let t=aE(e.items).map(oE).filter(e=>cE(e.src)),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1)),a=t[i];if(!a)return(0,p.jsx)(`p`,{className:`obj-empty`,children:`Nothing to show.`});let o=cE(a.src),s=a.kind===`video`;return(0,p.jsxs)(`div`,{className:`obj-media obj-gallery`,children:[(0,p.jsx)(dE,{props:e}),s?(0,p.jsx)(`video`,{src:o,controls:!0,playsInline:!0,preload:`metadata`},o):(0,p.jsx)(`img`,{src:o,alt:iE(a.caption)||`Picture ${i+1}`},o),(0,p.jsxs)(`div`,{className:`obj-gallery-bar`,children:[(0,p.jsx)(`button`,{type:`button`,"aria-label":`Previous`,disabled:t.length<2,onClick:()=>r((i+t.length-1)%t.length),children:`‹`}),(0,p.jsxs)(`span`,{children:[iE(a.caption),(0,p.jsxs)(`small`,{children:[i+1,` / `,t.length]})]}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Next`,disabled:t.length<2,onClick:()=>r((i+1)%t.length),children:`›`})]})]})}var EE=[`default-src 'none'`,`script-src 'unsafe-inline'`,`style-src 'unsafe-inline'`,`img-src data: blob:`,`form-action 'none'`,`base-uri 'none'`].join(`; `),DE=`html,body{margin:0;min-height:100%;background:#050b10;color:var(--ink,#d8f6ff);font:15px/1.5 var(--ui,system-ui,sans-serif)}`,OE=[`--accent`,`--ink`,`--muted`,`--ok`,`--warn`,`--bad`,`--glass`,`--edge`,`--ui`,`--mono`],kE=/^[\w\s#().,%'"/-]+$/;function AE(){if(typeof document>`u`)return``;let e=getComputedStyle(document.documentElement),t=OE.map(t=>[t,e.getPropertyValue(t).trim()]).filter(([,e])=>e&&kE.test(e));return t.length?`:root{${t.map(([e,t])=>`${e}:${t}`).join(`;`)}}`:``}function jE(e,t=``){return`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${EE}"><meta name="viewport" content="width=device-width,initial-scale=1"><style>${t}${DE}</style></head><body>${e}</body></html>`}function ME({props:e}){let t=typeof e.html==`string`?e.html:``,n=typeof e.title==`string`?e.title:``,r=(0,l.useMemo)(()=>jE(t,AE()),[t]);return(0,p.jsxs)(`div`,{className:`obj-sandbox`,children:[n&&(0,p.jsx)(`h3`,{className:`obj-title`,children:n}),(0,p.jsx)(`iframe`,{title:n||`Page made by Friend`,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,allow:``,srcDoc:r})]})}var NE=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,PE=e=>Array.isArray(e)?e:[];function FE({props:e}){let t=(0,l.useMemo)(()=>CT(NE(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`div`,{className:`obj-md`,dangerouslySetInnerHTML:{__html:t}})]})}function IE({props:e}){return(0,p.jsxs)(`div`,{className:`obj-stat`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:NE(e.label)}),(0,p.jsxs)(`span`,{className:`obj-value`,children:[(0,p.jsx)(`span`,{children:NE(e.value)}),NE(e.unit)&&(0,p.jsx)(`small`,{children:NE(e.unit)})]}),NE(e.delta)&&(0,p.jsx)(`span`,{className:`obj-delta`,children:NE(e.delta)})]})}function LE({props:e}){return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`ul`,{className:`obj-list`,children:PE(e.items).map((e,t)=>{let n=typeof e==`object`&&e?e:{text:e};return(0,p.jsx)(`li`,{className:n.done?`done`:void 0,children:NE(n.text)},t)})})]})}function RE({props:e}){let t=PE(e.columns),n=PE(e.rows);return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`div`,{className:`obj-table-wrap`,children:(0,p.jsxs)(`table`,{className:`obj-table`,children:[(0,p.jsx)(`thead`,{children:(0,p.jsx)(`tr`,{children:t.map((e,t)=>(0,p.jsx)(`th`,{children:NE(e)},t))})}),(0,p.jsx)(`tbody`,{children:n.map((e,t)=>(0,p.jsx)(`tr`,{children:PE(e).map((e,t)=>(0,p.jsx)(`td`,{children:NE(e)},t))},t))})]})})]})}function zE({props:e}){return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`pre`,{className:`obj-code`,"data-lang":NE(e.language),children:(0,p.jsx)(`code`,{children:NE(e.code)})})]})}function BE({part:e}){let t=typeof e==`object`&&e?e:{},n=typeof t.type==`string`?t.type:``;if(n===`group`||n===`tabs`||n===`sandbox`)return null;let r=UE[n];return r?(0,p.jsx)(`div`,{className:`obj-part obj-part-${n}`,children:(0,p.jsx)(r,{props:typeof t.props==`object`&&t.props!==null?t.props:{}})}):null}function VE({props:e}){let t=e.layout===`row`||e.layout===`column`?e.layout:`grid`;return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`div`,{className:`obj-group obj-group-${t}`,children:PE(e.items).map((e,t)=>(0,p.jsx)(BE,{part:e},t))})]})}function HE({props:e}){let t=PE(e.tabs).map(e=>typeof e==`object`&&e?e:{}),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1));return(0,p.jsxs)(p.Fragment,{children:[NE(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:NE(e.title)}),(0,p.jsx)(`div`,{className:`obj-tabs`,role:`tablist`,children:t.map((e,t)=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t===i,className:t===i?`on`:void 0,onClick:()=>r(t),children:NE(e.title)||`Tab ${t+1}`},t))}),t[i]&&(0,p.jsx)(BE,{part:t[i]})]})}var UE={card:FE,stat:IE,list:LE,table:RE,code:zE,chart:WT,gauge:GT,timeline:KT,graph:XT,sandbox:ME,markdown:fE,image:yE,video:CE,pdf:wE,gallery:TE,group:VE,tabs:HE,progress:pE,checklist:mE,countdown:vE,kv:hE};function WE(e,t){let n=new Map(t.map(e=>[e.id,e])),r=[],i=new Set;for(let t of e){if(i.has(t.object.id))continue;i.add(t.object.id);let e=n.get(t.object.id);r.push(e?{object:e,leaving:!1}:{object:t.object,leaving:!0})}for(let e of t)i.has(e.id)||(i.add(e.id),r.push({object:e,leaving:!1}));return r}function GE(e,t){let[n,r]=(0,l.useState)(()=>e.map(e=>({object:e,leaving:!1}))),i=(0,l.useRef)(new Map);return(0,l.useEffect)(()=>{r(n=>{let a=WE(n,e),o=new Set(n.filter(e=>e.leaving).map(e=>e.object.id));for(let e of a){let n=i.current.get(e.object.id);if(!e.leaving)n&&clearTimeout(n),i.current.delete(e.object.id);else if(!o.has(e.object.id)&&!n){let n=e.object.id;i.current.set(n,setTimeout(()=>{i.current.delete(n),r(e=>e.filter(e=>!(e.object.id===n&&e.leaving)))},Math.max(t,0)))}}return t<=0?a.filter(e=>!e.leaving):a})},[e,t]),(0,l.useEffect)(()=>()=>{for(let e of i.current.values())clearTimeout(e);i.current.clear()},[]),n}var KE=.12,qE=.1,JE=.02,YE=(e,t,n)=>Math.min(Math.max(e,t),n);function XE(e){let t=YE(e.w,KE,1),n=YE(e.h,qE,1);return{x:YE(e.x,0,1-t),y:YE(e.y,0,1-n),w:t,h:n}}function ZE(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();return n.width<=0||n.height<=0?null:XE({x:(r.left-n.left)/n.width,y:(r.top-n.top)/n.height,w:r.width/n.width,h:r.height/n.height})}function QE(e,t,n){let r=(0,l.useRef)(null),[i,a]=(0,l.useState)(null),o=(0,l.useCallback)((n,r)=>{let i=XE(r);t({type:`object.place`,id:n,placement:{x:i.x,y:i.y,w:i.w,h:i.h}}),e({type:`stage.move`,objectId:n,rect:i})},[e,t]),s=(0,l.useCallback)((e,t,i)=>{if(e.pointerType===`mouse`&&e.button!==0)return;let o=n(),s=e.currentTarget.closest(`[data-object]`);if(!o||!s||r.current)return;let c=ZE(s,o);if(!c)return;let l=o.getBoundingClientRect();r.current={id:t.id,mode:i,pointer:e.pointerId,startX:e.clientX,startY:e.clientY,from:c,stageW:l.width,stageH:l.height};try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}e.stopPropagation(),e.preventDefault(),a({id:t.id,box:c})},[n]),c=(e,t)=>{let n=(t.clientX-e.startX)/e.stageW,r=(t.clientY-e.startY)/e.stageH;return e.mode===`move`?XE({...e.from,x:e.from.x+n,y:e.from.y+r}):XE({...e.from,w:e.from.w+n,h:e.from.h+r})};return{preview:i,begin:s,move:(0,l.useCallback)(e=>{let t=r.current;t&&t.pointer===e.pointerId&&a({id:t.id,box:c(t,e)})},[]),end:(0,l.useCallback)((e,t)=>{let n=r.current;n&&n.pointer===e.pointerId&&(r.current=null,a(null),t||o(n.id,c(n,e)))},[o]),key:(0,l.useCallback)((e,t)=>{let r={ArrowLeft:[-.02,0],ArrowRight:[JE,0],ArrowUp:[0,-.02],ArrowDown:[0,JE]}[e.key],i=n(),a=e.currentTarget.closest(`[data-object]`);if(!r||!i||!a)return;let s=ZE(a,i);s&&(e.preventDefault(),o(t.id,e.shiftKey?{...s,w:s.w+r[0],h:s.h+r[1]}:{...s,x:s.x+r[0],y:s.y+r[1]}))},[o,n])}}function $E(e,t){if(e===`auto`)return{position:`relative`};if(t.w<600)return{position:`relative`,width:`100%`};let[n,r,i,a]=typeof e==`string`?lu[e]:[e.x*100,e.y*100,e.w*100,e.h*100],o={position:`absolute`,left:`${n}%`,top:`${r}%`,width:`${i}%`};return e===`top`||e===`bottom`?{...o,maxHeight:`${a}%`}:{...o,height:`${a}%`}}var eD=350,tD=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,nD=class extends l.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?null:this.props.children}};function rD(){let e=()=>({w:window.innerWidth,h:window.innerHeight}),[t,n]=(0,l.useState)(e);return(0,l.useEffect)(()=>{let t=()=>n(e());return window.addEventListener(`resize`,t),()=>window.removeEventListener(`resize`,t)},[]),t}var iD=350;function aD({state:e,send:t,dispatch:n,voice:r,slash:i,onMenu:a}){let o=rD(),[s,c]=(0,l.useState)(0),[u,d]=(0,l.useState)(!1),f=ae(),m=o.w<600,h=e.scene===`focus`||e.scene===`multi`,g={"--accent":e.mood.accent,"--intensity":e.mood.intensity},_=e.voice.mode,v=_===`listening`?`listening`:_===`speaking`?`speaking`:_===`transcribing`?`thinking`:e.presence.state,y=jx(e.look.reactivity),b=Math.min(1,(_===`listening`||_===`speaking`?e.voice.level:e.presence.amplitude)*y),x=(0,l.useRef)({timer:null,down:!1,talking:!1,id:null}),S=e=>{if(!(e.target===e.currentTarget||e.target.closest(`[data-presence]`))||e.pointerType===`mouse`&&e.button!==0)return;let t=x.current;if(!(t.down&&t.id!==null&&e.pointerId!==t.id)){t.timer&&clearTimeout(t.timer),t.down=!0,t.talking=!1,t.id=typeof e.pointerId==`number`?e.pointerId:null;try{t.id!==null&&e.currentTarget.setPointerCapture?.(t.id)}catch{}t.timer=r?setTimeout(()=>{t.down&&(t.talking=!0,r.pressStart())},iD):null}},C=(e,t)=>{let n=x.current;n.down&&(n.id===null||typeof e.pointerId!=`number`||e.pointerId===n.id)&&(n.down=!1,n.id=null,n.timer&&clearTimeout(n.timer),n.timer=null,n.talking?(n.talking=!1,t?r?.blur?.():r?.pressEnd()):t||c(e=>e+1))},w=(0,l.useRef)(null),T=QE(t,n,()=>w.current),E=GE(e.objects,tD()?0:eD),D=E.filter(e=>e.object.layer===`overlay`),O=E.filter(e=>e.object.layer!==`overlay`&&e.object.placement===`auto`),k=E.filter(e=>e.object.layer!==`overlay`&&e.object.placement!==`auto`),A=({object:e,leaving:r})=>{let i=UE[e.type];if(!i)return null;let a=e.layer===`overlay`,s=!m&&!r&&!a,c=T.preview?.id===e.id?T.preview.box:null,l=c?{x:c.x,y:c.y,w:c.w,h:c.h}:e.placement;return(0,p.jsxs)(`section`,{"data-object":e.id,className:`obj glass${e.style===`alert`?` alert`:``}${a?` overlay`:``}${e.pinned?` pinned`:``}${c?` dragging`:``}${r?` leaving`:``}`,style:a?void 0:$E(l,o),children:[s&&(0,p.jsx)(`div`,{className:`obj-grip`,role:`button`,tabIndex:0,"aria-label":`Move ${e.id}. Drag, or use the arrow keys; hold Shift to resize.`,onPointerDown:t=>T.begin(t,e,`move`),onPointerMove:T.move,onPointerUp:e=>T.end(e,!1),onPointerCancel:e=>T.end(e,!0),onKeyDown:t=>T.key(t,e)}),!a&&(0,p.jsx)(`button`,{className:`obj-pin${e.pinned?` on`:``}`,"aria-label":e.pinned?`Unpin ${e.id}`:`Pin ${e.id} to the screen`,"aria-pressed":!!e.pinned,title:e.pinned?`Pinned: stays on the screen. Click to unpin.`:`Pin: keep this on the screen.`,disabled:r,onClick:()=>t({type:`stage.pin`,objectId:e.id,pinned:!e.pinned}),children:(0,p.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:e.pinned?`currentColor`:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(0,p.jsx)(`path`,{d:`M12 17v5M9 3h6l-1 7 3 3H7l3-3-1-7z`})})}),(0,p.jsx)(`button`,{className:`obj-close`,"aria-label":`Dismiss ${e.id}`,title:e.pinned?`Remove this widget`:`Dismiss`,disabled:r,onClick:()=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})},children:`×`}),s&&(0,p.jsx)(`div`,{className:`obj-resize`,"aria-hidden":`true`,onPointerDown:t=>T.begin(t,e,`resize`),onPointerMove:T.move,onPointerUp:e=>T.end(e,!1),onPointerCancel:e=>T.end(e,!0)}),(0,p.jsx)(nD,{children:(0,p.jsx)(i,{props:e.props})})]},e.id)};return(0,p.jsxs)(`div`,{ref:w,"data-testid":`stage`,className:`stage`,style:g,onPointerDown:S,onPointerUp:e=>C(e,!1),onPointerCancel:e=>C(e,!0),onContextMenu:e=>r&&e.preventDefault(),children:[e.look.ambient&&(0,p.jsx)(`div`,{className:`ambient`,"aria-hidden":`true`,style:{opacity:.35+.65*e.mood.intensity}}),(0,p.jsx)(Ax,{state:v,amplitude:b,pulse:e.presence.pulse,mode:h?`corner`:`full`,accent:e.mood.accent,style:e.presence.style,intensity:e.mood.intensity,scale:e.look.size}),(0,p.jsxs)(`div`,{className:m?`objects objects-stack`:`objects`,style:{zIndex:10},children:[O.length>0&&(0,p.jsx)(`div`,{className:`auto-grid`,children:O.map(A)}),k.map(A)]}),D.length>0&&(0,p.jsxs)(`div`,{className:`overlay-layer`,"data-testid":`overlay`,children:[(0,p.jsx)(`div`,{className:`overlay-backdrop`,onClick:()=>D.forEach(({object:e})=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})})}),D.map(A)]}),e.look.captions&&e.captions&&(0,p.jsx)(`p`,{className:`captions captions-${e.look.captionSize}${e.captionDone?` done`:``}`,"aria-live":`polite`,children:e.captions}),f&&r&&!u&&(0,p.jsx)($x,{voice:r,mode:_,onType:()=>c(e=>e+1),onMenu:()=>a?.()}),(0,p.jsx)(Xx,{requestOpen:s,slash:i,onOpenChange:d,onSend:e=>t({type:`chat.send`,text:e})})]})}function oD(){let e=()=>Math.random().toString(36).slice(2,12)+Date.now().toString(36);try{let t=sessionStorage.getItem(`friend.tab`);return t||(t=e(),sessionStorage.setItem(`friend.tab`,t)),t}catch{return e()}}function sD(){return`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`}function cD(e=sD()){let t=null,n=`connecting`,r=!1,i=0,a=!1,o=oD(),s=null,c=new Set,l=new Set,u=e=>{n=e,l.forEach(t=>t(e))};function d(){if(r)return;u(`connecting`);let n=new WebSocket(`${e}${e.includes(`?`)?`&`:`?`}tab=${o}${a?`&takeover=1`:``}`);t=n,n.onopen=()=>{i=0,a=!1,u(`open`)},n.onmessage=e=>{try{let t=JSON.parse(String(e.data));c.forEach(e=>e(t))}catch{}},n.onclose=e=>{if(!r){if(e.code===4401)return u(`unauthorized`);if(e.code===4409||e.code===4410)return u(`elsewhere`);u(`closed`),s=setTimeout(d,Math.min(500*2**i++,8e3))}},n.onerror=()=>{}}return d(),{send(e){t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},onMessage(e){return c.add(e),()=>c.delete(e)},onState(e){return l.add(e),()=>l.delete(e)},state:()=>n,takeOver(){r||n!==`elsewhere`||(a=!0,i=0,d())},close(){r=!0,s&&clearTimeout(s),t?.close()}}}var lD={scene:`conversation`,objects:[],captions:``,captionDone:!0,presence:{state:`idle`,style:`sphere`,amplitude:0,pulse:0},mood:{accent:`#3fd8ff`,intensity:.6},approval:null,alerts:[],connection:`connecting`,chat:[],chatLive:!1,view:`companion`,look:{size:1,reactivity:.7,ambient:!0,captions:!0,captionSize:`medium`},viewKnown:!1,busy:!1,activity:null,deviceOnline:!1,voice:{mode:`idle`,level:0,available:!1,enrolled:!1},challenge:null,camera:{enabled:!1,stream:null},speaker:null,ownerName:``,assistantName:``,hud:null,music:null,hostMusic:null,musicCmd:null,uiOpen:null},uD=200,dD=e=>e.length>uD?e.slice(-200):e,fD=0,pD=e=>Math.min(1,Math.max(0,e));function mD(e,t){switch(t.cmd){case`scene`:return{...e,scene:t.mode};case`show`:{let n=e.objects.findIndex(e=>e.id===t.object.id),r=n===-1?[...e.objects,t.object]:e.objects.map((e,r)=>r===n?t.object:e);return{...e,objects:r}}case`update`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,props:{...e.props,...t.props}}:e)};case`hide`:return{...e,objects:e.objects.filter(e=>e.id!==t.id)};case`clear`:return{...e,objects:e.objects.filter(e=>e.pinned),scene:`conversation`};case`pin`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,pinned:!0}:e)};case`unpin`:return{...e,objects:e.objects.map(e=>e.id===t.id?(({pinned:e,...t})=>t)(e):e)};case`place`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,placement:t.placement}:e)};case`presence`:return{...e,presence:{...e.presence,state:t.state??e.presence.state,style:t.style??e.presence.style}};case`mood`:return{...e,mood:{accent:t.accent??e.mood.accent,intensity:t.intensity??e.mood.intensity}}}}function hD(e,t){let n=t;if(n&&typeof n==`object`){if(n.type===`conn`)return{...e,connection:n.value};if(n.type===`chat.seed`){let t=Array.isArray(n.lines)?n.lines:[];return e.chat.length===0?{...e,chat:dD(t)}:{...e,chat:dD([...t,...e.chat])}}if(n.type===`alert.add`)return{...e,alerts:[...e.alerts.slice(-3),{id:++fD,level:n.level,text:n.text}]};if(n.type===`camera.enable`)return{...e,camera:{enabled:n.value,stream:n.value?e.camera.stream:null}};if(n.type===`camera.open`)return{...e,camera:{...e.camera,stream:n.stream}};if(n.type===`camera.closed`)return{...e,camera:{...e.camera,stream:null}};if(n.type===`challenge.dismiss`)return e.challenge?.id===n.id?{...e,challenge:null}:e;if(n.type===`voice.mode`)return{...e,voice:{...e.voice,mode:n.mode,level:n.mode===`idle`?0:e.voice.level}};if(n.type===`voice.level`){let t=Number.isFinite(n.level)?Math.min(1,Math.max(0,n.level)):0;return{...e,voice:{...e.voice,level:t}}}if(n.type===`object.dismiss`)return{...e,objects:e.objects.filter(e=>e.id!==n.id)};if(n.type===`object.place`)return{...e,objects:e.objects.map(e=>e.id===n.id?{...e,placement:n.placement}:e)};if(n.type===`alert.dismiss`)return{...e,alerts:e.alerts.filter(e=>e.id!==n.id)}}let r=Mu.safeParse(t);if(!r.success)return e;let i=r.data;switch(i.type){case`snapshot`:return{...e,scene:i.stage.scene,objects:i.stage.objects,presence:{...e.presence,state:i.stage.presence.state,style:i.stage.presence.style},mood:i.stage.mood,approval:i.pendingApproval??null};case`stage`:return mD(e,i.command);case`chat.user`:return{...e,chat:dD([...e.chat,{role:`user`,text:i.text}]),chatLive:!1};case`ui.open`:return{...e,uiOpen:{n:(e.uiOpen?.n??0)+1,...i.integration?{integration:i.integration}:{}}};case`ui`:return{...e,view:i.view,look:i.look??e.look,ownerName:i.ownerName??e.ownerName,assistantName:i.assistantName??e.assistantName,hud:i.hud??e.hud,music:i.music??e.music,viewKnown:!0};case`music.host`:return{...e,hostMusic:i.state};case`music.command`:{let{type:t,...n}=i;return{...e,musicCmd:{n:(e.musicCmd?.n??0)+1,command:n}}}case`caption.delta`:{let t=e.captionDone,n=e.chat.at(-1),r=e.chatLive&&n?.role===`assistant`?[...e.chat.slice(0,-1),{role:`assistant`,text:n.text+i.text}]:dD([...e.chat,{role:`assistant`,text:i.text}]);return{...e,chat:r,chatLive:!0,captions:(t?``:e.captions)+i.text,captionDone:!1,presence:{...e.presence,amplitude:pD(.3+i.text.length*.04),pulse:e.presence.pulse+1}}}case`caption.end`:return{...e,chatLive:!1,captionDone:!0,presence:{...e.presence,amplitude:0}};case`approval.request`:{let{type:t,...n}=i;return{...e,approval:n}}case`approval.resolved`:return e.approval?.id===i.id?{...e,approval:null}:e;case`alert`:return{...e,alerts:[...e.alerts.slice(-3),{id:++fD,level:i.level,text:i.text}]};case`activity`:return{...e,activity:i.text};case`status`:return{...e,busy:i.busy,activity:i.busy?e.activity:null,deviceOnline:i.deviceOnline,voice:{...e.voice,available:i.voiceAvailable??e.voice.available,enrolled:i.voiceEnrolled??e.voice.enrolled}};case`error`:return{...e,alerts:[...e.alerts.slice(-3),{id:++fD,level:`error`,text:i.message}]};case`voice.heard`:return{...e,captions:i.trust===`guest`?`Guest: ${i.text}`:i.trust===`member`&&i.speaker?`${i.speaker}: ${i.text}`:i.text,captionDone:!0,speaker:{name:i.trust===`member`?i.speaker??null:null,trust:i.trust??`unverified`,seq:(e.speaker?.seq??0)+1}};case`voice.challenge`:return{...e,challenge:{id:i.id,text:i.text}};case`voice.challenge.end`:return e.challenge?.id===i.id?{...e,challenge:null}:e;case`audio.chunk`:case`audio.stop`:case`audio.duck`:return e;case`camera.request`:case`camera.cancel`:case`screen.request`:case`screen.cancel`:return e}}var gD=1024,_D=.8,vD=300;function yD(e,t){let n=Math.min(1,gD/Math.max(e,t));return{width:Math.round(e*n),height:Math.round(t*n)}}function bD(e){let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`permission`:t===`NotFoundError`||t===`OverconstrainedError`?`no-camera`:`busy`}async function xD(){if(!navigator.mediaDevices?.getUserMedia)throw Object.assign(Error(`This browser cannot use the camera here (use localhost or HTTPS).`),{name:`NotFoundError`});return navigator.mediaDevices.getUserMedia({video:{width:{ideal:1280}},audio:!1})}async function SD(e,t=vD){let n=document.createElement(`video`);n.muted=!0,n.playsInline=!0,n.srcObject=e,await n.play(),await new Promise(e=>setTimeout(e,t));let{width:r,height:i}=yD(n.videoWidth||640,n.videoHeight||480),a=document.createElement(`canvas`);return a.width=r,a.height=i,a.getContext(`2d`).drawImage(n,0,0,r,i),n.srcObject=null,new Promise((e,t)=>a.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,_D))}var CD=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`camera.cancel`){let t=this.active;t&&t.id===e.id&&(t.cancelled=!0,this.release(t));return}if(!this.opts.enabled())return this.opts.send({type:`camera.denied`,id:e.id,reason:`off`});if(this.active)return this.opts.send({type:`camera.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1,stream:null,opened:!1,released:!1};this.active=t;try{let n=await(this.opts.open??xD)();if(t.stream=n,t.cancelled){n.getTracks().forEach(e=>e.stop());return}t.opened=!0,this.opts.dispatch({type:`camera.open`,stream:n});let r=await(this.opts.frame??(e=>SD(e)))(n);if(t.cancelled)return;this.release(t);try{await this.opts.upload(e.id,r)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the camera picture to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`camera.denied`,id:e.id,reason:bD(n)})}finally{this.release(t),this.active===t&&(this.active=null)}}dispose(){let e=this.active;e&&(e.cancelled=!0,this.release(e))}release(e){e.released||(e.released=!0,e.stream?.getTracks().forEach(e=>e.stop()),e.opened&&this.opts.dispatch({type:`camera.closed`}))}};function wD(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement(`base`),i=n.createElement(`a`);return n.head.appendChild(r),n.body.appendChild(i),t&&(r.href=t),i.href=e,i.href}var TD=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function ED(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var DD=null;function OD(e={}){return DD||(e.includeStyleProperties?(DD=e.includeStyleProperties,DD):(DD=ED(window.getComputedStyle(document.documentElement)),DD))}function kD(e,t){let n=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return n?parseFloat(n.replace(`px`,``)):0}function AD(e){let t=kD(e,`border-left-width`),n=kD(e,`border-right-width`);return e.clientWidth+t+n}function jD(e){let t=kD(e,`border-top-width`),n=kD(e,`border-bottom-width`);return e.clientHeight+t+n}function MD(e,t={}){return{width:t.width||AD(e),height:t.height||jD(e)}}function ND(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var PD=16384;function FD(e){(e.width>PD||e.height>PD)&&(e.width>PD&&e.height>PD?e.width>e.height?(e.height*=PD/e.width,e.width=PD):(e.width*=PD/e.height,e.height=PD):e.width>PD?(e.height*=PD/e.width,e.width=PD):(e.width*=PD/e.height,e.height=PD))}function ID(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin=`anonymous`,r.decoding=`async`,r.src=e})}async function LD(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function RD(e,t,n){let r=`http://www.w3.org/2000/svg`,i=document.createElementNS(r,`svg`),a=document.createElementNS(r,`foreignObject`);return i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${n}`),i.setAttribute(`viewBox`,`0 0 ${t} ${n}`),a.setAttribute(`width`,`100%`),a.setAttribute(`height`,`100%`),a.setAttribute(`x`,`0`),a.setAttribute(`y`,`0`),a.setAttribute(`externalResourcesRequired`,`true`),i.appendChild(a),a.appendChild(e),LD(i)}var zD=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||zD(n,t)};function BD(e){let t=e.getPropertyValue(`content`);return`${e.cssText} content: '${t.replace(/'|"/g,``)}';`}function VD(e,t){return OD(t).map(t=>`${t}: ${e.getPropertyValue(t)}${e.getPropertyPriority(t)?` !important`:``};`).join(` `)}function HD(e,t,n,r){let i=`.${e}:${t}`,a=n.cssText?BD(n):VD(n,r);return document.createTextNode(`${i}{${a}}`)}function UD(e,t,n,r){let i=window.getComputedStyle(e,n),a=i.getPropertyValue(`content`);if(a===``||a===`none`)return;let o=TD();try{t.className=`${t.className} ${o}`}catch{return}let s=document.createElement(`style`);s.appendChild(HD(o,n,i,r)),t.appendChild(s)}function WD(e,t,n){UD(e,t,`:before`,n),UD(e,t,`:after`,n)}var GD=`application/font-woff`,KD=`image/jpeg`,qD={woff:GD,woff2:GD,ttf:`application/font-truetype`,eot:`application/vnd.ms-fontobject`,png:`image/png`,jpg:KD,jpeg:KD,gif:`image/gif`,tiff:`image/tiff`,svg:`image/svg+xml`,webp:`image/webp`};function JD(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:``}function YD(e){return qD[JD(e).toLowerCase()]||``}function XD(e){return e.split(/,/)[1]}function ZD(e){return e.search(/^(data:)/)!==-1}function QD(e,t){return`data:${t};base64,${e}`}async function $D(e,t,n){let r=await fetch(e,t);if(r.status===404)throw Error(`Resource "${r.url}" not found`);let i=await r.blob();return new Promise((e,t)=>{let a=new FileReader;a.onerror=t,a.onloadend=()=>{try{e(n({res:r,result:a.result}))}catch(e){t(e)}},a.readAsDataURL(i)})}var eO={};function tO(e,t,n){let r=e.replace(/\?.*/,``);return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,``)),t?`[${t}]${r}`:r}async function nO(e,t,n){let r=tO(e,t,n.includeQueryParams);if(eO[r]!=null)return eO[r];n.cacheBust&&(e+=(/\?/.test(e)?`&`:`?`)+new Date().getTime());let i;try{i=QD(await $D(e,n.fetchRequestInit,({res:e,result:n})=>(t||=e.headers.get(`Content-Type`)||``,XD(n))),t)}catch(t){i=n.imagePlaceholder||``;let r=`Failed to fetch resource: ${e}`;t&&(r=typeof t==`string`?t:t.message),r&&console.warn(r)}return eO[r]=i,i}async function rO(e){let t=e.toDataURL();return t===`data:,`?e.cloneNode(!1):ID(t)}async function iO(e,t){if(e.currentSrc){let t=document.createElement(`canvas`),n=t.getContext(`2d`);return t.width=e.clientWidth,t.height=e.clientHeight,n?.drawImage(e,0,0,t.width,t.height),ID(t.toDataURL())}let n=e.poster;return ID(await nO(n,YD(n),t))}async function aO(e,t){try{if(e?.contentDocument?.body)return await hO(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function oO(e,t){return zD(e,HTMLCanvasElement)?rO(e):zD(e,HTMLVideoElement)?iO(e,t):zD(e,HTMLIFrameElement)?aO(e,t):e.cloneNode(cO(e))}var sO=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SLOT`,cO=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SVG`;async function lO(e,t,n){if(cO(t))return t;let r=[];return r=sO(e)&&e.assignedNodes?ED(e.assignedNodes()):zD(e,HTMLIFrameElement)&&e.contentDocument?.body?ED(e.contentDocument.body.childNodes):ED((e.shadowRoot??e).childNodes),r.length===0||zD(e,HTMLVideoElement)||await r.reduce((e,r)=>e.then(()=>hO(r,n)).then(e=>{e&&t.appendChild(e)}),Promise.resolve()),t}function uO(e,t,n){let r=t.style;if(!r)return;let i=window.getComputedStyle(e);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):OD(n).forEach(n=>{let a=i.getPropertyValue(n);n===`font-size`&&a.endsWith(`px`)&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),zD(e,HTMLIFrameElement)&&n===`display`&&a===`inline`&&(a=`block`),n===`d`&&t.getAttribute(`d`)&&(a=`path(${t.getAttribute(`d`)})`),r.setProperty(n,a,i.getPropertyPriority(n))})}function dO(e,t){zD(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),zD(e,HTMLInputElement)&&t.setAttribute(`value`,e.value)}function fO(e,t){if(zD(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(t=>e.value===t.getAttribute(`value`));r&&r.setAttribute(`selected`,``)}}function pO(e,t,n){return zD(t,Element)&&(uO(e,t,n),WD(e,t,n),dO(e,t),fO(e,t)),t}async function mO(e,t){let n=e.querySelectorAll?e.querySelectorAll(`use`):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let a=n[i].getAttribute(`xlink:href`);if(a){let n=e.querySelector(a),i=document.querySelector(a);!n&&i&&!r[a]&&(r[a]=await hO(i,t,!0))}}let i=Object.values(r);if(i.length){let t=`http://www.w3.org/1999/xhtml`,n=document.createElementNS(t,`svg`);n.setAttribute(`xmlns`,t),n.style.position=`absolute`,n.style.width=`0`,n.style.height=`0`,n.style.overflow=`hidden`,n.style.display=`none`;let r=document.createElementNS(t,`defs`);n.appendChild(r);for(let e=0;e<i.length;e++)r.appendChild(i[e]);e.appendChild(n)}return e}async function hO(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(e=>oO(e,t)).then(n=>lO(e,n,t)).then(n=>pO(e,n,t)).then(e=>mO(e,t))}var gO=/url\((['"]?)([^'"]+?)\1\)/g,_O=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,vO=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function yO(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,`\\$1`);return RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,`g`)}function bO(e){let t=[];return e.replace(gO,(e,n,r)=>(t.push(r),e)),t.filter(e=>!ZD(e))}async function xO(e,t,n,r,i){try{let a=n?wD(t,n):t,o=YD(t),s;return s=i?QD(await i(a),o):await nO(a,o,r),e.replace(yO(t),`$1${s}$3`)}catch{}return e}function SO(e,{preferredFontFormat:t}){return t?e.replace(vO,e=>{for(;;){let[n,,r]=_O.exec(e)||[];if(!r)return``;if(r===t)return`src: ${n};`}}):e}function CO(e){return e.search(gO)!==-1}async function wO(e,t,n){if(!CO(e))return e;let r=SO(e,n);return bO(r).reduce((e,r)=>e.then(e=>xO(e,r,t,n)),Promise.resolve(r))}async function TO(e,t,n){let r=t.style?.getPropertyValue(e);if(r){let i=await wO(r,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function EO(e,t){await TO(`background`,e,t)||await TO(`background-image`,e,t),await TO(`mask`,e,t)||await TO(`-webkit-mask`,e,t)||await TO(`mask-image`,e,t)||await TO(`-webkit-mask-image`,e,t)}async function DO(e,t){let n=zD(e,HTMLImageElement);if((!n||ZD(e.src))&&(!zD(e,SVGImageElement)||ZD(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,i=await nO(r,YD(r),t);await new Promise((r,a)=>{e.onload=r,e.onerror=t.onImageErrorHandler?(...e)=>{try{r(t.onImageErrorHandler(...e))}catch(e){a(e)}}:a;let o=e;o.decode&&=r,o.loading===`lazy`&&(o.loading=`eager`),n?(e.srcset=``,e.src=i):e.href.baseVal=i})}async function OO(e,t){let n=ED(e.childNodes).map(e=>kO(e,t));await Promise.all(n).then(()=>e)}async function kO(e,t){zD(e,Element)&&(await EO(e,t),await DO(e,t),await OO(e,t))}function AO(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(e=>{n[e]=r[e]}),e}var jO={};async function MO(e){let t=jO[e];return t??(t={url:e,cssText:await(await fetch(e)).text()},jO[e]=t,t)}async function NO(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,`$1`);return a.startsWith(`https://`)||(a=new URL(a,e.url).href),$D(a,t.fetchRequestInit,({result:e})=>(n=n.replace(i,`url(${e})`),[i,e]))});return Promise.all(i).then(()=>n)}function PO(e){if(e==null)return[];let t=[],n=e.replace(/(\/\*[\s\S]*?\*\/)/gi,``),r=RegExp(`((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})`,`gi`);for(;;){let e=r.exec(n);if(e===null)break;t.push(e[0])}n=n.replace(r,``);let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a=RegExp(`((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})`,`gi`);for(;;){let e=i.exec(n);if(e===null){if(e=a.exec(n),e===null)break;i.lastIndex=a.lastIndex}else a.lastIndex=i.lastIndex;t.push(e[0])}return t}async function FO(e,t){let n=[],r=[];return e.forEach(n=>{if(`cssRules`in n)try{ED(n.cssRules||[]).forEach((e,i)=>{if(e.type===CSSRule.IMPORT_RULE){let a=i+1,o=e.href,s=MO(o).then(e=>NO(e,t)).then(e=>PO(e).forEach(e=>{try{n.insertRule(e,e.startsWith(`@import`)?a+=1:n.cssRules.length)}catch(t){console.error(`Error inserting rule from remote css`,{rule:e,error:t})}})).catch(e=>{console.error(`Error loading remote css`,e.toString())});r.push(s)}})}catch(i){let a=e.find(e=>e.href==null)||document.styleSheets[0];n.href!=null&&r.push(MO(n.href).then(e=>NO(e,t)).then(e=>PO(e).forEach(e=>{a.insertRule(e,a.cssRules.length)})).catch(e=>{console.error(`Error loading remote stylesheet`,e)})),console.error(`Error inlining remote css file`,i)}}),Promise.all(r).then(()=>(e.forEach(e=>{if(`cssRules`in e)try{ED(e.cssRules||[]).forEach(e=>{n.push(e)})}catch(t){console.error(`Error while reading CSS rules from ${e.href}`,t)}}),n))}function IO(e){return e.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>CO(e.style.getPropertyValue(`src`)))}async function LO(e,t){if(e.ownerDocument==null)throw Error(`Provided element is not within a Document`);return IO(await FO(ED(e.ownerDocument.styleSheets),t))}function RO(e){return e.trim().replace(/["']/g,``)}function zO(e){let t=new Set;function n(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(`,`).forEach(e=>{t.add(RO(e))}),Array.from(e.children).forEach(e=>{e instanceof HTMLElement&&n(e)})}return n(e),t}async function BO(e,t){let n=await LO(e,t),r=zO(e);return(await Promise.all(n.filter(e=>r.has(RO(e.style.fontFamily))).map(e=>{let n=e.parentStyleSheet?e.parentStyleSheet.href:null;return wO(e.cssText,n,t)}))).join(`
|
|
4456
|
+
`)}async function VO(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await BO(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function HO(e,t={}){let{width:n,height:r}=MD(e,t),i=await hO(e,t,!0);return await VO(i,t),await kO(i,t),AO(i,t),await RD(i,n,r)}async function UO(e,t={}){let{width:n,height:r}=MD(e,t),i=await ID(await HO(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||ND(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||FD(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}var WO=1600,GO=.85;function KO(e,t){let n=Math.min(1,WO/Math.max(e,t,1));return{width:Math.max(1,Math.round(e*n)),height:Math.max(1,Math.round(t*n))}}async function qO(){let e=document.documentElement.getBoundingClientRect(),t=await UO(document.body,{width:Math.round(e.width),height:Math.round(e.height),pixelRatio:1,backgroundColor:`#050b10`,filter:e=>!(e instanceof HTMLElement&&e.dataset.noCapture!==void 0)}),n=KO(t.width,t.height),r=document.createElement(`canvas`);return r.width=n.width,r.height=n.height,r.getContext(`2d`).drawImage(t,0,0,n.width,n.height),new Promise((e,t)=>r.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,GO))}var JO=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`screen.cancel`){this.active&&this.active.id===e.id&&(this.active.cancelled=!0);return}if(this.active)return this.opts.send({type:`screen.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1};this.active=t;try{let n=await(this.opts.capture??qO)();if(t.cancelled)return;try{await this.opts.upload(e.id,n)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the picture of the screen to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`screen.denied`,id:e.id,reason:YO(n)})}finally{this.active===t&&(this.active=null)}}dispose(){this.active&&(this.active.cancelled=!0)}};function YO(e){return e?.name===`NotSupportedError`?`unsupported`:`failed`}function XO(e,t){let n=(0,l.useRef)(t);n.current=t;let r=(0,l.useRef)(!1),i=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=e===`listening`||e===`speaking`;i.current&&clearTimeout(i.current),i.current=null,t?r.current||(r.current=!0,n.current({type:`audio.activity`,active:!0})):r.current&&(i.current=setTimeout(()=>{i.current=null,r.current=!1,n.current({type:`audio.activity`,active:!1})},900))},[e]),(0,l.useEffect)(()=>()=>{i.current&&clearTimeout(i.current),r.current&&(r.current=!1,n.current({type:`audio.activity`,active:!1}))},[])}var ZO={401:`Please sign in again.`,413:`That recording was too long.`,409:`Friend is busy with the last request. Try again in a moment.`,429:`You're talking too fast. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function QO(e,t,n){let r;try{r=await fetch(e,{method:`POST`,headers:{"content-type":t.type||`audio/webm`},body:t,signal:n})}catch(e){throw e.name===`AbortError`?e:Error(`Could not reach Friend. Check the connection.`)}if(!r.ok){let e=``;try{e=(await r.json()).error??``}catch{}throw Error(e||ZO[r.status]||`The voice request failed (${r.status}).`)}let i=await r.json();return{text:typeof i.text==`string`?i.text:``,wake:i.wake===!0}}async function $O(e,t){return{text:(await QO(`/api/voice/utterance`,e,t)).text}}async function ek(e,t){let n=await QO(`/api/voice/utterance?wake=1`,e,t);return{text:n.text,wake:n.wake===!0}}var tk=null;function nk(){try{tk??=new AudioContext,tk.resume().catch(()=>{});let e=tk.currentTime;for(let[t,n]of[660,990].entries()){let r=tk.createOscillator(),i=tk.createGain();r.frequency.value=n,i.gain.setValueAtTime(0,e+t*.11),i.gain.linearRampToValueAtTime(.18,e+t*.11+.02),i.gain.exponentialRampToValueAtTime(.001,e+t*.11+.14),r.connect(i).connect(tk.destination),r.start(e+t*.11),r.stop(e+t*.11+.16)}}catch{}}var rk=/busy with the last request|talking too fast/i,ik=3e4,ak=50,ok=class{deps;listener=null;awakeNow=!1;showing=!1;busyWithOne=!1;clock=null;meter=null;abort=null;lastAlert=0;constructor(e){this.deps=e}get enabled(){return this.listener!==null}get awake(){return this.awakeNow}async enable(){if(this.listener)return;let e=this.deps.makeListener({onUtterance:e=>void this.heard(e),onError:e=>{this.drop(),this.alert(e,!0)}});try{await e.start()}catch(e){this.alert(e.message,!0);return}this.listener=e}disable(){this.drop()}sync(){let e=this.listener;if(!e)return;let t=this.busyOther();if(e.pause(t),!this.awakeNow||t){this.clearClock(),this.stopMeter();return}this.deps.mode()===`idle`&&this.show(),this.clock||this.startClock(),this.startMeter()}busyOther(){let e=this.deps.mode();return e!==`listening`&&(this.showing=!1),e===`speaking`||e===`transcribing`||e===`listening`&&!this.showing}show(){this.showing=!0,this.deps.dispatch({type:`voice.mode`,mode:`listening`})}wakeUp(e){this.awakeNow=!0,e&&this.deps.chime(),this.clearClock(),this.show(),this.startClock(),this.startMeter()}sleep(){this.awakeNow=!1,this.clearClock(),this.stopMeter(),this.showing&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.showing=!1}drop(){let e=this.listener;this.listener=null,this.abort?.abort(),this.abort=null,this.busyWithOne=!1,this.sleep(),e?.stop()}startClock(){this.clearClock(),this.clock=setTimeout(()=>{this.clock=null,this.sleep()},this.deps.awakeMs??3e4)}clearClock(){this.clock&&clearTimeout(this.clock),this.clock=null}startMeter(){this.meter||=setInterval(()=>this.deps.dispatch({type:`voice.level`,level:this.listener?.level()??0}),ak)}stopMeter(){this.meter&&clearInterval(this.meter),this.meter=null}async heard(e){if(!this.listener||this.busyWithOne||this.busyOther())return;this.busyWithOne=!0;let t=new AbortController;this.abort=t;try{this.awakeNow?await this.request(e,t.signal):await this.check(e,t.signal)}catch(e){e.name!==`AbortError`&&!rk.test(e.message)&&this.alert(e.message,!1)}finally{this.abort===t&&(this.abort=null),this.busyWithOne=!1,this.listener&&this.awakeNow&&(this.clearClock(),this.deps.mode()===`transcribing`&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.sync())}}async check(e,t){let n=await this.deps.wake(e,t);this.listener&&n.wake&&this.wakeUp(!n.text)}async request(e,t){this.clearClock(),this.stopMeter(),this.showing=!1,this.deps.dispatch({type:`voice.mode`,mode:`transcribing`}),await this.deps.command(e,t)}alert(e,t){let n=Date.now();!t&&n-this.lastAlert<ik||(this.lastAlert=n,this.deps.dispatch({type:`alert.add`,level:`error`,text:e}))}},sk=0,ck=new Set;function lk(e){return ck.add(e),()=>ck.delete(e)}var uk=e=>ck.forEach(t=>{try{t(e)}catch{}}),dk=e=>/not compatible|audio capture|audiosession/i.test(String(e?.message??e));function fk(e){try{let t=navigator.audioSession;t&&t.type!==e&&(t.type=e)}catch{}}function pk(){sk===0&&fk(`playback`)}function mk(){sk++,sk===1&&uk(!0),fk(`play-and-record`);let e=!1;return()=>{e||(e=!0,sk=Math.max(0,sk-1),sk===0&&(fk(`playback`),uk(!1)))}}var hk=3,gk=.02,_k=.04,vk=class{minSpeechMs;endSilenceMs;maxMs;floor=null;loudSince=null;speaking=!1;startedAt=0;lastLoud=0;lastFeed=0;speechMs=0;constructor(e={}){this.minSpeechMs=e.minSpeechMs??300,this.endSilenceMs=e.endSilenceMs??800,this.maxMs=e.maxMs??8e3}get inSpeech(){return this.speaking}get maybeSpeech(){return this.loudSince!==null}feed(e,t){this.floor===null&&(this.floor=e);let n=e>Math.max(this.floor*hk+gk,_k),r=Math.min(100,Math.max(0,t-this.lastFeed));if(this.lastFeed=t,!this.speaking)return n?(this.loudSince??=t,t-this.loudSince<this.minSpeechMs?null:(this.speaking=!0,this.startedAt=this.loudSince,this.lastLoud=t,this.speechMs=t-this.loudSince,{type:`start`})):(this.loudSince=null,this.floor+=(e-this.floor)*(e<this.floor?.3:.02),null);n&&(this.lastLoud=t,this.speechMs+=r);let i=t-this.startedAt>=this.maxMs;if(!i&&t-this.lastLoud<this.endSilenceMs)return null;let a={type:`end`,ms:t-this.startedAt,speechMs:this.speechMs,forced:i};return this.speaking=!1,this.loudSince=null,i&&n&&(this.floor=e),a}reset(){this.speaking=!1,this.loudSince=null}},yk=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],bk=50,xk=2e3,Sk=2e3,Ck=400,wk=e=>{let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`Microphone permission was denied. Allow it in the browser to use hands-free.`:t===`NotFoundError`||t===`OverconstrainedError`?`No microphone was found.`:e?.message||`Could not open the microphone.`},Tk=class{opts;stream=null;ctx=null;analyser=null;rec=null;chunks=[];recStartedAt=0;timer=null;seg;leaveSession=null;paused=!1;starting=!1;finishing=!1;opened=!1;now;constructor(e){this.opts=e,this.seg=new vk(e),this.now=e.now??(()=>Date.now())}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get listening(){return this.opened}async start(){if(!(this.opened||this.starting)){this.starting=!0;try{this.leaveSession=mk();try{this.stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}})}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Error(wk(e))}for(let e of this.stream.getTracks())e.onended=()=>this.broke(`The microphone stopped working.`);try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(this.stream).connect(this.analyser),this.ctx.resume().catch(()=>{})}catch{throw this.release(),Error(`This browser cannot listen continuously here.`)}this.seg.reset(),this.beginRecording(),this.opened=!0,this.timer=setInterval(()=>this.tick(),bk)}finally{this.starting=!1}}}stop(){this.opened=!1,this.release()}pause(e){this.paused!==e&&(this.paused=e,this.seg.reset(),!e&&this.opened&&this.restartRecording())}level(){if(!this.analyser)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}tick(){if(!this.opened)return;let e=this.now();if(this.ctx&&this.ctx.state!==`running`&&this.ctx.resume().catch(()=>{}),this.paused){e-this.recStartedAt>=xk&&this.restartRecording();return}let t=this.seg.feed(this.level(),e);t?.type===`end`?this.finish(t.ms,t.speechMs):!t&&!this.seg.inSpeech&&!this.seg.maybeSpeech&&e-this.recStartedAt>=xk&&this.restartRecording()}beginRecording(){if(!this.stream)return;let e=yk.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.broke(`The microphone stopped working.`),t.start(250),this.rec=t,this.recStartedAt=this.now()}restartRecording(){let e=this.rec;if(this.rec=null,e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.opened&&this.beginRecording()}async finish(e,t){let n=this.rec;if(!n||this.finishing)return;this.finishing=!0;let r=n.mimeType||`audio/webm`,i=await new Promise(e=>{let t=!1,i=()=>{t||(t=!0,e(new Blob(this.chunks,{type:r})))},a=setTimeout(i,Sk);n.onstop=()=>{clearTimeout(a),i()};try{n.state===`inactive`?i():n.stop()}catch{i()}});this.finishing=!1,this.rec=null,this.opened&&(this.beginRecording(),!this.paused&&e>=Ck&&t>=Ck/2&&i.size>0&&this.opts.onUtterance(i))}broke(e){this.opened&&(this.stop(),this.opts.onError(e))}release(){if(this.timer&&clearInterval(this.timer),this.timer=null,this.rec){this.rec.ondataavailable=null,this.rec.onstop=null,this.rec.onerror=null;try{this.rec.state!==`inactive`&&this.rec.stop()}catch{}}this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.ctx=null,this.analyser=null,this.rec=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},Ek=4096,Dk=8,Ok=20,kk=6e6;function Ak(e){try{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch{return null}}var jk=class{ctx=null;analyser=null;pending=new Map;queue=[];current=null;busy=!1;gen=0;isPlaying=!1;unwatch=null;listeners=new Set;unlock(){pk();let e=this.ensureContext();e.state!==`running`&&e.resume().catch(()=>{})}locked(){return!this.ctx||this.ctx.state!==`running`}enqueue(e){if(!Number.isInteger(e.seq)||e.seq<0||e.seq>Ek)return;let t=Ak(e.data);if(!t)return;let n=this.pending.get(e.id);if(n||(this.pending.size>=Dk&&this.pending.delete(this.pending.keys().next().value),n={parts:new Map,lastSeq:null,bytes:0},this.pending.set(e.id,n)),n.bytes+=t.length,n.bytes>kk){this.pending.delete(e.id);return}if(n.parts.set(e.seq,t),e.last&&(n.lastSeq=e.seq),n.lastSeq===null||n.parts.size!==n.lastSeq+1)return;this.pending.delete(e.id);let r=new Uint8Array([...n.parts.values()].reduce((e,t)=>e+t.length,0)),i=0;for(let e=0;e<=n.lastSeq;e++){let t=n.parts.get(e);if(!t)return;r.set(t,i),i+=t.length}for(this.queue.push(r.buffer);this.queue.length>Ok;)this.queue.shift();this.pump()}stop(){this.gen++,this.queue=[],this.pending.clear(),this.busy=!1;let e=this.current;if(this.current=null,e){e.onended=null;try{e.stop()}catch{}}this.setPlaying(!1)}dispose(){this.stop(),this.ctx?.close().catch(()=>{}),this.unwatch?.(),this.unwatch=null,this.ctx=null,this.analyser=null}playing(){return this.isPlaying}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}level(){if(!this.analyser||!this.isPlaying)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}ensureContext(){if(!this.ctx){let e=window.AudioContext??window.webkitAudioContext;this.ctx=new e,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.analyser.connect(this.ctx.destination);let t=this.ctx;this.unwatch?.(),this.unwatch=lk(e=>{e&&t.state===`running`?t.suspend().catch(()=>{}):!e&&t.state!==`running`&&t.state!==`closed`&&t.resume().catch(()=>{})})}return this.ctx}setPlaying(e){this.isPlaying!==e&&(this.isPlaying=e,this.listeners.forEach(t=>t(e)))}async pump(){if(this.busy)return;let e=this.queue.shift();if(!e){this.setPlaying(!1);return}this.busy=!0;let t=this.gen;try{let n=this.ensureContext();if(n.state!==`running`){try{await n.resume()}catch{}if(t!==this.gen)return;if(n.state!==`running`){this.queue.unshift(e),this.busy=!1;return}}let r=await n.decodeAudioData(e);if(t!==this.gen)return;let i=n.createBufferSource();i.buffer=r,i.connect(this.analyser),i.onended=()=>{this.current===i&&(this.current=null,this.busy=!1,this.pump())},this.current=i,this.setPlaying(!0),i.start()}catch{if(t!==this.gen)return;this.busy=!1,this.pump()}}},Mk=e=>new Promise(t=>setTimeout(t,e)),Nk=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],Pk=3e3;function Fk(e){let t=e;return t?.name===`NotAllowedError`||t?.name===`SecurityError`?Error(`Microphone permission was denied. Allow it in the browser to talk.`):t?.name===`NotFoundError`||t?.name===`OverconstrainedError`?Error(`No microphone was found.`):Error(t?.message||`Could not open the microphone.`)}var Ik=class e{opts;stream=null;rec=null;chunks=[];ctx=null;analyser=null;timer=null;starting=!1;leaveSession=null;constructor(e={}){this.opts=e}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get active(){return this.rec!==null}async start(){if(!(this.rec||this.starting)){if(!e.supported())throw Error(`This browser cannot record audio here (use localhost or HTTPS).`);this.starting=!0;try{this.leaveSession=mk();try{let e=()=>navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});try{this.stream=await e()}catch(t){if(!dk(t))throw t;await Mk(250),this.leaveSession?.(),this.leaveSession=mk(),this.stream=await e()}}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Fk(e)}try{let e=Nk.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.failed();for(let e of this.stream.getTracks())e.onended=()=>this.failed();this.openMeter(this.stream),t.start(250),this.rec=t,this.opts.maxMs&&(this.timer=setTimeout(()=>{this.timer=null,this.opts.onLimit?.()},this.opts.maxMs))}catch(e){throw this.release(),Fk(e)}}finally{this.starting=!1}}}stop(){let e=this.rec;return e?new Promise(t=>{let n=!1,r=null,i=()=>{if(n)return;n=!0,r&&clearTimeout(r);let i=new Blob(this.chunks,{type:e.mimeType||`audio/webm`});this.release(),t(i)};if(r=setTimeout(i,Pk),e.onstop=i,e.state===`inactive`)return i();try{e.stop()}catch{i()}}):Promise.reject(Error(`Not recording.`))}cancel(){let e=this.rec;if(e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.release()}level(){if(!this.analyser||!this.rec)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}failed(){this.rec&&(this.cancel(),this.opts.onError?.())}openMeter(e){try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(e).connect(this.analyser)}catch{this.analyser=null}}release(){this.timer&&clearTimeout(this.timer),this.timer=null,this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.rec=null,this.ctx=null,this.analyser=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},Lk=2e3,Rk=()=>typeof window<`u`&&window.isSecureContext===!1,zk=50,Bk=class{deps;recorder;player;mode=`idle`;pressed=!1;disposed=!1;uploads=0;toldAboutSound=!1;abort=null;poll=null;unsubscribe;constructor(e){this.deps=e;let t=()=>this.recorderFailed();this.recorder=e.recorder??e.makeRecorder?.(t)??new Ik({maxMs:6e4,onLimit:()=>void this.pressEnd(),onError:t}),this.player=e.player??new jk,this.unsubscribe=this.player.onChange(e=>{this.mode!==`listening`&&this.mode!==`transcribing`&&this.setMode(e?`speaking`:`idle`)})}async pressStart(){if(!(this.pressed||this.disposed)){if(!this.deps.available()){this.alert(`warn`,`Voice is not available. Run: friend voice setup`);return}if(!(this.deps.supported?.()??Ik.supported())){this.alert(`warn`,Rk()?`This page is not secure, so the browser blocks the microphone. On the PC run: friend lan https on, restart Friend, and open the https:// address.`:`This browser cannot record audio here (use localhost or HTTPS).`);return}this.pressed=!0,this.player.unlock(),this.player.playing()&&(this.deps.send({type:`voice.interrupt`}),this.player.stop());try{await this.recorder.start()}catch(e){this.pressed=!1,this.alert(`error`,e.message),this.setMode(`idle`);return}if(!this.pressed){this.recorder.cancel(),this.setMode(`idle`);return}this.setMode(`listening`)}}async pressEnd(){if(!this.pressed||(this.pressed=!1,!this.recorder.active))return;let e=await this.recorder.stop();if(e.size<Lk){this.alert(`info`,`Hold the key a little longer while you speak.`),this.setMode(`idle`);return}this.setMode(`transcribing`);let t=new AbortController;this.abort=t,this.uploads++;try{let{text:n}=await this.deps.post(e,t.signal);n.trim()||this.alert(`info`,`I didn't catch that.`)}catch(e){e.name!==`AbortError`&&this.alert(`error`,e.message)}finally{this.uploads--,this.abort===t&&(this.abort=null),this.settle()}}blur(){this.pressed&&(this.pressed=!1,this.recorder.cancel(),this.setMode(`idle`))}handleServer(e){if(e.type!==`audio.chunk`)return this.player.stop();this.player.enqueue(e),!this.toldAboutSound&&this.player.locked?.()&&(this.toldAboutSound=!0,this.deps.dispatch({type:`alert.add`,level:`info`,text:`Sound is blocked by the browser. Click or press a key once anywhere on the page to hear me.`}))}unlock(){this.player.unlock()}dispose(){this.disposed=!0,this.pressed=!1,this.stopPolling(),this.abort?.abort(),this.recorder.cancel(),this.player.stop(),this.player.dispose?.(),this.unsubscribe()}recorderFailed(){this.pressed=!1,this.recorder.cancel(),this.alert(`error`,`The microphone stopped working.`),this.setMode(`idle`)}settle(){this.uploads>0||this.mode!==`transcribing`||this.setMode(this.player.playing()?`speaking`:`idle`)}setMode(e){this.disposed||(this.mode=e,this.deps.dispatch({type:`voice.mode`,mode:e}),e===`listening`||e===`speaking`?this.startPolling():this.stopPolling())}startPolling(){this.stopPolling(),this.poll=setInterval(()=>{let e=this.mode===`listening`?this.recorder.level():this.player.level();this.deps.dispatch({type:`voice.level`,level:e})},zk)}stopPolling(){this.poll&&clearInterval(this.poll),this.poll=null}alert(e,t){this.disposed||this.deps.dispatch({type:`alert.add`,level:e,text:t})}};function Vk(e){let[t,n]=(0,l.useReducer)(hD,lD),r=(0,l.useRef)(null),i=(0,l.useRef)(null),a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(!1),u=(0,l.useRef)(e);u.current=e;let d=(0,l.useRef)(t);d.current=t,(0,l.useEffect)(()=>{let e=cD();r.current=e;let t=new Bk({send:t=>e.send(t),dispatch:e=>n(e),post:$O,available:()=>d.current.voice.available});i.current=t;let s=new ok({makeListener:e=>new Tk(e),wake:ek,command:$O,mode:()=>d.current.voice.mode,chime:nk,dispatch:e=>n(e)});o.current=s;let l=new CD({send:t=>e.send(t),dispatch:e=>n(e),enabled:()=>d.current.camera.enabled,upload:async(e,t)=>{let n=await fetch(`/api/camera/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}});a.current=l;let f=new JO({send:t=>e.send(t),dispatch:e=>n(e),upload:async(e,t)=>{let n=await fetch(`/api/screen/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}}),p=e.onMessage(e=>{n(e);let r=e?.type,i=e?.id;(r===`camera.request`||r===`camera.cancel`)&&typeof i==`string`&&l.handle({type:r,id:i}),(r===`screen.request`||r===`screen.cancel`)&&typeof i==`string`&&f.handle({type:r,id:i}),r===`audio.duck`&&$T.set(e.level??1),(r===`audio.chunk`||r===`audio.stop`)&&t.handleServer(e)}),m=e.onState(e=>{n({type:`conn`,value:e}),e!==`open`&&$T.set(1,0),e===`unauthorized`&&u.current(),e===`elsewhere`&&(s.disable(),c(!1),t.blur(),l.dispose(),f.dispose())});return()=>{p(),m(),s.disable(),o.current=null,t.dispose(),l.dispose(),f.dispose(),e.close(),i.current=null,a.current=null,r.current=null}},[]),(0,l.useEffect)(()=>{t.camera.enabled||a.current?.dispose()},[t.camera.enabled]),(0,l.useEffect)(()=>{o.current?.sync()},[t.voice.mode]);let f=(0,l.useCallback)(async e=>{let t=o.current;if(t){e?await t.enable():t.disable(),c(t.enabled);try{localStorage.setItem(`friend.handsFree`,t.enabled?`1`:`0`)}catch{}}},[]),p=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!p.current&&t.voice.available){p.current=!0;try{localStorage.getItem(`friend.handsFree`)===`1`&&Tk.supported()&&f(!0)}catch{}}},[t.voice.available,f]);let m=(0,l.useMemo)(()=>({on:s,supported:Tk.supported(),toggle:()=>void f(!o.current?.enabled)}),[s,f]),h=(0,l.useCallback)(e=>r.current?.send(e),[]);return XO(t.voice.mode,h),{state:t,send:h,dispatch:(0,l.useCallback)(e=>n(e),[]),voice:(0,l.useMemo)(()=>({pressStart:()=>void i.current?.pressStart(),pressEnd:()=>void i.current?.pressEnd(),blur:()=>i.current?.blur(),unlock:()=>i.current?.unlock()}),[]),handsFree:m,useHere:(0,l.useCallback)(()=>r.current?.takeOver(),[])}}var Hk={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function Uk(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||Hk[n.status]||`The request failed (${n.status}).`)}return await n.json()}var Wk=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Gk={state:()=>Uk(`/api/voice/enroll`,{}),sample:e=>Uk(`/api/voice/enroll/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>Uk(`/api/voice/enroll/finish`,Wk(`POST`,{pin:e})),cancel:async()=>{await Uk(`/api/voice/enroll/cancel`,Wk(`POST`,{}))},remove:async e=>{await Uk(`/api/voice/enroll`,Wk(`DELETE`,{pin:e}))}},Kk=[`Friend, good evening. It is a pleasant day to get things done.`,`Open my projects and show me what changed today.`,`My voice is my key, so please remember it well.`,`Check the weather and read me the latest headlines.`,`Always protect the boss, and never trust a stranger.`],qk=15e3;function Jk({api:e=Gk,createRecorder:t=e=>new Ik(e),onClose:n,who:r}){let[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(0),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(`record`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(``),C=(0,l.useRef)(!0),w=(0,l.useRef)(null);(0,l.useEffect)(()=>(C.current=!0,e.state().then(e=>{C.current&&(a(e),s(e.samples))}).catch(e=>C.current&&b(e.message)),()=>{C.current=!1,w.current?.cancel(),w.current=null}),[e]);let E=(0,l.useCallback)(async()=>{let t=w.current;if(t){w.current=null,g(!1),v(!0);try{let n=await t.stop(),r=await e.sample(n);if(!C.current)return;s(r.count),u(r.note)}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}}},[e]),D=async()=>{b(null),u(null);let e=t({maxMs:qk,onLimit:()=>void E(),onError:()=>{w.current=null,C.current&&(g(!1),b(`The microphone stopped working. Try again.`))}});try{await e.start()}catch(e){C.current&&b(e.message);return}if(!C.current)return e.cancel();w.current=e,g(!0)},O=async e=>{b(null),v(!0);try{await e()}catch(e){C.current&&b(e.message)}finally{C.current&&(v(!1),S(``))}},k=async()=>{w.current?.cancel(),w.current=null,await e.cancel().catch(()=>{}),n()},A=i?.min??3,j=o%Kk.length,ee=o<Kk.length?`Phrase ${o+1} of ${Kk.length}`:`Extra recording (${o} so far)`;return(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Voice enrollment`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:r?`Teach Friend ${r}'s voice`:`Teach Friend your voice`})}),f===`record`&&(0,p.jsxs)(p.Fragment,{children:[!r&&i?.enrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Your voice is already saved. Saving a new one replaces it.`}),r&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Hand the device to `,r,`. `,r,` reads each sentence aloud, close to the microphone, in a quiet room.`]}),(0,p.jsxs)(`p`,{className:`auth-note`,children:[ee,`. Press Record, read this aloud in a quiet room, then press Stop.`]}),(0,p.jsx)(`pre`,{className:`approval-summary`,"data-testid":`enroll-phrase`,style:{whiteSpace:`pre-wrap`},children:Kk[j]}),(0,p.jsxs)(`div`,{role:`status`,className:`auth-note`,children:[o,` recorded`,o>=A?` — enough to save`:` — at least ${A} needed`,`.`,c?` ${c}`:``]}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[h?(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>void E(),children:`Stop`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||!i||o>=(i?.max??8),onClick:()=>void D(),children:_?`Uploading…`:`Record`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:h||_||o<A,onClick:()=>m(`pin-save`),children:r?`Save ${r}'s voice`:`Save my voice`}),!r&&i?.enrolled&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:h||_,onClick:()=>m(`pin-delete`),children:`Delete my voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>void k(),children:`Cancel`})]})]}),(f===`pin-save`||f===`pin-delete`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`pin-save`?r?`Enter your PIN to save ${r}'s voice.`:`Enter your PIN to save your voice.`:`Enter your PIN to delete your saved voice.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:f===`pin-save`?()=>!_&&void O(async()=>{await e.finish(x),C.current&&m(`saved`)}):void 0}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[f===`pin-save`?(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.finish(x),C.current&&m(`saved`)}),children:`Save`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.remove(x),C.current&&m(`deleted`)}),children:`Delete`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{S(``),b(null),m(`record`)},children:`Back`})]})]}),(f===`saved`||f===`deleted`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`saved`?r?`${r}'s voice is saved. From now on I will know when ${r} is talking.`:`Your voice is saved. From now on I will tell you apart from other speakers.`:`Your voice was deleted. Every voice is treated as yours until you enroll again.`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:n,children:`Done`})})]})]})}var Yk=new Set([`INPUT`,`TEXTAREA`,`SELECT`,`BUTTON`,`A`,`SUMMARY`]),Xk=new Set([`button`,`checkbox`,`switch`,`tab`,`menuitem`,`link`,`radio`,`option`,`textbox`,`combobox`,`slider`]),Zk=e=>e instanceof HTMLElement&&(Yk.has(e.tagName)||e.isContentEditable||Xk.has(e.getAttribute(`role`)??``)),Qk=e=>e.code===`Space`||e.key===` `;function $k(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=!1,n=n=>{!Qk(n)||n.ctrlKey||n.metaKey||n.altKey||Zk(n.target)||Zk(document.activeElement)||(n.preventDefault(),!(n.repeat||e)&&(e=!0,t.current.pressStart()))},r=n=>{Qk(n)&&e&&(e=!1,n.preventDefault(),t.current.pressEnd())},i=()=>{e=!1,t.current.blur()},a=()=>{document.hidden&&i()};return window.addEventListener(`keydown`,n),window.addEventListener(`keyup`,r),window.addEventListener(`blur`,i),document.addEventListener(`visibilitychange`,a),()=>{window.removeEventListener(`keydown`,n),window.removeEventListener(`keyup`,r),window.removeEventListener(`blur`,i),document.removeEventListener(`visibilitychange`,a)}},[])}function eA(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=()=>t.current.unlock(),n=[`pointerdown`,`keydown`,`touchend`];for(let t of n)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of n)window.removeEventListener(t,e)}},[])}function tA({onUseHere:e}){return(0,p.jsx)(`div`,{className:`elsewhere`,role:`alertdialog`,"aria-labelledby":`elsewhere-title`,"data-testid":`elsewhere`,children:(0,p.jsxs)(`div`,{className:`elsewhere-card`,children:[(0,p.jsx)(`h2`,{id:`elsewhere-title`,children:`Friend is open in another window`}),(0,p.jsx)(`p`,{children:`Friend works in one window at a time. Click “Use here” to use it in this window instead; the other one will stop.`}),(0,p.jsx)(`button`,{type:`button`,className:`elsewhere-btn`,onClick:e,autoFocus:!0,children:`Use here`})]})})}function nA(e,t,n){let r=Math.max(100,Math.round(e)),i=Math.max(100,Math.round(t));return{width:r,height:i,kind:r<=599?`phone`:n||r<1024?`tablet`:`desktop`,orientation:i>r?`portrait`:`landscape`,touch:n}}var rA=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches;function iA(){return nA(window.innerWidth,window.innerHeight,rA())}var aA=(e,t)=>!!e&&e.width===t.width&&e.height===t.height&&e.kind===t.kind&&e.orientation===t.orientation&&e.touch===t.touch;function oA(e,t){let n=(0,l.useRef)(null),r=(0,l.useRef)(e);r.current=e,(0,l.useEffect)(()=>{if(t!==`open`){n.current=null;return}let e=()=>{let e=iA();aA(n.current,e)||(n.current=e,r.current({type:`ui.screen`,...e}))};e();let i=null,a=()=>{i&&clearTimeout(i),i=setTimeout(e,400)};return window.addEventListener(`resize`,a),window.addEventListener(`orientationchange`,a),()=>{i&&clearTimeout(i),window.removeEventListener(`resize`,a),window.removeEventListener(`orientationchange`,a)}},[t])}var sA={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function cA(e,t={}){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||sA[n.status]||`The request failed (${n.status}).`)}return await n.json()}var lA=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),uA={overview:()=>cA(`/api/voice/people`),begin:e=>cA(`/api/voice/people/begin`,lA(`POST`,{name:e})),recording:{state:async()=>(await cA(`/api/voice/people`)).enrolling??{enrolled:!1,samples:0,min:3,max:8},sample:e=>cA(`/api/voice/people/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>cA(`/api/voice/people/finish`,lA(`POST`,{pin:e})),cancel:async()=>{await cA(`/api/voice/people/cancel`,lA(`POST`,{}))},remove:async()=>{}},removePerson:async(e,t)=>{await cA(`/api/voice/people/${e}`,lA(`DELETE`,{pin:t}))}};function dA({api:e=uA,createRecorder:t,onClose:n}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)({kind:`list`}),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>{e.overview().then(e=>v.current&&i(e)).catch(e=>v.current&&_(e.message))},[e]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async()=>{_(null),h(!0);try{let t=await e.begin(s.trim());v.current&&o({kind:`record`,name:t.name})}catch(e){v.current&&_(e.message)}finally{v.current&&h(!1)}},x=async t=>{_(null),h(!0);try{if(await e.removePerson(t.id,u),!v.current)return;o({kind:`list`}),y()}catch(e){v.current&&_(e.message)}finally{v.current&&(h(!1),f(``))}};return a.kind===`record`?(0,p.jsx)(Jk,{api:e.recording,who:a.name,...t?{createRecorder:t}:{},onClose:()=>{c(``),o({kind:`list`}),y()}}):(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Family voices`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Family voices`})}),a.kind===`list`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend knows your voice. Add the people at home, so it knows who is talking and answers them by name. They can chat and ask for the weather, but cannot use your PC or see your private things.`}),r&&!r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`First teach Friend your own voice (Esc, then Enroll my voice).`}),r&&r.people.length===0&&r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Nobody added yet.`}),r&&r.people.length>0&&(0,p.jsx)(`ul`,{className:`household-list`,"aria-label":`People Friend knows`,children:r.people.map(e=>(0,p.jsxs)(`li`,{className:`household-row`,children:[(0,p.jsx)(`span`,{children:e.name}),(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>o({kind:`remove`,person:e}),"aria-label":`Remove ${e.name}`,children:`Remove`})]},e.id))}),r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Add a person`}),(0,p.jsx)(`input`,{value:s,maxLength:40,placeholder:`Name, for example Priya`,onChange:e=>c(e.target.value),onKeyDown:e=>e.key===`Enter`&&s.trim()&&!m&&void b()})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:m||!s.trim(),onClick:()=>void b(),children:`Record their voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:n,children:`Close`})]})]}),a.kind===`remove`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to remove `,a.person.name,`’s voice. Friend will treat their voice as a stranger’s.`]}),(0,p.jsx)(T,{pin:u,onChange:f}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:m||u.length<6,onClick:()=>void x(a.person),children:`Remove`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{f(``),_(null),o({kind:`list`})},children:`Back`})]})]})]})}var fA=`▌▍▎▏█▓▒░<>/\\|+-=*#%&0123456789ABCDEF`;function pA(e,t,n=Math.random){let r=[...e];if(t>=1)return e;let i=Math.floor(r.length*Math.max(0,t));return r.map((e,t)=>t<i||e===` `?e:fA[Math.floor(n()*36)]).join(``)}var mA=e=>e.length===0?0:Math.min(24,Math.max(6,Math.ceil([...e].length/2)));function hA(e,t){let[n,r]=(0,l.useState)(e),i=(0,l.useRef)(e);return(0,l.useEffect)(()=>{if(!t||e===i.current){i.current=e,r(e);return}i.current=e;let n=mA(e);if(n===0){r(e);return}let a=0,o=setInterval(()=>{a++,r(pA(e,a/n)),a>=n&&clearInterval(o)},320/n);return()=>clearInterval(o)},[e,t]),n}function gA(e){let t=e.currentTarget,n=t.getBoundingClientRect(),r=document.createElement(`span`);r.className=`hud-ripple`;let i=Math.max(n.width,n.height)*2;r.style.width=r.style.height=`${i}px`,r.style.left=`${e.clientX-n.left-i/2}px`,r.style.top=`${e.clientY-n.top-i/2}px`,t.appendChild(r),r.addEventListener(`animationend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),900)}function _A({items:e,animations:t,onAction:n}){let[r,i]=(0,l.useState)(null),a=(0,l.useRef)(void 0);if((0,l.useEffect)(()=>()=>clearTimeout(a.current),[]),e.length===0)return null;let o=e=>{t!==`off`&&(i(e.id),clearTimeout(a.current),a.current=setTimeout(()=>i(null),650)),n(e)};return(0,p.jsxs)(he,{id:`launcher`,label:`Quick launch`,wholeBox:!0,testId:`launcher`,className:`hud hud-launcher${t===`full`?` hud-boot`:``}`,children:[(0,p.jsx)(`div`,{className:`hud-kicker`,children:`Quick launch`}),(0,p.jsx)(`ul`,{className:`hud-stack`,children:e.map((e,n)=>(0,p.jsx)(`li`,{className:`hud-tab hud-cut${r===e.id?` engaged`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":n+1},children:(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-label":e.label,onPointerDown:t===`off`?void 0:gA,onClick:()=>o(e),children:[(0,p.jsx)(`span`,{className:`hud-icon`,"aria-hidden":`true`,children:e.icon}),(0,p.jsx)(`span`,{className:`hud-tab-label`,children:e.label}),(0,p.jsx)(`span`,{className:`hud-tab-engaged`,"aria-hidden":`true`,children:`ENGAGED`}),(0,p.jsx)(`span`,{className:`hud-sweep`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`hud-scan`,"aria-hidden":`true`})]})},e.id))})]})}var vA=(e,t=18)=>(0,p.jsx)(`svg`,{width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e}),yA=()=>vA((0,p.jsx)(`path`,{d:`M7 4.5v15l12-7.5z`,fill:`currentColor`})),bA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`rect`,{x:`6`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`}),(0,p.jsx)(`rect`,{x:`14`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`})]})),xA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M5 5v14l10-7z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M18 5v14`})]})),SA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M19 5v14L9 12z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M6 5v14`})]})),CA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M3 7h3.5c3 0 4 2 5.5 5s2.500 5 5.500 5H21`}),(0,p.jsx)(`path`,{d:`M3 17h3.5c1.500 0 2.500-.6 3.400-1.800M13.500 8.800C14.500 7.600 15.500 7 17 7h4`}),(0,p.jsx)(`path`,{d:`m18.500 4.500 2.500 2.500-2.500 2.500M18.500 14.500l2.500 2.500-2.500 2.500`})]})),wA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M17 3l3 3-3 3`}),(0,p.jsx)(`path`,{d:`M4 11V9a3 3 0 0 1 3-3h13M7 21l-3-3 3-3`}),(0,p.jsx)(`path`,{d:`M20 13v2a3 3 0 0 1-3 3H4`})]})),TA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M15.500 9a4 4 0 0 1 0 6M18 6.500a7.500 7.500 0 0 1 0 11`})]})),EA=()=>vA((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`m16 9 5 6M21 9l-5 6`})]})),DA=()=>vA((0,p.jsx)(`path`,{d:`M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5`})),OA=()=>vA((0,p.jsx)(`path`,{d:`M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5`})),kA=()=>vA((0,p.jsx)(`path`,{d:`M6 6l12 12M18 6 6 18`})),AA=()=>vA((0,p.jsx)(`path`,{d:`M9 18V6l10-2v12`}),22),jA=56,MA=()=>({bars:new Float32Array(jA),bass:0,left:0,right:0});function NA(e,t,n,r,i){let a=n?.82:.9;if(t&&n){t.getByteFrequencyData(i);let n=Math.min(i.length,96);for(let t=0;t<jA;t++){let r=Math.min(n-1,Math.floor((t/jA)**1.6*n));e.bars[t]=Math.max((i[r]??0)/255,e.bars[t]*a)}}else if(n)for(let t=0;t<jA;t++)e.bars[t]=Math.max(.12+.28*Math.abs(Math.sin(r/420+t*.55)*Math.cos(r/900+t*.21)),e.bars[t]*a);else for(let t=0;t<jA;t++)e.bars[t]=e.bars[t]*a;let o=0;for(let t=0;t<6;t++)o+=e.bars[t];e.bass=Math.min(1,o/6*1.15);let s=0,c=0;for(let t=0;t<jA/2;t++)s+=e.bars[t],c+=e.bars[t+jA/2];e.left=Math.min(1,s/(jA/2)*1.6),e.right=Math.min(1,c/(jA/2)*3.2)}function PA({progress:e,playing:t,cover:n,analyser:r,levels:i,visualizer:a,animate:o,size:s}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)(new Uint8Array(new ArrayBuffer(128)));(0,l.useEffect)(()=>{let e=c.current,n=e?.getContext(`2d`);if(!e||!n||!o)return;let l=0,f=Math.min(2,window.devicePixelRatio||1);e.width=e.height=Math.round(s*f);let p=getComputedStyle(e).getPropertyValue(`--accent`).trim()||`#3fd8ff`,m=e=>{if(NA(i,r,t,e,d.current),u.current?.style.setProperty(`--bass`,i.bass.toFixed(3)),n.setTransform(f,0,0,f,0,0),n.clearRect(0,0,s,s),a){let e=s/2,t=s*.335,r=s*.135;n.lineCap=`round`,n.lineWidth=Math.max(1.5,s/90);for(let a=0;a<jA;a++){let o=a/jA*Math.PI*2-Math.PI/2,s=i.bars[a],c=2+s*r;n.strokeStyle=p,n.globalAlpha=.35+s*.65,n.beginPath(),n.moveTo(e+Math.cos(o)*t,e+Math.sin(o)*t),n.lineTo(e+Math.cos(o)*(t+c),e+Math.sin(o)*(t+c)),n.stroke()}n.globalAlpha=1}(t||!i.bars.every(e=>e<.01)||a)&&(l=requestAnimationFrame(m))};return l=requestAnimationFrame(m),()=>cancelAnimationFrame(l)},[r,t,a,o,s,i]);let f=Math.max(0,Math.min(1,e))*100;return(0,p.jsxs)(`div`,{ref:u,className:`hud-dial${t?` playing`:``}`,style:{width:s,height:s},role:`img`,"aria-label":`Playback dial`,children:[(0,p.jsxs)(`svg`,{className:`hud-dial-svg`,viewBox:`0 0 200 200`,"aria-hidden":`true`,children:[(0,p.jsx)(`circle`,{className:`hud-dial-ticks`,cx:`100`,cy:`100`,r:`96`}),(0,p.jsx)(`circle`,{className:`hud-dial-track`,cx:`100`,cy:`100`,r:`88`}),(0,p.jsx)(`circle`,{className:`hud-dial-arc`,cx:`100`,cy:`100`,r:`88`,pathLength:`100`,strokeDasharray:`${f} 100`,transform:`rotate(-90 100 100)`}),(0,p.jsx)(`circle`,{className:`hud-dial-inner`,cx:`100`,cy:`100`,r:`62`}),(0,p.jsxs)(`g`,{className:`hud-needle`,children:[(0,p.jsx)(`line`,{x1:`100`,y1:`100`,x2:`100`,y2:`14`}),(0,p.jsx)(`circle`,{cx:`100`,cy:`14`,r:`2.500`})]})]}),(0,p.jsx)(`canvas`,{ref:c,className:`hud-spectrum`,style:{width:s,height:s},"aria-hidden":`true`}),(0,p.jsx)(`div`,{className:`hud-cover`,style:n?{backgroundImage:`url("${n}")`}:void 0,children:!n&&(0,p.jsx)(AA,{})})]})}var FA=e=>{let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},IA=new Map,LA=e=>{let t=Su(e);return t&&t.source===`local`?t.id:null},RA=e=>Su(e)?.source===`spotify`,zA=e=>Su(e)?.source===`soundcloud`,BA=e=>Su(e)?.source===`audius`,VA={spotify:`Spotify`,soundcloud:`SoundCloud`,audius:`Audius`};function HA(e){let[t,n]=(0,l.useState)(e?IA.get(e)??!1:!1);return(0,l.useEffect)(()=>{if(!e)return n(!1);if(IA.has(e))return n(IA.get(e));let t=!0,r=new Image;r.onload=()=>{IA.set(e,!0),t&&n(!0)},r.onerror=()=>{IA.set(e,!1),t&&n(!1)};let i=LA(e);return i?(r.src=`/api/music/cover/${i}`,()=>{t=!1}):n(!1)},[e]),e&&t?`/api/music/cover/${LA(e)}`:null}async function UA(e,t){let n=await fetch(`/api/music/library?q=${encodeURIComponent(e)}&limit=${t}`);return n.ok?await n.json():{tracks:[],total:0}}function WA(){let[e,t]=(0,l.useState)(null);return(0,l.useEffect)(()=>{let e=!0;return fetch(`/api/music/sources`).then(e=>e.ok?e.json():null).then(n=>{let r={};for(let e of[`spotify`,`soundcloud`,`audius`]){let t=n?.sources?.find(t=>t.id===e)?.status;t&&(r[e]={connected:t.connected,needs:t.needs})}e&&n&&t(r)}).catch(()=>{}),()=>{e=!1}},[]),e}async function GA(e,t,n){let r=await fetch(`/api/music/search?q=${encodeURIComponent(t)}&source=${e}&limit=${n}`);if(!r.ok)return{tracks:[],total:0};let i=((await r.json()).tracks??[]).map(e=>({id:e.ref,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec}));return{tracks:i,total:i.length}}var KA=e=>({id:e.id,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec});function qA({levels:e,animate:t,side:n}){let r=(0,l.useRef)(null);return(0,l.useEffect)(()=>{if(!t)return;let i=0,a=r.current,o=()=>{if(a){let t=n===`left`?e.left:e.right,r=Math.round(t*12);a.querySelectorAll(`i`).forEach((e,t)=>e.classList.toggle(`on`,t<r))}i=requestAnimationFrame(o)};return i=requestAnimationFrame(o),()=>cancelAnimationFrame(i)},[e,t,n]),(0,p.jsx)(`div`,{ref:r,className:`hud-levels ${n}`,"aria-hidden":`true`,children:Array.from({length:12},(e,t)=>(0,p.jsx)(`i`,{},t))})}function JA({player:e,anim:t}){let{state:n,dispatch:r}=e,i=(0,l.useCallback)(async()=>{if(n.queue.length>0)return r({type:`resume`});let e=await UA(``,500);r({type:`play`,tracks:e.tracks.map(KA),mode:`replace`,...n.shuffle?{shuffle:!0}:{}})},[n.queue.length,n.shuffle,r]),a=e=>n=>{t!==`off`&&gA(n),e()};return(0,p.jsxs)(`div`,{className:`hud-controls`,role:`group`,"aria-label":`Player controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Shuffle`,"aria-pressed":n.shuffle,title:`Shuffle`,onClick:()=>r({type:`shuffle`}),children:(0,p.jsx)(CA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Previous track`,title:`Previous`,onPointerDown:a(()=>{}),onClick:()=>r({type:`previous`}),children:(0,p.jsx)(SA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn hud-btn-main`,"aria-label":n.playing?`Pause`:`Play`,title:n.playing?`Pause`:`Play`,onPointerDown:a(()=>{}),onClick:()=>n.playing?r({type:`pause`}):void i(),children:n.playing?(0,p.jsx)(bA,{}):(0,p.jsx)(yA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Next track`,title:`Next`,onPointerDown:a(()=>{}),onClick:()=>r({type:`next`}),children:(0,p.jsx)(xA,{})}),(0,p.jsxs)(`button`,{type:`button`,className:`hud-btn${n.repeat===`off`?``:` on`}`,"aria-label":`Repeat: ${n.repeat}`,title:`Repeat: ${n.repeat}`,onClick:()=>r({type:`repeat`,mode:n.repeat===`off`?`all`:n.repeat===`all`?`one`:`off`}),children:[(0,p.jsx)(wA,{}),n.repeat===`one`&&(0,p.jsx)(`sup`,{children:`1`})]})]})}function YA({player:e}){let{state:t,dispatch:n}=e,r=t.duration>0?t.position/t.duration*100:0;return(0,p.jsxs)(`div`,{className:`hud-timeline`,children:[(0,p.jsx)(`span`,{className:`hud-time`,children:FA(t.position)}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Position`,min:0,max:Math.max(1,Math.floor(t.duration)),step:1,value:Math.min(Math.floor(t.position),Math.max(1,Math.floor(t.duration))),style:{"--fill":`${r}%`},disabled:t.duration<=0,onChange:e=>n({type:`seek`,seconds:Number(e.target.value)})}),(0,p.jsxs)(`span`,{className:`hud-time`,children:[`-`,FA(Math.max(0,t.duration-t.position))]})]})}function XA({player:e}){let{state:t,dispatch:n}=e;return(0,p.jsxs)(`div`,{className:`hud-volume`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":t.muted?`Unmute`:`Mute`,onClick:()=>n({type:`mute`}),children:t.muted||t.volume===0?(0,p.jsx)(EA,{}):(0,p.jsx)(TA,{})}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Volume`,min:0,max:100,value:t.muted?0:t.volume,style:{"--fill":`${t.muted?0:t.volume}%`},onChange:e=>n({type:`volume`,level:Number(e.target.value)})})]})}function ZA({player:e,anim:t}){let{state:n,dispatch:r}=e,[i,a]=(0,l.useState)(n.queue.length?`queue`:`library`),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(`folder`),[d,f]=(0,l.useState)(null),m=WA(),h=[`spotify`,`soundcloud`,`audius`].filter(e=>m?.[e]?.connected),g=c!==`folder`&&h.includes(c)?c:null,_=g?m?.[g]?.needs:null;(0,l.useEffect)(()=>{if(i!==`library`)return;let e=!0;if(g&&!o.trim()){f(null);return}let t=()=>g?GA(g,o.trim(),30):UA(o,100),n=setTimeout(()=>void t().then(t=>e&&f(t)),o?250:0);return()=>{e=!1,clearTimeout(n)}},[i,o,g]);let v=i===`queue`?n.queue.map((e,t)=>({track:e,index:t})):(d?.tracks??[]).map((e,t)=>({track:KA(e),index:t}));return(0,p.jsxs)(`div`,{className:`hud-playlist`,children:[(0,p.jsxs)(`div`,{className:`hud-tabs`,role:`tablist`,children:[[`queue`,`library`].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":i===e,className:`hud-chip${i===e?` on`:``}`,onClick:()=>a(e),children:e===`queue`?`Queue (${n.queue.length})`:`Library`},e)),i===`queue`&&n.queue.length>0&&(0,p.jsx)(`button`,{type:`button`,className:`hud-chip`,onClick:()=>r({type:`clear`}),children:`Clear`})]}),i===`library`&&h.length>0&&(0,p.jsx)(`div`,{className:`hud-tabs`,role:`tablist`,"aria-label":`Where to look`,children:[`folder`,...h].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":c===e,className:`hud-chip${c===e?` on`:``}`,onClick:()=>{u(e),f(null)},children:e===`folder`?`Folder`:VA[e]},e))}),i===`library`&&(0,p.jsx)(`input`,{className:`hud-search`,type:`search`,placeholder:`Search title, artist or album`,"aria-label":`Search the music`,value:o,onChange:e=>s(e.target.value)}),(0,p.jsxs)(`ul`,{className:`hud-list`,children:[v.length===0&&(0,p.jsx)(`li`,{className:`hud-empty`,children:i===`queue`?`The queue is empty.`:g&&!o.trim()?`Type to search ${VA[g]}.`:d?`No music matches.`:`Loading…`}),i===`library`&&g&&_&&(0,p.jsx)(`li`,{className:`hud-empty`,children:_}),v.map(({track:e,index:a},o)=>{let s=i===`queue`&&a===n.index;return(0,p.jsxs)(`li`,{className:`hud-tab hud-cut${s?` current`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":Math.min(o,12)},children:[(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-current":s?`true`:void 0,onPointerDown:t===`off`?void 0:gA,onClick:()=>r(i===`queue`?{type:`jump`,index:a}:{type:`play`,tracks:(d?.tracks??[]).map(KA),mode:`replace`,start:a}),children:[(0,p.jsx)(`span`,{className:`hud-tab-title`,children:e.title}),(0,p.jsxs)(`small`,{children:[e.artist||e.album,RA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),zA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),BA(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`})]})]}),i===`library`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Add ${e.title} to the queue`,title:`Add to the queue`,onClick:()=>r({type:`play`,tracks:[e],mode:`add`}),children:`+`}),i===`queue`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Remove ${e.title} from the queue`,title:`Remove`,onClick:()=>r({type:`remove`,index:a}),children:`×`})]},`${e.id}-${a}`)})]})]})}function QA({player:e,music:t,animations:n}){let{state:r,dispatch:i,current:a,blocked:o,notice:s,analyser:c,unlock:u}=e,d=(0,l.useMemo)(MA,[]),f=HA(a?.id),m=r.view===`full`,h=hA(a?.title??``,n===`full`);if(!t?.folderSet||r.view===`hidden`)return null;let g=r.duration>0?r.position/r.duration:0,_=n!==`off`;return(0,p.jsxs)(he,{id:`music`,label:`Music player`,wholeBox:!0,testId:`music`,className:`hud hud-music hud-cut ${m?`full`:`mini`}${r.playing?` playing`:``}${n===`full`?` hud-boot`:``}`,children:[(0,p.jsxs)(`header`,{className:`hud-music-head`,children:[(0,p.jsx)(`span`,{className:`hud-kicker`,children:`Media player`}),(0,p.jsxs)(`span`,{className:`hud-head-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":m?`Smaller player`:`Bigger player`,title:m?`Smaller`:`Bigger`,onClick:()=>i({type:`view`,view:m?`mini`:`full`}),children:m?(0,p.jsx)(OA,{}):(0,p.jsx)(DA,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Hide the player`,title:`Hide (the music keeps playing)`,onClick:()=>i({type:`view`,view:`hidden`}),children:(0,p.jsx)(kA,{})})]})]}),(0,p.jsxs)(`div`,{className:`hud-music-body`,children:[(0,p.jsxs)(`div`,{className:`hud-music-left`,children:[m&&(0,p.jsx)(qA,{levels:d,animate:_,side:`left`}),(0,p.jsx)(PA,{progress:g,playing:r.playing,cover:f,analyser:c,levels:d,visualizer:t.visualizer,animate:_,size:m?250:112}),m&&(0,p.jsx)(qA,{levels:d,animate:_,side:`right`})]}),(0,p.jsxs)(`div`,{className:`hud-music-main`,children:[(0,p.jsxs)(`div`,{className:`hud-now`,"aria-live":`polite`,children:[(0,p.jsx)(`b`,{className:`hud-title`,children:a?h:`Nothing playing`}),(0,p.jsxs)(`small`,{className:`hud-sub`,children:[a?[a.artist,a.album].filter(Boolean).join(` — `):`Press play, or ask for some music.`,a&&RA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),a&&zA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),a&&BA(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`}),e.remote&&(0,p.jsx)(`em`,{className:`hud-source`,children:`THIS PC`})]})]}),(0,p.jsx)(YA,{player:e}),(0,p.jsx)(JA,{player:e,anim:n}),m&&(0,p.jsx)(XA,{player:e}),s&&(0,p.jsx)(`p`,{className:`hud-notice`,role:`status`,children:s}),o&&(0,p.jsx)(`button`,{type:`button`,className:`hud-unlock`,onClick:u,children:`Tap to enable sound`})]}),m&&(0,p.jsx)(ZA,{player:e,anim:n})]})]})}var $A=/^spotify:/,ej=class{local;makeSpotify;active;spotify=null;listeners=new Map;wrapped=new Map;vol=1;mute=!1;pre=``;constructor(e,t){this.local=e,this.makeSpotify=t,this.active=e}get element(){return this.local}get error(){return this.active.error??null}wrap(e){let t=this.wrapped.get(e);return t||(t={local:()=>{this.active===this.local&&e()},spot:()=>{this.spotify&&this.active===this.spotify&&e()}},this.wrapped.set(e,t)),t}spot(){if(!this.spotify){let e=this.makeSpotify();e.volume=this.vol,e.muted=this.mute,e.preload=this.pre;for(let[t,n]of this.listeners)for(let r of n)e.addEventListener(t,this.wrap(r).spot);this.spotify=e}return this.spotify}dispose(){this.spotify?.dispose?.(),this.spotify=null,this.active=this.local}get src(){return this.active.src}set src(e){let t=$A.test(e)?this.spot():this.local;t===this.active?e===``&&this.active.pause():(this.active.pause(),this.active=t),this.active.src=e}get currentTime(){return this.active.currentTime}set currentTime(e){this.active.currentTime=e}get duration(){return this.active.duration}get paused(){return this.active.paused}get volume(){return this.vol}set volume(e){this.vol=e,this.local.volume=e,this.spotify&&(this.spotify.volume=e)}get muted(){return this.mute}set muted(e){this.mute=e,this.local.muted=e,this.spotify&&(this.spotify.muted=e)}get preload(){return this.pre}set preload(e){this.pre=e,this.local.preload=e,this.spotify&&(this.spotify.preload=e)}play(){return this.active.play()}pause(){this.active.pause()}addEventListener(e,t){let n=this.listeners.get(e);n||this.listeners.set(e,n=new Set),n.add(t);let r=this.wrap(t);this.local.addEventListener(e,r.local),this.spotify?.addEventListener(e,r.spot)}removeEventListener(e,t){this.listeners.get(e)?.delete(t);let n=this.wrap(t);this.local.removeEventListener(e,n.local),this.spotify?.removeEventListener(e,n.spot)}},tj=/^spotify:([A-Za-z0-9_-]{1,64})$/,nj=`Spotify Premium is needed to play on this screen.`;async function rj(){let e=await fetch(`/api/music/spotify/token`,{cache:`no-store`});if(!e.ok)throw Error(`Spotify is not connected.`);return(await e.json()).accessToken}function ij(){let e=window;return e.Spotify?Promise.resolve(e.Spotify):new Promise((t,n)=>{e.onSpotifyWebPlaybackSDKReady=()=>e.Spotify?t(e.Spotify):n(Error(`no sdk`));let r=document.createElement(`script`);r.src=`https://sdk.scdn.co/spotify-player.js`,r.async=!0,r.onerror=()=>n(Error(`blocked`)),document.head.appendChild(r)})}function aj(e){let t=e.fetch??((...e)=>fetch(...e)),n=e.now??Date.now,r=new Map,i=null,a=null,o=null,s=null,c=!1,l=null,u=null,d=0,f=0,p=0,m=!0,h=1,g=!1,_,v=e=>{for(let t of r.get(e)??[])t()},y=()=>g?0:h,b=()=>{_&&clearInterval(_),_=void 0},x=()=>{_||=setInterval(()=>v(`timeupdate`),250)},S={error:null,preload:``,get src(){return s??``},set src(e){let t=tj.exec(e);c=e!==``&&!t,s=t?e:null,l=null,u=null,d=0,p=0,S.error=null,t||b()},get currentTime(){return m?d:d+(n()-f)/1e3},set currentTime(e){d=e,f=n(),i?.seek(Math.round(e*1e3)).catch(()=>{})},get duration(){return p},get paused(){return m},get volume(){return h},set volume(e){h=e,i?.setVolume(y()).catch(()=>{})},get muted(){return g},set muted(e){g=e,i?.setVolume(y()).catch(()=>{})},async play(){if(c||!s)throw Error(`That is not a Spotify track.`);let r=tj.exec(s),a=s,o=await T();if(s!==a)return;if(l===s){await i?.resume().catch(()=>{}),m=!1,f=n(),x();return}let u=await e.getToken().catch(()=>null);if(!u)throw C(`Spotify is not connected. Connect it in Plugins, Spotify.`);let d;try{d=await t(`https://api.spotify.com/v1/me/player/play?device_id=${encodeURIComponent(o)}`,{method:`PUT`,headers:{authorization:`Bearer ${u}`,"content-type":`application/json`},body:JSON.stringify({uris:[`spotify:track:${r[1]}`]})})}catch{throw C(`Friend could not reach Spotify right now.`)}if(d.status===403)throw C(nj);if(d.status===401)throw C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`);if(d.status===404)throw C(`Spotify could not find this screen or that track.`);if(d.status===429)throw C(`Spotify is asking Friend to slow down. Try again in a minute.`);if(!d.ok)throw C(`Spotify could not play that.`);s===a&&(l=a,m=!1,f=n(),x())},pause(){m=!0,d+=(n()-f)/1e3,f=n(),b(),i?.pause().catch(()=>{})},dispose(){b();try{i?.disconnect()}catch{}i=null,a=null,s=null,l=null},addEventListener(e,t){let n=r.get(e);n||r.set(e,n=new Set),n.add(t)},removeEventListener(e,t){r.get(e)?.delete(t)}};function C(e){S.error=e,m=!0,b(),v(`error`);let t=Error(e),n=o;return o=null,n?.reject(t),t}function w(e){if(!e)return;d=e.position/1e3,f=n(),p=e.duration/1e3,m=e.paused,v(`timeupdate`),v(`loadedmetadata`),v(`durationchange`);let t=s?tj.exec(s)?.[1]:void 0;t&&e.paused&&e.position===0&&u!==s&&(e.track_window.previous_tracks??[]).some(e=>e.id===t)&&(u=s,b(),v(`ended`))}function T(){if(a)return Promise.resolve(a);if(o)return o.promise;let t,n,r=new Promise((e,r)=>{t=e,n=r}),s={promise:r,resolve:t,reject:n};o=s;let c=setTimeout(()=>{o===s&&C(`Spotify's player did not start. Check that this browser allows Spotify's player, then try again.`)},e.readyTimeoutMs??15e3),l=()=>clearTimeout(c);return r.then(l,l),(async()=>{try{if(!i){let t;try{t=await(e.loadSdk??ij)()}catch{o===s&&C(`Spotify's player could not be loaded. Check that nothing blocks sdk.scdn.co.`);return}let n=new t.Player({name:e.deviceName??`Friend`,volume:y(),getOAuthToken:t=>{e.getToken().then(t,()=>{})}});i=n,n.addListener(`ready`,(e=>{a=e.device_id;let t=o;o=null,t?.resolve(e.device_id)})),n.addListener(`not_ready`,(()=>{a=null})),n.addListener(`player_state_changed`,(e=>w(e))),n.addListener(`account_error`,(()=>void C(nj))),n.addListener(`authentication_error`,(()=>void C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`))),n.addListener(`initialization_error`,(()=>void C(`Spotify's player does not work in this browser.`))),n.addListener(`playback_error`,(()=>void C(`Spotify could not play that.`)))}!await i.connect()&&o===s&&C(`Spotify's player could not connect.`)}catch{o===s&&C(`Spotify's player could not connect.`)}})(),r}return S}var oj=e=>{let t=Su(e);return t?t.source===`local`?`/api/music/track/${t.id}`:t.source===`soundcloud`||t.source===`audius`?`/api/music/stream/${e}`:e:`/api/music/track/${e}`},sj=(e,t)=>Xu(e,t),cj=`friend.music`,lj=1e3,uj=1.5,dj=()=>{try{return JSON.parse(localStorage.getItem(cj)??`{}`)}catch{return{}}},fj=e=>{try{localStorage.setItem(cj,JSON.stringify({volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view}))}catch{}};function pj({music:e,cmd:t,send:n,connection:r,createAudio:i,createSpotify:a,remote:o=!1}){let[s,c]=(0,l.useReducer)(sj,void 0,()=>{let e=dj();return Ku({volume:e.volume??70,shuffle:e.shuffle??!1,repeat:e.repeat??`all`,view:e.view??`mini`})}),[u,d]=(0,l.useState)(!1),[f,p]=(0,l.useState)(null),[m,h]=(0,l.useState)(null),g=(0,l.useRef)(null),_=(0,l.useRef)(!1),v=(0,l.useRef)(s);v.current=s;let y=(0,l.useRef)(!1),b=(0,l.useRef)(null),x=(0,l.useRef)(0),S=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!e||S.current)return;S.current=!0;let t=dj();c({type:`volume`,level:t.volume??e.volume}),c({type:`repeat`,mode:t.repeat??e.repeat}),(t.shuffle??e.shuffle)&&c({type:`shuffle`,on:!0}),c({type:`view`,view:t.view??e.startView}),t.muted&&c({type:`mute`,on:!0})},[e]);let C=()=>{if(!g.current){let e=new ej(i?i():new Audio,a??(()=>aj({getToken:rj})));e.preload=`auto`,g.current=e}return g.current},w=(0,l.useRef)(!1),T=(0,l.useCallback)(()=>{let e=g.current;if(e&&e.src){w.current=!0;try{let t=e.play();t&&typeof t.then==`function`?t.then(()=>{w.current=!1,d(!1)},()=>{w.current=!1;let e=g.current?.error??null;e?p(e):d(!0)}):(w.current=!1,d(!1))}catch{w.current=!1,d(!0)}E.current||O()}},[]),E=(0,l.useRef)(!1),D=(0,l.useRef)(null),O=()=>{let e=g.current,t=e instanceof ej?e.element:e,n=typeof window<`u`?window.AudioContext??window.webkitAudioContext:void 0;if(t&&n&&typeof t.play==`function`)try{let e=new n;D.current=e;let r=e.createMediaElementSource(t),i=e.createAnalyser();i.fftSize=256,i.smoothingTimeConstant=.82,r.connect(i),i.connect(e.destination),E.current=!0,h(i)}catch{E.current=!0}};(0,l.useEffect)(()=>{if(o)return;let e=C(),t=0,n=()=>{let n=Date.now();n-t<250||(t=n,c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}))},r=()=>c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}),i=()=>c({type:`ended`}),a=()=>{let t=e.error??null;p(t),c(t?{type:`pause`}:{type:`failed`})};return e.addEventListener(`timeupdate`,n),e.addEventListener(`loadedmetadata`,r),e.addEventListener(`durationchange`,r),e.addEventListener(`ended`,i),e.addEventListener(`error`,a),()=>{e.removeEventListener(`timeupdate`,n),e.removeEventListener(`loadedmetadata`,r),e.removeEventListener(`durationchange`,r),e.removeEventListener(`ended`,i),e.removeEventListener(`error`,a),e.pause(),D.current?.close().catch(()=>{}),D.current=null,e.dispose(),b.current=null,g.current=null,E.current=!1,h(null)}},[o]),(0,l.useEffect)(()=>{o&&c({type:`stop`})},[o]);let k=s.index>=0?s.queue[s.index]??null:null;(0,l.useEffect)(()=>{let e=g.current;if(o||!e)return;let t=k?.id??null;if(t!==b.current){if(b.current=t,!t){e.pause(),e.src=``;return}p(null),e.src=oj(t),s.playing&&T()}},[k?.id,s.playing,T,o]),(0,l.useEffect)(()=>{let e=g.current;!o&&e&&e.src&&(s.playing&&e.paused&&!_.current&&!w.current?T():!s.playing&&!e.paused&&e.pause())},[s.playing,s.position,T,o]),(0,l.useEffect)(()=>{let e=g.current;e&&(e.volume=s.volume/100*$T.level,e.muted=s.muted)},[s.volume,s.muted]),(0,l.useEffect)(()=>$T.subscribe(e=>{let t=g.current;t&&(t.volume=v.current.volume/100*e)}),[]),(0,l.useEffect)(()=>{let e=g.current;e&&e.src&&Math.abs((e.currentTime||0)-s.position)>uj&&(e.currentTime=s.position)},[s.position]),(0,l.useEffect)(()=>fj(s),[s.volume,s.muted,s.shuffle,s.repeat,s.view]),(0,l.useEffect)(()=>{if(!t||t.n===x.current)return;x.current=t.n;let e=Zu(t.command);e&&c(e)},[t]),(0,l.useEffect)(()=>{let e=()=>{y.current=!0,_.current&&T()};return window.addEventListener(`pointerdown`,e,{passive:!0}),window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,e)}},[T]),_.current=u;let A=(0,l.useRef)(0);return(0,l.useEffect)(()=>{if(r!==`open`||o)return;let e=()=>{let e=v.current,t=e.index>=0?e.queue[e.index]:void 0;A.current=Date.now(),n({type:`music.state`,state:{playing:e.playing,trackId:t?.id??null,title:t?.title??``,artist:t?.artist??``,album:t?.album??``,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view,queue:e.queue.slice(0,50).map(e=>({id:e.id,title:e.title.slice(0,200)})),index:e.index,active:(typeof document>`u`||document.visibilityState===`visible`)&&y.current}})};e();let t=setInterval(()=>s.playing&&Date.now()-A.current>=lj&&e(),lj);return()=>clearInterval(t)},[r,o,k?.id,s.playing,s.volume,s.muted,s.shuffle,s.repeat,s.view,s.queue.length,s.index]),(0,l.useEffect)(()=>{let e=typeof navigator<`u`?navigator.mediaSession:void 0;if(e&&!o)try{k&&typeof MediaMetadata<`u`&&(e.metadata=new MediaMetadata({title:k.title,artist:k.artist,album:k.album,artwork:[{src:`/api/music/cover/${k.id}`}]})),e.playbackState=s.playing?`playing`:k?`paused`:`none`,e.setActionHandler(`play`,()=>c({type:`resume`})),e.setActionHandler(`pause`,()=>c({type:`pause`})),e.setActionHandler(`previoustrack`,()=>c({type:`previous`})),e.setActionHandler(`nexttrack`,()=>c({type:`next`})),e.setActionHandler(`seekto`,e=>typeof e.seekTime==`number`&&c({type:`seek`,seconds:e.seekTime}))}catch{}},[k?.id,s.playing,o]),{remote:!1,state:s,dispatch:c,current:k,blocked:u,notice:f,analyser:m,unlock:T,audio:g}}function mj(e,t){if(!e)return{state:{queue:[],index:-1,playing:!1,position:0,duration:0,volume:70,muted:!1,shuffle:!1,repeat:`all`,view:t},current:null};let n=e.queue.map((t,n)=>n===e.index?{id:t.id,title:e.title||t.title,artist:e.artist,album:e.album,durationSec:e.duration>0?e.duration:null}:{id:t.id,title:t.title,artist:``,album:``,durationSec:null});return{state:{queue:n,index:e.index,playing:e.playing,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:t},current:e.index>=0?n[e.index]??null:null}}function hj({local:e,host:t,send:n}){let r=e.state.view,{state:i,current:a}=(0,l.useMemo)(()=>mj(t,r),[t,r]),o=e.dispatch,s=(0,l.useCallback)(e=>{if(e.type===`view`)return o(e);let t=Qu(e);t&&n({type:`music.remote`,command:t})},[o,n]);return(0,l.useMemo)(()=>({...e,remote:!0,state:i,dispatch:s,current:a,blocked:!1,notice:null,analyser:null,unlock:()=>{}}),[e,i,s,a])}function gj(e){let t=new URLSearchParams(e).get(`music`);return t===`connected`?{level:`info`,text:`Spotify is connected. Ask Friend to play something.`}:t===`failed`?{level:`warn`,text:`Spotify did not connect. Open Plugins, Spotify and press Connect again.`}:null}function _j({onSignedOut:e}){let{state:t,send:n,dispatch:r,voice:i,handsFree:a,useHere:o}=Vk(e);$k(i),eA(i),oA(n,t.connection);let[s,c]=(0,l.useState)(!1),[u,d]=(0,l.useState)(!1),[f,m]=(0,l.useState)(!1),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(void 0),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(be),C=e=>{U(e),S(e)},w=x===`orb`?We:xe,[T,E]=(0,l.useState)(!1),[D,O]=(0,l.useState)(0),[k,A]=(0,l.useState)(null),j=fe(t.view),ee=t.music?.output===`host`,M=pj({music:t.music,cmd:t.musicCmd,send:n,connection:t.connection,remote:ee}),P=hj({local:M,host:t.hostMusic,send:n}),F=ee?P:M,te=t.hud?.animations??`full`,I=e=>{let{type:i,value:a}=e.action;if(i===`url`)window.open(a,`_blank`,`noopener,noreferrer`);else if(i===`prompt`)n({type:`chat.send`,text:a});else if(i===`music`||i===`panel`&&a===`music`){if(!t.music?.folderSet){r({type:`alert.add`,level:`info`,text:`No music folder is chosen yet. Pick one in Settings, Widgets, and the player opens.`}),b(`widgets`);return}if(i===`panel`){j.toggle(`music`,!0),F.state.view===`hidden`&&F.dispatch({type:`view`,view:`mini`});return}let e=Zu({action:a});e&&F.dispatch(e)}else a===`plugins`?g(!0):a===`settings`?b(`model`):(a===`chat`||a===`tasks`)&&j.toggle(a,!0)},ne=(0,l.useMemo)(()=>s?{...t,objects:[],captions:``}:t,[s,t]),ie=(0,l.useRef)(!1);(0,l.useEffect)(()=>{ie.current||!t.voice.available||t.voice.enrolled||(ie.current=!0,r({type:`alert.add`,level:`info`,text:`Voice recognition is not set up. Press Esc, then Enroll my voice.`}))},[t.voice.available,t.voice.enrolled,r]);let oe=ae(),se=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!oe||se.current||t.connection!==`open`)return;se.current=!0;let e=!1;try{e=localStorage.getItem(`friend.touchHint`)===`1`,localStorage.setItem(`friend.touchHint`,`1`)}catch{}e||r({type:`alert.add`,level:`info`,text:`Hold the round mic button to talk, or tap it once to start and again to send. The keyboard button types; the menu button opens settings.`})},[oe,t.connection,r]);let ce=t.uiOpen?.n??0,le=t.uiOpen?.integration;(0,l.useEffect)(()=>{ce!==0&&(v(le),g(!0))},[ce,le]);let ue=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(ue.current)return;ue.current=!0;let e=gj(window.location.search);e&&(r({type:`alert.add`,level:e.level,text:e.text}),window.history.replaceState(null,``,window.location.pathname))},[r]);let de=(0,l.useRef)(!1);(0,l.useEffect)(()=>{de.current||t.connection!==`open`||(de.current=!0,fetch(`/api/history`).then(e=>e.ok?e.json():[]).then(e=>r({type:`chat.seed`,lines:e})).catch(()=>{}))},[t.connection,r]),(0,l.useEffect)(()=>{t.connection===`open`&&n({type:`ui.panels`,open:[...j.show.chat?[`chat`]:[],...j.show.tasks?[`tasks`]:[]]})},[t.connection,j.show.chat,j.show.tasks,n]);let R=(0,l.useRef)(!1);(0,l.useEffect)(()=>{t.viewKnown&&t.view===`minimal`&&!R.current&&(R.current=!0,r({type:`alert.add`,level:`info`,text:`The view is Minimal, so the status line and clock are hidden. Press Esc, then View, to bring them back.`}))},[t.viewKnown,t.view,r]);let z=e=>{ht.save({view:e}).catch(e=>r({type:`alert.add`,level:`warn`,text:e.message}))},pe=(0,l.useMemo)(()=>L({notify:e=>r({type:`alert.add`,level:`info`,text:e}),openSettings:()=>b(`model`),openLook:()=>b(`look`),openConnectors:()=>E(!0),openPlugins:()=>g(!0),openVoice:t.voice.available?()=>d(!0):null,muted:s,setMuted:c,cameraOn:t.camera.enabled,setCamera:e=>r({type:`camera.enable`,value:e}),clearScreen:()=>{for(let e of t.objects)n({type:`stage.event`,objectId:e.id,event:`dismiss`})},statusLine:()=>nt({connection:t.connection,deviceOnline:t.deviceOnline,approval:t.approval,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity}).text,endSession:t=>{fetch(t===`lock`?`/api/lock`:`/api/logout`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).catch(()=>{}).finally(e)},panelOn:e=>j.show[e],setPanel:(e,t)=>j.toggle(e,t),view:t.view,setView:z,openHelp:A,resetLayout:()=>{B(),window.location.reload()}}),[r,n,s,e,j.show,j.toggle,t.view,t.voice.available,t.voice.mode,t.camera.enabled,t.objects,t.connection,t.deviceOnline,t.approval,t.busy,t.activity]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(aD,{state:ne,send:n,dispatch:r,voice:i,slash:pe,onMenu:()=>O(e=>e+1)}),(0,p.jsxs)(at,{approval:t.approval,challenge:t.challenge,cameraStream:t.camera.stream,alerts:t.alerts,connection:t.connection,deviceOnline:t.deviceOnline,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity,showStatus:t.viewKnown&&j.show.status,showClock:t.viewKnown&&j.show.clock,profile:t.viewKnown&&j.show.profile?{ownerName:t.ownerName,speaker:t.speaker}:null,assistantName:t.assistantName,hud:t.hud,send:n,dispatch:r,children:[t.viewKnown&&j.show.chat&&(0,p.jsx)(ge,{lines:t.chat,live:t.chatLive,onSend:e=>n({type:`chat.send`,text:e}),onClose:()=>j.toggle(`chat`,!1)}),t.viewKnown&&j.show.tasks&&(0,p.jsx)(ve,{busy:t.busy,onClose:()=>j.toggle(`tasks`,!1)}),t.viewKnown&&j.show.launcher&&t.hud&&(0,p.jsx)(_A,{items:t.hud.launcher,animations:te,onAction:I}),t.viewKnown&&j.show.music&&(0,p.jsx)(QA,{player:F,music:t.music,animations:te}),u&&(0,p.jsx)(Jk,{onClose:()=>d(!1)}),f&&(0,p.jsx)(dA,{onClose:()=>m(!1)}),h&&(0,p.jsx)($d,{variant:x===`orb`?`holo`:`classic`,..._?{initialConfigure:_}:{},onClose:()=>{g(!1),v(void 0)}}),y&&(0,p.jsx)(Jx,{initialTab:y,variant:x===`orb`?`holo`:`classic`,onClose:()=>b(null)}),T&&(0,p.jsx)(N,{variant:x===`orb`?`holo`:`classic`,onClose:()=>E(!1)}),k&&(0,p.jsx)(re,{commands:k,onClose:()=>A(null)})]}),(0,p.jsx)(w,{voiceMode:t.voice.mode,busy:t.busy,onClassic:()=>C(`classic`),onOrb:()=>C(`orb`),muted:s,onToggleMute:()=>c(e=>!e),onSignedOut:e,voiceAvailable:t.voice.available,voiceEnrolled:t.voice.enrolled,onEnroll:()=>d(!0),onHousehold:()=>m(!0),handsFreeOn:a.on,onToggleHandsFree:a.supported?a.toggle:void 0,assistantName:t.assistantName,onPlugins:()=>g(!0),onSettings:e=>b(e??`model`),onConnectors:()=>E(!0),cameraOn:t.camera.enabled,onToggleCamera:()=>r({type:`camera.enable`,value:!t.camera.enabled}),chatOn:j.show.chat,onToggleChat:()=>j.toggle(`chat`),tasksOn:j.show.tasks,onToggleTasks:()=>j.toggle(`tasks`),musicOn:j.show.music,onToggleMusic:()=>j.toggle(`music`),launcherOn:j.show.launcher,onToggleLauncher:()=>j.toggle(`launcher`),view:t.view,onView:z,openRequest:D}),t.connection===`elsewhere`&&(0,p.jsx)(tA,{onUseHere:o})]})}function vj(){let[e,t]=(0,l.useState)(`loading`);return(0,l.useEffect)(()=>{let e=!0,n=n=>e&&t(n);return(async()=>{try{if(!(await(await fetch(`/api/state`)).json()).hasOwner)return n(`setup`);let e=await(await fetch(`/api/session`,{cache:`no-store`})).json();n(e.signedIn===!0?`stage`:`login`)}catch{n(`login`)}})(),()=>{e=!1}},[]),e===`loading`?(0,p.jsx)(`div`,{className:`boot`,"aria-busy":`true`}):e===`setup`?(0,p.jsx)(g,{onDone:()=>t(`login`)}):e===`login`?(0,p.jsx)(h,{onLoggedIn:()=>t(`stage`)}):(0,p.jsx)(_j,{onSignedOut:()=>t(`login`)})}(0,u.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(l.StrictMode,{children:(0,p.jsx)(vj,{})}));
|