@cyberart-io/engine 0.0.4 → 0.0.6
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 +102 -21
- package/dist/headless.d.ts +779 -68
- package/dist/headless.js +1 -1
- package/dist/index.d.ts +1144 -9
- package/dist/index.js +1 -1
- package/docs/asset-resolver.md +4 -4
- package/docs/audio.md +152 -0
- package/docs/browser-harness.md +126 -0
- package/docs/capability-manifest.md +18 -7
- package/docs/compositor.md +103 -0
- package/docs/deterministic-mode.md +1 -1
- package/docs/events.md +75 -13
- package/docs/executable-modules.md +112 -0
- package/docs/headless-harness.md +44 -14
- package/docs/midi.md +128 -0
- package/docs/presentation-adapter.md +8 -8
- package/docs/presentation-cue.md +2 -2
- package/docs/replay-inspector.md +88 -0
- package/docs/runtime-group.md +9 -7
- package/docs/snapshots.md +102 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
* Not an OSI open-source license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
var lr=(e,t)=>()=>(e&&(t=e(e=0)),t);var Er={};function vr(e,t){let n=e.indexOf(nn);if(n===-1)return null;let r=n+nn.length,o=`const __cyberSkip=new Set(${JSON.stringify(t)});const __cyberOrig=registerProcessor;registerProcessor=(n,p)=>__cyberSkip.has(n)?undefined:__cyberOrig(n,p);`;return e.slice(0,r)+o+e.slice(r)}var lt,qe,br,Me,nn,rn=lr(()=>{"use strict";lt=/AudioWorkletProcessor with name:\s*["'`][^"'`]+["'`]\s+is already registered/i,qe="__cyberartWorkletPatchApplied";typeof window<"u"&&!window[qe]&&(window.addEventListener("error",e=>{let t=e?.message??"";lt.test(t)&&(e.preventDefault(),e.stopImmediatePropagation())},!0),window.addEventListener("unhandledrejection",e=>{let t=e?.reason,n=typeof t=="string"?t:t?.message??"";lt.test(n)&&e.preventDefault()}),window[qe]=!0);br=!1,Me=(...e)=>{br&&console.log("[workletPatch]",...e)},nn="((AudioWorkletProcessor,registerProcessor)=>{";if(typeof AudioWorklet<"u"&&!AudioWorklet.prototype[qe]){let e=new WeakMap,t=/registerProcessor\s*\(\s*['"`]([^'"`]+)['"`]/g,n=AudioWorklet.prototype.addModule,r=0;AudioWorklet.prototype.addModule=async function(o,a){let d=++r,u=e.get(this);u||(u=new Set,e.set(this,u)),Me(`#${d} addModule`,{url:o.slice(0,64),isBlob:o.startsWith("blob:"),knownBefore:[...u]});let g=o,m=null;if(o.startsWith("blob:")){let y=null;try{y=await(await fetch(o)).text()}catch(C){Me(`#${d} blob fetch failed`,C)}if(y!==null){let C=new Set;for(let E of y.matchAll(t))C.add(E[1]);if(C.size>0){let E=[...C].filter(f=>u.has(f)),N=[...C].filter(f=>!u.has(f));if(E.length>0&&N.length===0){Me(`#${d} short-circuit \u2014 all processors already registered`,E);return}if(E.length>0&&N.length>0){let f=vr(y,E);if(f!==null){let l=new Blob([f],{type:"application/javascript"});m=URL.createObjectURL(l),g=m,Me(`#${d} rewrote blob; skipping`,E,"allowing",N)}else Me(`#${d} blob rewrite failed; passing original through`)}N.forEach(f=>u.add(f))}}}return n.call(this,g,a).then(()=>{m&&URL.revokeObjectURL(m)},y=>{m&&URL.revokeObjectURL(m);let C=(y&&y.message)??"";if(!(lt.test(C)||/already registered/i.test(C)))throw y})},AudioWorklet.prototype[qe]=!0}});var Ut=()=>{let e=["ms","moz","webkit","o"];for(let t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"]},z=window.devicePixelRatio||1,pe=/Headless/i.test(navigator.userAgent),_o=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)||/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform);function jt(){return Math.min(window.innerWidth,window.innerHeight)}var Ke="data-cyberart-canvas",fe=class{constructor(t,n,r=1,i={}){this.width=t,this.height=n;let o=i.container,a=i.adoptFromDocument??!o,d=o?o.querySelector(`canvas[${Ke}]`)??o.querySelector("canvas"):null;if(d)this.canvas=d,this.adopted=!0;else if(a){let u=document.getElementById("canvas")??document.querySelector("canvas");u?(this.canvas=u,this.adopted=!0):(this.canvas=document.createElement("canvas"),this.canvas.setAttribute("id","canvas"),this.adopted=!1)}else this.canvas=document.createElement("canvas"),this.adopted=!1;this.canvas.hasAttribute(Ke)||this.canvas.setAttribute(Ke,""),this.canvas.style.display="block",this.canvas.style.margin="auto",this.ctx=this.canvas.getContext("2d",{colorSpace:"display-p3",alpha:!1}),this.ctx.globalAlpha=r,this.ctx.imageSmoothingEnabled=!1,this.setSize(t,n)}setSize(t,n){this.width=t,this.height=n,this.canvas.width=t,this.canvas.height=n,this.canvas.style.width=`${t/z}px`,this.canvas.style.height=`${n/z}px`,this.imageData=this.ctx.createImageData(t,n),this.ctx.putImageData(this.imageData,0,0)}_blank(t=1){let n=t?Math.max(t,.03):1;this.ctx.fillStyle=`rgba(0,0,0,${n})`,this.ctx.fillRect(0,0,this.width,this.height)}clearAll(){this.ctx.save(),this.ctx.globalAlpha=1,this._blank(),this.ctx.restore()}};function zt(e,t){let n=e/t,r,i;return n>1?(r=e,i=~~(e/n)):(i=t,r=~~(t*n)),{width:r,height:i,iWidth:1/r,iHeight:1/i,area:r*i,largeDim:Math.max(r,i),smallDim:Math.min(r,i),aspectRatio:n}}function Wt(e,t=window.innerWidth,n=window.innerHeight){let r=jt(),i,o;return n<t?e>1?t>=r*e?(i=r*e,o=r):(i=t,o=i/e):(i=r*e,o=r):e>1?(i=r,o=r/e):n<r/e?(o=n,i=o*e):(i=r,o=r/e),[i,o]}var Ge=class{constructor(t=!1,n=!0){this.debugMode=t,this.actionMap={},this.listening=n,this.checkKeypress=this.checkKeypress.bind(this),this.registerAction=this.registerAction.bind(this),this.listening&&window.addEventListener("keydown",this.checkKeypress,!1)}checkKeypress({key:t}){this.debugMode&&console.log(`Pressed ${t}`),t in this.actionMap&&this.actionMap[t]()}inject(t){this.checkKeypress({key:t})}registerAction(t,n,r=!1){if(t.length!==1)throw new Error(`Only single-character actions may be registered. Cannot register: ${t}`);if(t in this.actionMap&&!r)throw new Error(`Action already exists for code: ${t}`);this.actionMap[t]=n}destroy(){this.listening&&window.removeEventListener("keydown",this.checkKeypress,!1),this.actionMap={}}},qt=Ge;var $e=class{constructor(t,n={}){this.x=-1;this.y=-1;this.isDown=!1;this.clicks=[];this.canvas=t,this.listening=n.listen!==!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.listening&&(t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointermove",this.onPointerMove),t.addEventListener("pointerup",this.onPointerUp))}toCanvasCoords(t){let n=this.canvas.getBoundingClientRect();return{x:(t.clientX-n.left)*(this.canvas.width/n.width),y:(t.clientY-n.top)*(this.canvas.height/n.height)}}onPointerDown(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!0,this.clicks.push({x:n,y:r})}onPointerMove(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r}onPointerUp(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!1}hasClick(){return this.clicks.length>0}consumeClick(){return this.clicks.shift()??null}inject(t,n,r){this.x=n,this.y=r,t==="down"?(this.isDown=!0,this.clicks.push({x:n,y:r})):t==="up"&&(this.isDown=!1)}destroy(){this.listening&&(this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp))}},Yt=$e;function me(){return{now:()=>performance.now()}}function Be(e=0){let t=e;return{now:()=>t,set(n){t=n},advance(n){t+=n}}}var Jt=(e,t,n,r)=>({now:e,startTime:t,elapsedSinceStart:e-t,deltaSinceLastUpdate:n===null?0:e-n,deltaSinceLastRender:r===null?0:e-r}),Ue=class{constructor(t,n,r,i,o,a={}){this.startTime=0;this.lastUpdateAt=null;this.lastRenderAt=null;this.clockOffsetMs=0;this.pauseStartedAt=null;this.renderAnimation=this.renderAnimation.bind(this),this.dimensionContext=zt(t,n),this.R=r,this.gameManager=a.gameManager,this.hostChannel=a.hostChannel,this.clock=a.clock??me(),this.canvas=new fe(this.dimensionContext.width,this.dimensionContext.height,1,a.canvasMount),this.drawingContext=this.canvas.ctx,this.keyboardManager=new qt(!1,a.captureKeyboard??!0),this.pointerManager=new Yt(this.canvas.canvas,{listen:a.listenToPointer!==!1}),this.animationCart=o;let d=a.customState;this.featureState=o.getDefaultFeatureState?.(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.hostChannel),this.cartState=o.getDefaultState(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.featureState,this.hostChannel),this.startTime=this.clock.now(),this.canvas.clearAll()}captureFramebuffer(){let t=this.canvas.imageData,n=new ImageData(t.width,t.height);return n.data.set(t.data),n}restoreFramebuffer(t){let n=this.canvas.imageData;return n.width!==t.width||n.height!==t.height||n.data.length!==t.data.length?!1:(n.data.set(t.data),this.drawingContext.putImageData(n,0,0),!0)}setPaused(t){let n=this.clock.now();if(t){this.pauseStartedAt===null&&(this.pauseStartedAt=n);return}this.pauseStartedAt!==null&&(this.clockOffsetMs+=n-this.pauseStartedAt,this.pauseStartedAt=null)}resolveNow(t){let n=this.pauseStartedAt!==null?t-this.pauseStartedAt:0;return t-this.clockOffsetMs-n}getElapsedSinceStart(t=this.clock.now()){return Math.max(0,this.resolveNow(t)-this.startTime)}restoreClock(t,n){this.pauseStartedAt=null,this.lastUpdateAt=null,this.lastRenderAt=null;let r=Math.max(0,t);if(typeof n=="number"&&Number.isFinite(n)){this.startTime=n,this.clockOffsetMs=this.clock.now()-n-r;return}this.clockOffsetMs=0,this.startTime=this.clock.now()-r}getRandomState(){return this.R.getState()}injectKey(t){this.keyboardManager.inject(t)}injectPointer(t,n,r){this.pointerManager.inject(t,n,r)}async updateAnimationState(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=Jt(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.cartState=this.animationCart.update(this.R,t,n,this.dimensionContext,this.cartState,this.keyboardManager,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastUpdateAt=i}async renderAnimation(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=Jt(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.animationCart.render(this.R,t,n,this.dimensionContext,this.cartState,this.drawingContext,this.canvas.imageData,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastRenderAt=i}getCanvas(){return this.canvas.canvas}getDrawDetails(){return[this.canvas.canvas,0,0,this.dimensionContext.width,this.dimensionContext.height]}teardown(){try{this.animationCart.teardown?.(this.cartState,this.featureState)}catch(t){console.error("Error during cart teardown",t)}this.keyboardManager.destroy(),this.pointerManager.destroy()}};var je=class extends fe{constructor(t,n,r=1,i=!0,o={}){if(super(t,n,r,o),this.adopted)return;let a=o.container;if(a){this.canvas.parentNode!==a&&a.appendChild(this.canvas);return}if(i){let d=document.getElementById("canvas");d&&d!==this.canvas&&d.parentNode===document.body&&document.body.removeChild(d),document.body.appendChild(this.canvas)}}};function Xt(e){let t=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,8),16),r=parseInt(e.substring(16,8),16),i=parseInt(e.substring(24,8),16);return{next:()=>{t|=0,n|=0,r|=0,i|=0;let a=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+a|0,(a>>>0)/4294967296},getRegs:()=>({a:t,b:n,c:r,d:i}),setRegs:a=>{t=a.a,n=a.b,r=a.c,i=a.d}}}var Te=class{constructor(t){this.seed=t.hash,this.useA=!1,this.genA=Xt(t.hash.substring(2,32)),this.genB=Xt(t.hash.substring(34,32)),this.prngA=this.genA.next,this.prngB=this.genB.next;for(let n=0;n<1e6;n+=2)this.prngA(),this.prngB()}getState(){let t=this.genA.getRegs(),n=this.genB.getRegs();return{seed:this.seed,useA:this.useA,prngA:{a:t.a,b:t.b,c:t.c,d:t.d},prngB:{a:n.a,b:n.b,c:n.c,d:n.d}}}setState(t){if(t.seed!==this.seed)throw new Error(`Random.setState: seed ${t.seed} does not match ${this.seed}`);this.useA=t.useA,this.genA.setRegs(t.prngA),this.genB.setRegs(t.prngB)}r_zero_one(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}dec(t,n){return t===void 0?this.r_zero_one():n===void 0?t*this.r_zero_one():t+(n-t)*this.r_zero_one()}int(t,n){return n===void 0&&(n=t,t=0),Math.floor(this.dec(t,n))}bool(t=.5){return this.r_zero_one()<t}sign(){return this.bool()?1:-1}choose(t){return t[this.int(t.length)]}};var Zt="bafybeicjwcq5lxxtfnyj4p2ugcr7ctyb5wl62cbcechj6tsabdq5whcs7u",Qt="https://ipfs.io/ipfs/";function pr(e){return e.endsWith("/")?e:`${e}/`}var Ie=null;function fr(e){return[...Array(e)].map(()=>Math.floor(Math.random()*16).toString(16)).join("")}function mr(e){return e&&e.length>0?e:[{cid:Zt}]}function hr(e){return e.startsWith("0x")?e:`0x${e}`}var en=/^(0[xX])?[0-9a-fA-F]{64}$/;function yr(e){let t="",n=2166136261,r=522970236;for(let i=0;t.length<64;i++){for(let o=0;o<e.length;o++)n^=e.charCodeAt(o)+i,n=Math.imul(n,16777619),r^=e.charCodeAt(o)+i*17,r=Math.imul(r,16777619);t+=(n>>>0).toString(16).padStart(8,"0"),t+=(r>>>0).toString(16).padStart(8,"0")}return`0x${t.slice(0,64)}`}function ze(e){let t=typeof e=="number"?String(e):e;return en.test(t)?`0x${(t.startsWith("0x")||t.startsWith("0X")?t.slice(2):t).toLowerCase()}`:yr(t)}function We(e,t){if(typeof e=="number"||t==="deterministic")return ze(e);let n=String(e);return en.test(n)?ze(n):n.startsWith("0x")||n.startsWith("0X")?n:`0x${n}`}function gr(e){if(!e&&typeof tokenData<"u"&&tokenData?.hash)return{hash:tokenData.hash,tokenId:String(tokenData.tokenId),externalAssetDependencies:mr(tokenData.externalAssetDependencies),preferredIPFSGateway:pr(tokenData.preferredIPFSGateway||Qt),preferredArweaveGateway:tokenData.preferredArweaveGateway};let t=typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams;return{hash:e?hr(e):t.get("hash")||`0x${fr(64)}`,tokenId:"18009999",externalAssetDependencies:[{cid:Zt}],preferredIPFSGateway:Qt}}function ct(e){let t=e?.useCache!==!1;if(t&&Ie&&!e?.hash)return Ie;let n=gr(e?.hash);return t?Ie=n:Ie||(Ie=n),n}function tn(e){return new Array(32).fill(null).map((t,n)=>parseInt(e.hash.slice(2+n*2,4+n*2),16))}async function pt(){let e=await import("tone");if(typeof e.start=="function")return e;let t=e.default;return t&&typeof t.start=="function"?t:e}var on={id:"tone",async load(){await Promise.resolve().then(()=>(rn(),Er))},async unlock(){await on.load(),await(await pt()).start()},async resumeIfSuspended(){let e=await pt();e.context.state==="suspended"&&await e.context.resume()},async suspendIfRunning(){let t=(await pt()).context.rawContext;"suspend"in t&&t.state==="running"&&await t.suspend()}},an={tone:on};function ft(e){if(!e)return[];let t=Array.isArray(e)?e:[e],n=[];for(let r of t){if(!(r in an)){console.warn(`Unknown audio library "${r}"`);continue}let i=r;n.includes(i)||n.push(i)}return n}function mt(e){return e.map(t=>an[t])}var Ye="$cyberartTa",j=class extends Error{constructor(t){super(t),this.name="IncompatibleCartStateError"}},ht={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array};function Ar(e){for(let t of Object.keys(ht))if(e instanceof ht[t])return t}function dn(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function J(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function yt(e){return J(e)?typeof e[Ye]=="string"&&Array.isArray(e.d):!1}function Cr(e){return e==null?!1:typeof e=="function"?!0:!(typeof e!="object"||Array.isArray(e)||dn(e)||J(e))}var Sr=new Set(["audioContextStarted","midiSynths","keepRatioPrimed","audioInitStarted","musicSeekApplied"]);function sn(e){return e===null?"null":yt(e)?String(e[Ye]):Array.isArray(e)?"array":J(e)?"object":typeof e}function wr(e,t){return e===t||e==="null"||t==="null"}function re(e){return e.trim().toLowerCase().replace(/^0x/,"")}function un(e,t,n,r){if(!(!n&&!r)&&re(e)!==re(t))throw new j(`Generative cart state is for seed "${t}", but the live token is "${e}"`)}function he(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function cn(e,t){let n=e.dimensions;if(n&&he(n.width)&&he(n.height))return n;if(t&&he(t.width)&&he(t.height))return{width:t.width,height:t.height};if(J(e.state)){let r=e.state.containerWidth,i=e.state.containerHeight;if(he(r)&&he(i))return{width:r,height:i}}return null}function ye(e,t=new WeakSet){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:null;if(!(typeof e=="function"||typeof e>"u"||typeof e=="bigint"||typeof e=="symbol")){if(dn(e)){let n=Ar(e);return n?{[Ye]:n,d:Array.from(e)}:void 0}if(typeof e=="object"&&!t.has(e)){t.add(e);try{if(Array.isArray(e)){let i=[],o=0;for(let a of e){let d=ye(a,t);d!==void 0&&(i.push(d),o++)}return e.length>0&&o===0?void 0:i}if(!J(e)||Cr(e))return;let n=Object.keys(e),r={};for(let i of n){if(Sr.has(i))continue;let o=ye(e[i],t);o!==void 0&&(r[i]=o)}return n.length>0&&Object.keys(r).length===0?void 0:r}finally{t.delete(e)}}}}function De(e){if(yt(e)){let t=ht[e[Ye]];return t?new t(e.d.map(n=>Number(n))):e}if(Array.isArray(e))return e.map(t=>De(t));if(J(e)){let t={};for(let n of Object.keys(e))t[n]=De(e[n]);return t}return e}function gt(e,t,n,r,i=!0){if(i&&n&&r&&n!==r)throw new j(`Cart state is for "${r}", but the live cart is "${n}"`);if(!J(t)){if(i)throw new j("Cart state snapshot is empty");return}let o=Object.keys(t);if(o.length===0){if(i)throw new j("Cart state snapshot is empty");return}let a=ye(e);if(!J(a)||Object.keys(a).length===0){if(i)throw new j("Live cart has no serializable state");return}let d=o.filter(u=>u in a);if(d.length===0){if(i)throw new j("Cart state snapshot does not overlap the live cart shape");return}for(let u of d){let g=sn(a[u]),m=sn(t[u]);if(!wr(g,m))throw new j(`Cart state field "${u}" has type ${m}, live cart expects ${g}`);if(g==="object"){let y=t[u],C=e[u];J(y)&&!yt(y)&>(C,y,void 0,void 0,!1)}}}function ln(e,t){if(!J(e)||!J(t))return;let n=ye(e);if(J(n))for(let r of Object.keys(t))r in n&&(e[r]=De(t[r]))}function pn(e){let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object")throw new j("Cart state bundle is not an object");if(t.version!==1)throw new j(`Unsupported cart state version ${String(t.version)}`);if(typeof t.seed!="string"||typeof t.framesElapsed!="number")throw new j("Cart state bundle is missing seed or framesElapsed");return t}var _e="cyberart.asset.ready",Oe="cyberart.asset.failed";function ie(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function X(e){try{return JSON.stringify(e)}catch{return String(e)}}function bt(e,t,n){let r=t??[],i=n??[],o=Math.max(r.length,i.length);for(let a=0;a<o;a++)if(X(r[a])!==X(i[a]))return`${e}[${a}]: ${X(r[a])} vs ${X(i[a])}`}function fn(e,t){let n=[];e.seed!==t.seed&&n.push(`seed: ${e.seed} vs ${t.seed}`),e.clock.framesElapsed!==t.clock.framesElapsed&&n.push(`framesElapsed: ${e.clock.framesElapsed} vs ${t.clock.framesElapsed}`),e.clock.now!==t.clock.now&&n.push(`now: ${e.clock.now} vs ${t.clock.now}`),e.clock.frameRate!==t.clock.frameRate&&n.push(`frameRate: ${e.clock.frameRate} vs ${t.clock.frameRate}`),X(e.rng)!==X(t.rng)&&n.push(`rng: ${X(e.rng)} vs ${X(t.rng)}`);let r=bt("actions",e.actions,t.actions);r&&n.push(r);let i=bt("applied",e.applied,t.applied);i&&n.push(i);let o=bt("events",e.events,t.events);return o&&n.push(o),X(e.state)!==X(t.state)&&n.push(`state: ${X(e.state)} vs ${X(t.state)}`),n}function mn(e){return{type:e.status==="ready"?_e:Oe,kind:"state",payload:e.detail===void 0?{id:e.id}:{id:e.id,detail:e.detail}}}function Pr(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.startTime=="number"&&typeof t.lastSimulationUpdateAt=="number"?Math.max(0,t.lastSimulationUpdateAt-t.startTime):0}function kr(e,t){if(typeof window.resizeTo!="function")return!1;try{if(window.top!==window)return!1}catch{return!1}let n=Math.max(1,Math.round(e)),r=Math.max(1,Math.round(t)),i=Math.max(0,window.outerWidth-window.innerWidth),o=Math.max(0,window.outerHeight-window.innerHeight);try{window.resizeTo(n+i,r+o)}catch{return!1}return Math.abs(window.innerWidth-n)<=8&&Math.abs(window.innerHeight-r)<=8}var Rr=[[0,0],[16,9],[9,16],[4,3],[3,4],[2,1],[1,2],[3,1],[1,3],[1,1]],Et=Rr[0],Tr=Et[0]/Et[1],vt=30,Ir=120,Mr=3840/2160,Dr=2160/3840,Je=class{constructor(t=vt,n=!1,r=window.innerWidth,i=window.innerHeight,o=!0,a,d={}){this.framesElapsed=0;this.frameRate=vt;this._paused=!1;this.savedToken=!1;this.prepared=!1;this.loopRunning=!1;this.fallbackAudio=[];this.audioLibrariesInternal=[];this.virtualClock=null;this.scriptedActions=[];this.initialScriptedActions=[];this.appliedActions=[];this.consumedActionIndexes=new Set;this.outboundEvents=[];this.consecutiveErrorCount=0;this.lastErrorLogAt=0;this.reinitStayPaused=!1;this.reinitPending=!1;this.lastExportedFramebuffer=null;this.pinnedOutput=null;this.pinViewportAtImport=null;this.importing=!1;this.drawLoop=this.drawLoop.bind(this),this.loadCart=this.loadCart.bind(this),this.prepareCart=this.prepareCart.bind(this),this.beginPlayback=this.beginPlayback.bind(this),this.reinit=this.reinit.bind(this),this.tuneFramerate=this.tuneFramerate.bind(this),this.container=d.container,this.seed=d.seed,this.captureKeyboard=d.captureKeyboard??!0,this.customState=d.customState,this.hostChannel=d.hostChannel,this.fallbackAudio=ft(d.audio),this.audioLibrariesInternal=this.fallbackAudio;let u=d.deterministic;this.deterministic=!!u;let g=u&&typeof u=="object"?u:{};if(this.deterministic){if(d.clock){let m=d.clock;if(typeof m.advance!="function")throw new Error("deterministic mode requires a virtual clock with advance()");this.virtualClock=m,this.clock=m}else this.virtualClock=Be(g.origin??0),this.clock=this.virtualClock;this.initialScriptedActions=ie(g.actions??[]),this.scriptedActions=ie(this.initialScriptedActions)}else this.clock=d.clock??me();this.isBodyCanvas=this.container?!1:o,this.autoMode=n,this.aspectRatio=Tr,this.selectedAsp=Et,this.isFullscreen=!!document.fullscreenElement,this.updateFrameRate(t),this.tempUnpause=!1,this.synchronous=pe,this.containerWidth=r,this.containerHeight=i,this.gameManager=a,this.init(!0)}setGameManager(t){this.gameManager=t}reinit(t){if(!this.importing){if(this.shouldKeepPinnedOutput()){this.fitPinnedCanvas();return}this.reinitPending||(this.reinitStayPaused=this._paused,this.reinitPending=!0),this.paused=!0,clearTimeout(this.reinitTimeout),this.reinitTimeout=setTimeout(()=>{if(this.importing){this.paused=this.reinitStayPaused,this.reinitPending=!1;return}this.updateInProgress?this.reinit(t):(this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.clearPinnedOutput(),this.init(),this.reloadCart(),this.paused=this.reinitStayPaused,this.reinitPending=!1)},150)}}initSeed(){this.tokenData=this.seed?ct({hash:this.seed,useCache:!1}):ct(),this.rawParams=tn(this.tokenData),this.mintNo=parseInt(this.tokenData.tokenId)%1e6,console.log("token",this.mintNo,this.tokenData.hash)}init(t=!1){t&&this.initSeed(),this.pureAspectUpdate(this.selectedAsp);let n=this.aspectRatio,[r,i]=Wt(n,this.containerWidth,this.containerHeight);r*=z,i*=z,this.width=~~r,this.height=~~i,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.mainCanvas?this.mainCanvas.setSize(this.width,this.height):this.mainCanvas=new je(this.width,this.height,1,this.isBodyCanvas,this.canvasMountOptions())}loadCart(t){this.prepareCart(t)&&this.beginPlayback()}prepareCart(t){if(this.prepared)return!0;try{let n=~~(this.width/1),r=~~(this.height/this.width*n),i=new Te(this.tokenData),o=new Ue(n,r,i,this.rawParams,t,{gameManager:this.gameManager,canvasMount:this.canvasMountOptions(),customState:this.customState,captureKeyboard:this.deterministic?!1:this.captureKeyboard,hostChannel:this.hostChannel,clock:this.clock,listenToPointer:!this.deterministic});return this.animation=o,this.animationCart=t,this.paused=!1,this.framesElapsed=0,this.outboundEvents=[],this.scriptedActions=ie(this.initialScriptedActions),this.appliedActions=[],this.consumedActionIndexes=new Set,this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.deterministic&&this.hostChannel&&(this.outboundUnsubscribe=this.hostChannel.onEvent(a=>{this.outboundEvents.push(a)})),this.R=i,this.applyCartFrameRate(t,o),this.resolveAudioLibraries(t),this.prepared=!0,!0}catch(n){return console.error(n),!1}}applyCartFrameRate(t,n){let r=t.metadata,i=r?.frameRate??vt,o=n.cartState?.visualMode??n.featureState?.visualMode,a=o&&r?.frameRateByVisualMode?r.frameRateByVisualMode[o]:void 0;this.updateFrameRate(typeof a=="number"&&a>0?a:i)}get audioLibraries(){return this.audioLibrariesInternal}get needsAudio(){return this.audioLibrariesInternal.length>0}resolveAudioLibraries(t){this.audioLibrariesInternal=ft(t.metadata?.audio)}async unlockAudio(){if(this.audioLibrariesInternal.length===0)return;let t=mt(this.audioLibrariesInternal);if(pe){for(let n of t)await n.load();return}for(let n of t)await n.unlock()}async resumeAudioLibraries(){if(!(this.paused||pe))for(let t of mt(this.audioLibrariesInternal))try{await t.resumeIfSuspended()}catch(n){console.error(`Failed to resume audio library "${t.id}" after reload`,n)}}beginPlayback(){!this.prepared||this.loopRunning||(this.prepared=!1,this.loopRunning=!0,this.consecutiveErrorCount=0,!this.deterministic&&(this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)))}get isPrepared(){return this.prepared}get isLoopRunning(){return this.loopRunning}get isDeterministic(){return this.deterministic}getClock(){return{now:this.clock.now(),framesElapsed:this.framesElapsed,frameRate:this.frameRate}}getRandomState(){return this.requirePreparedAnimation().getRandomState()}schedule(t){this.scriptedActions.push(ie(t))}async getReplayMetadata(){let t=await this.exportState();return{seed:this.tokenData.hash,clock:this.getClock(),rng:this.getRandomState(),actions:ie(this.scriptedActions),applied:ie(this.appliedActions),events:ie(this.outboundEvents),state:t.state}}async step(t=1){if(!this.deterministic)throw new Error("step() requires createRuntime({ deterministic: true })");this.requirePreparedAnimation(),this.prepared&&!this.loopRunning&&this.beginPlayback(),this.paused=!1;let n=Math.max(0,Math.floor(t));for(let r=0;r<n&&this.animation;r++){let i=this.framesElapsed;if(this.applyScheduledActions(i),await this.processFrame(this.clock.now(),{ignorePause:!0,scheduleNext:!1}),this.framesElapsed===i||(this.virtualClock?.advance(this.targetDrawTime),!this.loopRunning))break}}async advance(t){let n=Math.max(0,Math.round(t/this.targetDrawTime));await this.step(n)}applyScheduledActions(t){let n=this.animation;n&&this.scriptedActions.forEach((r,i)=>{r.atFrame===t&&(this.consumedActionIndexes.has(i)||(this.consumedActionIndexes.add(i),r.type==="pointer"?n.injectPointer(r.pointer.kind,r.pointer.x,r.pointer.y):r.type==="key"?n.injectKey(r.key):r.type==="event"?this.hostChannel?.dispatch(r.event):r.type==="asset"&&this.hostChannel?.dispatch(mn(r)),this.appliedActions.push({frame:t,action:r})))})}get paused(){return this._paused}set paused(t){this._paused!==t&&(this._paused=t,this.animation?.setPaused(t))}async waitUntilUpdateIdle(){for(;this.updateInProgress;)await new Promise(t=>{this.deterministic?queueMicrotask(t):typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,0)})}requirePreparedAnimation(){if(!this.animation)throw new Error("No prepared cart");return this.animation}async exportState(){let t=this.requirePreparedAnimation(),n=this._paused;this.paused=!0,await this.waitUntilUpdateIdle();try{this.lastExportedFramebuffer=t.captureFramebuffer();let r=t.getCanvas();return{version:1,cartId:this.animationCart?.metadata?.id,generative:this.animationCart?.metadata?.generative,seed:this.tokenData.hash,framesElapsed:this.framesElapsed,elapsedSinceStart:t.getElapsedSinceStart(),dimensions:{width:r.width,height:r.height,cssWidth:this.containerWidth,cssHeight:this.containerHeight,dpr:z},state:ye(t.cartState)}}finally{this.paused=n}}async exportStateJSON(){return JSON.stringify(await this.exportState())}peekExportedFramebuffer(){return this.lastExportedFramebuffer}peekSeed(){return this.tokenData?.hash}isGenerative(){return this.animationCart?.metadata?.generative===!0}async importState(t,n){let r=this.requirePreparedAnimation(),i=pn(t),o=this._paused,a=this.loopRunning;this.paused=!0,await this.waitUntilUpdateIdle(),gt(r.cartState,i.state,this.animationCart?.metadata?.id,i.cartId),un(this.tokenData.hash,i.seed,this.animationCart?.metadata?.generative,i.generative),clearTimeout(this.reinitTimeout),this.reinitPending=!1,this.importing=!0;let d=cn(i,n?.framebuffer??this.lastExportedFramebuffer);if(d){this.pinOutputSize(d);let m=d.cssWidth??d.width/z,y=d.cssHeight??d.height/z;kr(m,y),this.syncContainerFromDom(),this.pinViewportAtImport={w:this.containerWidth,h:this.containerHeight}}let u=this.customState,g=!1;try{if(this.customState=De(i.state),this.unloadCart(),!this.prepareCart(this.animationCart))throw new Error("Failed to prepare cart while loading state");this.animation.cartState!==this.customState&&ln(this.animation.cartState,i.state),this.framesElapsed=i.framesElapsed;let m=this.animation,y=m.cartState,C=typeof i.elapsedSinceStart=="number"?i.elapsedSinceStart:Pr(y);m.restoreClock(C,typeof y?.startTime=="number"?y.startTime:void 0),o&&m.setPaused(!0);let E=n?.framebuffer??this.lastExportedFramebuffer;E&&m.restoreFramebuffer(E)?y.keepRatioPrimed=!0:await m.renderAnimation(this.framesElapsed,this.rawParams),this.fitPinnedCanvas(),g=!0}catch(m){throw this.clearPinnedOutput(),this.customState=u,this.paused=o,this.animationCart&&(this.syncContainerFromDom(),this.init(),this.reloadCart()),m}finally{this.importing=!1,g&&(this.customState=u,this.paused=o,a&&this.beginPlayback())}}unloadCart(){this.loopRunning=!1,this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.drawLoopTimeout&&clearTimeout(this.drawLoopTimeout),this.animation?.teardown(),this.animation=void 0,this.prepared=!1,this.audioLibrariesInternal=this.fallbackAudio,this.mainCanvas?.clearAll()}reloadCart(t=!1){let n=this.animationCart;if(!n)return;this.pinnedOutput&&(this.clearPinnedOutput(),this.syncContainerFromDom(),this.init());let r=this.reinitPending?this.reinitStayPaused:this._paused;this.unloadCart(),t&&this.initSeed(),this.loadCart(n),this.paused=r,!this.paused&&!pe&&this.resumeAudioLibraries()}getFrameRate(){return this.frameRate}updateFrameRate(t){if(this.frameRate=t,t>=1)this.targetDrawTime=1e3/t;else{let r=1/(2-t);this.targetDrawTime=1e3/r}this.drawTime=this.targetDrawTime}canvasMountOptions(){return{container:this.container,adoptFromDocument:!this.container}}syncContainerFromDom(){if(this.container){this.containerWidth=this.container.clientWidth||this.containerWidth,this.containerHeight=this.container.clientHeight||this.containerHeight;return}this.containerWidth=window.innerWidth,this.containerHeight=window.innerHeight}pinOutputSize(t){this.pinnedOutput=t,this.width=~~t.width,this.height=~~t.height,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.aspectRatio=this.width/this.height,this.mainCanvas&&this.mainCanvas.setSize(this.width,this.height)}shouldKeepPinnedOutput(){return this.pinnedOutput?(this.syncContainerFromDom(),this.viewportMatches(this.pinnedCssSize())?!0:!!(this.pinViewportAtImport&&this.viewportMatches(this.pinViewportAtImport))):!1}pinnedCssSize(){let t=this.pinnedOutput;return{w:t.cssWidth??t.width/z,h:t.cssHeight??t.height/z}}viewportMatches(t){return Math.abs(this.containerWidth-t.w)<8&&Math.abs(this.containerHeight-t.h)<8}fitPinnedCanvas(){let t=this.pinnedOutput,n=this.canvas;if(!t||!n)return;this.container&&!this.container.style.position&&(this.container.style.position="relative");let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=t.width/z,a=t.height/z;if(o<1||a<1||r<1||i<1)return;let d=Math.min(r/o,i/a),u=o*d,g=a*d;n.style.position="absolute",n.style.left="50%",n.style.top="50%",n.style.transform="translate(-50%, -50%)",n.style.margin="0",n.style.width=`${u}px`,n.style.height=`${g}px`,n.style.imageRendering=Math.abs(d-1)<.01?"auto":"pixelated"}clearPinnedOutput(){let t=this.canvas;this.pinnedOutput=null,this.pinViewportAtImport=null,t&&(t.style.position="",t.style.left="",t.style.top="",t.style.transform="",t.style.imageRendering="",t.style.width="",t.style.height="",t.style.margin="auto")}get canvas(){return this.animation?.getCanvas()??this.mainCanvas?.canvas}destroy(){this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.clearPinnedOutput(),this.unloadCart(),clearTimeout(this.reinitTimeout),this.mainCanvas&&!this.mainCanvas.adopted&&this.mainCanvas.canvas.remove()}drawIt(){}tuneFramerate(t){let n=this.lastCall||t;this.lastCall=t,this.drawTime=Math.max(0,this.drawTime+this.targetDrawTime-this.lastCall+n)}async processFrame(t,n={}){let r=n.ignorePause===!0,i=n.scheduleNext!==!1;if(!this.loopRunning&&!r)return;let o=!1,a,d="update";try{if(r||!this.paused||this.tempUnpause){if(!pe&&!r&&this.tuneFramerate(t),!this.animation)return;if(d="update",this.updateInProgress=!0,await this.animation.updateAnimationState(this.framesElapsed,this.rawParams,t),this.updateInProgress=!1,d="render",await this.animation.renderAnimation(this.framesElapsed,this.rawParams,t),this.autoMode&&this.animation.cartState.saveToken&&!this.savedToken&&!new URLSearchParams(window.location.search).get("hash")){let m=localStorage.getItem("goodones"),y=JSON.stringify(m?[...JSON.parse(m),this.tokenData.hash]:[this.tokenData.hash]);localStorage.setItem("goodones",y),this.savedToken=!0,localStorage.setItem(this.tokenData.hash,this.mainCanvas.canvas.toDataURL("image/png")),window.location.reload(),this.loopRunning=!1;return}this.framesElapsed++,this.tempUnpause&&(this.tempUnpause=!1)}d="draw",this.drawIt()}catch(u){o=!0,a=u,this.handleFrameError(u,d)}finally{this.updateInProgress=!1}o?(this.consecutiveErrorCount++,this.consecutiveErrorCount>=Ir&&(this.loopRunning=!1,this.onError?.(a,{phase:d,consecutive:this.consecutiveErrorCount,stopped:!0}))):this.consecutiveErrorCount=0,!(!this.loopRunning||!i)&&(this.drawLoopTimeout=setTimeout(()=>{this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)},this.drawTime))}async drawLoop(t){await this.processFrame(t,{scheduleNext:!0})}handleFrameError(t,n){let r=performance.now();r-this.lastErrorLogAt>=1e3&&(this.lastErrorLogAt=r,console.error(`Animation ${n} error:`,t)),this.consecutiveErrorCount===0&&this.onError?.(t,{phase:n,consecutive:1,stopped:!1})}pureAspectUpdate(t){if(t[0]===0&&t[1]===0){let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=r/i;this.aspectRatio=Math.min(Mr,Math.max(Dr,o))}else this.aspectRatio=t[0]/t[1]}};var _r="HostChannel has been destroyed",ge=class{constructor(){this.inbound=[];this.listeners=[];this.closed=!1}dispatch(t){this.requireOpen(),this.inbound.push(t),this.inbound.length>32&&this.inbound.splice(0,this.inbound.length-32)}consume(){if(this.requireOpen(),this.inbound.length===0)return[];let t=this.inbound;return this.inbound=[],t}emit(t){this.requireOpen();for(let n of this.listeners)n(t)}onEvent(t){return this.requireOpen(),this.listeners.push(t),()=>{this.listeners=this.listeners.filter(n=>n!==t)}}clearInbound(){this.requireOpen(),this.inbound=[]}clear(){this.inbound=[],this.listeners=[]}close(){this.closed=!0,this.clear()}requireOpen(){if(this.closed)throw new Error(_r)}};var vn=["image","audio","font","spritesheet"],En=["timeout","cors","not-found","invalid","aborted","resolver"],be="cyberart:fallback/silent",hn="Asset preloader has been destroyed",Or=4,Fr=new Set(vn),Nr=new Set(En),Lr={timeout:"asset load timed out",cors:"CORS blocked this asset","not-found":"asset was not found",invalid:"asset declaration or resource is invalid",aborted:"asset load was aborted",resolver:"asset resolver failed"};function An(e){return typeof e=="string"&&Fr.has(e)}function Cn(e){return typeof e=="string"&&Nr.has(e)}function Xe(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.id=="string"&&typeof t.ref=="string"&&Cn(t.code)&&typeof t.message=="string"}function H(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message&&e.message.length>0?e.message:Lr[e.code]}}function ce(e,t){return{type:e==="ready"?_e:Oe,kind:"state",payload:t}}function Sn(e){if(!e?.aborted)return;let t=new Error("aborted");throw t.name="AbortError",t}function Vr(e){return e instanceof Error&&e.name==="AbortError"||typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function At(e){return e?{...e}:void 0}function te(e){let t={id:e.id,ref:e.ref,type:e.type,url:e.url};return e.integrity!==void 0&&(t.integrity=e.integrity),e.provenance&&(t.provenance=At(e.provenance)),e.cors!==void 0&&(t.cors=e.cors),e.usedFallback&&(t.usedFallback=!0),e.managed&&(t.managed=!0),t}function Fe(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message}}function Hr(e){if(e.state==="ready"){let t={state:"ready",resource:te(e.resource)};return e.failure&&(t.failure=Fe(e.failure)),t}return e.state==="failed"?{state:"failed",failure:Fe(e.failure)}:{state:e.state}}function Kr(e){return/^https?:/i.test(e)}function wn(e){return e.endsWith("/")?e:`${e}/`}function xn(e,t){let n=wn(t);if(/^(https?:|data:|blob:)/i.test(e))return e;let r=/^moltazine:post\/([^#]+)#(.+)$/.exec(e);if(r)return`${n}moltazine/${encodeURIComponent(r[1])}/${r[2]}`;let i=/^world:asset\/(.+)$/.exec(e);if(i)return`${n}world/${i[1]}`;let o=/^library:(.+)$/.exec(e);return o?`${n}library/${o[1]}`:`${n}${e.replace(/^\//,"")}`}function Gr(e){return{async resolve(t,n){Sn(n);let r=e[t.ref];if(!r)throw H({id:t.id,ref:t.ref,code:"not-found",message:`no fixture for ${t.ref}`});if("error"in r)throw H({id:t.id,ref:t.ref,code:r.error,message:r.message});return{id:t.id,ref:t.ref,type:t.type,url:r.url,integrity:r.integrity??t.integrity,cors:r.cors??"omit",provenance:r.provenance??t.provenance}}}}function $r(e){let t=wn(e.cdnBase);return{async resolve(n,r){Sn(r);let i=e.failures?.[n.ref];if(i){let a=typeof i=="string"?i:i.code,d=typeof i=="string"?void 0:i.message;throw H({id:n.id,ref:n.ref,code:a,message:d})}let o=xn(n.ref,t);return{id:n.id,ref:n.ref,type:n.type,url:o,integrity:n.integrity,cors:Kr(o)?"anonymous":"omit",provenance:n.provenance}}}}function Br(e){if(!e||typeof e!="object")return H({id:"",ref:"",code:"invalid",message:"declaration is required"});if(typeof e.id!="string"||e.id.length===0)return H({id:typeof e.id=="string"?e.id:"",ref:typeof e.ref=="string"?e.ref:"",code:"invalid",message:"id is required"});if(typeof e.ref!="string"||e.ref.length===0)return H({id:e.id,ref:"",code:"invalid",message:"ref is required"});if(!An(e.type))return H({id:e.id,ref:e.ref,code:"invalid",message:`unsupported type ${String(e.type)}`});if(e.integrity!==void 0&&typeof e.integrity!="string")return H({id:e.id,ref:e.ref,code:"invalid",message:"integrity must be a string"});if(e.timeoutMs!==void 0&&(typeof e.timeoutMs!="number"||!Number.isFinite(e.timeoutMs)||e.timeoutMs<0))return H({id:e.id,ref:e.ref,code:"invalid",message:"timeoutMs must be a non-negative finite number"})}function yn(e){return{id:e.id,ref:be,type:e.type,url:be,usedFallback:!0,cors:"omit"}}function gn(e,t){return Xe(t)?{id:e.id,ref:e.ref,code:t.code,message:t.message}:Vr(t)?H({id:e.id,ref:e.ref,code:"aborted"}):H({id:e.id,ref:e.ref,code:"resolver",message:t instanceof Error?t.message:String(t)})}function bn(e,t){if(!t||typeof t.url!="string"||t.url.length===0)throw H({id:e.id,ref:e.ref,code:"invalid",message:"resolver returned no url"});if(t.integrity&&e.integrity&&t.integrity!==e.integrity)throw H({id:e.id,ref:e.ref,code:"invalid",message:"integrity mismatch"});let n=te(t);return n.id=e.id,n.ref=t.ref||e.ref,n.type=e.type,!n.integrity&&e.integrity&&(n.integrity=e.integrity),!n.provenance&&e.provenance&&(n.provenance=At(e.provenance)),n}function Ct(e){if(typeof e?.resolver?.resolve!="function")throw new Error("createAssetPreloader: resolver is required");let t=e.emitEvents!==!1,n=e.wallClockTimeout!==!1,r=new Map,i=[],o=new Map,a=new Map,d=new Map,u=new Map,g=new Map,m=new Set,y=!1;function C(s){return s.code==="aborted"||s.code==="timeout"}function E(s,v,A){let R=gn(s,A);return R.code==="timeout"?R:v.aborted?H({id:s.id,ref:s.ref,code:"aborted"}):R}function N(s,v){let A=g.get(s);A||(A=new Set,g.set(s,A)),A.add(v)}function f(s){if(s?.state==="ready")return`${s.resource.type}\0${s.resource.ref}`}function l(s,v){for(let[A,R]of g)if(A!==v&&R.has(s))return!0;for(let[A,R]of r)if(A!==v&&f(R)===s)return!0;return!1}function P(s,v){let A=new Set(g.get(s)),R=f(v);R&&A.add(R),g.delete(s);for(let $ of A)l($,s)||d.delete($)}function T(){let s=0,v=0,A=0,R=0,$={};for(let[O,M]of r)$[O]=Hr(M),M.state==="pending"||M.state==="loading"?s+=1:M.state==="failed"?A+=1:(v+=1,(M.resource.usedFallback||M.failure)&&(R+=1));return{total:r.size,pending:s,ready:v,failed:A,fallbacks:R,items:$,failures:i.map(Fe)}}function W(){if(m.size===0)return;let s=T();for(let v of m)v(s)}function L(s){i.push(Fe(s))}function p(s){y||!t||!e.dispatch||e.dispatch(s)}function I(s){if(s?.managed&&s.url.startsWith("blob:")&&!(typeof URL>"u"||typeof URL.revokeObjectURL!="function"))try{URL.revokeObjectURL(s.url)}catch{}}function S(s,v){if(y)return;let A=r.get(s);A?.state==="ready"&&I(A.resource),r.set(s,v),W()}function _(s){if(s.fallback!==void 0)return s.fallback==="silent"?{id:`${s.id}::fallback`,ref:be,type:s.type}:typeof s.fallback=="string"?{id:`${s.id}::fallback`,ref:s.fallback,type:s.type}:{...s.fallback,id:typeof s.fallback.id=="string"&&s.fallback.id.length>0?s.fallback.id:`${s.id}::fallback`}}function F(s,v,A){let R=`${s.type}\0${s.ref}`,$=d.get(R);if($)return v.aborted?Promise.reject(H({id:s.id,ref:s.ref,code:"aborted"})):(N(A,R),Promise.resolve(te($.resource)));if(v.aborted)return Promise.reject(H({id:s.id,ref:s.ref,code:"aborted"}));let O=u.get(R);if(!O){let k=new AbortController,V={id:s.id,ref:s.ref,type:s.type};s.integrity!==void 0&&(V.integrity=s.integrity),s.provenance&&(V.provenance=At(s.provenance)),O={promise:Promise.resolve().then(()=>e.resolver.resolve(V,k.signal)).then(K=>{let ee=bn(s,K);if(k.signal.aborted)throw H({id:s.id,ref:s.ref,code:"aborted"});return d.set(R,{resource:te(ee)}),ee}).catch(K=>{throw gn(s,K)}).finally(()=>{u.delete(R)}),controller:k,waiters:0},u.set(R,O)}let M=O;return M.waiters+=1,new Promise((k,V)=>{let Z=!1,K=(ne,ut)=>{Z||(Z=!0,v.removeEventListener("abort",ee),M.waiters-=1,ut&&M.waiters<=0&&M.controller.abort(),ne())},ee=()=>{K(()=>V(H({id:s.id,ref:s.ref,code:"aborted"})),!0)};if(v.aborted){ee();return}v.addEventListener("abort",ee,{once:!0}),M.promise.then(ne=>{if(!Z){if(v.aborted){ee();return}N(A,R),K(()=>k(te(ne)),!1)}},ne=>{if(!Z){if(v.aborted){ee();return}K(()=>V(ne),!1)}})})}function U(s,v,A){if(v.aborted)return Promise.reject(H({id:s.id,ref:s.ref,code:"aborted"}));if(s.ref===be)return Promise.resolve(yn(s));let R=new AbortController,$=()=>R.abort();v.addEventListener("abort",$,{once:!0});let O=s.timeoutMs??e.timeoutMs,M,k=!1;return n&&O!==void 0&&O>0&&Number.isFinite(O)&&(M=setTimeout(()=>{k=!0,R.abort()},O)),F(s,R.signal,A).then(V=>{let Z=bn(s,V);return Z.id=s.id,Z}).catch(V=>{throw k?H({id:s.id,ref:s.ref,code:"timeout"}):V}).finally(()=>{M!==void 0&&clearTimeout(M),v.removeEventListener("abort",$)})}async function q(s,v,A,R){try{return{resource:await U(s,v,R)}}catch($){let O=E(s,v,$);if(C(O)||v.aborted||A>=Or)throw O;let M=_(s);if(!M)throw O;if(v.aborted)throw H({id:s.id,ref:s.ref,code:"aborted"});if(s.fallback==="silent"||M.ref===be)return{resource:yn(s),failure:O};try{let k=await q(M,v,A+1,R);return{resource:{...te(k.resource),id:s.id,usedFallback:!0},failure:O}}catch(k){let V=Xe(k)&&!C(k)&&!v.aborted?k:E(s,v,k);throw!C(V)&&!v.aborted&&L(O),V}}}async function ue(s,v){if(y)throw new Error(hn);let A=r.get(s.id);if(A?.state==="ready"||A?.state==="failed")return;let R=o.get(s.id);if(R){await R;return}let $=(async()=>{let O=Br(s);if(O){S(s.id,{state:"failed",failure:O}),L(O),p(ce("failed",{id:s.id,ref:s.ref,failure:O}));return}S(s.id,{state:"loading"});let M=a.get(s.id)??new AbortController;a.has(s.id)||a.set(s.id,M);try{let k=await q(s,M.signal,v,s.id);if(y)return;if(M.signal.aborted){let V=H({id:s.id,ref:s.ref,code:"aborted"});S(s.id,{state:"failed",failure:V}),L(V),p(ce("failed",{id:s.id,ref:s.ref,failure:V}));return}if(k.resource.id=s.id,k.failure){S(s.id,{state:"ready",resource:k.resource,failure:k.failure}),L(k.failure),p(ce("failed",{id:s.id,ref:s.ref,failure:k.failure,resource:te(k.resource)})),p(ce("ready",{id:s.id,ref:k.resource.ref,resource:te(k.resource),failure:k.failure}));return}S(s.id,{state:"ready",resource:k.resource}),p(ce("ready",{id:s.id,ref:s.ref,resource:te(k.resource)}))}catch(k){if(y)return;let V=Xe(k)&&!C(k)&&!M.signal.aborted?{...Fe(k),id:s.id}:E(s,M.signal,k);S(s.id,{state:"failed",failure:V}),L(V),p(ce("failed",{id:s.id,ref:s.ref,failure:V}))}finally{a.get(s.id)===M&&a.delete(s.id)}})();o.set(s.id,$);try{await $}finally{o.delete(s.id)}}return{async preload(s){if(y)throw new Error(hn);let v=Array.isArray(s)?s:[];for(let A of v)A&&typeof A.id=="string"&&A.id.length>0&&(r.has(A.id)||r.set(A.id,{state:"pending"}),a.has(A.id)||a.set(A.id,new AbortController));return W(),await Promise.all(v.map(A=>ue(A,0))),T()},get(s){let v=r.get(s);if(v?.state==="ready")return te(v.resource)},getProgress(){return T()},onProgress(s){return m.add(s),()=>{m.delete(s)}},abort(s){if(!y){if(s!==void 0){a.get(s)?.abort();return}for(let v of a.values())v.abort()}},forget(s){if(y)return;if(s===void 0){for(let A of r.values())A.state==="ready"&&I(A.resource);r.clear(),i.length=0,d.clear(),g.clear(),W();return}let v=r.get(s);v?.state==="ready"&&I(v.resource),P(s,v),r.delete(s);for(let A=i.length-1;A>=0;A--)i[A].id===s&&i.splice(A,1);W()},dispose(){if(!y){y=!0;for(let s of a.values())s.abort();a.clear();for(let s of r.values())s.state==="ready"&&I(s.resource);r.clear(),i.length=0,o.clear();for(let s of u.values())s.controller.abort();d.clear(),u.clear(),g.clear(),m.clear()}}}}function St(e){Ut();let{container:t,seed:n,captureKeyboard:r=!1,audio:i,deterministic:o,assets:a}=e,d=n===void 0?void 0:We(n,o?"deterministic":"live"),u=new ge;if(a&&typeof a.resolver?.resolve!="function")throw new Error("createRuntime: assets.resolver is required");let g=a?Ct({resolver:a.resolver,timeoutMs:a.timeoutMs,emitEvents:a.emitEvents??!o,wallClockTimeout:!o,dispatch:L=>u.dispatch(L)}):void 0,m=!1,y=null,C,E=!1,N=t.clientWidth||window.innerWidth,f=t.clientHeight||window.innerHeight,l=new Je(30,!1,N,f,!1,void 0,{container:t,seed:d,captureKeyboard:r,hostChannel:u,audio:i,deterministic:o}),P=()=>{let L=t.clientWidth||window.innerWidth,p=t.clientHeight||window.innerHeight;return L===l.containerWidth&&p===l.containerHeight?!1:(l.containerWidth=L,l.containerHeight=p,!0)},T=null;return!l.isDeterministic&&typeof ResizeObserver<"u"&&(T=new ResizeObserver(()=>{if(m||!y)return;P()&&E&&l.reinit()}),T.observe(t)),l.onError=(L,p)=>{C?.(L,p)},{get tokenData(){return l.tokenData},get hostChannel(){return u},get assets(){return g},get onError(){return C},set onError(L){C=L},mount(L,p={}){if(m)throw new Error("createRuntime: cannot mount on a destroyed runtime");y?.destroy(),E=!1,l.customState=p.initialState,l.setGameManager(p.gameManager);let I=p.onEvent?u.onEvent(p.onEvent):()=>{};if(!l.prepareCart(L))throw I(),new Error("createRuntime: failed to prepare cart");let S=!1,_={async start(){if(!S){if(P()&&l.isPrepared&&(l.init(),l.unloadCart(),!l.prepareCart(L)))throw new Error("createRuntime: failed to prepare cart");l.needsAudio&&(await l.unlockAudio(),S)||(E=!0,l.beginPlayback())}},pause(){S||(l.paused=!0)},resume(){S||(l.paused=!1)},dispatch(F){S||u.dispatch(F)},snapshot(){if(S)return{seed:"",pngDataUrl:""};let F=l.canvas;return{seed:l.tokenData.hash,metadata:L.metadata,pngDataUrl:F?F.toDataURL("image/png"):""}},destroy(){S||(S=!0,E=!1,I(),u.clearInbound(),l.unloadCart(),y===_&&(y=null))},reload(){if(!S){if(!E){if(l.isPrepared&&(l.unloadCart(),!l.prepareCart(L)))throw new Error("createRuntime: failed to prepare cart");return}l.reloadCart()}},reinit(F){if(!S){if(!E){P();return}l.reinit(F)}},getCartState(){return l.animation?.cartState},exportState(){return S?Promise.reject(new Error("Cart handle has been destroyed")):l.exportState()},exportStateJSON(){return S?Promise.reject(new Error("Cart handle has been destroyed")):l.exportStateJSON()},async importState(F,U){if(S)throw new Error("Cart handle has been destroyed");await l.importState(F,U)},peekExportedFramebuffer(){return S?null:l.peekExportedFramebuffer()},peekSeed(){if(!S)return l.peekSeed()},isGenerative(){return S?!1:l.isGenerative()},async step(F=1){if(S)throw new Error("Cart handle has been destroyed");await l.step(F)},async advance(F){if(S)throw new Error("Cart handle has been destroyed");await l.advance(F)},schedule(F){S||l.schedule(F)},getClock(){if(S)throw new Error("Cart handle has been destroyed");return l.getClock()},getRandomState(){if(S)throw new Error("Cart handle has been destroyed");return l.getRandomState()},getReplayMetadata(){return S?Promise.reject(new Error("Cart handle has been destroyed")):l.getReplayMetadata()},get canvas(){return l.canvas},get paused(){return l.paused},set paused(F){S||(l.paused=F)},get tokenData(){return l.tokenData},get isPrepared(){return l.isPrepared},get isLoopRunning(){return l.isLoopRunning},get needsAudio(){return l.needsAudio},get audioLibraries(){return l.audioLibraries}};return y=_,_},async unlockAudio(){await l.unlockAudio()},destroy(){m||(m=!0,y?.destroy(),y=null,T?.disconnect(),T=null,g?.dispose(),u.close(),l.destroy())}}}var ve="cyberart.state.save",Ee="cyberart.state.load";function Ur(e,t,n={}){let r=n.persist,i=r?{persist:r}:void 0,o=()=>{t.emit({type:ve,payload:i})},a=()=>{t.emit({type:Ee,payload:i})};e.registerAction("w",o,!0),e.registerAction("W",o,!0),e.registerAction("e",a,!0),e.registerAction("E",a,!0)}function Pn(e){if(e.type!==ve&&e.type!==Ee)return;let t=e.payload?.persist;return t==="localStorage"?t:void 0}var jr="cyberart-io",zr=1,oe="framebuffers";function wt(e,t){return`${e||"unknown"}:${t?re(t):"none"}`}function Rn(e,t){return`${e||"unknown"}:${t||"none"}`}function xt(){return new Promise((e,t)=>{let n=indexedDB.open(jr,zr);n.onupgradeneeded=()=>{let r=n.result;r.objectStoreNames.contains(oe)||r.createObjectStore(oe)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error??new Error("indexedDB open failed"))})}function Wr(e){let t=e.data;return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}function kn(e,t){return new Promise((n,r)=>{let o=e.transaction(oe,"readonly").objectStore(oe).get(t);o.onsuccess=()=>n(o.result),o.onerror=()=>r(o.error??new Error("indexedDB read failed"))})}async function Tn(e,t,n){if(typeof indexedDB>"u")return;let r=await xt(),i={width:n.width,height:n.height,data:Wr(n)};try{await new Promise((o,a)=>{let d=r.transaction(oe,"readwrite");d.oncomplete=()=>o(),d.onerror=()=>a(d.error??new Error("indexedDB write failed")),d.objectStore(oe).put(i,wt(e,t))})}finally{r.close()}}async function In(e,t){if(typeof indexedDB>"u")return null;let n=await xt();try{let r=wt(e,t),i=Rn(e,t),o=await kn(n,r)??(r===i?void 0:await kn(n,i));if(!o||!o.data||o.width<1||o.height<1)return null;let a=new ImageData(o.width,o.height);return a.data.set(new Uint8ClampedArray(o.data)),a}finally{n.close()}}async function Mn(e,t){if(typeof indexedDB>"u")return;let n=await xt();try{await new Promise((r,i)=>{let o=n.transaction(oe,"readwrite");o.oncomplete=()=>r(),o.onerror=()=>i(o.error??new Error("indexedDB delete failed"));let a=o.objectStore(oe);a.delete(wt(e,t)),a.delete(Rn(e,t))})}finally{n.close()}}var Pt="cyberart.state.",qr="Saved state",Yr="Loaded state",Jr="Failed to save state",Xr="Failed to load state",Qr="No saved state";function ae(e,t){let n=e||"unknown";return t?Pt+n+"."+re(t):Pt+n}function Zr(e,t,n){return r=>{if(Pn(r)==="localStorage"){if(r.type===ve){ei(e,t,n);return}r.type===Ee&&ti(e,t,n)}}}function Ae(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(typeof n.savedAt=="number"&&n.bundle&&typeof n.bundle=="object")return{savedAt:n.savedAt,bundle:n.bundle};let r=t;return typeof r.seed=="string"&&typeof r.version=="number"?{savedAt:0,bundle:r}:null}catch{return null}}async function ei(e,t,n){let r=e();if(r)try{let i=await r.exportState(),o=i.cartId??t?.();i.generative===!0?(di(o),Qe(ae(o,i.seed),i)):Qe(ae(o),i);let a=r.peekExportedFramebuffer?.();if(a)try{await Tn(o,i.seed,a)}catch(d){console.warn("Failed to save cart framebuffer",d)}n?.(qr,"transient")}catch(i){console.error("Failed to save cart state",i),n?.(Jr,"transient")}}async function ti(e,t,n){let r=e();if(!r)return;let i=t?.(),o=r.peekSeed?.(),a=r.isGenerative?.()===!0,d=ai(i,a,o);if(!d){console.warn("No saved cart state for",i||"unknown",a&&o?`(hash ${o})`:""),n?.(Qr,"transient");return}try{let u=await In(i,d.bundle.seed).catch(()=>null);await r.importState(d.bundle,{framebuffer:u}),n?.(Yr,"transient")}catch(u){console.error("Failed to load cart state",u),n?.(Xr,"transient")}}function Qe(e,t){let n=JSON.stringify({savedAt:Date.now(),bundle:t});ni(e,n)}function ni(e,t){for(;;)try{localStorage.setItem(e,t);return}catch(n){if(!ri(n)||!ii(e))throw n}}function ri(e){if(!e||typeof e!="object")return!1;let t=e.name,n=e.code;return t==="QuotaExceededError"||t==="NS_ERROR_DOM_QUOTA_REACHED"||n===22||n===1014}function ii(e){let t=null,n=1/0;for(let o of oi()){if(o===e)continue;let a=localStorage.getItem(o);if(!a)continue;let u=Ae(a)?.savedAt??0;u<n&&(n=u,t=o)}if(!t)return!1;let r=localStorage.getItem(t),i=r?Ae(r):null;return localStorage.removeItem(t),i?.bundle&&Mn(i.bundle.cartId,i.bundle.seed).catch(()=>{}),!0}function oi(){let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&n.startsWith(Pt)&&e.push(n)}return e}function ai(e,t,n){if(t&&n){let i=localStorage.getItem(ae(e,n));if(i)return Ae(i);let o=localStorage.getItem(ae(e));if(!o)return null;let a=Ae(o);if(!a||!si(a.bundle,n))return null;try{Qe(ae(e,n),a.bundle)}catch{}return a}let r=localStorage.getItem(ae(e));return r?Ae(r):null}function si(e,t){return typeof e.seed=="string"&&re(e.seed)===re(t)}function di(e){let t=ae(e),n=localStorage.getItem(t);if(!n)return;let r=Ae(n);if(r&&typeof r.bundle.seed=="string"){let i=ae(e,r.bundle.seed);if(!localStorage.getItem(i))try{Qe(i,r.bundle)}catch{return}}localStorage.removeItem(t)}var Ne=1,se="cyberart.diagnostic.rejected",et=8,ui=new Set(["intent","state","diagnostic"]),ci=new Set([ve,Ee]);function Ze(e){return typeof e=="string"&&ui.has(e)}function Dn(e){if(e.kind!==void 0)return Ze(e.kind)?e.kind:void 0;if(!(typeof e.type!="string"||e.type.length===0)){if(ci.has(e.type))return"intent";for(let t of e.type.split("."))if(Ze(t))return t}}function _n(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function de(e,t){for(let n of e)if(_n(n,t))return!0;return!1}function Ce(e){if(e===void 0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(JSON.stringify(e))}}catch{return{ok:!1}}}function tt(e,t){if(!e||typeof e.type!="string"||e.type.length===0)return{ok:!1,reason:"malformed",detail:"type is required"};if(e.schemaVersion!==void 0&&e.schemaVersion!==Ne)return{ok:!1,reason:"malformed",detail:`unsupported schemaVersion ${String(e.schemaVersion)}`};let n=Dn(e);if(!n)return{ok:!1,reason:"malformed",detail:`cannot infer kind from type "${e.type}"`};let r=Ce(e.payload);if(!r.ok)return{ok:!1,reason:"malformed",detail:"payload is not JSON-serializable"};let i=t.createId(),o=typeof e.correlationId=="string"&&e.correlationId.length>0?e.correlationId:i,a=typeof e.causationId=="string"&&e.causationId.length>0?e.causationId:t.causationId,d=typeof e.target=="string"&&e.target.length>0?e.target:void 0,u=t.maxHops??et,g=t.parentHops===void 0?u:Math.max(0,t.parentHops-1),m=typeof e.idempotencyKey=="string"&&e.idempotencyKey.length>0?e.idempotencyKey:void 0,y={schemaVersion:Ne,type:e.type,kind:n,source:t.source,id:i,correlationId:o,seq:t.seq,hops:g};return d&&(y.target=d),a&&(y.causationId=a),m&&(y.idempotencyKey=m),r.value!==void 0&&(y.payload=r.value),{ok:!0,envelope:y}}var li=new Set(["rate-limited","storm-detected","hop-limit","loop-detected","not-subscribed"]),pi=8,fi=8,mi=16,hi=256,yi=["*.intent.*"];function kt(e={}){let t=e.hostSource??"host",n="router",r=e.maxPerTurn??pi,i=e.maxCausationDepth??fi,o=e.maxHops??et,a=e.maxCorrelationPerTurn??mi,d=e.maxIndex??hi,u=e.maxPerWindow,g=e.windowMs??1e3,m=e.now??Date.now,y=0,C=e.createId??(()=>`evt-${++y}`),E=new Map,N=[],f=new Map,l=new Map,P=new Map,T=0,W=0,L=[],p=!1;function I(c,h,w){for(c.set(h,w);c.size>d;){let x=c.keys().next().value;if(x===void 0)break;c.delete(x)}}function S(c){I(f,c.id,{type:c.type,source:c.source,causationId:c.causationId,hops:c.hops,correlationId:c.correlationId,idempotencyKey:c.idempotencyKey})}function _(c,h){h&&(c.correlationId||(c.correlationId=h.correlationId),c.causationId||(c.causationId=h.id),!c.idempotencyKey&&h.idempotencyKey&&(c.idempotencyKey=`${h.idempotencyKey}::${c.type}`))}function F(c,h){if(c){let w=f.get(c);return w?w.hops:o}return h}function U(c,h){return`${c}\0${h}`}function q(c,h){c.idempotencyKey&&I(P,U(c.source,c.idempotencyKey),h)}function ue(c,h){if(h)return P.get(U(c,h))}function s(c){return ue(c.source,c.idempotencyKey)}function v(c){return c.seq+=1,c.seq}function A(c,h){if(!(typeof h.causationId=="string"&&h.causationId.length>0))return c.lastDelivered}function R(c){let h=new Set,w=new Set([`${c.type}\0${c.source}`]),x=c.causationId,b=0;for(;x;){if(b+=1,b>i||h.has(x))return!0;h.add(x);let G=f.get(x);if(!G)break;let Y=`${G.type}\0${G.source}`;if(w.has(Y))return!0;w.add(Y),x=G.causationId}return!1}function $(c){let h=(l.get(c)??0)+1;return l.set(c,h),h}function O(c,h){u!==void 0&&(c.emitTimestamps=c.emitTimestamps.filter(w=>h-w<g))}function M(c,h){return(h.kind==="state"||h.kind==="diagnostic")&&!c.authoritative?!1:de(c.emit,h.type)}function k(c){for(let h of N)if(de(h.patterns,c.type))try{h.listener(c)}catch{}}function V(c){if(c.target){let h=E.get(c.target);if(!h||!de(h.subscribe,c.type))return;h.channel.dispatch(c),h.lastDelivered={id:c.id,hops:c.hops,correlationId:c.correlationId,idempotencyKey:c.idempotencyKey};return}for(let h of E.values())de(h.subscribe,c.type)&&(h.channel.dispatch(c),h.lastDelivered={id:c.id,hops:c.hops,correlationId:c.correlationId,idempotencyKey:c.idempotencyKey})}function Z(c,h,w,x,b,G,Y){let Q={reason:x,eventType:h,source:w};b&&(Q.detail=b),W+=1;let Re=C(),le={schemaVersion:Ne,type:se,kind:"diagnostic",source:n,id:Re,correlationId:G??Re,seq:W,hops:0,payload:Q};Y&&(le.causationId=Y),S(le);let Bt=E.get(c);Bt&&Bt.channel.dispatch(le),k(le)}function K(c,h,w,x,b){Z(c,b?.type??(typeof h.type=="string"?h.type:""),b?.source??c,w,x,b?.correlationId,b?.id),b?.idempotencyKey&&!li.has(w)&&q(b,{status:"rejected"})}function ee(c){S(c),q(c,{status:"accepted",envelope:c}),$(c.correlationId),k(c),V(c)}function ne(c,h,w,x){if(!w.ok){K(c,h,"malformed",w.detail);return}let b=w.envelope,G=s(b);if(G)return G.status==="accepted"?G.envelope:void 0;if(b.hops<1){K(c,h,"hop-limit","no hops remaining",b);return}if(b.target&&b.target!==t){let Y=E.get(b.target);if(!Y){K(c,h,"unknown-target",`unknown target "${b.target}"`,b);return}if(!de(Y.subscribe,b.type)){K(c,h,"not-subscribed",`target "${b.target}" does not subscribe to ${b.type}`,b);return}}if(x){if(!M(x,b)){K(c,h,"unauthorized","source may not emit this event",b);return}if(x.emitsThisTurn+=1,x.emitsThisTurn>r){K(c,h,"rate-limited","maxPerTurn exceeded",b);return}if(u!==void 0){let Q=m();if(O(x,Q),x.emitTimestamps.push(Q),x.emitTimestamps.length>u){K(c,h,"rate-limited","maxPerWindow exceeded",b);return}}if(R(b)){K(c,h,"loop-detected","causation chain cycle or depth exceeded",b);return}if((l.get(b.correlationId)??0)+1>a){K(c,h,"storm-detected","correlationId storm",b);return}if(e.validate){let Q;try{Q=e.validate(b)}catch(Re){let le=Re instanceof Error?Re.message:"validate threw";K(c,h,"host-rejected",le,b);return}if(Q!==!0){K(c,h,"host-rejected",Q.detail,b);return}}}else{if(R(b)){K(c,h,"loop-detected","causation chain cycle or depth exceeded",b);return}if((l.get(b.correlationId)??0)+1>a){K(c,h,"storm-detected","correlationId storm",b);return}}return ee(b),b}function ut(c,h){let w=E.get(c);if(!w)return;let x={...h},b=A(w,x);if(_(x,b),ue(w.id,x.idempotencyKey))return;let Y=v(w),Q=tt(x,{source:w.id,createId:C,seq:Y,causationId:b?.id,maxHops:o,parentHops:F(x.causationId??b?.id,b?.hops)});ne(c,x,Q,w)}function ur(c,h){let w=h?.cause,x={...c};_(x,w);let b=ue(t,x.idempotencyKey);if(b)return b.status==="accepted"?b.envelope:void 0;T+=1;let G=tt(x,{source:t,createId:C,seq:T,causationId:x.causationId,maxHops:o,parentHops:F(x.causationId,w?.hops)});return ne(t,x,G,void 0)}function cr(){if(!p){p=!0;try{for(;L.length>0;){let c=L.shift();c&&(c.kind==="cart"?ut(c.participantId,c.event):c.result=ur(c.event,c.extras))}}finally{p=!1}}}function $t(c){L.push(c),cr()}return{attach(c,h,w={}){if(c===t||c===n)throw new Error(`createEventRouter: "${c}" is a reserved participant id`);for(let G of E.values())if(G.channel===h&&G.id!==c)throw new Error(`createEventRouter: channel already attached as "${G.id}"`);E.get(c)?.unsubscribe();let b={id:c,channel:h,emit:w.emit??yi,subscribe:w.subscribe??[],authoritative:w.authoritative===!0,seq:0,emitsThisTurn:0,emitTimestamps:[],unsubscribe:()=>{}};b.unsubscribe=h.onEvent(G=>{$t({kind:"cart",participantId:c,event:G})}),E.set(c,b)},detach(c){let h=E.get(c);h&&(h.unsubscribe(),E.delete(c))},publish(c,h){let w={kind:"publish",event:c,extras:h};return $t(w),w.result},subscribe(c,h){let w={patterns:c,listener:h};return N.push(w),()=>{let x=N.indexOf(w);x>=0&&N.splice(x,1)}},turn(){l.clear();for(let c of E.values())c.emitsThisTurn=0,c.lastDelivered=void 0,u!==void 0&&O(c,m())}}}var gi=new Set(["string","number","boolean","object","array"]);function B(e,t,n){return n?{code:e,detail:t,path:n}:{code:e,detail:t}}function On(e){if(!(typeof e!="string"||e.length===0)){for(let t of e.split("."))if(Ze(t))return t}}function Fn(e){let t=e.split(".");return t.length===0?"*":(t[t.length-1]="*",t.join("."))}function Rt(e){let t=[];if(!e||typeof e!="object")return[B("invalid-schema","payload schema is required")];if((typeof e.version!="number"||!Number.isInteger(e.version)||e.version<1)&&t.push(B("invalid-version","payload schema version must be an integer >= 1")),!e.fields||typeof e.fields!="object"||Array.isArray(e.fields))return t.push(B("invalid-fields","payload schema fields must be an object")),t;for(let[n,r]of Object.entries(e.fields)){if(!n){t.push(B("invalid-field","field name is required",n));continue}(!r||typeof r!="object"||!gi.has(r.type))&&t.push(B("invalid-field-type",`field "${n}" type must be string | number | boolean | object | array`,n))}return t}function bi(e){return e===null?"null":e===void 0?"undefined":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="number"&&Number.isFinite(e)?"number":typeof e=="boolean"?"boolean":typeof e=="object"?"object":"other"}function vi(e,t){if(t===void 0){let i=Object.entries(e.fields).filter(([,o])=>o.optional!==!0);return i.length===0?{ok:!0,payload:void 0}:{ok:!1,errors:i.map(([o])=>B("missing-field",`payload is missing required field "${o}"`,o))}}if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,errors:[B("invalid-payload","payload must be a JSON object")]};let n=t,r=[];for(let[i,o]of Object.entries(e.fields)){if(!(i in n)||n[i]===void 0){o.optional!==!0&&r.push(B("missing-field",`payload is missing required field "${i}"`,i));continue}let a=bi(n[i]);a!==o.type&&r.push(B("field-type",`payload.${i} expected ${o.type}, got ${a}`,i))}return r.length>0?{ok:!1,errors:r}:{ok:!0,payload:t}}function Ei(e,t,n){let r=Fn(e);return{type:e,kind:t,payloadSchema:{version:n.version,fields:{...n.fields}},emitPattern:r,subscribePattern:r,toManifest(){let i={};for(let[o,a]of Object.entries(this.payloadSchema.fields))i[o]={type:a.type,optional:a.optional===!0};return{type:this.type,kind:this.kind,version:this.payloadSchema.version,fields:i,emitPattern:this.emitPattern,subscribePattern:this.subscribePattern}},validatePayload(i){return vi(this.payloadSchema,i)}}}function Tt(e,t,n){let r=[];if(typeof t!="string"||t.length===0)r.push(B("invalid-type","event type is required"));else if(t.split(".").some(i=>i.length===0))r.push(B("invalid-type",`event type "${t}" has empty dotted segments`));else{let i=On(t);i?i!==e&&r.push(B("kind-mismatch",`type "${t}" infers kind "${i}" but this helper defines "${e}"`)):r.push(B("kind-mismatch",`type "${t}" has no "${e}" segment; Adventure-style names like adventure.presentation.* need e.g. adventure.presentation.${e}.cue-started`))}return r.push(...Rt(n)),r.length>0?{ok:!1,errors:r}:{ok:!0,contract:Ei(t,e,n)}}function Ai(e,t){return Tt("intent",e,t)}function Ci(e,t){return Tt("state",e,t)}function Si(e,t){return Tt("diagnostic",e,t)}function wi(e,t){let n=Rt(e),r=Rt(t);if(n.length>0||r.length>0||t.version<e.version)return"breaking";let i=Object.keys(e.fields),o=Object.keys(t.fields),a=new Set(i),d=new Set(o);for(let m of i){if(!d.has(m))return"breaking";let y=e.fields[m],C=t.fields[m];if(y.type!==C.type)return"breaking";let E=y.optional!==!0,N=C.optional===!0;if(E&&N||!E&&C.optional!==!0&&y.optional===!0)return"breaking"}let u=!1;for(let m of o)if(!a.has(m)){if(t.fields[m].optional!==!0)return"breaking";u=!0}let g=i.length===o.length&&i.every(m=>t.fields[m].type===e.fields[m].type&&t.fields[m].optional===!0==(e.fields[m].optional===!0));return g&&t.version===e.version?"identical":t.version>e.version&&(u||g)?"backward-compatible":t.version===e.version&&u?"breaking":g?"identical":"breaking"}function xi(e,t){let n=[],r=[],i=new Set,o=new Set;for(let a of e)(t==="authoritative"||a.kind==="intent")&&!i.has(a.emitPattern)&&(i.add(a.emitPattern),n.push(a.emitPattern)),a.kind!=="intent"&&!o.has(a.subscribePattern)&&(o.add(a.subscribePattern),r.push(a.subscribePattern));return{emit:n,subscribe:r,authoritative:t==="authoritative"}}function Pi(e,t){let n=e.emit??["*.intent.*"],r=e.authoritative===!0,i=[];for(let o of t)de(n,o.type)&&(o.kind==="state"||o.kind==="diagnostic")&&!r&&i.push(B("unauthorized-emit",`emit pattern allows ${o.kind} "${o.type}" but attach is not authoritative`,o.type));return i.length>0?{ok:!1,errors:i}:{ok:!0}}function ki(e){let t=new Map;for(let i of e)t.set(i.type,i);let n=i=>{let o=t.get(i.type);return o?o.kind!==i.kind?{ok:!1,errors:[B("kind-mismatch",`envelope kind "${i.kind}" does not match contract "${o.kind}"`,i.type)]}:o.validatePayload(i.payload):{ok:!1,errors:[B("unknown-type",`no contract registered for "${i.type}"`,i.type)]}};return{get(i){return t.get(i)},manifest(){return[...t.values()].sort((i,o)=>i.type.localeCompare(o.type)).map(i=>i.toManifest())},validateEnvelope:n,asRouterValidate:i=>{let o=n(i);return o.ok?!0:{reason:"host-rejected",detail:o.errors.map(a=>a.detail).join("; ")}}}}var Se=1,Mt="presentation.state.model",Ln="presentation.intent.unsupported",Vn=["loading","ready","error","unsupported"],Ri=["presentation.state.*",se],Ti="Presentation adapter has been destroyed",Hn="Presentation adapter: model is invalid or not JSON-serializable",Ii=new Set(Vn);function Kn(e){return typeof e=="string"&&Ii.has(e)}function Dt(e){if(e===null||typeof e!="object")return!1;let t=e;return!(t.contractVersion!==Se||!Kn(t.phase)||t.reason!==void 0&&typeof t.reason!="string"||t.view!==void 0&&(t.view===null||typeof t.view!="object"))}function It(e,t){let n={type:Mt,kind:"state",payload:e};return t?.correlationId&&(n.correlationId=t.correlationId),t?.causationId&&(n.causationId=t.causationId),t?.idempotencyKey&&(n.idempotencyKey=t.idempotencyKey),n}function _t(){return{contractVersion:Se,phase:"loading"}}function Ot(e){return{contractVersion:Se,phase:"unsupported",reason:e}}function Ft(e){let t=Ce(e);return t.ok?Dt(t.value)?{ok:!0,model:t.value}:t.value!==null&&typeof t.value=="object"&&"contractVersion"in t.value&&t.value.contractVersion!==Se?{ok:!1,reason:"unknown-contract-version",contractVersion:t.value.contractVersion}:{ok:!1,reason:"invalid-model"}:{ok:!1,reason:"model-not-serializable"}}function nt(e){let t=Ft(e);if(!t.ok)throw new Error(Hn);return t.model}function Mi(e){let t=Ce(e);return t.ok&&Dt(t.value)?t.value:Ot("model-not-serializable")}function Di(e,t){if(e.type!==Mt)return{model:t};let n=Ft(e.payload);return n.ok?{model:n.model}:{model:Ot(n.reason),rejected:{reason:n.reason,contractVersion:n.contractVersion}}}function _i(e){if(e===null||typeof e!="object"||!("regions"in e))return[];let t=e.regions;return Array.isArray(t)?t:[]}function Oi(e,t,n){return e>=n.x&&e<n.x+n.width&&t>=n.y&&t<n.y+n.height}function Fi(e,t){let n=t.intent;if(!n||typeof n.type!="string"||n.type.length===0)return;let r={type:n.type,kind:"intent"};if(n.payload!==void 0){let i=Ce(n.payload);if(!i.ok)return;r.payload=i.value}n.target&&(r.target=n.target),n.correlationId&&(r.correlationId=n.correlationId),n.idempotencyKey&&(r.idempotencyKey=n.idempotencyKey),e.emit(r)}function Gn(e,t,n){let r={reason:t};if(n!==void 0){let i=Ce(n);i.ok&&(r.contractVersion=i.value)}e.emit({type:Ln,kind:"intent",payload:r})}function Nn(e,t,n){let r=t;for(let i of e){let o=Di(i,r);o.rejected&&n&&Gn(n,o.rejected.reason,o.rejected.contractVersion),r=o.model}return r}function $n(){return{metadata:{id:"cyberart.presentation.reference",name:"Reference presentation",frameRate:30},getDefaultState:(e,t,n,r,i,o,a,d,u)=>{let g=i?.model;if(g===void 0)return{model:_t()};let m=Ft(g);return m.ok?{model:m.model}:(u&&Gn(u,m.reason,m.contractVersion),{model:Ot(m.reason)})},update:(e,t,n,r,i,o,a,d,u,g,m)=>{let y=Nn(m?.consume()??[],i.model,m);for(;a?.hasClick();){let C=a.consumeClick();if(!(!C||y.phase!=="ready"||!m)){for(let E of _i(y.view))if(Oi(C.x,C.y,E)){Fi(m,E);break}}}return m&&(y=Nn(m.consume(),y,m)),y===i.model?i:{...i,model:y}},render:(e,t,n,r,i,o)=>{let a=i.model.view?.background;o.fillStyle=a??"#111",o.fillRect(0,0,r.width,r.height)}}}function Bn(e,t={}){let n=e,r=t.model?nt(t.model):_t(),i=!1,o=t.present??t.model!==void 0,a=()=>{if(i)throw new Error(Ti)},d=u=>{a(),r=nt(u),n.dispatch(It(r))};return o&&n.dispatch(It(r)),{version:Se,get target(){return n},get model(){return Mi(r)},get phase(){return r.phase},get paused(){return n.paused===!0},present:d,async start(){return a(),n.start()},pause(){a(),n.pause()},resume(){a(),n.resume()},retarget(u){a(),n=u},destroy(){i||(i=!0,n.destroy())}}}function Ni(e,t={}){let n=t.model?nt(t.model):t.initialState?.model!==void 0?nt(t.initialState.model):_t(),r=t.cart??$n(),i=e.mount(r,{initialState:{...t.initialState,model:n},onEvent:t.onEvent});return Bn(i,{model:n,present:!1})}var Le="cue.started",it="cue.completed",Ve="cue.cancelled",ot="cue.replaced",Li=[Le,it,Ve,ot];function Vi(e){return e===Le||e===it||e===Ve||e===ot}function jn(e,t){let n=e<0?0:e>1?1:e;return t==="ease-out"?1-(1-n)*(1-n):n}function Un(e){return{type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,progress:e.progress}}function rt(e){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:e.phase,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,progress:e.progress,repeatIndex:e.repeatIndex}}function Nt(e){return e.startFrame+e.delayFrames}function Hi(e,t){if(!e||typeof e!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof e.name!="string"||e.name.length===0)return{ok:!1,reason:"invalid",detail:"name is required"};if(typeof e.idempotencyKey!="string"||e.idempotencyKey.length===0)return{ok:!1,reason:"invalid",detail:"idempotencyKey is required"};if(typeof e.durationFrames!="number"||!Number.isFinite(e.durationFrames)||e.durationFrames<0)return{ok:!1,reason:"invalid",detail:"durationFrames must be a non-negative finite number"};let n=e.startFrame===void 0?t:e.startFrame;if(typeof n!="number"||!Number.isFinite(n))return{ok:!1,reason:"invalid",detail:"startFrame must be finite"};let r=e.delayFrames??0;if(typeof r!="number"||!Number.isFinite(r)||r<0)return{ok:!1,reason:"invalid",detail:"delayFrames must be a non-negative finite number"};let i=e.easing??"linear";if(i!=="linear"&&i!=="ease-out")return{ok:!1,reason:"invalid",detail:"unsupported easing"};let o=e.onDuplicate??"replace";if(o!=="ignore"&&o!=="replace"&&o!=="reject")return{ok:!1,reason:"invalid",detail:"unsupported onDuplicate"};let a=0;if(e.repeat)if("forever"in e.repeat&&e.repeat.forever)a="forever";else if("count"in e.repeat){if(typeof e.repeat.count!="number"||!Number.isFinite(e.repeat.count)||e.repeat.count<0)return{ok:!1,reason:"invalid",detail:"repeat.count must be >= 0"};a=Math.floor(e.repeat.count)}else return{ok:!1,reason:"invalid",detail:"unsupported repeat"};let d=e.reducedMotion??"complete";return d!=="skip"&&d!=="complete"&&(typeof d!="object"||typeof d.durationFrames!="number"||!Number.isFinite(d.durationFrames)||d.durationFrames<0)?{ok:!1,reason:"invalid",detail:"unsupported reducedMotion"}:{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:n,durationFrames:e.durationFrames,delayFrames:r,easing:i,repeatRemaining:a,repeatIndex:0,reducedMotion:d,onDuplicate:o,phase:"scheduled",progress:0}}function Ki(e,t){if(!t)return e;let n=e.reducedMotion;return n==="skip"||n==="complete"?{...e,durationFrames:0,delayFrames:0,startFrame:e.startFrame}:{...e,durationFrames:n.durationFrames}}function Gi(e={}){let t=!!e.reducedMotion,n=e.originFrame??0,r=new Map,i=[];function o(f){i.push(f)}function a(f,l){let P=Nt(f)-Nt(l);return P!==0?P:f.name<l.name?-1:f.name>l.name?1:f.idempotencyKey<l.idempotencyKey?-1:f.idempotencyKey>l.idempotencyKey?1:0}function d(f,l){o({type:l,atFrame:n,name:f.name,idempotencyKey:f.idempotencyKey,progress:f.progress})}function u(f){if(f.phase="completed",f.progress=1,d(f,it),f.repeatRemaining==="forever"||f.repeatRemaining>0){if(typeof f.repeatRemaining=="number"&&(f.repeatRemaining-=1),f.repeatIndex+=1,f.phase="scheduled",f.progress=0,f.startFrame=n,f.delayFrames=0,f.durationFrames===0){r.delete(f.idempotencyKey);return}f.phase="active",d(f,Le)}else r.delete(f.idempotencyKey)}function g(f){if(f.phase==="cancelled"||f.phase==="completed")return;let l=Nt(f);if(!(n<l)){if(f.phase==="scheduled"&&(f.phase="active",f.progress=f.durationFrames===0?1:0,d(f,Le),f.durationFrames===0)){u(f);return}if(f.phase==="active"){let P=n-l;P>=f.durationFrames?(f.progress=1,u(f)):f.progress=jn(f.durationFrames===0?1:P/f.durationFrames,f.easing)}}}function m(){let f=[...r.values()].sort(a);for(let l of f)g(l)}function y(f){let l=Hi(f,n);if("ok"in l&&l.ok===!1)return l;let P=Ki(l,t),T=r.get(P.idempotencyKey);if(T&&(T.phase==="scheduled"||T.phase==="active")){if(T.onDuplicate==="reject"||P.onDuplicate==="reject")return{ok:!1,reason:"duplicate",detail:`cue ${P.idempotencyKey} is already ${T.phase}`};if(T.onDuplicate==="ignore"||P.onDuplicate==="ignore")return{ok:!0,cue:rt(T)};T.phase="cancelled",T.progress=T.progress,d(T,ot),r.delete(T.idempotencyKey)}r.set(P.idempotencyKey,P),g(P);let W=r.get(P.idempotencyKey)??P;return{ok:!0,cue:rt(W)}}function C(f){let l=r.get(f);return!l||l.phase==="completed"||l.phase==="cancelled"?!1:(l.phase="cancelled",d(l,Ve),r.delete(f),!0)}function E(){for(let f of[...r.values()].sort(a))(f.phase==="scheduled"||f.phase==="active")&&(f.phase="cancelled",d(f,Ve));r.clear(),i.length=0,n=e.originFrame??0}function N(f=1){let l=Number.isFinite(f)?Math.max(0,Math.floor(f)):0,P=i.length;for(let T=0;T<l;T++)n+=1,m();return i.slice(P).map(Un)}return{play:y,step:N,cancel:C,reset:E,snapshot(){return{frame:n,reducedMotion:t,cues:[...r.values()].sort(a).map(rt),events:i.map(Un)}},get(f){let l=r.get(f);return l?rt(l):void 0},get frame(){return n},get reducedMotion(){return t}}}var $i=1,Wn=["loading","ready","error","unsupported"],qn=["keyboard","pointer","audio","assets","hostChannel"],Yn=["image","audio","font","spritesheet"],Jn=["tone","midi"],Bi=new Set(Wn),Xn=new Set(qn),zn=new Set(Yn),Qn=new Set(Jn),Ui=new Set(["version","id","runtime","phases","managers","assets","acceptedEvents","emittedEvents","permissions","integrations"]),ji=new Set(["minContractVersion","features"]),zi=new Set(["kinds","declarations"]),Wi=new Set(["id","kind"]),qi=new Set(["emit","subscribe","authoritative"]),Yi=new Set(["contractVersion","features","integrations","managers","emit","subscribe"]);function D(e,t,n){return n?{code:e,detail:t,path:n}:{code:e,detail:t}}function we(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function xe(e,t,n){let r=[];for(let i of Object.keys(e))t.has(i)||r.push(D("unknown-field",`unknown field "${i}"`,n?`${n}.${i}`:i));return r}function Ji(e){if(typeof e!="string"||e.length===0)return!1;let t=e.split(".");return t.some(n=>n.length===0)?!1:t.every(n=>n==="*"||/^[a-z0-9][a-z0-9-]*$/i.test(n))}function Xi(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function st(e,t){for(let n of t)if(e===n||Xi(n,e))return!0;return!1}function at(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function Lt(e,t,n){if(!Array.isArray(e))return{ok:!1,errors:[D("invalid-field",`${t} must be an array`,t)]};let r=[],i=[];return e.forEach((o,a)=>{let d=`${t}[${a}]`;if(typeof o!="string"||o.length===0){r.push(D("invalid-field",`${t} entries must be non-empty strings`,d));return}let u=n(o,d);u?r.push(u):i.push(o)}),r.length>0?{ok:!1,errors:r}:{ok:!0,values:i}}function Pe(e,t){return Lt(e,t,(n,r)=>Ji(n)?void 0:D("invalid-pattern",`invalid event pattern "${n}"`,r))}function ke(e,t,n,r,i){return Lt(e,t,(o,a)=>n.has(o)?void 0:D(r,`invalid ${i} "${o}"`,a))}function Zn(e,t){return Lt(e,t,(n,r)=>/^[a-z0-9][a-z0-9.-]*$/i.test(n)?void 0:D("invalid-feature",`invalid feature tag "${n}"`,r))}function Qi(e){if(!we(e))return[D("invalid-manifest","capability manifest must be a JSON object")];let t=[...xe(e,Ui,"")];if(e.version!==void 0&&e.version!==1&&t.push(D("invalid-version","capability manifest version must be 1","version")),(typeof e.id!="string"||e.id.length===0)&&t.push(D("invalid-id","id is required","id")),!we(e.runtime))t.push(D("invalid-runtime","runtime is required","runtime"));else{t.push(...xe(e.runtime,ji,"runtime"));let d=e.runtime.minContractVersion;(typeof d!="number"||!Number.isInteger(d)||d<1)&&t.push(D("invalid-runtime","runtime.minContractVersion must be an integer >= 1","runtime.minContractVersion"));let u=Zn(e.runtime.features,"runtime.features");u.ok||t.push(...u.errors)}let n=ke(e.phases,"phases",Bi,"invalid-phase","phase");n.ok||t.push(...n.errors);let r=ke(e.managers,"managers",Xn,"invalid-manager","manager");if(r.ok||t.push(...r.errors),!we(e.assets))t.push(D("invalid-assets","assets is required","assets"));else{t.push(...xe(e.assets,zi,"assets"));let d=ke(e.assets.kinds,"assets.kinds",zn,"invalid-asset-kind","asset kind");d.ok||t.push(...d.errors),Array.isArray(e.assets.declarations)?e.assets.declarations.forEach((u,g)=>{let m=`assets.declarations[${g}]`;if(!we(u)){t.push(D("invalid-assets","asset declaration must be an object",m));return}t.push(...xe(u,Wi,m)),(typeof u.id!="string"||u.id.length===0)&&t.push(D("invalid-assets","asset declaration id is required",`${m}.id`)),(typeof u.kind!="string"||!zn.has(u.kind))&&t.push(D("invalid-asset-kind",`invalid asset kind "${String(u.kind)}"`,`${m}.kind`))}):t.push(D("invalid-assets","assets.declarations must be an array","assets.declarations"))}let i=Pe(e.acceptedEvents,"acceptedEvents");i.ok||t.push(...i.errors);let o=Pe(e.emittedEvents,"emittedEvents");if(o.ok||t.push(...o.errors),!we(e.permissions))t.push(D("invalid-permissions","permissions is required","permissions"));else{t.push(...xe(e.permissions,qi,"permissions"));let d=Pe(e.permissions.emit,"permissions.emit");d.ok||t.push(...d.errors);let u=Pe(e.permissions.subscribe,"permissions.subscribe");u.ok||t.push(...u.errors),e.permissions.authoritative!==void 0&&typeof e.permissions.authoritative!="boolean"&&t.push(D("invalid-permissions","permissions.authoritative must be a boolean","permissions.authoritative"))}let a=ke(e.integrations,"integrations",Qn,"invalid-integration","integration");return a.ok||t.push(...a.errors),t}function Zi(e){let t=[];return e.emittedEvents.forEach((n,r)=>{st(n,e.permissions.emit)||t.push(D("undeclared-permission",`emitted event "${n}" is not covered by permissions.emit`,`emittedEvents[${r}]`))}),e.acceptedEvents.forEach((n,r)=>{st(n,e.permissions.subscribe)||t.push(D("undeclared-permission",`accepted event "${n}" is not covered by permissions.subscribe`,`acceptedEvents[${r}]`))}),t}function eo(e){let t=at(e.assets.kinds),n=e.assets.declarations.map(i=>({id:i.id,kind:i.kind})),r={emit:[...e.permissions.emit],subscribe:[...e.permissions.subscribe]};return e.permissions.authoritative===!0&&(r.authoritative=!0),{version:1,id:e.id,runtime:{minContractVersion:e.runtime.minContractVersion,features:[...e.runtime.features]},phases:at(e.phases),managers:at(e.managers),assets:{kinds:t,declarations:n},acceptedEvents:[...e.acceptedEvents],emittedEvents:[...e.emittedEvents],permissions:r,integrations:at(e.integrations)}}function Vt(e){let t=Qi(e);if(t.length>0)return{ok:!1,errors:t};let n=eo(e);return t.push(...Zi(n)),t.length>0?{ok:!1,errors:t}:{ok:!0,manifest:n}}function to(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return{ok:!1,errors:[D("invalid-json","capability manifest JSON is not parseable")]}}return Vt(t)}function no(e){return JSON.parse(JSON.stringify(e))}function ro(e,t){let n=Vt(e),r=n.ok?[]:[...n.errors];if(!we(t))return{ok:!1,errors:[D("invalid-host","host capabilities must be a JSON object")]};r.push(...xe(t,Yi,"host")),typeof t.contractVersion!="number"||!Number.isInteger(t.contractVersion)||t.contractVersion<1?r.push(D("invalid-host","host.contractVersion must be an integer >= 1","host.contractVersion")):n.ok&&t.contractVersion<n.manifest.runtime.minContractVersion&&r.push(D("unsupported-runtime",`host contract version ${t.contractVersion} is below required ${n.manifest.runtime.minContractVersion}`,"runtime.minContractVersion"));let i=Zn(t.features,"host.features");if(!i.ok)r.push(...i.errors);else if(n.ok){let a=new Set(i.values);n.manifest.runtime.features.forEach((d,u)=>{a.has(d)||r.push(D("unsupported-feature",`host does not support required feature "${d}"`,`runtime.features[${u}]`))})}let o=ke(t.integrations,"host.integrations",Qn,"invalid-integration","integration");if(!o.ok)r.push(...o.errors);else if(n.ok){let a=new Set(o.values);n.manifest.integrations.forEach((d,u)=>{a.has(d)||r.push(D("missing-integration",`host does not provide required integration "${d}"`,`integrations[${u}]`))})}if(t.managers!==void 0){let a=ke(t.managers,"host.managers",Xn,"invalid-manager","manager");if(!a.ok)r.push(...a.errors);else if(n.ok){let d=new Set(a.values);n.manifest.managers.forEach((u,g)=>{d.has(u)||r.push(D("missing-manager",`host does not provide required manager "${u}"`,`managers[${g}]`))})}}if(t.emit!==void 0){let a=Pe(t.emit,"host.emit");a.ok?n.ok&&n.manifest.permissions.emit.forEach((d,u)=>{st(d,a.values)||r.push(D("unknown-permission",`host does not allow emit permission "${d}"`,`permissions.emit[${u}]`))}):r.push(...a.errors)}if(t.subscribe!==void 0){let a=Pe(t.subscribe,"host.subscribe");a.ok?n.ok&&n.manifest.permissions.subscribe.forEach((d,u)=>{st(d,a.values)||r.push(D("unknown-permission",`host does not allow subscribe permission "${d}"`,`permissions.subscribe[${u}]`))}):r.push(...a.errors)}return r.length>0?{ok:!1,errors:r}:{ok:!0}}var io=1,oo=1e-6,ao=.5,so=["normalized","asset","canvas","css","viewport"],uo=["center","top-left","top-right","bottom-left","bottom-right","top","bottom","left","right"],co={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-right":{x:1,y:1},top:{x:.5,y:0},bottom:{x:.5,y:1},left:{x:0,y:.5},right:{x:1,y:.5}};function lo(e){let t=co[e];return{x:t.x,y:t.y}}function po(e){let t=e.devicePixelRatio??1,{contentWidth:n,contentHeight:r,viewportWidth:i,viewportHeight:o,mode:a}=e,d=i/n,u=o/r,g=a==="contain"?Math.min(d,u):Math.max(d,u),m=n*g,y=r*g,C=(i-m)/2,E=(o-y)/2,N=dt(-C/m),f=dt(-E/y),l=dt(i/m),P=dt(o/y);return{mode:a,contentWidth:n,contentHeight:r,viewportWidth:i,viewportHeight:o,devicePixelRatio:t,scale:g,offsetX:C,offsetY:E,canvasWidth:i*t,canvasHeight:o*t,visibleNormalizedRect:{x:N,y:f,width:Math.min(l,1-N),height:Math.min(P,1-f)}}}function fo(e,t){return{x:e.x*t.contentWidth,y:e.y*t.contentHeight}}function mo(e,t){return{x:e.x/t.contentWidth,y:e.y/t.contentHeight}}function Ht(e,t){return{x:t.offsetX+e.x*t.contentWidth*t.scale,y:t.offsetY+e.y*t.contentHeight*t.scale}}function Kt(e,t){return{x:(e.x-t.offsetX)/(t.contentWidth*t.scale),y:(e.y-t.offsetY)/(t.contentHeight*t.scale)}}function tr(e,t){return{x:e.x*t.devicePixelRatio,y:e.y*t.devicePixelRatio}}function nr(e,t){return{x:e.x/t.devicePixelRatio,y:e.y/t.devicePixelRatio}}function ho(e,t){return tr(Ht(e,t),t)}function rr(e,t){return Kt(nr(e,t),t)}function Gt(e,t){let n=Ht({x:e.x,y:e.y},t);return{x:n.x,y:n.y,width:e.width*t.contentWidth*t.scale,height:e.height*t.contentHeight*t.scale}}function ir(e,t){let n=Gt(e,t),r=t.devicePixelRatio;return{x:n.x*r,y:n.y*r,width:n.width*r,height:n.height*r}}function yo(e,t,n,r){let o=(r?.space??"canvas")==="css"?Kt(e,t):rr(e,t);for(let a of n.regions)if(xo(a,o))return a}function go(e,t){let n=He(e);if(n)return Gt(n,t)}function bo(e){let t=new Map,n=r=>{if(t.has(r.id))return{ok:!1,error:"duplicate-id",id:r.id};let i={id:r.id,point:{x:r.point.x,y:r.point.y},...r.origin!==void 0?{origin:r.origin}:{}};return t.set(i.id,i),{ok:!0,landmark:i}};if(e)for(let r of e){let i=n(r);if(!i.ok)throw new Error(`Duplicate landmark id: ${i.id}`)}return{register:n,get:r=>t.get(r),list:()=>[...t.values()]}}function vo(e){let t=[];e.version!==1&&t.push({code:"version-mismatch",detail:`expected version 1, got ${String(e.version)}`});let n=new Set,r=i=>{if(n.has(i)){t.push({code:"duplicate-id",id:i,detail:`duplicate id ${i}`});return}n.add(i)};for(let i of e.landmarks)r(i.id),er(i.point)||t.push({code:"out-of-bounds",id:i.id,detail:`landmark ${i.id} is outside 0\u20131`});for(let i of e.regions){r(i.id);let o=He(i);if(!i.rect&&!i.polygon){t.push({code:"invalid-shape",id:i.id,detail:`region ${i.id} has neither rect nor polygon`});continue}if(i.polygon&&i.polygon.length<3&&t.push({code:"invalid-shape",id:i.id,detail:`region ${i.id} polygon needs at least 3 points`}),o&&!So(o)&&t.push({code:"out-of-bounds",id:i.id,detail:`region ${i.id} is outside 0\u20131`}),i.polygon){for(let a of i.polygon)if(!er(a)){t.push({code:"out-of-bounds",id:i.id,detail:`region ${i.id} has a vertex outside 0\u20131`});break}}}for(let i=0;i<e.regions.length;i+=1){let o=e.regions[i],a=He(o);if(a)for(let d=i+1;d<e.regions.length;d+=1){let u=e.regions[d],g=He(u);g&&wo(a,g)&&t.push({code:"overlap",id:o.id,with:u.id,detail:`region ${o.id} overlaps ${u.id}`})}}return{ok:t.length===0,diagnostics:t}}function Eo(e,t,n,r=[]){let i=[],o=(a,d,u)=>{i.push({method:a,id:u,args:d})};for(let a of n.regions){let d=He(a);if(!d)continue;let u=ir(d,t);e.fillStyle="rgba(0, 180, 255, 0.15)",e.strokeStyle="#00b4ff",e.fillRect&&e.fillRect(u.x,u.y,u.width,u.height),o("fillRect",[u.x,u.y,u.width,u.height],a.id),e.strokeRect&&e.strokeRect(u.x,u.y,u.width,u.height),o("strokeRect",[u.x,u.y,u.width,u.height],a.id),e.font="12px sans-serif";let g=a.id;e.fillText&&e.fillText(g,u.x+4,u.y+14),o("fillText",[g,u.x+4,u.y+14],a.id)}for(let a of r){let d=a.id?`${a.id}: ${a.code}`:a.code,u=16+i.filter(g=>g.method==="fillText").length*14;e.fillText&&e.fillText(d,8,u),o("fillText",[d,8,u],a.id)}return i}function Ao(e){return JSON.stringify(e)}function Co(e){return JSON.parse(e)}function dt(e){return e<=0?0:e>=1?1:e}function er(e){return e.x>=0&&e.x<=1&&e.y>=0&&e.y<=1}function So(e){return e.x>=0&&e.y>=0&&e.width>=0&&e.height>=0&&e.x+e.width<=1&&e.y+e.height<=1}function wo(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function He(e){if(e.rect)return e.rect;if(!e.polygon||e.polygon.length===0)return;let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let o of e.polygon)t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x),i=Math.max(i,o.y);return{x:t,y:n,width:r-t,height:i-n}}function xo(e,t){return e.polygon&&e.polygon.length>=3?Po(t,e.polygon):e.rect?t.x>=e.rect.x&&t.x<e.rect.x+e.rect.width&&t.y>=e.rect.y&&t.y<e.rect.y+e.rect.height:!1}function Po(e,t){let n=!1;for(let r=0,i=t.length-1;r<t.length;i=r,r+=1){let o=t[r],a=t[i];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}var ar=320,sr=180,ko="Runtime group has been destroyed";function Ro(e){let t="";for(let n=0;n<32;n++){let r=e.charCodeAt(n%Math.max(e.length,1))+n*17&255;t+=r.toString(16).padStart(2,"0")}return`0x${t}`}function To(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function dr(e){let t=e.capability,n={},r=e.emit??t?.emit,i=e.subscribe??t?.subscribe,o=e.authoritative??t?.authoritative;return r&&(n.emit=r),i&&(n.subscribe=i),o!==void 0&&(n.authoritative=o),n}function or(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Io(e){let t=new Set([se,"*.*","*.*.*","*.*.*.*","*.*.*.*.*"]);for(let n of e){let r=dr(n);for(let i of r.emit??[])t.add(i);for(let i of r.subscribe??[])t.add(i)}return[...t]}function Mo(e){if(!e.participants.length)throw new Error("createRuntimeGroup: at least one participant is required");let t=new Set;for(let p of e.participants){if(!p.id)throw new Error("createRuntimeGroup: participant id is required");if(t.has(p.id))throw new Error(`createRuntimeGroup: duplicate participant id "${p.id}"`);t.add(p.id)}let n=e.origin??0,r=e.width??ar,i=e.height??sr,o=[...e.participants].sort((p,I)=>p.id.localeCompare(I.id)),a=[],d=new Map,u=0,g=e.createId??e.router?.createId??(()=>`evt-${++u}`),m=e.now??e.router?.now??(()=>{let p=a[0];if(!p)return n;try{return p.cart.getClock().now}catch{return n}}),y=kt({...e.router,createId:g,now:m,validate:e.validate??e.router?.validate}),C=[],E=!1,N=!1,f=()=>{},l=p=>I=>{p.events.push(I),p.userOnEvent?.(I)},P=()=>{if(N)throw new Error(ko)},T=()=>{f();for(let p of a){try{y.detach(p.id)}catch{}try{p.runtime.destroy()}catch{}p.ownsContainer&&p.container.remove()}a.length=0,d.clear()};try{for(let p of o){let I=p.width??r,S=p.height??i,_=!p.container,F=p.container??To(I,S),U=St({container:F,seed:p.seed??Ro(p.id),deterministic:{origin:n}}),q={id:p.id,kind:p.kind??"render",cartDef:p.cart,initialState:p.initialState,gameManager:p.gameManager,userOnEvent:p.onEvent,runtime:U,container:F,ownsContainer:_,cart:void 0,events:[],errors:[]};U.onError=(ue,s)=>{q.errors.push({error:ue,info:s})},y.attach(p.id,U.hostChannel,dr(p)),q.cart=U.mount(p.cart,{initialState:p.initialState,gameManager:p.gameManager,onEvent:l(q)}),a.push(q),d.set(q.id,q)}f=y.subscribe(Io(o),p=>{C.push(or(p))})}catch(p){throw T(),p}let W=p=>({id:p.id,kind:p.kind,runtime:p.runtime,container:p.container,get events(){return p.events.slice()},get errors(){return p.errors.slice()},get cart(){return p.cart}});return{router:y,origin:n,get paused(){return E},participant(p){P();let I=d.get(p);if(!I)throw new Error(`createRuntimeGroup: unknown participant "${p}"`);return W(I)},async step(p=1){if(P(),E)return;let I=Math.max(0,Math.floor(p));for(let S=0;S<I;S++){y.turn();for(let _ of a)await _.cart.step(1)}},pause(){P(),E=!0;for(let p of a)p.cart.pause()},resume(){P(),E=!1;for(let p of a)p.cart.resume()},reset(){P(),C.length=0;for(let p of a)p.events.length=0,p.errors.length=0,p.cart=p.runtime.mount(p.cartDef,{initialState:p.initialState,gameManager:p.gameManager,onEvent:l(p)});y.turn()},dispatch(p,I){P();let S=d.get(p);if(!S)throw new Error(`createRuntimeGroup: unknown participant "${p}"`);S.cart.dispatch(I)},publish(p,I){return P(),y.publish(p,I)},async inspect(){P();let p={},I={};for(let _ of a){let F=await _.cart.getReplayMetadata(),U=_.cart.getClock();I[_.id]=U,p[_.id]={state:F.state,events:_.events.slice(),errors:_.errors.slice(),kind:_.kind,clock:U}}let S=C.map(_=>or(_));return{participants:p,trace:S,diagnostics:{paused:E,participantIds:a.map(_=>_.id),clocks:I,rejections:S.filter(_=>_.type===se).map(_=>_.payload)}}},destroy(){if(!N){N=!0,E=!1;try{T()}finally{C.length=0}}}}}export{uo as ANCHOR_ORIGINS,Oe as ASSET_FAILED_EVENT,En as ASSET_FAILURE_CODES,vn as ASSET_KINDS,_e as ASSET_READY_EVENT,Yn as CAPABILITY_ASSET_KINDS,Jn as CAPABILITY_INTEGRATIONS,qn as CAPABILITY_MANAGERS,$i as CAPABILITY_MANIFEST_VERSION,Wn as CAPABILITY_PHASES,so as COORDINATE_SPACES,Ve as CUE_CANCELLED_EVENT,it as CUE_COMPLETED_EVENT,Li as CUE_LIFECYCLE_EVENTS,ot as CUE_REPLACED_EVENT,Le as CUE_STARTED_EVENT,Ke as CYBERART_CANVAS_ATTR,sr as DEFAULT_GROUP_HEIGHT,ar as DEFAULT_GROUP_WIDTH,et as DEFAULT_MAX_HOPS,Ne as EVENT_ENVELOPE_VERSION,io as GEOMETRY_CONTRACT_VERSION,ge as HostChannel,Hn as INVALID_PRESENTATION_MODEL_MESSAGE,j as IncompatibleCartStateError,Ge as KeyboardManager,Se as PRESENTATION_ADAPTER_VERSION,Mt as PRESENTATION_MODEL_EVENT,Vn as PRESENTATION_PHASES,Ri as PRESENTATION_SUBSCRIBE_PATTERNS,Ln as PRESENTATION_UNSUPPORTED_EVENT,$e as PointerManager,se as REJECTED_EVENT_TYPE,oo as ROUND_TRIP_TOLERANCE,ao as ROUND_TRIP_TOLERANCE_CANVAS_PX,Te as Random,be as SILENT_ASSET_FALLBACK_REF,jn as applyCueEasing,ce as assetStatusEvent,mo as assetToNormalized,Zr as attachCartStatePersistence,Bn as attachPresentationAdapter,ze as canonicalizeSeed,nr as canvasToCss,rr as canvasToNormalized,no as capabilityManifestToJSON,wi as comparePayloadSchemas,H as createAssetFailure,Ct as createAssetPreloader,ki as createContractRegistry,kt as createEventRouter,Gr as createFixtureAssetResolver,$r as createHostedAssetResolver,bo as createLandmarkRegistry,po as createPresentationLayout,It as createPresentationModelEvent,Gi as createPresentationTimeline,$n as createReferencePresentationCart,St as createRuntime,Mo as createRuntimeGroup,Be as createVirtualClock,me as createWallClock,tr as cssToCanvas,Kt as cssToNormalized,Vt as defineCapabilityManifest,Si as defineDiagnostic,Ai as defineIntent,Ci as defineStateEvent,xi as deriveAttachOptions,fn as describeReplayMismatch,Eo as drawGeometryDebug,Fn as familyPatternForType,Dn as inferEventKind,Xe as isAssetFailure,Cn as isAssetFailureCode,An as isAssetKind,Vi as isCueLifecycleType,Dt as isPresentationModel,Kn as isPresentationPhase,On as kindSegmentInType,_n as matchEventPattern,Ni as mountPresentationAdapter,tt as normalizeEvent,fo as normalizedToAsset,ho as normalizedToCanvas,Ht as normalizedToCss,to as parseCapabilityManifest,Co as parseGeometry,lo as pointFromOrigin,yo as pointerToRegion,ir as rectToCanvas,Gt as rectToCss,go as regionToViewport,Ur as registerCartStateHotkeys,We as resolveRuntimeSeed,xn as rewriteHostedAssetRef,Ao as serializeGeometry,ro as validateCapabilityManifest,vo as validateGeometry,Pi as verifyAttachOptions};
|
|
8
|
+
var po=Object.defineProperty;var rr=(e,t)=>()=>(e&&(t=e(e=0)),t);var fo=(e,t)=>{for(var n in t)po(e,n,{get:t[n],enumerable:!0})};var Co={};function So(e,t){let n=e.indexOf(yr);if(n===-1)return null;let r=n+yr.length,o=`const __cyberSkip=new Set(${JSON.stringify(t)});const __cyberOrig=registerProcessor;registerProcessor=(n,p)=>__cyberSkip.has(n)?undefined:__cyberOrig(n,p);`;return e.slice(0,r)+o+e.slice(r)}var Qt,vt,Eo,Xe,yr,gr=rr(()=>{"use strict";Qt=/AudioWorkletProcessor with name:\s*["'`][^"'`]+["'`]\s+is already registered/i,vt="__cyberartWorkletPatchApplied";typeof window<"u"&&!window[vt]&&(window.addEventListener("error",e=>{let t=e?.message??"";Qt.test(t)&&(e.preventDefault(),e.stopImmediatePropagation())},!0),window.addEventListener("unhandledrejection",e=>{let t=e?.reason,n=typeof t=="string"?t:t?.message??"";Qt.test(n)&&e.preventDefault()}),window[vt]=!0);Eo=!1,Xe=(...e)=>{Eo&&console.log("[workletPatch]",...e)},yr="((AudioWorkletProcessor,registerProcessor)=>{";if(typeof AudioWorklet<"u"&&!AudioWorklet.prototype[vt]){let e=new WeakMap,t=/registerProcessor\s*\(\s*['"`]([^'"`]+)['"`]/g,n=AudioWorklet.prototype.addModule,r=0;AudioWorklet.prototype.addModule=async function(o,a){let d=++r,c=e.get(this);c||(c=new Set,e.set(this,c)),Xe(`#${d} addModule`,{url:o.slice(0,64),isBlob:o.startsWith("blob:"),knownBefore:[...c]});let v=o,y=null;if(o.startsWith("blob:")){let g=null;try{g=await(await fetch(o)).text()}catch(w){Xe(`#${d} blob fetch failed`,w)}if(g!==null){let w=new Set;for(let k of g.matchAll(t))w.add(k[1]);if(w.size>0){let k=[...w].filter(m=>c.has(m)),I=[...w].filter(m=>!c.has(m));if(k.length>0&&I.length===0){Xe(`#${d} short-circuit \u2014 all processors already registered`,k);return}if(k.length>0&&I.length>0){let m=So(g,k);if(m!==null){let x=new Blob([m],{type:"application/javascript"});y=URL.createObjectURL(x),v=y,Xe(`#${d} rewrote blob; skipping`,k,"allowing",I)}else Xe(`#${d} blob rewrite failed; passing original through`)}I.forEach(m=>c.add(m))}}}return n.call(this,v,a).then(()=>{y&&URL.revokeObjectURL(y)},g=>{y&&URL.revokeObjectURL(y);let w=(g&&g.message)??"";if(!(Qt.test(w)||/already registered/i.test(w)))throw g})},AudioWorklet.prototype[vt]=!0}});var vr={};fo(vr,{AUDIO_LIBRARIES:()=>Zt,adaptersFor:()=>Ct,importTone:()=>Et,normalizeAudioLibraries:()=>St});async function Et(){let e=await import("tone");if(typeof e.start=="function")return e;let t=e.default;return t&&typeof t.start=="function"?t:e}function St(e){if(!e)return[];let t=Array.isArray(e)?e:[e],n=[];for(let r of t){if(!(r in Zt)){console.warn(`Unknown audio library "${r}"`);continue}let i=r;n.includes(i)||n.push(i)}return n}function Ct(e){return e.map(t=>Zt[t])}var br,Zt,en=rr(()=>{"use strict";br={id:"tone",async load(){await Promise.resolve().then(()=>(gr(),Co))},async unlock(){await br.load(),await(await Et()).start()},async resumeIfSuspended(){let e=await Et();e.context.state==="suspended"&&await e.context.resume()},async suspendIfRunning(){let t=(await Et()).context.rawContext;"suspend"in t&&t.state==="running"&&await t.suspend()}},Zt={tone:br}});var ir=()=>{let e=["ms","moz","webkit","o"];for(let t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"]},oe=window.devicePixelRatio||1,Te=/Headless/i.test(navigator.userAgent),Ud=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)||/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform);function or(){return Math.min(window.innerWidth,window.innerHeight)}var lt="data-cyberart-canvas",Me=class{constructor(t,n,r=1,i={}){this.width=t,this.height=n;let o=i.container,a=i.adoptFromDocument??!o,d=o?o.querySelector(`canvas[${lt}]`)??o.querySelector("canvas"):null;if(d)this.canvas=d,this.adopted=!0;else if(a){let c=document.getElementById("canvas")??document.querySelector("canvas");c?(this.canvas=c,this.adopted=!0):(this.canvas=document.createElement("canvas"),this.canvas.setAttribute("id","canvas"),this.adopted=!1)}else this.canvas=document.createElement("canvas"),this.adopted=!1;this.canvas.hasAttribute(lt)||this.canvas.setAttribute(lt,""),this.canvas.style.display="block",this.canvas.style.margin="auto",this.ctx=this.canvas.getContext("2d",{colorSpace:"display-p3",alpha:!1}),this.ctx.globalAlpha=r,this.ctx.imageSmoothingEnabled=!1,this.setSize(t,n)}setSize(t,n){this.width=t,this.height=n,this.canvas.width=t,this.canvas.height=n,this.canvas.style.width=`${t/oe}px`,this.canvas.style.height=`${n/oe}px`,this.imageData=this.ctx.createImageData(t,n),this.ctx.putImageData(this.imageData,0,0)}_blank(t=1){let n=t?Math.max(t,.03):1;this.ctx.fillStyle=`rgba(0,0,0,${n})`,this.ctx.fillRect(0,0,this.width,this.height)}clearAll(){this.ctx.save(),this.ctx.globalAlpha=1,this._blank(),this.ctx.restore()}};function sr(e,t){let n=e/t,r,i;return n>1?(r=e,i=~~(e/n)):(i=t,r=~~(t*n)),{width:r,height:i,iWidth:1/r,iHeight:1/i,area:r*i,largeDim:Math.max(r,i),smallDim:Math.min(r,i),aspectRatio:n}}function ar(e,t=window.innerWidth,n=window.innerHeight){let r=or(),i,o;return n<t?e>1?t>=r*e?(i=r*e,o=r):(i=t,o=i/e):(i=r*e,o=r):e>1?(i=r,o=r/e):n<r/e?(o=n,i=o*e):(i=r,o=r/e),[i,o]}var pt=class{constructor(t=!1,n=!0){this.debugMode=t,this.actionMap={},this.listening=n,this.checkKeypress=this.checkKeypress.bind(this),this.registerAction=this.registerAction.bind(this),this.listening&&window.addEventListener("keydown",this.checkKeypress,!1)}checkKeypress({key:t}){this.debugMode&&console.log(`Pressed ${t}`),t in this.actionMap&&this.actionMap[t]()}inject(t){this.checkKeypress({key:t})}registerAction(t,n,r=!1){if(t.length!==1)throw new Error(`Only single-character actions may be registered. Cannot register: ${t}`);if(t in this.actionMap&&!r)throw new Error(`Action already exists for code: ${t}`);this.actionMap[t]=n}destroy(){this.listening&&window.removeEventListener("keydown",this.checkKeypress,!1),this.actionMap={}}},dr=pt;var ft=class{constructor(t,n={}){this.x=-1;this.y=-1;this.isDown=!1;this.clicks=[];this.canvas=t,this.listening=n.listen!==!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.listening&&(t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointermove",this.onPointerMove),t.addEventListener("pointerup",this.onPointerUp))}toCanvasCoords(t){let n=this.canvas.getBoundingClientRect();return{x:(t.clientX-n.left)*(this.canvas.width/n.width),y:(t.clientY-n.top)*(this.canvas.height/n.height)}}onPointerDown(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!0,this.clicks.push({x:n,y:r})}onPointerMove(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r}onPointerUp(t){let{x:n,y:r}=this.toCanvasCoords(t);this.x=n,this.y=r,this.isDown=!1}hasClick(){return this.clicks.length>0}consumeClick(){return this.clicks.shift()??null}inject(t,n,r){this.x=n,this.y=r,t==="down"?(this.isDown=!0,this.clicks.push({x:n,y:r})):t==="up"&&(this.isDown=!1)}destroy(){this.listening&&(this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp))}},ur=ft;function De(){return{now:()=>performance.now()}}function mt(e=0){let t=e;return{now:()=>t,set(n){t=n},advance(n){t+=n}}}var cr=(e,t,n,r)=>({now:e,startTime:t,elapsedSinceStart:e-t,deltaSinceLastUpdate:n===null?0:e-n,deltaSinceLastRender:r===null?0:e-r}),ht=class{constructor(t,n,r,i,o,a={}){this.startTime=0;this.lastUpdateAt=null;this.lastRenderAt=null;this.clockOffsetMs=0;this.pauseStartedAt=null;this.renderAnimation=this.renderAnimation.bind(this),this.dimensionContext=sr(t,n),this.R=r,this.gameManager=a.gameManager,this.hostChannel=a.hostChannel,this.clock=a.clock??De(),this.canvas=new Me(this.dimensionContext.width,this.dimensionContext.height,1,a.canvasMount),this.drawingContext=this.canvas.ctx,this.keyboardManager=new dr(!1,a.captureKeyboard??!0),this.pointerManager=new ur(this.canvas.canvas,{listen:a.listenToPointer!==!1}),this.animationCart=o;let d=a.customState;this.featureState=o.getDefaultFeatureState?.(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.hostChannel),this.cartState=o.getDefaultState(this.R,this.dimensionContext,i,this.keyboardManager,d,this.pointerManager,this.gameManager,this.featureState,this.hostChannel),this.startTime=this.clock.now(),this.canvas.clearAll()}captureFramebuffer(){let t=this.canvas.imageData,n=new ImageData(t.width,t.height);return n.data.set(t.data),n}restoreFramebuffer(t){let n=this.canvas.imageData;return n.width!==t.width||n.height!==t.height||n.data.length!==t.data.length?!1:(n.data.set(t.data),this.drawingContext.putImageData(n,0,0),!0)}setPaused(t){let n=this.clock.now();if(t){this.pauseStartedAt===null&&(this.pauseStartedAt=n);return}this.pauseStartedAt!==null&&(this.clockOffsetMs+=n-this.pauseStartedAt,this.pauseStartedAt=null)}resolveNow(t){let n=this.pauseStartedAt!==null?t-this.pauseStartedAt:0;return t-this.clockOffsetMs-n}getElapsedSinceStart(t=this.clock.now()){return Math.max(0,this.resolveNow(t)-this.startTime)}restoreClock(t,n){this.pauseStartedAt=null,this.lastUpdateAt=null,this.lastRenderAt=null;let r=Math.max(0,t);if(typeof n=="number"&&Number.isFinite(n)){this.startTime=n,this.clockOffsetMs=this.clock.now()-n-r;return}this.clockOffsetMs=0,this.startTime=this.clock.now()-r}getRandomState(){return this.R.getState()}injectKey(t){this.keyboardManager.inject(t)}injectPointer(t,n,r){this.pointerManager.inject(t,n,r)}async updateAnimationState(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=cr(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.cartState=this.animationCart.update(this.R,t,n,this.dimensionContext,this.cartState,this.keyboardManager,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastUpdateAt=i}async renderAnimation(t,n,r=this.clock.now()){let i=this.resolveNow(r),o=cr(i,this.startTime,this.lastUpdateAt,this.lastRenderAt);this.animationCart.render(this.R,t,n,this.dimensionContext,this.cartState,this.drawingContext,this.canvas.imageData,this.pointerManager,this.gameManager,o,this.featureState,this.hostChannel),this.lastRenderAt=i}getCanvas(){return this.canvas.canvas}getDrawDetails(){return[this.canvas.canvas,0,0,this.dimensionContext.width,this.dimensionContext.height]}teardown(){try{this.animationCart.teardown?.(this.cartState,this.featureState)}catch(t){console.error("Error during cart teardown",t)}this.keyboardManager.destroy(),this.pointerManager.destroy()}};var yt=class extends Me{constructor(t,n,r=1,i=!0,o={}){if(super(t,n,r,o),this.adopted)return;let a=o.container;if(a){this.canvas.parentNode!==a&&a.appendChild(this.canvas);return}if(i){let d=document.getElementById("canvas");d&&d!==this.canvas&&d.parentNode===document.body&&document.body.removeChild(d),document.body.appendChild(this.canvas)}}};function lr(e){let t=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,8),16),r=parseInt(e.substring(16,8),16),i=parseInt(e.substring(24,8),16);return{next:()=>{t|=0,n|=0,r|=0,i|=0;let a=(t+n|0)+i|0;return i=i+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+a|0,(a>>>0)/4294967296},getRegs:()=>({a:t,b:n,c:r,d:i}),setRegs:a=>{t=a.a,n=a.b,r=a.c,i=a.d}}}var Ye=class{constructor(t){this.seed=t.hash,this.useA=!1,this.genA=lr(t.hash.substring(2,32)),this.genB=lr(t.hash.substring(34,32)),this.prngA=this.genA.next,this.prngB=this.genB.next;for(let n=0;n<1e6;n+=2)this.prngA(),this.prngB()}getState(){let t=this.genA.getRegs(),n=this.genB.getRegs();return{seed:this.seed,useA:this.useA,prngA:{a:t.a,b:t.b,c:t.c,d:t.d},prngB:{a:n.a,b:n.b,c:n.c,d:n.d}}}setState(t){if(t.seed!==this.seed)throw new Error(`Random.setState: seed ${t.seed} does not match ${this.seed}`);this.useA=t.useA,this.genA.setRegs(t.prngA),this.genB.setRegs(t.prngB)}r_zero_one(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}dec(t,n){return t===void 0?this.r_zero_one():n===void 0?t*this.r_zero_one():t+(n-t)*this.r_zero_one()}int(t,n){return n===void 0&&(n=t,t=0),Math.floor(this.dec(t,n))}bool(t=.5){return this.r_zero_one()<t}sign(){return this.bool()?1:-1}choose(t){return t[this.int(t.length)]}};var fr="bafybeicjwcq5lxxtfnyj4p2ugcr7ctyb5wl62cbcechj6tsabdq5whcs7u",pr="https://ipfs.io/ipfs/";function mo(e){return e.endsWith("/")?e:`${e}/`}var Je=null;function ho(e){return[...Array(e)].map(()=>Math.floor(Math.random()*16).toString(16)).join("")}function yo(e){return e&&e.length>0?e:[{cid:fr}]}function go(e){return e.startsWith("0x")?e:`0x${e}`}var mr=/^(0[xX])?[0-9a-fA-F]{64}$/;function bo(e){let t="",n=2166136261,r=522970236;for(let i=0;t.length<64;i++){for(let o=0;o<e.length;o++)n^=e.charCodeAt(o)+i,n=Math.imul(n,16777619),r^=e.charCodeAt(o)+i*17,r=Math.imul(r,16777619);t+=(n>>>0).toString(16).padStart(8,"0"),t+=(r>>>0).toString(16).padStart(8,"0")}return`0x${t.slice(0,64)}`}function gt(e){let t=typeof e=="number"?String(e):e;return mr.test(t)?`0x${(t.startsWith("0x")||t.startsWith("0X")?t.slice(2):t).toLowerCase()}`:bo(t)}function bt(e,t){if(typeof e=="number"||t==="deterministic")return gt(e);let n=String(e);return mr.test(n)?gt(n):n.startsWith("0x")||n.startsWith("0X")?n:`0x${n}`}function vo(e){if(!e&&typeof tokenData<"u"&&tokenData?.hash)return{hash:tokenData.hash,tokenId:String(tokenData.tokenId),externalAssetDependencies:yo(tokenData.externalAssetDependencies),preferredIPFSGateway:mo(tokenData.preferredIPFSGateway||pr),preferredArweaveGateway:tokenData.preferredArweaveGateway};let t=typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams;return{hash:e?go(e):t.get("hash")||`0x${ho(64)}`,tokenId:"18009999",externalAssetDependencies:[{cid:fr}],preferredIPFSGateway:pr}}function Xt(e){let t=e?.useCache!==!1;if(t&&Je&&!e?.hash)return Je;let n=vo(e?.hash);return t?Je=n:Je||(Je=n),n}function hr(e){return new Array(32).fill(null).map((t,n)=>parseInt(e.hash.slice(2+n*2,4+n*2),16))}en();var wt="$cyberartTa",Q=class extends Error{constructor(t){super(t),this.name="IncompatibleCartStateError"}},tn={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array};function wo(e){for(let t of Object.keys(tn))if(e instanceof tn[t])return t}function Sr(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function ce(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nn(e){return ce(e)?typeof e[wt]=="string"&&Array.isArray(e.d):!1}function Ao(e){return e==null?!1:typeof e=="function"?!0:!(typeof e!="object"||Array.isArray(e)||Sr(e)||ce(e))}var ko=new Set(["audioContextStarted","midiSynths","keepRatioPrimed","audioInitStarted","musicSeekApplied"]);function Er(e){return e===null?"null":nn(e)?String(e[wt]):Array.isArray(e)?"array":ce(e)?"object":typeof e}function Ro(e,t){return e===t||e==="null"||t==="null"}function ge(e){return e.trim().toLowerCase().replace(/^0x/,"")}function Cr(e,t,n,r){if(!(!n&&!r)&&ge(e)!==ge(t))throw new Q(`Generative cart state is for seed "${t}", but the live token is "${e}"`)}function Oe(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function wr(e,t){let n=e.dimensions;if(n&&Oe(n.width)&&Oe(n.height))return n;if(t&&Oe(t.width)&&Oe(t.height))return{width:t.width,height:t.height};if(ce(e.state)){let r=e.state.containerWidth,i=e.state.containerHeight;if(Oe(r)&&Oe(i))return{width:r,height:i}}return null}function _e(e,t=new WeakSet){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:null;if(!(typeof e=="function"||typeof e>"u"||typeof e=="bigint"||typeof e=="symbol")){if(Sr(e)){let n=wo(e);return n?{[wt]:n,d:Array.from(e)}:void 0}if(typeof e=="object"&&!t.has(e)){t.add(e);try{if(Array.isArray(e)){let i=[],o=0;for(let a of e){let d=_e(a,t);d!==void 0&&(i.push(d),o++)}return e.length>0&&o===0?void 0:i}if(!ce(e)||Ao(e))return;let n=Object.keys(e),r={};for(let i of n){if(ko.has(i))continue;let o=_e(e[i],t);o!==void 0&&(r[i]=o)}return n.length>0&&Object.keys(r).length===0?void 0:r}finally{t.delete(e)}}}}function Qe(e){if(nn(e)){let t=tn[e[wt]];return t?new t(e.d.map(n=>Number(n))):e}if(Array.isArray(e))return e.map(t=>Qe(t));if(ce(e)){let t={};for(let n of Object.keys(e))t[n]=Qe(e[n]);return t}return e}function rn(e,t,n,r,i=!0){if(i&&n&&r&&n!==r)throw new Q(`Cart state is for "${r}", but the live cart is "${n}"`);if(!ce(t)){if(i)throw new Q("Cart state snapshot is empty");return}let o=Object.keys(t);if(o.length===0){if(i)throw new Q("Cart state snapshot is empty");return}let a=_e(e);if(!ce(a)||Object.keys(a).length===0){if(i)throw new Q("Live cart has no serializable state");return}let d=o.filter(c=>c in a);if(d.length===0){if(i)throw new Q("Cart state snapshot does not overlap the live cart shape");return}for(let c of d){let v=Er(a[c]),y=Er(t[c]);if(!Ro(v,y))throw new Q(`Cart state field "${c}" has type ${y}, live cart expects ${v}`);if(v==="object"){let g=t[c],w=e[c];ce(g)&&!nn(g)&&rn(w,g,void 0,void 0,!1)}}}function Ar(e,t){if(!ce(e)||!ce(t))return;let n=_e(e);if(ce(n))for(let r of Object.keys(t))r in n&&(e[r]=Qe(t[r]))}function re(e){let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object")throw new Q("Cart state bundle is not an object");if(t.version!==1)throw new Q(`Unsupported cart state version ${String(t.version)}`);if(typeof t.seed!="string"||typeof t.framesElapsed!="number")throw new Q("Cart state bundle is missing seed or framesElapsed");return t}var he="cyberart.asset.ready",ye="cyberart.asset.failed";function be(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function le(e){try{return JSON.stringify(e)}catch{return String(e)}}function on(e,t,n){let r=t??[],i=n??[],o=Math.max(r.length,i.length);for(let a=0;a<o;a++)if(le(r[a])!==le(i[a]))return`${e}[${a}]: ${le(r[a])} vs ${le(i[a])}`}function kr(e,t){let n=[];e.seed!==t.seed&&n.push(`seed: ${e.seed} vs ${t.seed}`),e.clock.framesElapsed!==t.clock.framesElapsed&&n.push(`framesElapsed: ${e.clock.framesElapsed} vs ${t.clock.framesElapsed}`),e.clock.now!==t.clock.now&&n.push(`now: ${e.clock.now} vs ${t.clock.now}`),e.clock.frameRate!==t.clock.frameRate&&n.push(`frameRate: ${e.clock.frameRate} vs ${t.clock.frameRate}`),le(e.rng)!==le(t.rng)&&n.push(`rng: ${le(e.rng)} vs ${le(t.rng)}`);let r=on("actions",e.actions,t.actions);r&&n.push(r);let i=on("applied",e.applied,t.applied);i&&n.push(i);let o=on("events",e.events,t.events);return o&&n.push(o),le(e.state)!==le(t.state)&&n.push(`state: ${le(e.state)} vs ${le(t.state)}`),n}function Rr(e){return{type:e.status==="ready"?he:ye,kind:"state",payload:e.detail===void 0?{id:e.id}:{id:e.id,detail:e.detail}}}function Po(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.startTime=="number"&&typeof t.lastSimulationUpdateAt=="number"?Math.max(0,t.lastSimulationUpdateAt-t.startTime):0}function Io(e,t){if(typeof window.resizeTo!="function")return!1;try{if(window.top!==window)return!1}catch{return!1}let n=Math.max(1,Math.round(e)),r=Math.max(1,Math.round(t)),i=Math.max(0,window.outerWidth-window.innerWidth),o=Math.max(0,window.outerHeight-window.innerHeight);try{window.resizeTo(n+i,r+o)}catch{return!1}return Math.abs(window.innerWidth-n)<=8&&Math.abs(window.innerHeight-r)<=8}var To=[[0,0],[16,9],[9,16],[4,3],[3,4],[2,1],[1,2],[3,1],[1,3],[1,1]],an=To[0],Mo=an[0]/an[1],sn=30,Do=120,Oo=3840/2160,_o=2160/3840,At=class{constructor(t=sn,n=!1,r=window.innerWidth,i=window.innerHeight,o=!0,a,d={}){this.framesElapsed=0;this.frameRate=sn;this._paused=!1;this.savedToken=!1;this.prepared=!1;this.loopRunning=!1;this.fallbackAudio=[];this.audioLibrariesInternal=[];this.virtualClock=null;this.scriptedActions=[];this.initialScriptedActions=[];this.appliedActions=[];this.consumedActionIndexes=new Set;this.outboundEvents=[];this.consecutiveErrorCount=0;this.lastErrorLogAt=0;this.reinitStayPaused=!1;this.reinitPending=!1;this.lastExportedFramebuffer=null;this.pinnedOutput=null;this.pinViewportAtImport=null;this.importing=!1;this.drawLoop=this.drawLoop.bind(this),this.loadCart=this.loadCart.bind(this),this.prepareCart=this.prepareCart.bind(this),this.beginPlayback=this.beginPlayback.bind(this),this.reinit=this.reinit.bind(this),this.tuneFramerate=this.tuneFramerate.bind(this),this.container=d.container,this.seed=d.seed,this.captureKeyboard=d.captureKeyboard??!0,this.customState=d.customState,this.hostChannel=d.hostChannel,this.fallbackAudio=St(d.audio),this.audioLibrariesInternal=this.fallbackAudio;let c=d.deterministic;this.deterministic=!!c;let v=c&&typeof c=="object"?c:{};if(this.deterministic){if(d.clock){let y=d.clock;if(typeof y.advance!="function")throw new Error("deterministic mode requires a virtual clock with advance()");this.virtualClock=y,this.clock=y}else this.virtualClock=mt(v.origin??0),this.clock=this.virtualClock;this.initialScriptedActions=be(v.actions??[]),this.scriptedActions=be(this.initialScriptedActions)}else this.clock=d.clock??De();this.isBodyCanvas=this.container?!1:o,this.autoMode=n,this.aspectRatio=Mo,this.selectedAsp=an,this.isFullscreen=!!document.fullscreenElement,this.updateFrameRate(t),this.tempUnpause=!1,this.synchronous=Te,this.containerWidth=r,this.containerHeight=i,this.gameManager=a,this.init(!0)}setGameManager(t){this.gameManager=t}reinit(t){if(!this.importing){if(this.shouldKeepPinnedOutput()){this.fitPinnedCanvas();return}this.reinitPending||(this.reinitStayPaused=this._paused,this.reinitPending=!0),this.paused=!0,clearTimeout(this.reinitTimeout),this.reinitTimeout=setTimeout(()=>{if(this.importing){this.paused=this.reinitStayPaused,this.reinitPending=!1;return}this.updateInProgress?this.reinit(t):(this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.clearPinnedOutput(),this.init(),this.reloadCart(),this.paused=this.reinitStayPaused,this.reinitPending=!1)},150)}}initSeed(){this.tokenData=this.seed?Xt({hash:this.seed,useCache:!1}):Xt(),this.rawParams=hr(this.tokenData),this.mintNo=parseInt(this.tokenData.tokenId)%1e6,console.log("token",this.mintNo,this.tokenData.hash)}init(t=!1){t&&this.initSeed(),this.pureAspectUpdate(this.selectedAsp);let n=this.aspectRatio,[r,i]=ar(n,this.containerWidth,this.containerHeight);r*=oe,i*=oe,this.width=~~r,this.height=~~i,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.mainCanvas?this.mainCanvas.setSize(this.width,this.height):this.mainCanvas=new yt(this.width,this.height,1,this.isBodyCanvas,this.canvasMountOptions())}loadCart(t){this.prepareCart(t)&&this.beginPlayback()}prepareCart(t){if(this.prepared)return!0;try{let n=~~(this.width/1),r=~~(this.height/this.width*n),i=new Ye(this.tokenData),o=new ht(n,r,i,this.rawParams,t,{gameManager:this.gameManager,canvasMount:this.canvasMountOptions(),customState:this.customState,captureKeyboard:this.deterministic?!1:this.captureKeyboard,hostChannel:this.hostChannel,clock:this.clock,listenToPointer:!this.deterministic});return this.animation=o,this.animationCart=t,this.paused=!1,this.framesElapsed=0,this.outboundEvents=[],this.scriptedActions=be(this.initialScriptedActions),this.appliedActions=[],this.consumedActionIndexes=new Set,this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.deterministic&&this.hostChannel&&(this.outboundUnsubscribe=this.hostChannel.onEvent(a=>{this.outboundEvents.push(a)})),this.R=i,this.applyCartFrameRate(t,o),this.resolveAudioLibraries(t),this.prepared=!0,!0}catch(n){return console.error(n),!1}}applyCartFrameRate(t,n){let r=t.metadata,i=r?.frameRate??sn,o=n.cartState?.visualMode??n.featureState?.visualMode,a=o&&r?.frameRateByVisualMode?r.frameRateByVisualMode[o]:void 0;this.updateFrameRate(typeof a=="number"&&a>0?a:i)}get audioLibraries(){return this.audioLibrariesInternal}get needsAudio(){return this.audioLibrariesInternal.length>0}resolveAudioLibraries(t){this.audioLibrariesInternal=St(t.metadata?.audio)}async unlockAudio(){if(this.audioLibrariesInternal.length===0)return;let t=Ct(this.audioLibrariesInternal);if(Te){for(let n of t)await n.load();return}for(let n of t)await n.unlock()}async resumeAudioLibraries(){if(!(this.paused||Te))for(let t of Ct(this.audioLibrariesInternal))try{await t.resumeIfSuspended()}catch(n){console.error(`Failed to resume audio library "${t.id}" after reload`,n)}}beginPlayback(){!this.prepared||this.loopRunning||(this.prepared=!1,this.loopRunning=!0,this.consecutiveErrorCount=0,!this.deterministic&&(this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)))}get isPrepared(){return this.prepared}get isLoopRunning(){return this.loopRunning}get isDeterministic(){return this.deterministic}getClock(){return{now:this.clock.now(),framesElapsed:this.framesElapsed,frameRate:this.frameRate}}getRandomState(){return this.requirePreparedAnimation().getRandomState()}schedule(t){this.scriptedActions.push(be(t))}async getReplayMetadata(){let t=await this.exportState();return{seed:this.tokenData.hash,clock:this.getClock(),rng:this.getRandomState(),actions:be(this.scriptedActions),applied:be(this.appliedActions),events:be(this.outboundEvents),state:t.state}}async step(t=1){if(!this.deterministic)throw new Error("step() requires createRuntime({ deterministic: true })");this.requirePreparedAnimation(),this.prepared&&!this.loopRunning&&this.beginPlayback(),this.paused=!1;let n=Math.max(0,Math.floor(t));for(let r=0;r<n&&this.animation;r++){let i=this.framesElapsed;if(this.applyScheduledActions(i),await this.processFrame(this.clock.now(),{ignorePause:!0,scheduleNext:!1}),this.framesElapsed===i||(this.virtualClock?.advance(this.targetDrawTime),!this.loopRunning))break}}async advance(t){let n=Math.max(0,Math.round(t/this.targetDrawTime));await this.step(n)}applyScheduledActions(t){let n=this.animation;n&&this.scriptedActions.forEach((r,i)=>{r.atFrame===t&&(this.consumedActionIndexes.has(i)||(this.consumedActionIndexes.add(i),r.type==="pointer"?n.injectPointer(r.pointer.kind,r.pointer.x,r.pointer.y):r.type==="key"?n.injectKey(r.key):r.type==="event"?this.hostChannel?.dispatch(r.event):r.type==="asset"&&this.hostChannel?.dispatch(Rr(r)),this.appliedActions.push({frame:t,action:r})))})}get paused(){return this._paused}set paused(t){this._paused!==t&&(this._paused=t,this.animation?.setPaused(t))}async waitUntilUpdateIdle(){for(;this.updateInProgress;)await new Promise(t=>{this.deterministic?queueMicrotask(t):typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,0)})}requirePreparedAnimation(){if(!this.animation)throw new Error("No prepared cart");return this.animation}async exportState(){let t=this.requirePreparedAnimation(),n=this._paused;this.paused=!0,await this.waitUntilUpdateIdle();try{this.lastExportedFramebuffer=t.captureFramebuffer();let r=t.getCanvas();return{version:1,cartId:this.animationCart?.metadata?.id,generative:this.animationCart?.metadata?.generative,seed:this.tokenData.hash,framesElapsed:this.framesElapsed,elapsedSinceStart:t.getElapsedSinceStart(),dimensions:{width:r.width,height:r.height,cssWidth:this.containerWidth,cssHeight:this.containerHeight,dpr:oe},state:_e(t.cartState)}}finally{this.paused=n}}async exportStateJSON(){return JSON.stringify(await this.exportState())}peekExportedFramebuffer(){return this.lastExportedFramebuffer}peekSeed(){return this.tokenData?.hash}isGenerative(){return this.animationCart?.metadata?.generative===!0}async importState(t,n){let r=this.requirePreparedAnimation(),i=re(t),o=this._paused,a=this.loopRunning;this.paused=!0,await this.waitUntilUpdateIdle(),rn(r.cartState,i.state,this.animationCart?.metadata?.id,i.cartId),Cr(this.tokenData.hash,i.seed,this.animationCart?.metadata?.generative,i.generative),clearTimeout(this.reinitTimeout),this.reinitPending=!1,this.importing=!0;let d=wr(i,n?.framebuffer??this.lastExportedFramebuffer);if(d){this.pinOutputSize(d);let y=d.cssWidth??d.width/oe,g=d.cssHeight??d.height/oe;Io(y,g),this.syncContainerFromDom(),this.pinViewportAtImport={w:this.containerWidth,h:this.containerHeight}}let c=this.customState,v=!1;try{if(this.customState=Qe(i.state),this.unloadCart(),!this.prepareCart(this.animationCart))throw new Error("Failed to prepare cart while loading state");this.animation.cartState!==this.customState&&Ar(this.animation.cartState,i.state),this.framesElapsed=i.framesElapsed;let y=this.animation,g=y.cartState,w=typeof i.elapsedSinceStart=="number"?i.elapsedSinceStart:Po(g);y.restoreClock(w,typeof g?.startTime=="number"?g.startTime:void 0),o&&y.setPaused(!0);let k=n?.framebuffer??this.lastExportedFramebuffer;k&&y.restoreFramebuffer(k)?g.keepRatioPrimed=!0:await y.renderAnimation(this.framesElapsed,this.rawParams),this.fitPinnedCanvas(),v=!0}catch(y){throw this.clearPinnedOutput(),this.customState=c,this.paused=o,this.animationCart&&(this.syncContainerFromDom(),this.init(),this.reloadCart()),y}finally{this.importing=!1,v&&(this.customState=c,this.paused=o,a&&this.beginPlayback())}}unloadCart(){this.loopRunning=!1,this.requestedAnimationFrame&&cancelAnimationFrame(this.requestedAnimationFrame),this.drawLoopTimeout&&clearTimeout(this.drawLoopTimeout),this.animation?.teardown(),this.animation=void 0,this.prepared=!1,this.audioLibrariesInternal=this.fallbackAudio,this.mainCanvas?.clearAll()}reloadCart(t=!1){let n=this.animationCart;if(!n)return;this.pinnedOutput&&(this.clearPinnedOutput(),this.syncContainerFromDom(),this.init());let r=this.reinitPending?this.reinitStayPaused:this._paused;this.unloadCart(),t&&this.initSeed(),this.loadCart(n),this.paused=r,!this.paused&&!Te&&this.resumeAudioLibraries()}getFrameRate(){return this.frameRate}updateFrameRate(t){if(this.frameRate=t,t>=1)this.targetDrawTime=1e3/t;else{let r=1/(2-t);this.targetDrawTime=1e3/r}this.drawTime=this.targetDrawTime}canvasMountOptions(){return{container:this.container,adoptFromDocument:!this.container}}syncContainerFromDom(){if(this.container){this.containerWidth=this.container.clientWidth||this.containerWidth,this.containerHeight=this.container.clientHeight||this.containerHeight;return}this.containerWidth=window.innerWidth,this.containerHeight=window.innerHeight}pinOutputSize(t){this.pinnedOutput=t,this.width=~~t.width,this.height=~~t.height,this.atCenterX=this.width/2,this.atCenterY=this.height/2,this.aspectRatio=this.width/this.height,this.mainCanvas&&this.mainCanvas.setSize(this.width,this.height)}shouldKeepPinnedOutput(){return this.pinnedOutput?(this.syncContainerFromDom(),this.viewportMatches(this.pinnedCssSize())?!0:!!(this.pinViewportAtImport&&this.viewportMatches(this.pinViewportAtImport))):!1}pinnedCssSize(){let t=this.pinnedOutput;return{w:t.cssWidth??t.width/oe,h:t.cssHeight??t.height/oe}}viewportMatches(t){return Math.abs(this.containerWidth-t.w)<8&&Math.abs(this.containerHeight-t.h)<8}fitPinnedCanvas(){let t=this.pinnedOutput,n=this.canvas;if(!t||!n)return;this.container&&!this.container.style.position&&(this.container.style.position="relative");let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=t.width/oe,a=t.height/oe;if(o<1||a<1||r<1||i<1)return;let d=Math.min(r/o,i/a),c=o*d,v=a*d;n.style.position="absolute",n.style.left="50%",n.style.top="50%",n.style.transform="translate(-50%, -50%)",n.style.margin="0",n.style.width=`${c}px`,n.style.height=`${v}px`,n.style.imageRendering=Math.abs(d-1)<.01?"auto":"pixelated"}clearPinnedOutput(){let t=this.canvas;this.pinnedOutput=null,this.pinViewportAtImport=null,t&&(t.style.position="",t.style.left="",t.style.top="",t.style.transform="",t.style.imageRendering="",t.style.width="",t.style.height="",t.style.margin="auto")}get canvas(){return this.animation?.getCanvas()??this.mainCanvas?.canvas}destroy(){this.outboundUnsubscribe?.(),this.outboundUnsubscribe=void 0,this.clearPinnedOutput(),this.unloadCart(),clearTimeout(this.reinitTimeout),this.mainCanvas&&!this.mainCanvas.adopted&&this.mainCanvas.canvas.remove()}drawIt(){}tuneFramerate(t){let n=this.lastCall||t;this.lastCall=t,this.drawTime=Math.max(0,this.drawTime+this.targetDrawTime-this.lastCall+n)}async processFrame(t,n={}){let r=n.ignorePause===!0,i=n.scheduleNext!==!1;if(!this.loopRunning&&!r)return;let o=!1,a,d="update";try{if(r||!this.paused||this.tempUnpause){if(!Te&&!r&&this.tuneFramerate(t),!this.animation)return;if(d="update",this.updateInProgress=!0,await this.animation.updateAnimationState(this.framesElapsed,this.rawParams,t),this.updateInProgress=!1,d="render",await this.animation.renderAnimation(this.framesElapsed,this.rawParams,t),this.autoMode&&this.animation.cartState.saveToken&&!this.savedToken&&!new URLSearchParams(window.location.search).get("hash")){let y=localStorage.getItem("goodones"),g=JSON.stringify(y?[...JSON.parse(y),this.tokenData.hash]:[this.tokenData.hash]);localStorage.setItem("goodones",g),this.savedToken=!0,localStorage.setItem(this.tokenData.hash,this.mainCanvas.canvas.toDataURL("image/png")),window.location.reload(),this.loopRunning=!1;return}this.framesElapsed++,this.tempUnpause&&(this.tempUnpause=!1)}d="draw",this.drawIt()}catch(c){o=!0,a=c,this.handleFrameError(c,d)}finally{this.updateInProgress=!1}o?(this.consecutiveErrorCount++,this.consecutiveErrorCount>=Do&&(this.loopRunning=!1,this.onError?.(a,{phase:d,consecutive:this.consecutiveErrorCount,stopped:!0}))):this.consecutiveErrorCount=0,!(!this.loopRunning||!i)&&(this.drawLoopTimeout=setTimeout(()=>{this.requestedAnimationFrame=requestAnimationFrame(this.drawLoop)},this.drawTime))}async drawLoop(t){await this.processFrame(t,{scheduleNext:!0})}handleFrameError(t,n){let r=performance.now();r-this.lastErrorLogAt>=1e3&&(this.lastErrorLogAt=r,console.error(`Animation ${n} error:`,t)),this.consecutiveErrorCount===0&&this.onError?.(t,{phase:n,consecutive:1,stopped:!1})}pureAspectUpdate(t){if(t[0]===0&&t[1]===0){let r=this.containerWidth||window.innerWidth,i=this.containerHeight||window.innerHeight,o=r/i;this.aspectRatio=Math.min(Oo,Math.max(_o,o))}else this.aspectRatio=t[0]/t[1]}};var No="HostChannel has been destroyed",Ne=class{constructor(){this.inbound=[];this.listeners=[];this.closed=!1}dispatch(t){this.requireOpen(),this.inbound.push(t),this.inbound.length>32&&this.inbound.splice(0,this.inbound.length-32)}consume(){if(this.requireOpen(),this.inbound.length===0)return[];let t=this.inbound;return this.inbound=[],t}emit(t){this.requireOpen();for(let n of this.listeners)n(t)}onEvent(t){return this.requireOpen(),this.listeners.push(t),()=>{this.listeners=this.listeners.filter(n=>n!==t)}}clearInbound(){this.requireOpen(),this.inbound=[]}clear(){this.inbound=[],this.listeners=[]}close(){this.closed=!0,this.clear()}requireOpen(){if(this.closed)throw new Error(No)}};var ee=2,Rt=1,xt="0.0.5",un="0",Pr="1970-01-01T00:00:00.000Z";function X(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Le(e){return JSON.parse(JSON.stringify(e))}function W(e,t,n,r){e.push(r?{code:t,detail:n,path:r}:{code:t,detail:n})}function Ir(e,t,n){try{let r=JSON.stringify(e);if(r===void 0){W(n,"invalid-field",`${t} is not JSON-serializable`,t);return}return JSON.parse(r)}catch{W(n,"invalid-field",`${t} is not JSON-serializable`,t);return}}function Z(e){return typeof e=="string"&&e.length>0}function kt(e){return typeof e=="number"&&Number.isFinite(e)}function Lo(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function Fe(e){return!X(e)||typeof e.schemaVersion=="number"?!1:typeof e.version=="number"&&typeof e.seed=="string"&&typeof e.framesElapsed=="number"&&"state"in e}function Fo(e){return X(e)&&e.schemaVersion===ee&&X(e.engineState)}function Ho(e){return X(e)&&typeof e.schemaVersion=="number"&&X(e.engineState)}function Ze(e){if(X(e)){if(typeof e.schemaVersion=="number")return Number.isInteger(e.schemaVersion)?e.schemaVersion:void 0;if(Fe(e))return Rt}}function dn(e,t,n){try{return Le(re(e))}catch(r){let i=r instanceof Error?r.message:"engineState is not a cart state bundle";W(n,"invalid-engine-state",i,t);return}}function Vo(e,t,n){if(!X(e)){W(n,"invalid-field","cart must be an object",t);return}Z(e.id)||W(n,"invalid-field","cart.id must be a non-empty string",`${t}.id`),Z(e.version)||W(n,"invalid-field","cart.version must be a non-empty string",`${t}.version`);let r={id:typeof e.id=="string"?e.id:"",version:typeof e.version=="string"?e.version:""};return e.generative!==void 0&&(typeof e.generative!="boolean"?W(n,"invalid-field","cart.generative must be a boolean",`${t}.generative`):r.generative=e.generative),r.id&&r.version?r:void 0}function Bo(e,t,n){if(!X(e)){W(n,"invalid-field","clock must be an object",t);return}if(!kt(e.framesElapsed)){W(n,"invalid-field","clock.framesElapsed must be a finite number",`${t}.framesElapsed`);return}let r={framesElapsed:e.framesElapsed};return e.elapsedSinceStart!==void 0&&(kt(e.elapsedSinceStart)?r.elapsedSinceStart=e.elapsedSinceStart:W(n,"invalid-field","clock.elapsedSinceStart must be a finite number",`${t}.elapsedSinceStart`)),e.now!==void 0&&(kt(e.now)?r.now=e.now:W(n,"invalid-field","clock.now must be a finite number",`${t}.now`)),e.frameRate!==void 0&&(kt(e.frameRate)?r.frameRate=e.frameRate:W(n,"invalid-field","clock.frameRate must be a finite number",`${t}.frameRate`)),r}function Ko(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){W(n,"invalid-field","modules must be an array",t);return}let r=[];return e.forEach((i,o)=>{let a=`${t}[${o}]`;if(!X(i)||!Z(i.id)||!Z(i.version)){W(n,"invalid-field","module refs need non-empty id and version",a);return}r.push({id:i.id,version:i.version})}),r}function $o(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){W(n,"invalid-field","assets must be an array",t);return}let r=[];return e.forEach((i,o)=>{let a=`${t}[${o}]`;if(!X(i)||!Z(i.id)){W(n,"invalid-field","asset refs need a non-empty id",a);return}let d={id:i.id};i.version!==void 0&&(Z(i.version)?d.version=i.version:W(n,"invalid-field","asset.version must be a non-empty string",`${a}.version`)),i.ref!==void 0&&(Z(i.ref)?d.ref=i.ref:W(n,"invalid-field","asset.ref must be a non-empty string",`${a}.ref`)),r.push(d)}),r}function Uo(e,t,n){if(e===void 0)return;if(!X(e)||!Z(e.seed)){W(n,"invalid-field","rng must include a seed",t);return}if(!X(e.prngA)||!X(e.prngB)){W(n,"invalid-field","rng must include prngA and prngB",t);return}if(typeof e.useA!="boolean"){W(n,"invalid-field","rng.useA must be a boolean",`${t}.useA`);return}return Ir(e,t,n)}function Go(e,t,n){if(e===void 0)return;if(!X(e)){W(n,"invalid-field","provenance must be an object",t);return}let r={};return e.source!==void 0&&(Z(e.source)?r.source=e.source:W(n,"invalid-field","provenance.source must be a non-empty string",`${t}.source`)),e.integrity!==void 0&&(!X(e.integrity)||!Z(e.integrity.alg)||!Z(e.integrity.hash)?W(n,"invalid-field","provenance.integrity needs alg and hash strings",`${t}.integrity`):r.integrity={alg:e.integrity.alg,hash:e.integrity.hash}),r}function Tr(e,t){e.schemaVersion!==void 0&&e.schemaVersion!==ee&&W(t,"invalid-schema",`defineSnapshot produces schema ${ee}`,"schemaVersion"),Z(e.seed)||W(t,"invalid-field","seed must be a non-empty string","seed");let n=e.runtimeVersion===void 0?xt:e.runtimeVersion;Z(n)||W(t,"invalid-field","runtimeVersion must be a non-empty string","runtimeVersion");let r=e.createdAt===void 0?new Date().toISOString():e.createdAt;Lo(r)||W(t,"invalid-field","createdAt must be an ISO-8601 date","createdAt");let i=Vo(e.cart,"cart",t),o=Bo(e.clock,"clock",t),a=dn(e.engineState,"engineState",t),d=Ko(e.modules,"modules",t),c=$o(e.assets,"assets",t),v=Uo(e.rng,"rng",t),y=Go(e.provenance,"provenance",t),g;if(e.hostState!==void 0&&(g=Ir(e.hostState,"hostState",t)),e.hostStateRef!==void 0&&!Z(e.hostStateRef)&&W(t,"invalid-field","hostStateRef must be a non-empty string","hostStateRef"),t.length>0||!i||!o||!a||!Z(e.seed))return;let w={schemaVersion:ee,runtimeVersion:n,cart:i,seed:e.seed,clock:o,engineState:a,createdAt:r};return d&&d.length>0&&(w.modules=d),v&&(w.rng=v),g!==void 0&&(w.hostState=g),Z(e.hostStateRef)&&(w.hostStateRef=e.hostStateRef),c&&c.length>0&&(w.assets=c),y&&(y.source||y.integrity)&&(w.provenance=y),w}function Mr(e){if(!X(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot input is not an object"}]};let t=[],n=Tr(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function et(e,t){return Z(e.cartId)?Mr({cart:{id:e.cartId,version:t?.cartVersion??un,generative:e.generative},modules:t?.modules,seed:e.seed,rng:t?.rng,clock:t?.clock??{framesElapsed:e.framesElapsed,elapsedSinceStart:e.elapsedSinceStart},engineState:e,hostState:t?.hostState,hostStateRef:t?.hostStateRef,assets:t?.assets,createdAt:t?.createdAt,provenance:t?.provenance,runtimeVersion:t?.runtimeVersion}):{ok:!1,errors:[{code:"invalid-field",detail:"cart.id is required",path:"cart.id"}]}}function xr(e){let t=Le(e),n={schemaVersion:Rt,engineState:t,seed:t.seed,clock:{framesElapsed:t.framesElapsed,elapsedSinceStart:t.elapsedSinceStart}};return t.cartId&&(n.cart={id:t.cartId,version:un,generative:t.generative}),n}function Pt(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!X(t))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(Fe(t))try{return{ok:!0,snapshot:xr(re(t))}}catch(r){return{ok:!1,errors:[{code:"invalid-engine-state",detail:r instanceof Error?r.message:"Cart state bundle is invalid"}]}}let n=Ze(t);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is missing schemaVersion and is not a cart state bundle",path:"schemaVersion"}]};if(n===Rt){let r=[],i=dn(t.engineState,"engineState",r);return!i||r.length>0?{ok:!1,errors:r}:{ok:!0,snapshot:xr(i)}}if(n!==ee){if(n>ee)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${n} is newer than ${ee}`,path:"schemaVersion"}]};let r=[],i=dn(t.engineState,"engineState",r);return i?{ok:!0,snapshot:{schemaVersion:n,engineState:i,seed:typeof t.seed=="string"?t.seed:i.seed,clock:{framesElapsed:i.framesElapsed,elapsedSinceStart:i.elapsedSinceStart}}}:{ok:!1,errors:r.length?r:[{code:"invalid-snapshot",detail:`Snapshot schema ${n} is missing engineState`,path:"engineState"}]}}return He(t)}function He(e){if(!X(e))return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(e.schemaVersion!==ee)return{ok:!1,errors:[{code:"invalid-schema",detail:`Expected snapshot schema ${ee}`,path:"schemaVersion"}]};let t=[],n=Tr(e,t);return!n||t.length>0?{ok:!1,errors:t}:{ok:!0,snapshot:n}}function Ae(e){return e.map(t=>t.detail).join("; ")}function Dr(e){if(Fe(e))return re(e);if(X(e)&&e.engineState!==void 0)return re(e.engineState);throw new Error("Legacy snapshot is missing engine state")}function jo(e){return re(Le(e.engineState))}function _r(){return[{from:1,to:2,migrate:qo}]}function Nr(e){let t=[...e?.migrations??_r()],n=new Map;for(let r of t){if(!Number.isInteger(r.from)||!Number.isInteger(r.to)||r.to!==r.from+1)throw new Error(`Snapshot migration must step from n to n+1 (got ${String(r.from)} \u2192 ${String(r.to)})`);if(typeof r.migrate!="function")throw new Error(`Snapshot migration ${r.from} \u2192 ${r.to} is missing migrate()`);if(n.has(r.from))throw new Error(`Duplicate snapshot migration from schema ${r.from}`);n.set(r.from,r)}return{migrations:t,get(r){return n.get(r)}}}var zo=Nr();function Lr(){return zo}function qo(e){let t=Dr(e),n=et(t,{createdAt:Pr,runtimeVersion:xt});if(n.ok===!1)throw new Error(Ae(n.errors));return n.snapshot}function Or(e){try{return Le(e)}catch{return}}function tt(e,t=Lr()){let n=Or(e);if(n===void 0)return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not JSON-serializable"}]};let r=n,i=Ze(r);if(i===void 0){let o=Pt(r);if(o.ok===!1)return o;r=o.snapshot,i=o.snapshot.schemaVersion}if(i>ee)return{ok:!1,errors:[{code:"unsupported-schema",detail:`Snapshot schema ${i} is newer than ${ee}`,path:"schemaVersion"}]};if(i===ee)return He(r);for(;i<ee;){let o=t.get(i);if(!o)return{ok:!1,errors:[{code:"missing-migration",detail:`No snapshot migration from schema ${i} to ${i+1}`,path:"schemaVersion"}]};let a;try{a=o.migrate(Or(r))}catch(c){let v=c instanceof Error?c.message:"Migration threw";return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} failed: ${v}`,path:"schemaVersion"}]}}let d=Ze(a);if(d!==o.to)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} produced schema ${String(d)}`,path:"schemaVersion"}]};if(o.to===ee){let c=He(a);if(c.ok===!1)return{ok:!1,errors:[{code:"invalid-migration-result",detail:`Migration ${o.from} \u2192 ${o.to} did not produce a valid snapshot`,path:"schemaVersion"},...c.errors]};r=c.snapshot}else r=a;i=o.to}return He(r)}function cn(e,t){let n=e;if(typeof e=="string")try{n=JSON.parse(e)}catch{return{ok:!1,errors:[{code:"invalid-json",detail:"Snapshot JSON could not be parsed"}]}}if(!n||typeof n!="object")return{ok:!1,errors:[{code:"invalid-snapshot",detail:"Snapshot is not an object"}]};if(typeof n.schemaVersion=="number"){let i=tt(n,t);if(i.ok===!1)return i;try{return{ok:!0,bundle:re(i.snapshot.engineState),snapshot:i.snapshot}}catch(o){return{ok:!1,errors:[{code:"invalid-engine-state",detail:o instanceof Error?o.message:"engineState is not a cart state bundle",path:"engineState"}]}}}try{return{ok:!0,bundle:re(n)}}catch(i){return{ok:!1,errors:[{code:"invalid-engine-state",detail:i instanceof Error?i.message:"Cart state bundle is invalid"}]}}}function ln(e,t){let n=Pt(e);return n.ok===!1?n:tt(n.snapshot,t)}var Kr=["image","audio","font","spritesheet"],$r=["timeout","cors","not-found","invalid","aborted","resolver"],Ve="cyberart:fallback/silent",Fr="Asset preloader has been destroyed",Wo=4,Yo=new Set(Kr),Jo=new Set($r),Xo={timeout:"asset load timed out",cors:"CORS blocked this asset","not-found":"asset was not found",invalid:"asset declaration or resource is invalid",aborted:"asset load was aborted",resolver:"asset resolver failed"};function Ur(e){return typeof e=="string"&&Yo.has(e)}function Gr(e){return typeof e=="string"&&Jo.has(e)}function It(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.id=="string"&&typeof t.ref=="string"&&Gr(t.code)&&typeof t.message=="string"}function J(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message&&e.message.length>0?e.message:Xo[e.code]}}function ke(e,t){return{type:e==="ready"?he:ye,kind:"state",payload:t}}function jr(e){if(!e?.aborted)return;let t=new Error("aborted");throw t.name="AbortError",t}function Qo(e){return e instanceof Error&&e.name==="AbortError"||typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function pn(e){return e?{...e}:void 0}function fe(e){let t={id:e.id,ref:e.ref,type:e.type,url:e.url};return e.integrity!==void 0&&(t.integrity=e.integrity),e.provenance&&(t.provenance=pn(e.provenance)),e.cors!==void 0&&(t.cors=e.cors),e.usedFallback&&(t.usedFallback=!0),e.managed&&(t.managed=!0),t}function nt(e){return{id:e.id,ref:e.ref,code:e.code,message:e.message}}function Zo(e){if(e.state==="ready"){let t={state:"ready",resource:fe(e.resource)};return e.failure&&(t.failure=nt(e.failure)),t}return e.state==="failed"?{state:"failed",failure:nt(e.failure)}:{state:e.state}}function es(e){return/^https?:/i.test(e)}function zr(e){return e.endsWith("/")?e:`${e}/`}function qr(e,t){let n=zr(t);if(/^(https?:|data:|blob:)/i.test(e))return e;let r=/^moltazine:post\/([^#]+)#(.+)$/.exec(e);if(r)return`${n}moltazine/${encodeURIComponent(r[1])}/${r[2]}`;let i=/^world:asset\/(.+)$/.exec(e);if(i)return`${n}world/${i[1]}`;let o=/^library:(.+)$/.exec(e);return o?`${n}library/${o[1]}`:`${n}${e.replace(/^\//,"")}`}function ts(e){return{async resolve(t,n){jr(n);let r=e[t.ref];if(!r)throw J({id:t.id,ref:t.ref,code:"not-found",message:`no fixture for ${t.ref}`});if("error"in r)throw J({id:t.id,ref:t.ref,code:r.error,message:r.message});return{id:t.id,ref:t.ref,type:t.type,url:r.url,integrity:r.integrity??t.integrity,cors:r.cors??"omit",provenance:r.provenance??t.provenance}}}}function ns(e){let t=zr(e.cdnBase);return{async resolve(n,r){jr(r);let i=e.failures?.[n.ref];if(i){let a=typeof i=="string"?i:i.code,d=typeof i=="string"?void 0:i.message;throw J({id:n.id,ref:n.ref,code:a,message:d})}let o=qr(n.ref,t);return{id:n.id,ref:n.ref,type:n.type,url:o,integrity:n.integrity,cors:es(o)?"anonymous":"omit",provenance:n.provenance}}}}function rs(e){if(!e||typeof e!="object")return J({id:"",ref:"",code:"invalid",message:"declaration is required"});if(typeof e.id!="string"||e.id.length===0)return J({id:typeof e.id=="string"?e.id:"",ref:typeof e.ref=="string"?e.ref:"",code:"invalid",message:"id is required"});if(typeof e.ref!="string"||e.ref.length===0)return J({id:e.id,ref:"",code:"invalid",message:"ref is required"});if(!Ur(e.type))return J({id:e.id,ref:e.ref,code:"invalid",message:`unsupported type ${String(e.type)}`});if(e.integrity!==void 0&&typeof e.integrity!="string")return J({id:e.id,ref:e.ref,code:"invalid",message:"integrity must be a string"});if(e.timeoutMs!==void 0&&(typeof e.timeoutMs!="number"||!Number.isFinite(e.timeoutMs)||e.timeoutMs<0))return J({id:e.id,ref:e.ref,code:"invalid",message:"timeoutMs must be a non-negative finite number"})}function Hr(e){return{id:e.id,ref:Ve,type:e.type,url:Ve,usedFallback:!0,cors:"omit"}}function Vr(e,t){return It(t)?{id:e.id,ref:e.ref,code:t.code,message:t.message}:Qo(t)?J({id:e.id,ref:e.ref,code:"aborted"}):J({id:e.id,ref:e.ref,code:"resolver",message:t instanceof Error?t.message:String(t)})}function Br(e,t){if(!t||typeof t.url!="string"||t.url.length===0)throw J({id:e.id,ref:e.ref,code:"invalid",message:"resolver returned no url"});if(t.integrity&&e.integrity&&t.integrity!==e.integrity)throw J({id:e.id,ref:e.ref,code:"invalid",message:"integrity mismatch"});let n=fe(t);return n.id=e.id,n.ref=t.ref||e.ref,n.type=e.type,!n.integrity&&e.integrity&&(n.integrity=e.integrity),!n.provenance&&e.provenance&&(n.provenance=pn(e.provenance)),n}function fn(e){if(typeof e?.resolver?.resolve!="function")throw new Error("createAssetPreloader: resolver is required");let t=e.emitEvents!==!1,n=e.wallClockTimeout!==!1,r=new Map,i=[],o=new Map,a=new Map,d=new Map,c=new Map,v=new Map,y=new Set,g=!1;function w(l){return l.code==="aborted"||l.code==="timeout"}function k(l,C,R){let L=Vr(l,R);return L.code==="timeout"?L:C.aborted?J({id:l.id,ref:l.ref,code:"aborted"}):L}function I(l,C){let R=v.get(l);R||(R=new Set,v.set(l,R)),R.add(C)}function m(l){if(l?.state==="ready")return`${l.resource.type}\0${l.resource.ref}`}function x(l,C){for(let[R,L]of v)if(R!==C&&L.has(l))return!0;for(let[R,L]of r)if(R!==C&&m(L)===l)return!0;return!1}function H(l,C){let R=new Set(v.get(l)),L=m(C);L&&R.add(L),v.delete(l);for(let q of R)x(q,l)||d.delete(q)}function E(){let l=0,C=0,R=0,L=0,q={};for(let[G,F]of r)q[G]=Zo(F),F.state==="pending"||F.state==="loading"?l+=1:F.state==="failed"?R+=1:(C+=1,(F.resource.usedFallback||F.failure)&&(L+=1));return{total:r.size,pending:l,ready:C,failed:R,fallbacks:L,items:q,failures:i.map(nt)}}function b(){if(y.size===0)return;let l=E();for(let C of y)C(l)}function h(l){i.push(nt(l))}function u(l){g||!t||!e.dispatch||e.dispatch(l)}function s(l){if(l?.managed&&l.url.startsWith("blob:")&&!(typeof URL>"u"||typeof URL.revokeObjectURL!="function"))try{URL.revokeObjectURL(l.url)}catch{}}function f(l,C){if(g)return;let R=r.get(l);R?.state==="ready"&&s(R.resource),r.set(l,C),b()}function A(l){if(l.fallback!==void 0)return l.fallback==="silent"?{id:`${l.id}::fallback`,ref:Ve,type:l.type}:typeof l.fallback=="string"?{id:`${l.id}::fallback`,ref:l.fallback,type:l.type}:{...l.fallback,id:typeof l.fallback.id=="string"&&l.fallback.id.length>0?l.fallback.id:`${l.id}::fallback`}}function D(l,C,R){let L=`${l.type}\0${l.ref}`,q=d.get(L);if(q)return C.aborted?Promise.reject(J({id:l.id,ref:l.ref,code:"aborted"})):(I(R,L),Promise.resolve(fe(q.resource)));if(C.aborted)return Promise.reject(J({id:l.id,ref:l.ref,code:"aborted"}));let G=c.get(L);if(!G){let B=new AbortController,Y={id:l.id,ref:l.ref,type:l.type};l.integrity!==void 0&&(Y.integrity=l.integrity),l.provenance&&(Y.provenance=pn(l.provenance)),G={promise:Promise.resolve().then(()=>e.resolver.resolve(Y,B.signal)).then(U=>{let j=Br(l,U);if(B.signal.aborted)throw J({id:l.id,ref:l.ref,code:"aborted"});return d.set(L,{resource:fe(j)}),j}).catch(U=>{throw Vr(l,U)}).finally(()=>{c.delete(L)}),controller:B,waiters:0},c.set(L,G)}let F=G;return F.waiters+=1,new Promise((B,Y)=>{let T=!1,U=(z,de)=>{T||(T=!0,C.removeEventListener("abort",j),F.waiters-=1,de&&F.waiters<=0&&F.controller.abort(),z())},j=()=>{U(()=>Y(J({id:l.id,ref:l.ref,code:"aborted"})),!0)};if(C.aborted){j();return}C.addEventListener("abort",j,{once:!0}),F.promise.then(z=>{if(!T){if(C.aborted){j();return}I(R,L),U(()=>B(fe(z)),!1)}},z=>{if(!T){if(C.aborted){j();return}U(()=>Y(z),!1)}})})}function O(l,C,R){if(C.aborted)return Promise.reject(J({id:l.id,ref:l.ref,code:"aborted"}));if(l.ref===Ve)return Promise.resolve(Hr(l));let L=new AbortController,q=()=>L.abort();C.addEventListener("abort",q,{once:!0});let G=l.timeoutMs??e.timeoutMs,F,B=!1;return n&&G!==void 0&&G>0&&Number.isFinite(G)&&(F=setTimeout(()=>{B=!0,L.abort()},G)),D(l,L.signal,R).then(Y=>{let T=Br(l,Y);return T.id=l.id,T}).catch(Y=>{throw B?J({id:l.id,ref:l.ref,code:"timeout"}):Y}).finally(()=>{F!==void 0&&clearTimeout(F),C.removeEventListener("abort",q)})}async function P(l,C,R,L){try{return{resource:await O(l,C,L)}}catch(q){let G=k(l,C,q);if(w(G)||C.aborted||R>=Wo)throw G;let F=A(l);if(!F)throw G;if(C.aborted)throw J({id:l.id,ref:l.ref,code:"aborted"});if(l.fallback==="silent"||F.ref===Ve)return{resource:Hr(l),failure:G};try{let B=await P(F,C,R+1,L);return{resource:{...fe(B.resource),id:l.id,usedFallback:!0},failure:G}}catch(B){let Y=It(B)&&!w(B)&&!C.aborted?B:k(l,C,B);throw!w(Y)&&!C.aborted&&h(G),Y}}}async function V(l,C){if(g)throw new Error(Fr);let R=r.get(l.id);if(R?.state==="ready"||R?.state==="failed")return;let L=o.get(l.id);if(L){await L;return}let q=(async()=>{let G=rs(l);if(G){f(l.id,{state:"failed",failure:G}),h(G),u(ke("failed",{id:l.id,ref:l.ref,failure:G}));return}f(l.id,{state:"loading"});let F=a.get(l.id)??new AbortController;a.has(l.id)||a.set(l.id,F);try{let B=await P(l,F.signal,C,l.id);if(g)return;if(F.signal.aborted){let Y=J({id:l.id,ref:l.ref,code:"aborted"});f(l.id,{state:"failed",failure:Y}),h(Y),u(ke("failed",{id:l.id,ref:l.ref,failure:Y}));return}if(B.resource.id=l.id,B.failure){f(l.id,{state:"ready",resource:B.resource,failure:B.failure}),h(B.failure),u(ke("failed",{id:l.id,ref:l.ref,failure:B.failure,resource:fe(B.resource)})),u(ke("ready",{id:l.id,ref:B.resource.ref,resource:fe(B.resource),failure:B.failure}));return}f(l.id,{state:"ready",resource:B.resource}),u(ke("ready",{id:l.id,ref:l.ref,resource:fe(B.resource)}))}catch(B){if(g)return;let Y=It(B)&&!w(B)&&!F.signal.aborted?{...nt(B),id:l.id}:k(l,F.signal,B);f(l.id,{state:"failed",failure:Y}),h(Y),u(ke("failed",{id:l.id,ref:l.ref,failure:Y}))}finally{a.get(l.id)===F&&a.delete(l.id)}})();o.set(l.id,q);try{await q}finally{o.delete(l.id)}}return{async preload(l){if(g)throw new Error(Fr);let C=Array.isArray(l)?l:[];for(let R of C)R&&typeof R.id=="string"&&R.id.length>0&&(r.has(R.id)||r.set(R.id,{state:"pending"}),a.has(R.id)||a.set(R.id,new AbortController));return b(),await Promise.all(C.map(R=>V(R,0))),E()},get(l){let C=r.get(l);if(C?.state==="ready")return fe(C.resource)},getProgress(){return E()},onProgress(l){return y.add(l),()=>{y.delete(l)}},abort(l){if(!g){if(l!==void 0){a.get(l)?.abort();return}for(let C of a.values())C.abort()}},forget(l){if(g)return;if(l===void 0){for(let R of r.values())R.state==="ready"&&s(R.resource);r.clear(),i.length=0,d.clear(),v.clear(),b();return}let C=r.get(l);C?.state==="ready"&&s(C.resource),H(l,C),r.delete(l);for(let R=i.length-1;R>=0;R--)i[R].id===l&&i.splice(R,1);b()},dispose(){if(!g){g=!0;for(let l of a.values())l.abort();a.clear();for(let l of r.values())l.state==="ready"&&s(l.resource);r.clear(),i.length=0,o.clear();for(let l of c.values())l.controller.abort();d.clear(),c.clear(),v.clear(),y.clear()}}}}var hn=.25;function Be(e){return e.error===void 0?{state:e.state}:{state:e.state,error:e.error}}function mn(e){return!Number.isFinite(e)||e<0?0:e>1?1:e}function is(e){return e instanceof Error&&e.message?e.message:String(e)}async function os(){let{adaptersFor:e}=await Promise.resolve().then(()=>(en(),vr)),t=e(["tone"]),n=typeof navigator<"u"&&/Headless/i.test(navigator.userAgent);for(let r of t)n?await r.load():await r.unlock()}function ss(e){if(!e||typeof e!="object")return;let t=e.id;return typeof t=="string"&&t.length>0?t:void 0}function yn(e={}){let t=e.toneStart??os,n=!!e.reducedSensory,r=new Set,i=new Map,o=new Map,a=new Map,d=[],c={state:"locked"},v,y=!1,g=!1;function w(b){for(let h of d.slice())h(b)}function k(b,h){let u=i.get(b);if(u)return h&&!u.participantId&&(u.participantId=h),u;let s={id:b,participantId:h,gain:1,muted:!1,duckGain:1,priority:0,manualDuck:!1};return i.set(b,s),s}function I(b){return y||b.muted?0:mn(b.gain*b.duckGain)}function m(b){return{id:b.id,participantId:b.participantId,gain:b.gain,muted:b.muted,duckGain:b.duckGain,priority:b.priority,effectiveGain:I(b)}}function x(){let b=-1/0;for(let h of a.values())h.priority>b&&(b=h.priority);for(let h of i.values())if(!h.manualDuck){if(b===-1/0){h.duckGain=1;continue}h.duckGain=h.priority<b?hn:1}}async function H(){if(g||c.state==="unlocked")return Be(c);if(v)return await v,Be(c);c={state:"unlocking"},v=(async()=>{try{await t(),c={state:"unlocked"}}catch(b){c={state:"failed",error:is(b)}}})();try{await v}finally{v=void 0}return Be(c)}return{unlock:H,status(){return Be(c)},authorize(b){g||typeof b!="string"||b.length===0||r.add(b)},revoke(b){g||r.delete(b)},isAuthorized(b){return b===void 0||b.length===0?r.size===0:r.size===0?!0:r.has(b)},setChannelGain(b,h,u){g||typeof b!="string"||b.length===0||(k(b,u).gain=mn(h))},setPriority(b,h,u){g||typeof b!="string"||b.length===0||(k(b,u).priority=Number.isFinite(h)?h:0,x())},mute(){g||(y=!0,w({type:"mute"}))},unmute(){g||(y=!1,w({type:"mute"}))},muteChannel(b,h){g||typeof b!="string"||b.length===0||(k(b,h).muted=!0,w({type:"mute"}))},unmuteChannel(b){if(g)return;let h=i.get(b);h&&(h.muted=!1,w({type:"mute"}))},duck(b,h=hn){if(g||typeof b!="string"||b.length===0)return;let u=k(b);u.manualDuck=!0,u.duckGain=mn(h)},unduck(b){if(g)return;let h=i.get(b);h&&(h.manualDuck=!1,x())},effectiveGain(b){let h=i.get(b);return h?I(h):y?0:1},handleHostEvent(b){if(g||!b||typeof b!="object")return;let h=ss(b.payload);if(h){if(b.type===he){o.set(h,"ready"),w({type:"asset",id:h,status:"ready"});return}b.type===ye&&(o.set(h,"failed"),w({type:"asset",id:h,status:"failed"}))}},assetStatus(b){return o.get(b)},noteCueStarted(b){if(g)return;a.set(b.idempotencyKey,{idempotencyKey:b.idempotencyKey,channelId:b.channelId,participantId:b.participantId,priority:b.priority});let h=k(b.channelId,b.participantId);b.priority>h.priority&&(h.priority=b.priority),x()},noteCueEnded(b){a.delete(b)&&x()},teardown(b){if(!g&&!(typeof b!="string"||b.length===0)){r.delete(b);for(let[h,u]of[...a.entries()])u.participantId===b&&a.delete(h);for(let[h,u]of[...i.entries()])u.participantId===b&&i.delete(h);x(),w({type:"teardown",participantId:b})}},onNotice(b){return d.push(b),()=>{let h=d.indexOf(b);h>=0&&d.splice(h,1)}},inspect(){let b=[...o.entries()].sort(([u],[s])=>u<s?-1:u>s?1:0),h={};for(let[u,s]of b)h[u]=s;return{status:Be(c),reducedSensory:n,muted:y,authorized:[...r].sort(),channels:[...i.values()].sort((u,s)=>u.id<s.id?-1:u.id>s.id?1:0).map(m),assets:h}},destroy(){g||(g=!0,a.clear(),i.clear(),r.clear(),w({type:"destroy"}),d.length=0)},get reducedSensory(){return n},get muted(){return y}}}function Wr(e,t){let n=e.dispatch.bind(e);e.dispatch=r=>{t.handleHostEvent(r),n(r)}}function gn(e){ir();let{container:t,seed:n,captureKeyboard:r=!1,audio:i,deterministic:o,assets:a,audioBroker:d,audioParticipantId:c}=e,v=n===void 0?void 0:bt(n,o?"deterministic":"live"),y=new Ne;if(d&&(Wr(y,d),c&&d.authorize(c)),a&&typeof a.resolver?.resolve!="function")throw new Error("createRuntime: assets.resolver is required");let g=a?fn({resolver:a.resolver,timeoutMs:a.timeoutMs,emitEvents:a.emitEvents??!o,wallClockTimeout:!o,dispatch:s=>y.dispatch(s)}):void 0,w=!1,k=null,I,m=!1,x=t.clientWidth||window.innerWidth,H=t.clientHeight||window.innerHeight,E=new At(30,!1,x,H,!1,void 0,{container:t,seed:v,captureKeyboard:r,hostChannel:y,audio:i,deterministic:o}),b=()=>{let s=t.clientWidth||window.innerWidth,f=t.clientHeight||window.innerHeight;return s===E.containerWidth&&f===E.containerHeight?!1:(E.containerWidth=s,E.containerHeight=f,!0)},h=null;return!E.isDeterministic&&typeof ResizeObserver<"u"&&(h=new ResizeObserver(()=>{if(w||!k)return;b()&&m&&E.reinit()}),h.observe(t)),E.onError=(s,f)=>{I?.(s,f)},{get tokenData(){return E.tokenData},get hostChannel(){return y},get assets(){return g},get audioBroker(){return d},get onError(){return I},set onError(s){I=s},mount(s,f={}){if(w)throw new Error("createRuntime: cannot mount on a destroyed runtime");k?.destroy(),m=!1,E.customState=f.initialState,E.setGameManager(f.gameManager);let A=f.onEvent?y.onEvent(f.onEvent):()=>{};if(d&&c&&d.authorize(c),!E.prepareCart(s))throw A(),new Error("createRuntime: failed to prepare cart");let D=!1,O={async start(){if(!D){if(b()&&E.isPrepared&&(E.init(),E.unloadCart(),!E.prepareCart(s)))throw new Error("createRuntime: failed to prepare cart");E.needsAudio&&(d?await d.unlock():await E.unlockAudio(),D)||(m=!0,E.beginPlayback())}},pause(){D||(E.paused=!0)},resume(){D||(E.paused=!1)},dispatch(P){D||y.dispatch(P)},snapshot(){if(D)return{seed:"",pngDataUrl:""};let P=E.canvas;return{seed:E.tokenData.hash,metadata:s.metadata,pngDataUrl:P?P.toDataURL("image/png"):""}},destroy(){D||(D=!0,m=!1,A(),y.clearInbound(),E.unloadCart(),k===O&&(k=null))},reload(){if(!D){if(!m){if(E.isPrepared&&(E.unloadCart(),!E.prepareCart(s)))throw new Error("createRuntime: failed to prepare cart");return}E.reloadCart()}},reinit(P){if(!D){if(!m){b();return}E.reinit(P)}},getCartState(){return E.animation?.cartState},exportState(){return D?Promise.reject(new Error("Cart handle has been destroyed")):E.exportState()},exportStateJSON(){return D?Promise.reject(new Error("Cart handle has been destroyed")):E.exportStateJSON()},async importState(P,V){if(D)throw new Error("Cart handle has been destroyed");let l=P,C=P;if(typeof P=="string")try{C=JSON.parse(P)}catch{await E.importState(P,V);return}if(C&&typeof C=="object"&&typeof C.schemaVersion=="number"){let R=cn(C);if(R.ok===!1)throw new Q(Ae(R.errors));await E.importState(R.bundle,V);return}await E.importState(typeof l=="string"?l:C,V)},async exportSnapshot(P){if(D)throw new Error("Cart handle has been destroyed");let V=await E.exportState(),l=E.getClock(),C=et(V,{...P,rng:E.getRandomState(),clock:{framesElapsed:V.framesElapsed,elapsedSinceStart:V.elapsedSinceStart,now:l.now,frameRate:l.frameRate}});if(C.ok===!1)throw new Q(Ae(C.errors));return C.snapshot},async exportSnapshotJSON(P){return JSON.stringify(await O.exportSnapshot(P))},async importSnapshot(P,V){if(D)throw new Error("Cart handle has been destroyed");let l=ln(P);if(l.ok===!1)throw new Q(Ae(l.errors));await E.importState(l.snapshot.engineState,V)},peekExportedFramebuffer(){return D?null:E.peekExportedFramebuffer()},peekSeed(){if(!D)return E.peekSeed()},isGenerative(){return D?!1:E.isGenerative()},async step(P=1){if(D)throw new Error("Cart handle has been destroyed");await E.step(P)},async advance(P){if(D)throw new Error("Cart handle has been destroyed");await E.advance(P)},schedule(P){D||E.schedule(P)},getClock(){if(D)throw new Error("Cart handle has been destroyed");return E.getClock()},getRandomState(){if(D)throw new Error("Cart handle has been destroyed");return E.getRandomState()},getReplayMetadata(){return D?Promise.reject(new Error("Cart handle has been destroyed")):E.getReplayMetadata()},get canvas(){return E.canvas},get paused(){return E.paused},set paused(P){D||(E.paused=P)},get tokenData(){return E.tokenData},get isPrepared(){return E.isPrepared},get isLoopRunning(){return E.isLoopRunning},get needsAudio(){return E.needsAudio},get audioLibraries(){return E.audioLibraries}};return k=O,O},async unlockAudio(){if(d){E.needsAudio&&await d.unlock();return}await E.unlockAudio()},destroy(){w||(w=!0,k?.destroy(),k=null,d&&c&&d.teardown(c),h?.disconnect(),h=null,g?.dispose(),y.close(),E.destroy())}}}var Ke="cyberart.state.save",$e="cyberart.state.load";function as(e,t,n={}){let r=n.persist,i=r?{persist:r}:void 0,o=()=>{t.emit({type:Ke,payload:i})},a=()=>{t.emit({type:$e,payload:i})};e.registerAction("w",o,!0),e.registerAction("W",o,!0),e.registerAction("e",a,!0),e.registerAction("E",a,!0)}function Yr(e){if(e.type!==Ke&&e.type!==$e)return;let t=e.payload?.persist;return t==="localStorage"?t:void 0}var ds="cyberart-io",us=1,ve="framebuffers";function bn(e,t){return`${e||"unknown"}:${t?ge(t):"none"}`}function Xr(e,t){return`${e||"unknown"}:${t||"none"}`}function vn(){return new Promise((e,t)=>{let n=indexedDB.open(ds,us);n.onupgradeneeded=()=>{let r=n.result;r.objectStoreNames.contains(ve)||r.createObjectStore(ve)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error??new Error("indexedDB open failed"))})}function cs(e){let t=e.data;return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}function Jr(e,t){return new Promise((n,r)=>{let o=e.transaction(ve,"readonly").objectStore(ve).get(t);o.onsuccess=()=>n(o.result),o.onerror=()=>r(o.error??new Error("indexedDB read failed"))})}async function Qr(e,t,n){if(typeof indexedDB>"u")return;let r=await vn(),i={width:n.width,height:n.height,data:cs(n)};try{await new Promise((o,a)=>{let d=r.transaction(ve,"readwrite");d.oncomplete=()=>o(),d.onerror=()=>a(d.error??new Error("indexedDB write failed")),d.objectStore(ve).put(i,bn(e,t))})}finally{r.close()}}async function Zr(e,t){if(typeof indexedDB>"u")return null;let n=await vn();try{let r=bn(e,t),i=Xr(e,t),o=await Jr(n,r)??(r===i?void 0:await Jr(n,i));if(!o||!o.data||o.width<1||o.height<1)return null;let a=new ImageData(o.width,o.height);return a.data.set(new Uint8ClampedArray(o.data)),a}finally{n.close()}}async function ei(e,t){if(typeof indexedDB>"u")return;let n=await vn();try{await new Promise((r,i)=>{let o=n.transaction(ve,"readwrite");o.oncomplete=()=>r(),o.onerror=()=>i(o.error??new Error("indexedDB delete failed"));let a=o.objectStore(ve);a.delete(bn(e,t)),a.delete(Xr(e,t))})}finally{n.close()}}var En="cyberart.state.",ls="Saved state",ps="Loaded state",ti="Failed to save state",fs="Failed to load state",ms="No saved state";function Ee(e,t){let n=e||"unknown";return t?En+n+"."+ge(t):En+n}function hs(e,t,n){return r=>{if(Yr(r)==="localStorage"){if(r.type===Ke){ys(e,t,n);return}r.type===$e&&gs(e,t,n)}}}function ri(e){return!!e&&typeof e=="object"&&typeof e.schemaVersion=="number"}function ni(e){if(ri(e)){let t=tt(e);if(t.ok===!1)return null;try{return re(t.snapshot.engineState)}catch{return null}}if(Fe(e))try{return re(e)}catch{return null}return null}function Ue(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(typeof n.savedAt=="number"&&n.bundle&&typeof n.bundle=="object"){let o=ni(n.bundle);return o?{savedAt:n.savedAt,bundle:o}:null}let r=ni(t);if(r)return{savedAt:0,bundle:r};if(ri(t))return null;let i=t;return typeof i.seed=="string"&&typeof i.version=="number"?{savedAt:0,bundle:i}:null}catch{return null}}async function ys(e,t,n){let r=e();if(r)try{let i=await r.exportState(),o=i.cartId??t?.();if(!o){console.error("Refusing to persist cart state without cartId"),n?.(ti,"transient");return}i.generative===!0?(As(o),Tt(Ee(o,i.seed),i)):Tt(Ee(o),i);let a=r.peekExportedFramebuffer?.();if(a)try{await Qr(o,i.seed,a)}catch(d){console.warn("Failed to save cart framebuffer",d)}n?.(ls,"transient")}catch(i){console.error("Failed to save cart state",i),n?.(ti,"transient")}}async function gs(e,t,n){let r=e();if(!r)return;let i=t?.(),o=r.peekSeed?.(),a=r.isGenerative?.()===!0,d=Cs(i,a,o);if(!d){console.warn("No saved cart state for",i||"unknown",a&&o?`(hash ${o})`:""),n?.(ms,"transient");return}try{let c=await Zr(i,d.bundle.seed).catch(()=>null);await r.importState(d.bundle,{framebuffer:c}),n?.(ps,"transient")}catch(c){console.error("Failed to load cart state",c),n?.(fs,"transient")}}function Tt(e,t){let n=JSON.stringify({savedAt:Date.now(),bundle:t});bs(e,n)}function bs(e,t){for(;;)try{localStorage.setItem(e,t);return}catch(n){if(!vs(n)||!Es(e))throw n}}function vs(e){if(!e||typeof e!="object")return!1;let t=e.name,n=e.code;return t==="QuotaExceededError"||t==="NS_ERROR_DOM_QUOTA_REACHED"||n===22||n===1014}function Es(e){let t=null,n=1/0;for(let o of Ss()){if(o===e)continue;let a=localStorage.getItem(o);if(!a)continue;let c=Ue(a)?.savedAt??0;c<n&&(n=c,t=o)}if(!t)return!1;let r=localStorage.getItem(t),i=r?Ue(r):null;return localStorage.removeItem(t),i?.bundle&&ei(i.bundle.cartId,i.bundle.seed).catch(()=>{}),!0}function Ss(){let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&n.startsWith(En)&&e.push(n)}return e}function Cs(e,t,n){if(t&&n){let i=localStorage.getItem(Ee(e,n));if(i)return Ue(i);let o=localStorage.getItem(Ee(e));if(!o)return null;let a=Ue(o);if(!a||!ws(a.bundle,n))return null;try{Tt(Ee(e,n),a.bundle)}catch{}return a}let r=localStorage.getItem(Ee(e));return r?Ue(r):null}function ws(e,t){return typeof e.seed=="string"&&ge(e.seed)===ge(t)}function As(e){let t=Ee(e),n=localStorage.getItem(t);if(!n)return;let r=Ue(n);if(r&&typeof r.bundle.seed=="string"){let i=Ee(e,r.bundle.seed);if(!localStorage.getItem(i))try{Tt(i,r.bundle)}catch{return}}localStorage.removeItem(t)}var rt=1,me="cyberart.diagnostic.rejected",Dt=8,ks=new Set(["intent","state","diagnostic"]),Rs=new Set([Ke,$e]);function Mt(e){return typeof e=="string"&&ks.has(e)}function ii(e){if(e.kind!==void 0)return Mt(e.kind)?e.kind:void 0;if(!(typeof e.type!="string"||e.type.length===0)){if(Rs.has(e.type))return"intent";for(let t of e.type.split("."))if(Mt(t))return t}}function oi(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function Se(e,t){for(let n of e)if(oi(n,t))return!0;return!1}function Ge(e){if(e===void 0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(JSON.stringify(e))}}catch{return{ok:!1}}}function Ot(e,t){if(!e||typeof e.type!="string"||e.type.length===0)return{ok:!1,reason:"malformed",detail:"type is required"};if(e.schemaVersion!==void 0&&e.schemaVersion!==rt)return{ok:!1,reason:"malformed",detail:`unsupported schemaVersion ${String(e.schemaVersion)}`};let n=ii(e);if(!n)return{ok:!1,reason:"malformed",detail:`cannot infer kind from type "${e.type}"`};let r=Ge(e.payload);if(!r.ok)return{ok:!1,reason:"malformed",detail:"payload is not JSON-serializable"};let i=t.createId(),o=typeof e.correlationId=="string"&&e.correlationId.length>0?e.correlationId:i,a=typeof e.causationId=="string"&&e.causationId.length>0?e.causationId:t.causationId,d=typeof e.target=="string"&&e.target.length>0?e.target:void 0,c=t.maxHops??Dt,v=t.parentHops===void 0?c:Math.max(0,t.parentHops-1),y=typeof e.idempotencyKey=="string"&&e.idempotencyKey.length>0?e.idempotencyKey:void 0,g={schemaVersion:rt,type:e.type,kind:n,source:t.source,id:i,correlationId:o,seq:t.seq,hops:v};return d&&(g.target=d),a&&(g.causationId=a),y&&(g.idempotencyKey=y),r.value!==void 0&&(g.payload=r.value),{ok:!0,envelope:g}}var xs=new Set(["rate-limited","storm-detected","hop-limit","loop-detected","not-subscribed"]),Ps=8,Is=8,Ts=16,Ms=256,Ds=256,Os=["*.intent.*"];function Sn(e={}){let t=e.hostSource??"host",n="router",r=e.maxPerTurn??Ps,i=e.maxCausationDepth??Is,o=e.maxHops??Dt,a=e.maxCorrelationPerTurn??Ts,d=e.maxIndex??Ms,c=e.maxDecisions??Ds,v=e.maxPerWindow,y=e.windowMs??1e3,g=e.now??Date.now,w=0,k=e.createId??(()=>`evt-${++w}`),I=new Map,m=[],x=[],H=new Map,E=new Map,b=new Map,h=[],u=0,s=0,f=0;function A(p){try{return JSON.parse(JSON.stringify(p))}catch{return p}}function D(p){for(h.push(p);h.length>c;)h.shift();for(let S of x)try{S(A(p))}catch{}}function O(p,S){let M={outcome:S.outcome,source:S.source,type:p.type,kind:p.kind,envelopeId:p.id,deliveredTo:S.deliveredTo,hops:p.hops,seq:p.seq,correlationId:p.correlationId,schemaVersion:p.schemaVersion,turn:f,time:g()};return S.reason&&(M.reason=S.reason),S.detail&&(M.detail=S.detail),S.priorEnvelopeId&&(M.priorEnvelopeId=S.priorEnvelopeId),p.target&&(M.target=p.target),p.causationId&&(M.causationId=p.causationId),p.idempotencyKey&&(M.idempotencyKey=p.idempotencyKey),p.payload!==void 0&&(M.payload=A(p.payload)),M}let P=[],V=!1;function l(p,S,M){for(p.set(S,M);p.size>d;){let _=p.keys().next().value;if(_===void 0)break;p.delete(_)}}function C(p){l(H,p.id,{type:p.type,source:p.source,causationId:p.causationId,hops:p.hops,correlationId:p.correlationId,idempotencyKey:p.idempotencyKey})}function R(p,S){S&&(p.correlationId||(p.correlationId=S.correlationId),p.causationId||(p.causationId=S.id),!p.idempotencyKey&&S.idempotencyKey&&(p.idempotencyKey=`${S.idempotencyKey}::${p.type}`))}function L(p,S){if(p){let M=H.get(p);return M?M.hops:o}return S}function q(p,S){return`${p}\0${S}`}function G(p,S){p.idempotencyKey&&l(b,q(p.source,p.idempotencyKey),S)}function F(p,S){if(S)return b.get(q(p,S))}function B(p){return F(p.source,p.idempotencyKey)}function Y(p){return p.seq+=1,p.seq}function T(p,S){if(!(typeof S.causationId=="string"&&S.causationId.length>0))return p.lastDelivered}function U(p){let S=new Set,M=new Set([`${p.type}\0${p.source}`]),_=p.causationId,N=0;for(;_;){if(N+=1,N>i||S.has(_))return!0;S.add(_);let $=H.get(_);if(!$)break;let ue=`${$.type}\0${$.source}`;if(M.has(ue))return!0;M.add(ue),_=$.causationId}return!1}function j(p){let S=(E.get(p)??0)+1;return E.set(p,S),S}function z(p,S){v!==void 0&&(p.emitTimestamps=p.emitTimestamps.filter(M=>S-M<y))}function de(p,S){return(S.kind==="state"||S.kind==="diagnostic")&&!p.authoritative?!1:Se(p.emit,S.type)}function ut(p){for(let S of m)if(Se(S.patterns,p.type))try{S.listener(p)}catch{}}function ct(p){let S=[];if(p.target){let M=I.get(p.target);return!M||!Se(M.subscribe,p.type)||(M.channel.dispatch(p),M.lastDelivered={id:p.id,hops:p.hops,correlationId:p.correlationId,idempotencyKey:p.idempotencyKey},S.push(M.id)),S}for(let M of I.values())Se(M.subscribe,p.type)&&(M.channel.dispatch(p),M.lastDelivered={id:p.id,hops:p.hops,correlationId:p.correlationId,idempotencyKey:p.idempotencyKey},S.push(M.id));return S}function so(p,S,M,_,N,$,ue){let pe={reason:_,eventType:S,source:M};N&&(pe.detail=N),s+=1;let We=k(),Ie={schemaVersion:rt,type:me,kind:"diagnostic",source:n,id:We,correlationId:$??We,seq:s,hops:0,payload:pe};ue&&(Ie.causationId=ue),C(Ie);let nr=I.get(p);nr&&nr.channel.dispatch(Ie),ut(Ie)}function ie(p,S,M,_,N){if(so(p,N?.type??(typeof S.type=="string"?S.type:""),N?.source??p,M,_,N?.correlationId,N?.id),N?.idempotencyKey&&!xs.has(M)&&G(N,{status:"rejected"}),N)D(O(N,{outcome:"rejected",reason:M,detail:_,source:p,deliveredTo:[]}));else{let $={outcome:"rejected",reason:M,source:p,type:typeof S.type=="string"?S.type:"",deliveredTo:[],turn:f,time:g()};_&&($.detail=_),typeof S.idempotencyKey=="string"&&($.idempotencyKey=S.idempotencyKey),D($)}}function ao(p,S){C(p),G(p,{status:"accepted",envelope:p}),j(p.correlationId),ut(p);let M=ct(p);D(O(p,{outcome:"accepted",source:S,deliveredTo:M}))}function Jt(p,S,M,_){let N=_?.type??(typeof S.type=="string"?S.type:""),$={outcome:"duplicate",reason:"duplicate",detail:M.status==="accepted"?"idempotent accepted":"idempotent rejected",source:p,type:N,deliveredTo:[],turn:f,time:g()};_?($.kind=_.kind,$.envelopeId=_.id,$.hops=_.hops,$.seq=_.seq,$.correlationId=_.correlationId,$.schemaVersion=_.schemaVersion,_.target&&($.target=_.target),_.causationId&&($.causationId=_.causationId),_.idempotencyKey&&($.idempotencyKey=_.idempotencyKey),_.payload!==void 0&&($.payload=A(_.payload))):typeof S.idempotencyKey=="string"&&($.idempotencyKey=S.idempotencyKey),M.status==="accepted"&&($.priorEnvelopeId=M.envelope.id,$.envelopeId||($.envelopeId=M.envelope.id)),D($)}function er(p,S,M,_){if(!M.ok){ie(p,S,"malformed",M.detail);return}let N=M.envelope,$=B(N);if($)return Jt(p,S,$,N),$.status==="accepted"?$.envelope:void 0;if(N.hops<1){ie(p,S,"hop-limit","no hops remaining",N);return}if(N.target&&N.target!==t){let ue=I.get(N.target);if(!ue){ie(p,S,"unknown-target",`unknown target "${N.target}"`,N);return}if(!Se(ue.subscribe,N.type)){ie(p,S,"not-subscribed",`target "${N.target}" does not subscribe to ${N.type}`,N);return}}if(_){if(!de(_,N)){ie(p,S,"unauthorized","source may not emit this event",N);return}if(_.emitsThisTurn+=1,_.emitsThisTurn>r){ie(p,S,"rate-limited","maxPerTurn exceeded",N);return}if(v!==void 0){let pe=g();if(z(_,pe),_.emitTimestamps.push(pe),_.emitTimestamps.length>v){ie(p,S,"rate-limited","maxPerWindow exceeded",N);return}}if(U(N)){ie(p,S,"loop-detected","causation chain cycle or depth exceeded",N);return}if((E.get(N.correlationId)??0)+1>a){ie(p,S,"storm-detected","correlationId storm",N);return}if(e.validate){let pe;try{pe=e.validate(N)}catch(We){let Ie=We instanceof Error?We.message:"validate threw";ie(p,S,"host-rejected",Ie,N);return}if(pe!==!0){ie(p,S,"host-rejected",pe.detail,N);return}}}else{if(U(N)){ie(p,S,"loop-detected","causation chain cycle or depth exceeded",N);return}if((E.get(N.correlationId)??0)+1>a){ie(p,S,"storm-detected","correlationId storm",N);return}}return ao(N,p),N}function uo(p,S){let M=I.get(p);if(!M)return;let _={...S},N=T(M,_);R(_,N);let $=F(M.id,_.idempotencyKey);if($){Jt(p,_,$);return}let ue=Y(M),pe=Ot(_,{source:M.id,createId:k,seq:ue,causationId:N?.id,maxHops:o,parentHops:L(_.causationId??N?.id,N?.hops)});er(p,_,pe,M)}function co(p,S){let M=S?.cause,_={...p};R(_,M);let N=F(t,_.idempotencyKey);if(N)return Jt(t,_,N),N.status==="accepted"?N.envelope:void 0;u+=1;let $=Ot(_,{source:t,createId:k,seq:u,causationId:_.causationId,maxHops:o,parentHops:L(_.causationId,M?.hops)});return er(t,_,$,void 0)}function lo(){if(!V){V=!0;try{for(;P.length>0;){let p=P.shift();p&&(p.kind==="cart"?uo(p.participantId,p.event):p.result=co(p.event,p.extras))}}finally{V=!1}}}function tr(p){P.push(p),lo()}return{attach(p,S,M={}){if(p===t||p===n)throw new Error(`createEventRouter: "${p}" is a reserved participant id`);for(let $ of I.values())if($.channel===S&&$.id!==p)throw new Error(`createEventRouter: channel already attached as "${$.id}"`);I.get(p)?.unsubscribe();let N={id:p,channel:S,emit:M.emit??Os,subscribe:M.subscribe??[],authoritative:M.authoritative===!0,seq:0,emitsThisTurn:0,emitTimestamps:[],unsubscribe:()=>{}};N.unsubscribe=S.onEvent($=>{tr({kind:"cart",participantId:p,event:$})}),I.set(p,N)},detach(p){let S=I.get(p);S&&(S.unsubscribe(),I.delete(p))},publish(p,S){let M={kind:"publish",event:p,extras:S};return tr(M),M.result},subscribe(p,S){let M={patterns:p,listener:S};return m.push(M),()=>{let _=m.indexOf(M);_>=0&&m.splice(_,1)}},subscribeDecision(p){return x.push(p),()=>{let S=x.indexOf(p);S>=0&&x.splice(S,1)}},inspectParticipants(){return[...I.values()].map(p=>({id:p.id,emit:p.emit.slice(),subscribe:p.subscribe.slice(),authoritative:p.authoritative}))},inspectDecisions(){return h.map(p=>A(p))},turn(){f+=1,E.clear();for(let p of I.values())p.emitsThisTurn=0,p.lastDelivered=void 0,v!==void 0&&z(p,g())}}}var _s=new Set(["string","number","boolean","object","array"]);function te(e,t,n){return n?{code:e,detail:t,path:n}:{code:e,detail:t}}function si(e){if(!(typeof e!="string"||e.length===0)){for(let t of e.split("."))if(Mt(t))return t}}function ai(e){let t=e.split(".");return t.length===0?"*":(t[t.length-1]="*",t.join("."))}function Cn(e){let t=[];if(!e||typeof e!="object")return[te("invalid-schema","payload schema is required")];if((typeof e.version!="number"||!Number.isInteger(e.version)||e.version<1)&&t.push(te("invalid-version","payload schema version must be an integer >= 1")),!e.fields||typeof e.fields!="object"||Array.isArray(e.fields))return t.push(te("invalid-fields","payload schema fields must be an object")),t;for(let[n,r]of Object.entries(e.fields)){if(!n){t.push(te("invalid-field","field name is required",n));continue}(!r||typeof r!="object"||!_s.has(r.type))&&t.push(te("invalid-field-type",`field "${n}" type must be string | number | boolean | object | array`,n))}return t}function Ns(e){return e===null?"null":e===void 0?"undefined":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="number"&&Number.isFinite(e)?"number":typeof e=="boolean"?"boolean":typeof e=="object"?"object":"other"}function Ls(e,t){if(t===void 0){let i=Object.entries(e.fields).filter(([,o])=>o.optional!==!0);return i.length===0?{ok:!0,payload:void 0}:{ok:!1,errors:i.map(([o])=>te("missing-field",`payload is missing required field "${o}"`,o))}}if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,errors:[te("invalid-payload","payload must be a JSON object")]};let n=t,r=[];for(let[i,o]of Object.entries(e.fields)){if(!(i in n)||n[i]===void 0){o.optional!==!0&&r.push(te("missing-field",`payload is missing required field "${i}"`,i));continue}let a=Ns(n[i]);a!==o.type&&r.push(te("field-type",`payload.${i} expected ${o.type}, got ${a}`,i))}return r.length>0?{ok:!1,errors:r}:{ok:!0,payload:t}}function Fs(e,t,n){let r=ai(e);return{type:e,kind:t,payloadSchema:{version:n.version,fields:{...n.fields}},emitPattern:r,subscribePattern:r,toManifest(){let i={};for(let[o,a]of Object.entries(this.payloadSchema.fields))i[o]={type:a.type,optional:a.optional===!0};return{type:this.type,kind:this.kind,version:this.payloadSchema.version,fields:i,emitPattern:this.emitPattern,subscribePattern:this.subscribePattern}},validatePayload(i){return Ls(this.payloadSchema,i)}}}function wn(e,t,n){let r=[];if(typeof t!="string"||t.length===0)r.push(te("invalid-type","event type is required"));else if(t.split(".").some(i=>i.length===0))r.push(te("invalid-type",`event type "${t}" has empty dotted segments`));else{let i=si(t);i?i!==e&&r.push(te("kind-mismatch",`type "${t}" infers kind "${i}" but this helper defines "${e}"`)):r.push(te("kind-mismatch",`type "${t}" has no "${e}" segment; dotted names like host.presentation.* need e.g. host.presentation.${e}.cue-started`))}return r.push(...Cn(n)),r.length>0?{ok:!1,errors:r}:{ok:!0,contract:Fs(t,e,n)}}function Hs(e,t){return wn("intent",e,t)}function Vs(e,t){return wn("state",e,t)}function Bs(e,t){return wn("diagnostic",e,t)}function Ks(e,t){let n=Cn(e),r=Cn(t);if(n.length>0||r.length>0||t.version<e.version)return"breaking";let i=Object.keys(e.fields),o=Object.keys(t.fields),a=new Set(i),d=new Set(o);for(let y of i){if(!d.has(y))return"breaking";let g=e.fields[y],w=t.fields[y];if(g.type!==w.type)return"breaking";let k=g.optional!==!0,I=w.optional===!0;if(k&&I||!k&&w.optional!==!0&&g.optional===!0)return"breaking"}let c=!1;for(let y of o)if(!a.has(y)){if(t.fields[y].optional!==!0)return"breaking";c=!0}let v=i.length===o.length&&i.every(y=>t.fields[y].type===e.fields[y].type&&t.fields[y].optional===!0==(e.fields[y].optional===!0));return v&&t.version===e.version?"identical":t.version>e.version&&(c||v)?"backward-compatible":t.version===e.version&&c?"breaking":v?"identical":"breaking"}function $s(e,t){let n=[],r=[],i=new Set,o=new Set;for(let a of e)(t==="authoritative"||a.kind==="intent")&&!i.has(a.emitPattern)&&(i.add(a.emitPattern),n.push(a.emitPattern)),a.kind!=="intent"&&!o.has(a.subscribePattern)&&(o.add(a.subscribePattern),r.push(a.subscribePattern));return{emit:n,subscribe:r,authoritative:t==="authoritative"}}function Us(e,t){let n=e.emit??["*.intent.*"],r=e.authoritative===!0,i=[];for(let o of t)Se(n,o.type)&&(o.kind==="state"||o.kind==="diagnostic")&&!r&&i.push(te("unauthorized-emit",`emit pattern allows ${o.kind} "${o.type}" but attach is not authoritative`,o.type));return i.length>0?{ok:!1,errors:i}:{ok:!0}}function Gs(e){let t=new Map;for(let i of e)t.set(i.type,i);let n=i=>{let o=t.get(i.type);return o?o.kind!==i.kind?{ok:!1,errors:[te("kind-mismatch",`envelope kind "${i.kind}" does not match contract "${o.kind}"`,i.type)]}:o.validatePayload(i.payload):{ok:!1,errors:[te("unknown-type",`no contract registered for "${i.type}"`,i.type)]}};return{get(i){return t.get(i)},manifest(){return[...t.values()].sort((i,o)=>i.type.localeCompare(o.type)).map(i=>i.toManifest())},validateEnvelope:n,asRouterValidate:i=>{let o=n(i);return o.ok?!0:{reason:"host-rejected",detail:o.errors.map(a=>a.detail).join("; ")}}}}var je=1,kn="presentation.state.model",ui="presentation.intent.unsupported",ci=["loading","ready","error","unsupported"],js=["presentation.state.*",me],zs="Presentation adapter has been destroyed",li="Presentation adapter: model is invalid or not JSON-serializable",qs=new Set(ci);function pi(e){return typeof e=="string"&&qs.has(e)}function Rn(e){if(e===null||typeof e!="object")return!1;let t=e;return!(t.contractVersion!==je||!pi(t.phase)||t.reason!==void 0&&typeof t.reason!="string"||t.view!==void 0&&(t.view===null||typeof t.view!="object"))}function An(e,t){let n={type:kn,kind:"state",payload:e};return t?.correlationId&&(n.correlationId=t.correlationId),t?.causationId&&(n.causationId=t.causationId),t?.idempotencyKey&&(n.idempotencyKey=t.idempotencyKey),n}function xn(){return{contractVersion:je,phase:"loading"}}function Pn(e){return{contractVersion:je,phase:"unsupported",reason:e}}function In(e){let t=Ge(e);return t.ok?Rn(t.value)?{ok:!0,model:t.value}:t.value!==null&&typeof t.value=="object"&&"contractVersion"in t.value&&t.value.contractVersion!==je?{ok:!1,reason:"unknown-contract-version",contractVersion:t.value.contractVersion}:{ok:!1,reason:"invalid-model"}:{ok:!1,reason:"model-not-serializable"}}function _t(e){let t=In(e);if(!t.ok)throw new Error(li);return t.model}function Ws(e){let t=Ge(e);return t.ok&&Rn(t.value)?t.value:Pn("model-not-serializable")}function Ys(e,t){if(e.type!==kn)return{model:t};let n=In(e.payload);return n.ok?{model:n.model}:{model:Pn(n.reason),rejected:{reason:n.reason,contractVersion:n.contractVersion}}}function Js(e){if(e===null||typeof e!="object"||!("regions"in e))return[];let t=e.regions;return Array.isArray(t)?t:[]}function Xs(e,t,n){return e>=n.x&&e<n.x+n.width&&t>=n.y&&t<n.y+n.height}function Qs(e,t){let n=t.intent;if(!n||typeof n.type!="string"||n.type.length===0)return;let r={type:n.type,kind:"intent"};if(n.payload!==void 0){let i=Ge(n.payload);if(!i.ok)return;r.payload=i.value}n.target&&(r.target=n.target),n.correlationId&&(r.correlationId=n.correlationId),n.idempotencyKey&&(r.idempotencyKey=n.idempotencyKey),e.emit(r)}function fi(e,t,n){let r={reason:t};if(n!==void 0){let i=Ge(n);i.ok&&(r.contractVersion=i.value)}e.emit({type:ui,kind:"intent",payload:r})}function di(e,t,n){let r=t;for(let i of e){let o=Ys(i,r);o.rejected&&n&&fi(n,o.rejected.reason,o.rejected.contractVersion),r=o.model}return r}function mi(){return{metadata:{id:"cyberart.presentation.reference",name:"Reference presentation",frameRate:30},getDefaultState:(e,t,n,r,i,o,a,d,c)=>{let v=i?.model;if(v===void 0)return{model:xn()};let y=In(v);return y.ok?{model:y.model}:(c&&fi(c,y.reason,y.contractVersion),{model:Pn(y.reason)})},update:(e,t,n,r,i,o,a,d,c,v,y)=>{let g=di(y?.consume()??[],i.model,y);for(;a?.hasClick();){let w=a.consumeClick();if(!(!w||g.phase!=="ready"||!y)){for(let k of Js(g.view))if(Xs(w.x,w.y,k)){Qs(y,k);break}}}return y&&(g=di(y.consume(),g,y)),g===i.model?i:{...i,model:g}},render:(e,t,n,r,i,o)=>{let a=i.model.view?.background;o.fillStyle=a??"#111",o.fillRect(0,0,r.width,r.height)}}}function hi(e,t={}){let n=e,r=t.model?_t(t.model):xn(),i=!1,o=t.present??t.model!==void 0,a=()=>{if(i)throw new Error(zs)},d=c=>{a(),r=_t(c),n.dispatch(An(r))};return o&&n.dispatch(An(r)),{version:je,get target(){return n},get model(){return Ws(r)},get phase(){return r.phase},get paused(){return n.paused===!0},present:d,async start(){return a(),n.start()},pause(){a(),n.pause()},resume(){a(),n.resume()},retarget(c){a(),n=c},destroy(){i||(i=!0,n.destroy())}}}function Zs(e,t={}){let n=t.model?_t(t.model):t.initialState?.model!==void 0?_t(t.initialState.model):xn(),r=t.cart??mi(),i=e.mount(r,{initialState:{...t.initialState,model:n},onEvent:t.onEvent});return hi(i,{model:n,present:!1})}var Re="cue.started",ze="cue.completed",xe="cue.cancelled",Ce="cue.replaced",ea=[Re,ze,xe,Ce];function ta(e){return e===Re||e===ze||e===xe||e===Ce}function gi(e,t){let n=e<0?0:e>1?1:e;return t==="ease-out"?1-(1-n)*(1-n):n}function yi(e){return{type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,progress:e.progress}}function Nt(e){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:e.phase,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,progress:e.progress,repeatIndex:e.repeatIndex}}function Tn(e){return e.startFrame+e.delayFrames}function na(e,t){if(!e||typeof e!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof e.name!="string"||e.name.length===0)return{ok:!1,reason:"invalid",detail:"name is required"};if(typeof e.idempotencyKey!="string"||e.idempotencyKey.length===0)return{ok:!1,reason:"invalid",detail:"idempotencyKey is required"};if(typeof e.durationFrames!="number"||!Number.isFinite(e.durationFrames)||e.durationFrames<0)return{ok:!1,reason:"invalid",detail:"durationFrames must be a non-negative finite number"};let n=e.startFrame===void 0?t:e.startFrame;if(typeof n!="number"||!Number.isFinite(n))return{ok:!1,reason:"invalid",detail:"startFrame must be finite"};let r=e.delayFrames??0;if(typeof r!="number"||!Number.isFinite(r)||r<0)return{ok:!1,reason:"invalid",detail:"delayFrames must be a non-negative finite number"};let i=e.easing??"linear";if(i!=="linear"&&i!=="ease-out")return{ok:!1,reason:"invalid",detail:"unsupported easing"};let o=e.onDuplicate??"replace";if(o!=="ignore"&&o!=="replace"&&o!=="reject")return{ok:!1,reason:"invalid",detail:"unsupported onDuplicate"};let a=0;if(e.repeat)if("forever"in e.repeat&&e.repeat.forever)a="forever";else if("count"in e.repeat){if(typeof e.repeat.count!="number"||!Number.isFinite(e.repeat.count)||e.repeat.count<0)return{ok:!1,reason:"invalid",detail:"repeat.count must be >= 0"};a=Math.floor(e.repeat.count)}else return{ok:!1,reason:"invalid",detail:"unsupported repeat"};let d=e.reducedMotion??"complete";return d!=="skip"&&d!=="complete"&&(typeof d!="object"||typeof d.durationFrames!="number"||!Number.isFinite(d.durationFrames)||d.durationFrames<0)?{ok:!1,reason:"invalid",detail:"unsupported reducedMotion"}:{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:n,durationFrames:e.durationFrames,delayFrames:r,easing:i,repeatRemaining:a,repeatIndex:0,reducedMotion:d,onDuplicate:o,phase:"scheduled",progress:0}}function ra(e,t){if(!t)return e;let n=e.reducedMotion;return n==="skip"||n==="complete"?{...e,durationFrames:0,delayFrames:0,startFrame:e.startFrame}:{...e,durationFrames:n.durationFrames}}function Mn(e={}){let t=!!e.reducedMotion,n=e.originFrame??0,r=new Map,i=[];function o(m){i.push(m)}function a(m,x){let H=Tn(m)-Tn(x);return H!==0?H:m.name<x.name?-1:m.name>x.name?1:m.idempotencyKey<x.idempotencyKey?-1:m.idempotencyKey>x.idempotencyKey?1:0}function d(m,x){o({type:x,atFrame:n,name:m.name,idempotencyKey:m.idempotencyKey,progress:m.progress})}function c(m){if(m.phase="completed",m.progress=1,d(m,ze),m.repeatRemaining==="forever"||m.repeatRemaining>0){if(typeof m.repeatRemaining=="number"&&(m.repeatRemaining-=1),m.repeatIndex+=1,m.phase="scheduled",m.progress=0,m.startFrame=n,m.delayFrames=0,m.durationFrames===0){r.delete(m.idempotencyKey);return}m.phase="active",d(m,Re)}else r.delete(m.idempotencyKey)}function v(m){if(m.phase==="cancelled"||m.phase==="completed")return;let x=Tn(m);if(!(n<x)){if(m.phase==="scheduled"&&(m.phase="active",m.progress=m.durationFrames===0?1:0,d(m,Re),m.durationFrames===0)){c(m);return}if(m.phase==="active"){let H=n-x;H>=m.durationFrames?(m.progress=1,c(m)):m.progress=gi(m.durationFrames===0?1:H/m.durationFrames,m.easing)}}}function y(){let m=[...r.values()].sort(a);for(let x of m)v(x)}function g(m){let x=na(m,n);if("ok"in x&&x.ok===!1)return x;let H=ra(x,t),E=r.get(H.idempotencyKey);if(E&&(E.phase==="scheduled"||E.phase==="active")){if(E.onDuplicate==="reject"||H.onDuplicate==="reject")return{ok:!1,reason:"duplicate",detail:`cue ${H.idempotencyKey} is already ${E.phase}`};if(E.onDuplicate==="ignore"||H.onDuplicate==="ignore")return{ok:!0,cue:Nt(E)};E.phase="cancelled",E.progress=E.progress,d(E,Ce),r.delete(E.idempotencyKey)}r.set(H.idempotencyKey,H),v(H);let b=r.get(H.idempotencyKey)??H;return{ok:!0,cue:Nt(b)}}function w(m){let x=r.get(m);return!x||x.phase==="completed"||x.phase==="cancelled"?!1:(x.phase="cancelled",d(x,xe),r.delete(m),!0)}function k(){for(let m of[...r.values()].sort(a))(m.phase==="scheduled"||m.phase==="active")&&(m.phase="cancelled",d(m,xe));r.clear(),i.length=0,n=e.originFrame??0}function I(m=1){let x=Number.isFinite(m)?Math.max(0,Math.floor(m)):0,H=i.length;for(let E=0;E<x;E++)n+=1,y();return i.slice(H).map(yi)}return{play:g,step:I,cancel:w,reset:k,snapshot(){return{frame:n,reducedMotion:t,cues:[...r.values()].sort(a).map(Nt),events:i.map(yi)}},get(m){let x=r.get(m);return x?Nt(x):void 0},get frame(){return n},get reducedMotion(){return t}}}var Ft="audio.cue.scheduled",Ht="audio.cue.started",Vt="audio.cue.skipped",Bt="audio.cue.failed",ia=[Ft,Ht,Vt,Bt];function oa(e){return e===Ft||e===Ht||e===Vt||e===Bt}function Dn(e){let t={type:e.type,atFrame:e.atFrame,name:e.name,idempotencyKey:e.idempotencyKey,assetId:e.assetId,channelId:e.channelId,progress:e.progress};return e.participantId!==void 0&&(t.participantId=e.participantId),e.reason!==void 0&&(t.reason=e.reason),t}function sa(e){return{name:e.name,idempotencyKey:e.idempotencyKey,startFrame:e.startFrame,durationFrames:e.durationFrames,delayFrames:e.delayFrames,easing:e.easing,repeat:e.repeat,reducedMotion:e.reducedMotion,onDuplicate:e.onDuplicate}}function Lt(e,t,n){return{name:e.name,idempotencyKey:e.idempotencyKey,phase:t?.phase??(e.audioPhase==="started"?"active":"scheduled"),startFrame:t?.startFrame??n,durationFrames:t?.durationFrames??0,delayFrames:t?.delayFrames??0,easing:t?.easing??"linear",progress:t?.progress??0,repeatIndex:t?.repeatIndex??0,assetId:e.assetId,channelId:e.channelId,participantId:e.participantId,priority:e.priority,audioPhase:e.audioPhase}}function bi(e={}){let t=e.broker,n=!!(e.reducedSensory??t?.reducedSensory),r=Mn({originFrame:e.originFrame}),i=new Map,o=[],a=new Set,d=0;function c(u){o.push(u)}function v(u,s,f){let A=r.get(s.idempotencyKey);return Dn({type:u,atFrame:r.frame,name:s.name,idempotencyKey:s.idempotencyKey,assetId:s.assetId,channelId:s.channelId,participantId:s.participantId,reason:f?.reason,progress:f?.progress??A?.progress??0})}function y(u,s){a.delete(u.idempotencyKey),t?.noteCueEnded(u.idempotencyKey),u.audioPhase="failed",c(v(Bt,u,{reason:s})),r.cancel(u.idempotencyKey),i.delete(u.idempotencyKey)}function g(u,s){a.delete(u.idempotencyKey),u.audioPhase="skipped",c(v(Vt,u,{reason:s}))}function w(u){a.delete(u.idempotencyKey),u.audioPhase="started",t?.noteCueStarted({idempotencyKey:u.idempotencyKey,channelId:u.channelId,participantId:u.participantId,priority:u.priority}),c(v(Ht,u))}function k(u){if(u.audioPhase!=="scheduled")return;if(t&&!t.isAuthorized(u.participantId)){g(u,"unauthorized"),r.cancel(u.idempotencyKey),i.delete(u.idempotencyKey);return}if(n||t?.reducedSensory){g(u,"reduced-sensory");return}if(t?.muted||t&&t.effectiveGain(u.channelId)===0){g(u,"muted");return}let s=t?.assetStatus(u.assetId);if(!t){w(u);return}if(s==="failed"){y(u,"asset-failed");return}if(s==="ready"){w(u);return}a.add(u.idempotencyKey)}function I(u,s){for(let f of[...a]){let A=i.get(f);if(!A){a.delete(f);continue}if(!(u&&A.assetId!==u)){if(s==="failed"||t?.assetStatus(A.assetId)==="failed"){y(A,"asset-failed");continue}(s==="ready"||t?.assetStatus(A.assetId)==="ready")&&k(A)}}}function m(u){for(let s of[...i.values()])s.participantId===u&&(s.audioPhase==="scheduled"||s.audioPhase==="started")&&y(s,"torn-down")}function x(u){for(let s of u){let f=i.get(s.idempotencyKey);if(f)if(s.type===Re)k(f);else if(s.type===ze){if(a.delete(f.idempotencyKey),t?.noteCueEnded(f.idempotencyKey),r.get(f.idempotencyKey)){f.audioPhase="scheduled";continue}f.audioPhase==="scheduled"?y(f,"asset-failed"):(f.audioPhase==="started"&&(f.audioPhase="completed"),i.delete(f.idempotencyKey))}else s.type===xe?(a.delete(f.idempotencyKey),t?.noteCueEnded(f.idempotencyKey),(f.audioPhase==="scheduled"||f.audioPhase==="started")&&(f.audioPhase="failed"),i.delete(f.idempotencyKey)):s.type===Ce&&(a.delete(f.idempotencyKey),t?.noteCueEnded(f.idempotencyKey),i.delete(f.idempotencyKey))}}function H(){let u=o.slice(d).map(Dn);return d=o.length,u}let E=t?.onNotice(u=>{if(u.type==="asset"){if(u.status==="failed"){for(let s of[...i.values()])s.assetId===u.id&&(s.audioPhase==="scheduled"||s.audioPhase==="started")&&y(s,"asset-failed");return}I(u.id,u.status);return}if(u.type==="teardown"){m(u.participantId);return}if(u.type==="destroy")for(let s of[...i.values()])(s.audioPhase==="scheduled"||s.audioPhase==="started")&&y(s,"torn-down")});function b(){for(let u of i.values())t?.noteCueEnded(u.idempotencyKey);i.clear(),a.clear(),o.length=0,d=0,r.reset()}function h(u){if(!u||typeof u!="object")return{ok:!1,reason:"invalid",detail:"spec is required"};if(typeof u.assetId!="string"||u.assetId.length===0)return{ok:!1,reason:"invalid",detail:"assetId is required"};let s=r.snapshot().events.length,f=r.play(sa(u));if(!f.ok)return f;let A=r.snapshot().events.slice(s),D=A.some(R=>R.type===Ce);if(!D&&i.has(u.idempotencyKey)){let R=i.get(u.idempotencyKey);return{ok:!0,cue:Lt(R,f.cue,r.frame)}}if(D){let R=i.get(u.idempotencyKey);R&&(a.delete(R.idempotencyKey),t?.noteCueEnded(R.idempotencyKey),i.delete(R.idempotencyKey))}let O=u.channelId??u.participantId??"master",P={name:u.name,idempotencyKey:u.idempotencyKey,assetId:u.assetId,channelId:O,participantId:u.participantId,priority:Number.isFinite(u.priority)?u.priority:0,audioPhase:"scheduled"};i.set(P.idempotencyKey,P),typeof u.gain=="number"&&t?.setChannelGain(O,u.gain,u.participantId),typeof u.priority=="number"&&t?.setPriority(O,u.priority,u.participantId),c(v(Ft,P)),x(A.filter(R=>R.type!==Ce));let V=i.get(P.idempotencyKey);V&&V.audioPhase==="scheduled"&&t?.assetStatus(V.assetId)==="failed"&&y(V,"asset-failed"),H();let l=i.get(P.idempotencyKey)??P,C=r.get(P.idempotencyKey)??f.cue;return{ok:!0,cue:Lt(l,C,r.frame)}}return{play:h,step(u=1){let s=r.step(u);return x(s),H()},cancel(u){let s=i.get(u),f=r.cancel(u);return s&&(a.delete(u),t?.noteCueEnded(u),i.delete(u)),f},reset:b,snapshot(){return{frame:r.frame,reducedSensory:n,cues:[...i.values()].map(u=>Lt(u,r.get(u.idempotencyKey),r.frame)).sort((u,s)=>u.name!==s.name?u.name<s.name?-1:1:u.idempotencyKey<s.idempotencyKey?-1:u.idempotencyKey>s.idempotencyKey?1:0),events:o.map(Dn)}},get(u){let s=i.get(u);if(s)return Lt(s,r.get(u),r.frame)},dispose(){E?.(),b()},get frame(){return r.frame},get reducedSensory(){return n}}}function aa(e,t){return e.play(t)}function da(e={}){let t=yn({toneStart:async()=>{},reducedSensory:e.reducedSensory}),n=bi({broker:t,originFrame:e.originFrame,reducedSensory:e.reducedSensory});return{broker:t,timeline:n,unlock(){return t.unlock()},play(r){return n.play(r)},step(r){return n.step(r)},handleHostEvent(r){t.handleHostEvent(r)},snapshot(){return{...n.snapshot(),unlock:t.status(),muted:t.muted}},destroy(){n.dispose(),t.destroy()}}}var ua=1,Ei=["loading","ready","error","unsupported"],Si=["keyboard","pointer","audio","assets","hostChannel"],Ci=["image","audio","font","spritesheet"],wi=["tone","midi"],Ut=["source-over","screen"],Gt=["transparent","opaque"],ca=new Set(Ei),Ai=new Set(Si),vi=new Set(Ci),ki=new Set(wi),la=new Set(["version","id","runtime","phases","managers","assets","acceptedEvents","emittedEvents","permissions","integrations","surface","layers","modules"]),pa=new Set(["minContractVersion","features"]),fa=new Set(["kinds","declarations"]),ma=new Set(["id","kind"]),ha=new Set(["emit","subscribe","authoritative"]),Ri=new Set(["alpha","clearPolicy"]),xi=new Set(["compositor","blend"]),Pi=new Set(["refs"]),ya=new Set(["id","version"]),Kt=/^[a-z0-9][a-z0-9.-]*$/i,Ii=new Set(Ut),Ti=new Set(Gt),ga=new Set(["contractVersion","features","integrations","managers","emit","subscribe","surface","layers","modules"]);function K(e,t,n){return n?{code:e,detail:t,path:n}:{code:e,detail:t}}function se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ae(e,t,n){let r=[];for(let i of Object.keys(e))t.has(i)||r.push(K("unknown-field",`unknown field "${i}"`,n?`${n}.${i}`:i));return r}function ba(e){if(typeof e!="string"||e.length===0)return!1;let t=e.split(".");return t.some(n=>n.length===0)?!1:t.every(n=>n==="*"||/^[a-z0-9][a-z0-9-]*$/i.test(n))}function va(e,t){let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function $t(e,t){for(let n of t)if(e===n||va(n,e))return!0;return!1}function it(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function On(e,t,n){if(!Array.isArray(e))return{ok:!1,errors:[K("invalid-field",`${t} must be an array`,t)]};let r=[],i=[];return e.forEach((o,a)=>{let d=`${t}[${a}]`;if(typeof o!="string"||o.length===0){r.push(K("invalid-field",`${t} entries must be non-empty strings`,d));return}let c=n(o,d);c?r.push(c):i.push(o)}),r.length>0?{ok:!1,errors:r}:{ok:!0,values:i}}function qe(e,t){return On(e,t,(n,r)=>ba(n)?void 0:K("invalid-pattern",`invalid event pattern "${n}"`,r))}function we(e,t,n,r,i){return On(e,t,(o,a)=>n.has(o)?void 0:K(r,`invalid ${i} "${o}"`,a))}function Mi(e,t){return On(e,t,(n,r)=>/^[a-z0-9][a-z0-9.-]*$/i.test(n)?void 0:K("invalid-feature",`invalid feature tag "${n}"`,r))}function Di(e,t){if(!Array.isArray(e))return{ok:!1,errors:[K("invalid-module",`${t} must be an array`,t)]};let n=[],r=[];return e.forEach((i,o)=>{let a=`${t}[${o}]`;if(!se(i)){n.push(K("invalid-module","module ref must be an object",a));return}n.push(...ae(i,ya,a)),(typeof i.id!="string"||i.id.length===0||!Kt.test(i.id))&&n.push(K("invalid-module",`invalid module id "${String(i.id)}"`,`${a}.id`)),(typeof i.version!="string"||i.version.length===0||!Kt.test(i.version))&&n.push(K("invalid-module",`invalid module version "${String(i.version)}"`,`${a}.version`)),typeof i.id=="string"&&Kt.test(i.id)&&typeof i.version=="string"&&Kt.test(i.version)&&r.push({id:i.id,version:i.version})}),n.length>0?{ok:!1,errors:n}:{ok:!0,values:r}}function Ea(e){let t=new Set,n=[];for(let r of e){let i=`${r.id}@${r.version}`;t.has(i)||(t.add(i),n.push({id:r.id,version:r.version}))}return n}function Sa(e){if(!se(e))return[K("invalid-manifest","capability manifest must be a JSON object")];let t=[...ae(e,la,"")];if(e.version!==void 0&&e.version!==1&&t.push(K("invalid-version","capability manifest version must be 1","version")),(typeof e.id!="string"||e.id.length===0)&&t.push(K("invalid-id","id is required","id")),!se(e.runtime))t.push(K("invalid-runtime","runtime is required","runtime"));else{t.push(...ae(e.runtime,pa,"runtime"));let d=e.runtime.minContractVersion;(typeof d!="number"||!Number.isInteger(d)||d<1)&&t.push(K("invalid-runtime","runtime.minContractVersion must be an integer >= 1","runtime.minContractVersion"));let c=Mi(e.runtime.features,"runtime.features");c.ok||t.push(...c.errors)}let n=we(e.phases,"phases",ca,"invalid-phase","phase");n.ok||t.push(...n.errors);let r=we(e.managers,"managers",Ai,"invalid-manager","manager");if(r.ok||t.push(...r.errors),!se(e.assets))t.push(K("invalid-assets","assets is required","assets"));else{t.push(...ae(e.assets,fa,"assets"));let d=we(e.assets.kinds,"assets.kinds",vi,"invalid-asset-kind","asset kind");d.ok||t.push(...d.errors),Array.isArray(e.assets.declarations)?e.assets.declarations.forEach((c,v)=>{let y=`assets.declarations[${v}]`;if(!se(c)){t.push(K("invalid-assets","asset declaration must be an object",y));return}t.push(...ae(c,ma,y)),(typeof c.id!="string"||c.id.length===0)&&t.push(K("invalid-assets","asset declaration id is required",`${y}.id`)),(typeof c.kind!="string"||!vi.has(c.kind))&&t.push(K("invalid-asset-kind",`invalid asset kind "${String(c.kind)}"`,`${y}.kind`))}):t.push(K("invalid-assets","assets.declarations must be an array","assets.declarations"))}let i=qe(e.acceptedEvents,"acceptedEvents");i.ok||t.push(...i.errors);let o=qe(e.emittedEvents,"emittedEvents");if(o.ok||t.push(...o.errors),!se(e.permissions))t.push(K("invalid-permissions","permissions is required","permissions"));else{t.push(...ae(e.permissions,ha,"permissions"));let d=qe(e.permissions.emit,"permissions.emit");d.ok||t.push(...d.errors);let c=qe(e.permissions.subscribe,"permissions.subscribe");c.ok||t.push(...c.errors),e.permissions.authoritative!==void 0&&typeof e.permissions.authoritative!="boolean"&&t.push(K("invalid-permissions","permissions.authoritative must be a boolean","permissions.authoritative"))}let a=we(e.integrations,"integrations",ki,"invalid-integration","integration");if(a.ok||t.push(...a.errors),e.surface!==void 0&&(se(e.surface)?(t.push(...ae(e.surface,Ri,"surface")),e.surface.alpha!==void 0&&typeof e.surface.alpha!="boolean"&&t.push(K("invalid-surface","surface.alpha must be a boolean","surface.alpha")),e.surface.clearPolicy!==void 0&&(typeof e.surface.clearPolicy!="string"||!Ti.has(e.surface.clearPolicy))&&t.push(K("invalid-clear-policy",`invalid clear policy "${String(e.surface.clearPolicy)}"`,"surface.clearPolicy"))):t.push(K("invalid-surface","surface must be an object","surface"))),e.layers!==void 0){if(!se(e.layers))t.push(K("invalid-layers","layers must be an object","layers"));else if(t.push(...ae(e.layers,xi,"layers")),e.layers.compositor!==void 0&&typeof e.layers.compositor!="boolean"&&t.push(K("invalid-layers","layers.compositor must be a boolean","layers.compositor")),e.layers.blend!==void 0){let d=we(e.layers.blend,"layers.blend",Ii,"invalid-blend","blend mode");d.ok||t.push(...d.errors)}}if(e.modules!==void 0){if(!se(e.modules))t.push(K("invalid-module","modules must be an object","modules"));else if(t.push(...ae(e.modules,Pi,"modules")),e.modules.refs!==void 0){let d=Di(e.modules.refs,"modules.refs");d.ok||t.push(...d.errors)}}return t}function Ca(e){let t=[];return e.emittedEvents.forEach((n,r)=>{$t(n,e.permissions.emit)||t.push(K("undeclared-permission",`emitted event "${n}" is not covered by permissions.emit`,`emittedEvents[${r}]`))}),e.acceptedEvents.forEach((n,r)=>{$t(n,e.permissions.subscribe)||t.push(K("undeclared-permission",`accepted event "${n}" is not covered by permissions.subscribe`,`acceptedEvents[${r}]`))}),t}function wa(e){let t=it(e.assets.kinds),n=e.assets.declarations.map(o=>({id:o.id,kind:o.kind})),r={emit:[...e.permissions.emit],subscribe:[...e.permissions.subscribe]};e.permissions.authoritative===!0&&(r.authoritative=!0);let i={version:1,id:e.id,runtime:{minContractVersion:e.runtime.minContractVersion,features:[...e.runtime.features]},phases:it(e.phases),managers:it(e.managers),assets:{kinds:t,declarations:n},acceptedEvents:[...e.acceptedEvents],emittedEvents:[...e.emittedEvents],permissions:r,integrations:it(e.integrations)};if(e.surface){let o={};e.surface.alpha===!0&&(o.alpha=!0),e.surface.clearPolicy&&(o.clearPolicy=e.surface.clearPolicy),(o.alpha!==void 0||o.clearPolicy!==void 0)&&(i.surface=o)}if(e.layers){let o={};e.layers.compositor===!0&&(o.compositor=!0),e.layers.blend&&e.layers.blend.length>0&&(o.blend=it(e.layers.blend)),(o.compositor!==void 0||o.blend!==void 0)&&(i.layers=o)}if(e.modules?.refs&&e.modules.refs.length>0){let o=Ea(e.modules.refs);o.length>0&&(i.modules={refs:o})}return i}function _n(e){let t=Sa(e);if(t.length>0)return{ok:!1,errors:t};let n=wa(e);return t.push(...Ca(n)),t.length>0?{ok:!1,errors:t}:{ok:!0,manifest:n}}function Aa(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return{ok:!1,errors:[K("invalid-json","capability manifest JSON is not parseable")]}}return _n(t)}function ka(e){return JSON.parse(JSON.stringify(e))}function Ra(e,t){let n=_n(e),r=n.ok?[]:[...n.errors];if(!se(t))return{ok:!1,errors:[K("invalid-host","host capabilities must be a JSON object")]};r.push(...ae(t,ga,"host")),typeof t.contractVersion!="number"||!Number.isInteger(t.contractVersion)||t.contractVersion<1?r.push(K("invalid-host","host.contractVersion must be an integer >= 1","host.contractVersion")):n.ok&&t.contractVersion<n.manifest.runtime.minContractVersion&&r.push(K("unsupported-runtime",`host contract version ${t.contractVersion} is below required ${n.manifest.runtime.minContractVersion}`,"runtime.minContractVersion"));let i=Mi(t.features,"host.features");if(!i.ok)r.push(...i.errors);else if(n.ok){let d=new Set(i.values);n.manifest.runtime.features.forEach((c,v)=>{d.has(c)||r.push(K("unsupported-feature",`host does not support required feature "${c}"`,`runtime.features[${v}]`))})}let o=we(t.integrations,"host.integrations",ki,"invalid-integration","integration");if(!o.ok)r.push(...o.errors);else if(n.ok){let d=new Set(o.values);n.manifest.integrations.forEach((c,v)=>{d.has(c)||r.push(K("missing-integration",`host does not provide required integration "${c}"`,`integrations[${v}]`))})}if(t.managers!==void 0){let d=we(t.managers,"host.managers",Ai,"invalid-manager","manager");if(!d.ok)r.push(...d.errors);else if(n.ok){let c=new Set(d.values);n.manifest.managers.forEach((v,y)=>{c.has(v)||r.push(K("missing-manager",`host does not provide required manager "${v}"`,`managers[${y}]`))})}}if(t.emit!==void 0){let d=qe(t.emit,"host.emit");d.ok?n.ok&&n.manifest.permissions.emit.forEach((c,v)=>{$t(c,d.values)||r.push(K("unknown-permission",`host does not allow emit permission "${c}"`,`permissions.emit[${v}]`))}):r.push(...d.errors)}if(t.subscribe!==void 0){let d=qe(t.subscribe,"host.subscribe");d.ok?n.ok&&n.manifest.permissions.subscribe.forEach((c,v)=>{$t(c,d.values)||r.push(K("unknown-permission",`host does not allow subscribe permission "${c}"`,`permissions.subscribe[${v}]`))}):r.push(...d.errors)}if(t.surface!==void 0&&(se(t.surface)?(r.push(...ae(t.surface,Ri,"host.surface")),t.surface.alpha!==void 0&&typeof t.surface.alpha!="boolean"&&r.push(K("invalid-host","host.surface.alpha must be a boolean","host.surface.alpha")),t.surface.clearPolicy!==void 0&&(Array.isArray(t.surface.clearPolicy)?t.surface.clearPolicy:[t.surface.clearPolicy]).forEach((c,v)=>{(typeof c!="string"||!Ti.has(c))&&r.push(K("invalid-clear-policy",`invalid clear policy "${String(c)}"`,Array.isArray(t.surface?.clearPolicy)?`host.surface.clearPolicy[${v}]`:"host.surface.clearPolicy"))})):r.push(K("invalid-host","host.surface must be an object","host.surface"))),t.layers!==void 0){if(!se(t.layers))r.push(K("invalid-host","host.layers must be an object","host.layers"));else if(r.push(...ae(t.layers,xi,"host.layers")),t.layers.compositor!==void 0&&typeof t.layers.compositor!="boolean"&&r.push(K("invalid-host","host.layers.compositor must be a boolean","host.layers.compositor")),t.layers.blend!==void 0){let d=we(t.layers.blend,"host.layers.blend",Ii,"invalid-blend","blend mode");d.ok||r.push(...d.errors)}}let a;if(t.modules!==void 0)if(!se(t.modules))r.push(K("invalid-host","host.modules must be an object","host.modules"));else if(r.push(...ae(t.modules,Pi,"host.modules")),t.modules.refs!==void 0){let d=Di(t.modules.refs,"host.modules.refs");d.ok?a=d.values:r.push(...d.errors)}else a=[];if(n.ok&&n.manifest.surface){let d=n.manifest.surface,c=t.surface;d.alpha===!0&&c?.alpha!==!0&&r.push(K("unsupported-surface","host does not provide an alpha-capable surface","surface.alpha")),d.clearPolicy&&((Array.isArray(c?.clearPolicy)?c.clearPolicy:c?.clearPolicy?[c.clearPolicy]:[]).includes(d.clearPolicy)||r.push(K("unsupported-surface",`host does not provide clear policy "${d.clearPolicy}"`,"surface.clearPolicy")))}if(n.ok&&n.manifest.layers){let d=n.manifest.layers,c=t.layers;if(d.compositor===!0&&c?.compositor!==!0&&r.push(K("unsupported-layer","host does not provide a compositor","layers.compositor")),d.blend){let v=new Set(c?.blend??[]);d.blend.forEach((y,g)=>{v.has(y)||r.push(K("unsupported-layer",`host does not provide blend mode "${y}"`,`layers.blend[${g}]`))})}}if(n.ok&&n.manifest.modules?.refs){let d=t.modules===void 0?[]:a??[];n.manifest.modules.refs.forEach((c,v)=>{d.some(y=>y.id===c.id&&y.version===c.version)||r.push(K("unsupported-module",`host does not provide required module "${c.id}@${c.version}"`,`modules.refs[${v}]`))})}return r.length>0?{ok:!1,errors:r}:{ok:!0}}var xa=1,Pa=1e-6,Ia=.5,Ta=["normalized","asset","canvas","css","viewport"],Ma=["center","top-left","top-right","bottom-left","bottom-right","top","bottom","left","right"],Da={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-right":{x:1,y:1},top:{x:.5,y:0},bottom:{x:.5,y:1},left:{x:0,y:.5},right:{x:1,y:.5}};function Oa(e){let t=Da[e];return{x:t.x,y:t.y}}function Nn(e){let t=e.devicePixelRatio??1,{contentWidth:n,contentHeight:r,viewportWidth:i,viewportHeight:o,mode:a}=e,d=i/n,c=o/r,v=a==="contain"?Math.min(d,c):Math.max(d,c),y=n*v,g=r*v,w=(i-y)/2,k=(o-g)/2,I=jt(-w/y),m=jt(-k/g),x=jt(i/y),H=jt(o/g);return{mode:a,contentWidth:n,contentHeight:r,viewportWidth:i,viewportHeight:o,devicePixelRatio:t,scale:v,offsetX:w,offsetY:k,canvasWidth:i*t,canvasHeight:o*t,visibleNormalizedRect:{x:I,y:m,width:Math.min(x,1-I),height:Math.min(H,1-m)}}}function _a(e,t){return{x:e.x*t.contentWidth,y:e.y*t.contentHeight}}function Na(e,t){return{x:e.x/t.contentWidth,y:e.y/t.contentHeight}}function Ln(e,t){return{x:t.offsetX+e.x*t.contentWidth*t.scale,y:t.offsetY+e.y*t.contentHeight*t.scale}}function Fn(e,t){return{x:(e.x-t.offsetX)/(t.contentWidth*t.scale),y:(e.y-t.offsetY)/(t.contentHeight*t.scale)}}function _i(e,t){return{x:e.x*t.devicePixelRatio,y:e.y*t.devicePixelRatio}}function Ni(e,t){return{x:e.x/t.devicePixelRatio,y:e.y/t.devicePixelRatio}}function La(e,t){return _i(Ln(e,t),t)}function Li(e,t){return Fn(Ni(e,t),t)}function Hn(e,t){let n=Ln({x:e.x,y:e.y},t);return{x:n.x,y:n.y,width:e.width*t.contentWidth*t.scale,height:e.height*t.contentHeight*t.scale}}function Fi(e,t){let n=Hn(e,t),r=t.devicePixelRatio;return{x:n.x*r,y:n.y*r,width:n.width*r,height:n.height*r}}function Vn(e,t,n,r){let o=(r?.space??"canvas")==="css"?Fn(e,t):Li(e,t);for(let a of n.regions)if(Ga(a,o))return a}function Bn(e,t){let n=ot(e);if(n)return Hn(n,t)}function Fa(e){let t=new Map,n=r=>{if(t.has(r.id))return{ok:!1,error:"duplicate-id",id:r.id};let i={id:r.id,point:{x:r.point.x,y:r.point.y},...r.origin!==void 0?{origin:r.origin}:{}};return t.set(i.id,i),{ok:!0,landmark:i}};if(e)for(let r of e){let i=n(r);if(!i.ok)throw new Error(`Duplicate landmark id: ${i.id}`)}return{register:n,get:r=>t.get(r),list:()=>[...t.values()]}}function Ha(e){let t=[];e.version!==1&&t.push({code:"version-mismatch",detail:`expected version 1, got ${String(e.version)}`});let n=new Set,r=i=>{if(n.has(i)){t.push({code:"duplicate-id",id:i,detail:`duplicate id ${i}`});return}n.add(i)};for(let i of e.landmarks)r(i.id),Oi(i.point)||t.push({code:"out-of-bounds",id:i.id,detail:`landmark ${i.id} is outside 0\u20131`});for(let i of e.regions){r(i.id);let o=ot(i);if(!i.rect&&!i.polygon){t.push({code:"invalid-shape",id:i.id,detail:`region ${i.id} has neither rect nor polygon`});continue}if(i.polygon&&i.polygon.length<3&&t.push({code:"invalid-shape",id:i.id,detail:`region ${i.id} polygon needs at least 3 points`}),o&&!$a(o)&&t.push({code:"out-of-bounds",id:i.id,detail:`region ${i.id} is outside 0\u20131`}),i.polygon){for(let a of i.polygon)if(!Oi(a)){t.push({code:"out-of-bounds",id:i.id,detail:`region ${i.id} has a vertex outside 0\u20131`});break}}}for(let i=0;i<e.regions.length;i+=1){let o=e.regions[i],a=ot(o);if(a)for(let d=i+1;d<e.regions.length;d+=1){let c=e.regions[d],v=ot(c);v&&Ua(a,v)&&t.push({code:"overlap",id:o.id,with:c.id,detail:`region ${o.id} overlaps ${c.id}`})}}return{ok:t.length===0,diagnostics:t}}function Va(e,t,n,r=[]){let i=[],o=(a,d,c)=>{i.push({method:a,id:c,args:d})};for(let a of n.regions){let d=ot(a);if(!d)continue;let c=Fi(d,t);e.fillStyle="rgba(0, 180, 255, 0.15)",e.strokeStyle="#00b4ff",e.fillRect&&e.fillRect(c.x,c.y,c.width,c.height),o("fillRect",[c.x,c.y,c.width,c.height],a.id),e.strokeRect&&e.strokeRect(c.x,c.y,c.width,c.height),o("strokeRect",[c.x,c.y,c.width,c.height],a.id),e.font="12px sans-serif";let v=a.id;e.fillText&&e.fillText(v,c.x+4,c.y+14),o("fillText",[v,c.x+4,c.y+14],a.id)}for(let a of r){let d=a.id?`${a.id}: ${a.code}`:a.code,c=16+i.filter(v=>v.method==="fillText").length*14;e.fillText&&e.fillText(d,8,c),o("fillText",[d,8,c],a.id)}return i}function Ba(e){return JSON.stringify(e)}function Ka(e){return JSON.parse(e)}function jt(e){return e<=0?0:e>=1?1:e}function Oi(e){return e.x>=0&&e.x<=1&&e.y>=0&&e.y<=1}function $a(e){return e.x>=0&&e.y>=0&&e.width>=0&&e.height>=0&&e.x+e.width<=1&&e.y+e.height<=1}function Ua(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function ot(e){if(e.rect)return e.rect;if(!e.polygon||e.polygon.length===0)return;let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let o of e.polygon)t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x),i=Math.max(i,o.y);return{x:t,y:n,width:r-t,height:i-n}}function Ga(e,t){return e.polygon&&e.polygon.length>=3?ja(t,e.polygon):e.rect?t.x>=e.rect.x&&t.x<e.rect.x+e.rect.width&&t.y>=e.rect.y&&t.y<e.rect.y+e.rect.height:!1}function ja(e,t){let n=!1;for(let r=0,i=t.length-1;r<t.length;i=r,r+=1){let o=t[r],a=t[i];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}var Vi=320,Bi=180,za=1024,qa="Runtime group has been destroyed";function Wa(e){let t="";for(let n=0;n<32;n++){let r=e.charCodeAt(n%Math.max(e.length,1))+n*17&255;t+=r.toString(16).padStart(2,"0")}return`0x${t}`}function Ya(e,t){let n=document.createElement("div");return Object.defineProperty(n,"clientWidth",{value:e,configurable:!0}),Object.defineProperty(n,"clientHeight",{value:t,configurable:!0}),document.body.appendChild(n),n}function Ki(e){let t=e.capability,n={},r=e.emit??t?.emit,i=e.subscribe??t?.subscribe,o=e.authoritative??t?.authoritative;return r&&(n.emit=r),i&&(n.subscribe=i),o!==void 0&&(n.authoritative=o),n}function Hi(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function Ja(e){let t=new Set([me,"*.*","*.*.*","*.*.*.*","*.*.*.*.*"]);for(let n of e){let r=Ki(n);for(let i of r.emit??[])t.add(i);for(let i of r.subscribe??[])t.add(i)}return[...t]}function Kn(e){if(!e.participants.length)throw new Error("createRuntimeGroup: at least one participant is required");let t=new Set;for(let s of e.participants){if(!s.id)throw new Error("createRuntimeGroup: participant id is required");if(t.has(s.id))throw new Error(`createRuntimeGroup: duplicate participant id "${s.id}"`);t.add(s.id)}let n=e.origin??0,r=e.width??Vi,i=e.height??Bi,o=e.maxTrace??za,a=[...e.participants].sort((s,f)=>s.id.localeCompare(f.id)),d=[],c=new Map,v=0,y=e.createId??e.router?.createId??(()=>`evt-${++v}`),g=e.now??e.router?.now??(()=>{let s=d[0];if(!s)return n;try{return s.cart.getClock().now}catch{return n}}),w=Sn({...e.router,createId:y,now:g,validate:e.validate??e.router?.validate}),k=[],I=!1,m=!1,x=()=>{},H=s=>f=>{s.events.push(f),s.userOnEvent?.(f)},E=()=>{if(m)throw new Error(qa)},b=()=>{x();for(let s of d){try{w.detach(s.id)}catch{}try{s.runtime.destroy()}catch{}s.ownsContainer&&s.container.remove()}d.length=0,c.clear()};try{for(let s of a){let f=s.width??r,A=s.height??i,D=!s.container,O=s.container??Ya(f,A),P=gn({container:O,seed:s.seed??Wa(s.id),deterministic:{origin:n},audioBroker:e.audioBroker,audioParticipantId:e.audioBroker?s.id:void 0}),V={id:s.id,kind:s.kind??"render",cartDef:s.cart,initialState:s.initialState,gameManager:s.gameManager,userOnEvent:s.onEvent,runtime:P,container:O,ownsContainer:D,cart:void 0,events:[],errors:[]};P.onError=(l,C)=>{V.errors.push({error:l,info:C})},w.attach(s.id,P.hostChannel,Ki(s)),V.cart=P.mount(s.cart,{initialState:s.initialState,gameManager:s.gameManager,onEvent:H(V)}),d.push(V),c.set(V.id,V)}x=w.subscribe(Ja(a),s=>{for(k.push(Hi(s));k.length>o;)k.shift()})}catch(s){throw b(),s}let h=s=>({id:s.id,kind:s.kind,runtime:s.runtime,container:s.container,get events(){return s.events.slice()},get errors(){return s.errors.slice()},get cart(){return s.cart}});return{router:w,origin:n,get paused(){return I},get audioBroker(){return e.audioBroker},participant(s){E();let f=c.get(s);if(!f)throw new Error(`createRuntimeGroup: unknown participant "${s}"`);return h(f)},async step(s=1){if(E(),I)return;let f=Math.max(0,Math.floor(s));for(let A=0;A<f;A++){w.turn();for(let D of d)try{await D.cart.step(1)}catch(O){D.errors.push({error:O,info:{phase:"update",consecutive:D.errors.length+1,stopped:!1}})}}},pause(){E(),I=!0;for(let s of d)s.cart.pause()},resume(){E(),I=!1;for(let s of d)s.cart.resume()},reset(){E(),k.length=0;for(let s of d)s.events.length=0,s.errors.length=0,s.cart=s.runtime.mount(s.cartDef,{initialState:s.initialState,gameManager:s.gameManager,onEvent:H(s)});w.turn()},resize(s,f){E();let A=Math.max(1,s|0),D=Math.max(1,f|0);for(let O of d){Object.defineProperty(O.container,"clientWidth",{value:A,configurable:!0}),Object.defineProperty(O.container,"clientHeight",{value:D,configurable:!0});let P=O.cart.canvas;P&&(P.width=A,P.height=D)}},detach(s){E();let f=c.get(s);if(!f)throw new Error(`createRuntimeGroup: unknown participant "${s}"`);try{w.detach(f.id)}catch{}try{f.runtime.destroy()}catch{}e.audioBroker&&e.audioBroker.teardown(f.id),f.ownsContainer&&f.container.remove();let A=d.indexOf(f);A>=0&&d.splice(A,1),c.delete(s)},dispatch(s,f){E();let A=c.get(s);if(!A)throw new Error(`createRuntimeGroup: unknown participant "${s}"`);A.cart.dispatch(f)},publish(s,f){return E(),w.publish(s,f)},inspectParticipants(){E();let s=new Map(d.map(f=>[f.id,f.kind]));return w.inspectParticipants().map(f=>({...f,kind:s.get(f.id)??"render"}))},async inspect(){E();let s={},f={},A=new Map(w.inspectParticipants().map(O=>[O.id,O]));for(let O of d){let P=await O.cart.getReplayMetadata(),V=O.cart.getClock();f[O.id]=V;let l=A.get(O.id);s[O.id]={state:P.state,events:O.events.slice(),errors:O.errors.slice(),kind:O.kind,clock:V,emit:l?.emit.slice()??[],subscribe:l?.subscribe.slice()??[],authoritative:l?.authoritative===!0}}let D=k.map(O=>Hi(O));return{participants:s,trace:D,diagnostics:{paused:I,participantIds:d.map(O=>O.id),clocks:f,rejections:D.filter(O=>O.type===me).map(O=>O.payload)}}},destroy(){if(!m){m=!0,I=!1;try{b()}finally{k.length=0}}}}}var zt=1,ji=512,zi="[REDACTED]",Xa=new Set([he,ye]);function ne(e){try{return JSON.parse(JSON.stringify(e))}catch{return e}}function qt(e,t){if(e==null)return e;if(Array.isArray(e))return e.map(i=>qt(i,t));if(typeof e!="object")return e;let n=e,r={};for(let[i,o]of Object.entries(n))r[i]=t.has(i)?zi:qt(o,t);return r}function Qa(e){return e instanceof Error&&typeof e.message=="string"?e.message:"error"}function Za(e,t){return t?!(t.types&&!t.types.includes(e.type)||t.sources&&!t.sources.includes(e.source)||t.outcomes&&!t.outcomes.includes(e.outcome)||t.correlationId&&e.correlationId!==t.correlationId):!0}function $i(e){return JSON.stringify({outcome:e.outcome,reason:e.reason,source:e.source,target:e.target,type:e.type,kind:e.kind,envelopeId:e.envelopeId,priorEnvelopeId:e.priorEnvelopeId,correlationId:e.correlationId,causationId:e.causationId,hops:e.hops,seq:e.seq,idempotencyKey:e.idempotencyKey,deliveredTo:e.deliveredTo,payload:e.payload})}function ed(e,t){if(e.length!==t.length)return{ok:!1,detail:`record count ${t.length} !== ${e.length}`};for(let n=0;n<e.length;n++){let r=$i(e[n]),i=$i(t[n]);if(r!==i)return{ok:!1,detail:`record ${n} differs`}}return{ok:!0}}function Ui(e){let t=new Map,n=[];for(let o of e){if(o.outcome==="duplicate"){n.push(void 0);continue}let a={envelopeId:o.envelopeId,type:o.type,source:o.source,outcome:o.outcome,children:[]};o.reason&&(a.reason=o.reason),n.push(a),o.envelopeId&&!t.has(o.envelopeId)&&t.set(o.envelopeId,a)}let r=new Set;for(let o=0;o<e.length;o++){let a=e[o],d=n[o];if(!d)continue;let c=a.causationId?t.get(a.causationId):void 0;c&&c!==d&&(c.children.push(d),r.add(d))}let i=[];for(let o of n)o&&!r.has(o)&&i.push(o);return i}function Gi(e,t){let n={id:e.id,emit:e.emit.slice(),subscribe:e.subscribe.slice(),authoritative:e.authoritative,errorCount:0};return t&&(n.kind=t),n}function td(e,t,n){let r=t.errors[t.errors.length-1],i={id:e,kind:t.kind,emit:t.emit.slice(),subscribe:t.subscribe.slice(),authoritative:t.authoritative,clock:ne(t.clock),state:qt(t.state,n),errorCount:t.errors.length};return r&&(i.lastError=Qa(r.error)),i}function qi(e={}){let t=new Set(e.redactedKeys??[]),n=e.maxRecords??ji,r=e.registry,i=0,o=0,a=!1,d=[],c=[],v,y=[],g=0,w=[],k={},I=()=>{},m=()=>{if(a)throw new Error("Replay inspector has been destroyed")},x=h=>{let u=r?.get(h.type),s={index:o,turn:h.turn,time:h.time,outcome:h.outcome,source:h.source,type:h.type,deliveredTo:h.deliveredTo.slice(),payload:qt(h.payload,t)};for(o+=1,h.reason&&(s.reason=h.reason),h.detail&&(s.detail=h.detail),h.target&&(s.target=h.target),h.kind&&(s.kind=h.kind),h.envelopeId&&(s.envelopeId=h.envelopeId),h.priorEnvelopeId&&(s.priorEnvelopeId=h.priorEnvelopeId),h.correlationId&&(s.correlationId=h.correlationId),h.causationId&&(s.causationId=h.causationId),h.hops!==void 0&&(s.hops=h.hops),h.seq!==void 0&&(s.seq=h.seq),h.idempotencyKey&&(s.idempotencyKey=h.idempotencyKey),h.schemaVersion!==void 0&&(s.schemaVersion=h.schemaVersion),u&&(s.payloadSchemaVersion=u.payloadSchema.version),d.push(s);d.length>n;)d.shift(),i+=1},H=h=>d.filter(u=>Za(u,h)).map(u=>ne(u)),E=h=>h?h.inspectParticipants().map(u=>Gi(u,u.kind)):w.map(u=>ne(u)),b={watchRouter(h){if(m(),I(),w=h.inspectParticipants().map(s=>Gi(s)),d.length===0)for(let s of h.inspectDecisions())x(s);let u=h.subscribeDecision(s=>x(s));return I=()=>{u(),I=()=>{}},c.push(I),I},bind(h){m(),v&&I(),v=h,g=h.origin,b.watchRouter(h.router),w=E(h);let u={publish(s,f){m();let A={kind:"publish",event:ne(s)};return f?.cause&&(A.extras={cause:ne(f.cause)}),y.push(A),h.publish(s,f)},dispatch(s,f){m();let A=ne(f);typeof A.type=="string"&&Xa.has(A.type)?y.push({kind:"asset",participantId:s,event:A}):y.push({kind:"dispatch",participantId:s,event:A}),h.dispatch(s,f)},async step(s=1){m(),y.push({kind:"step",frames:s}),await h.step(s)},async report(){m();let s=await h.inspect(),f=[];for(let A of Object.keys(s.participants).sort())f.push(td(A,s.participants[A],t));w=f,k={};for(let A of f)k[A.id]=ne(A.state);return b.report()},async exportTrace(s){return await u.report(),b.exportTrace(s)},unbind(){I(),v=void 0}};return u},importTrace(h){m();let u=typeof h=="string"?JSON.parse(h):h;if(u.schemaVersion!==zt)throw new Error("Replay inspector: unsupported export schemaVersion");i=0,o=0,d.length=0,y=ne(u.tape??[]),g=u.origin??0,w=ne(u.participants??[]),k=ne(u.snapshots??{});for(let s of u.records??[])x({outcome:s.outcome,reason:s.reason,detail:s.detail,source:s.source,type:s.type,kind:s.kind,envelopeId:s.envelopeId,priorEnvelopeId:s.priorEnvelopeId,target:s.target,deliveredTo:s.deliveredTo,hops:s.hops,seq:s.seq,correlationId:s.correlationId,causationId:s.causationId,idempotencyKey:s.idempotencyKey,schemaVersion:s.schemaVersion,payload:s.payload,turn:s.turn,time:s.time})},exportTrace(h){return m(),{schemaVersion:zt,origin:g,redactedKeys:[...t],participants:ne(w),tape:ne(y),records:H(h),snapshots:ne(k)}},report(h){m();let u=H(h);return{schemaVersion:zt,participants:ne(w),records:u,trees:Ui(u),dropped:i}},causationTree(h){m();let u=H(h?{correlationId:h}:void 0);return Ui(u)},records(){return m(),d.map(h=>ne(h))},reset(){m(),d.length=0,y=[],i=0,o=0,k={},v&&(w=E(v))},destroy(){if(!a){for(a=!0,I();c.length>0;)c.pop()?.();d.length=0,y=[],w=[],k={},v=void 0}}};return b}async function nd(e,t,n={}){let r=qi({redactedKeys:n.redactedKeys??e.redactedKeys,maxRecords:n.maxRecords,registry:n.registry}),i=r.bind(t);try{for(let a of e.tape)a.kind==="publish"?i.publish(a.event,a.extras):a.kind==="dispatch"||a.kind==="asset"?i.dispatch(a.participantId,a.event):await i.step(a.frames);let o=await i.report();return{inspector:r,report:o}}catch(o){throw r.destroy(),o}}var rd=Ut,id=Gt,od="Compositor has been destroyed";function sd(e){return Number.isFinite(e)?e<0?0:e>1?1:e:1}function ad(e){let t=e.trim().toLowerCase();if(t[0]!=="#")throw new Error(`createCompositor: host.color must be #rgb or #rrggbb, got "${e}"`);let n=t.slice(1);if(n.length===3)return{r:parseInt(n[0]+n[0],16),g:parseInt(n[1]+n[1],16),b:parseInt(n[2]+n[2],16),a:255};if(n.length===6)return{r:parseInt(n.slice(0,2),16),g:parseInt(n.slice(2,4),16),b:parseInt(n.slice(4,6),16),a:255};throw new Error(`createCompositor: host.color must be #rgb or #rrggbb, got "${e}"`)}function Wi(e,t){if(!e.id)throw new Error("createCompositor: layer id is required");if(!Number.isFinite(e.order))throw new Error(`createCompositor: layer "${e.id}" order is required`);let n=e.blend??"source-over";if(n!=="source-over"&&n!=="screen")throw new Error(`createCompositor: layer "${e.id}" blend must be source-over or screen`);let r=e.pointerEvents??"auto";if(r!=="auto"&&r!=="none")throw new Error(`createCompositor: layer "${e.id}" pointerEvents must be auto or none`);let i=e.clearPolicy??t;if(i!=="transparent"&&i!=="opaque")throw new Error(`createCompositor: layer "${e.id}" clearPolicy is invalid`);return{id:e.id,order:e.order,visible:e.visible!==!1,opacity:sd(e.opacity??1),blend:n,clip:e.clip?{...e.clip}:null,pointerEvents:r,clearPolicy:i}}function dd(e){return[...e].sort((t,n)=>t.order-n.order||t.id.localeCompare(n.id))}function $n(e,t){return 255-Math.round((255-e)*(255-t)/255)}function ud(e,t,n,r,i,o,a,d){let c=o/255*a;if(c<=0)return;let v=e[t],y=e[t+1],g=e[t+2],w=e[t+3]/255,k=n,I=r,m=i;d==="screen"&&(k=$n(v,n),I=$n(y,r),m=$n(g,i));let x=c+w*(1-c);if(x<=0){e[t]=0,e[t+1]=0,e[t+2]=0,e[t+3]=0;return}e[t]=Math.round((k*c+v*w*(1-c))/x),e[t+1]=Math.round((I*c+y*w*(1-c))/x),e[t+2]=Math.round((m*c+g*w*(1-c))/x),e[t+3]=Math.round(x*255)}function cd(e,t,n){if(e.width===t&&e.height===n)return{data:new Uint8ClampedArray(e.data),width:t,height:n,colorSpace:e.colorSpace??"srgb"};let r=new Uint8ClampedArray(t*n*4);for(let i=0;i<n;i++){let o=Math.min(e.height-1,Math.floor(i*e.height/n));for(let a=0;a<t;a++){let d=Math.min(e.width-1,Math.floor(a*e.width/t)),c=(o*e.width+d)*4,v=(i*t+a)*4;r[v]=e.data[c],r[v+1]=e.data[c+1],r[v+2]=e.data[c+2],r[v+3]=e.data[c+3]}}return{data:r,width:t,height:n,colorSpace:e.colorSpace??"srgb"}}function ld(e,t){for(let n=0;n<e.length;n+=4)e[n]=t.r,e[n+1]=t.g,e[n+2]=t.b,e[n+3]=t.a}function Yi(e,t,n){return e?t>=e.x&&n>=e.y&&t<e.x+e.width&&n<e.y+e.height:!0}function pd(e){let t=e.getContext("2d");if(!t)throw new Error("createCompositor: layer canvas has no 2d context");return t.getImageData(0,0,e.width,e.height)}function Un(e,t){e&&(e.style.zIndex=String(t.order),e.style.pointerEvents=t.pointerEvents==="none"?"none":"auto",e.style.visibility=t.visible?"visible":"hidden")}function Gn(e){if(!e.layers.length)throw new Error("createCompositor: at least one layer is required");let t=new Set,n=e.clearPolicy??"transparent";if(n!=="transparent"&&n!=="opaque")throw new Error("createCompositor: clearPolicy must be transparent or opaque");let r=new Map;for(let u of e.layers){let s=Wi(u,n);if(t.has(s.id))throw new Error(`createCompositor: duplicate layer id "${s.id}"`);t.add(s.id),r.set(s.id,s)}let i=e.group,o=e.dpr&&e.dpr>0?e.dpr:1,a=Math.max(1,(e.width??320)|0),d=Math.max(1,(e.height??180)|0),c=o,v=e.offscreen!==!1,y=!e.target;if(!v&&!e.target)throw new Error("createCompositor: target canvas is required when offscreen is false");let g=e.target??document.createElement("canvas"),w=g.getContext("2d",{alpha:!0});if(!w)throw new Error("createCompositor: host canvas has no 2d context");let k=!1,I=()=>{if(k)throw new Error(od)},m=()=>({width:Math.max(1,Math.round(a*c)),height:Math.max(1,Math.round(d*c))}),x=()=>{let u=m();g.width!==u.width&&(g.width=u.width),g.height!==u.height&&(g.height=u.height),g.style.width=`${a}px`,g.style.height=`${d}px`},H=()=>dd([...r.values()]).map(u=>({...u,clip:u.clip?{...u.clip}:null})),E=(u,s,f)=>{if(u.fill(0),n==="opaque"&&!e.host?.image&&!e.host?.color&&u.fill(0),e.host?.image){let A=cd(e.host.image,s,f);u.set(A.data);return}e.host?.color&&ld(u,ad(e.host.color))},b=()=>{let{width:u,height:s}=m();x();let f=w.createImageData(u,s);E(f.data,u,s);for(let A of H()){if(!A.visible||A.opacity<=0)continue;let D;try{D=i.participant(A.id)}catch{continue}let O=D.cart.canvas;if(!O)continue;Un(O,A);let P;try{P=pd(O)}catch{continue}let V=A.clearPolicy==="transparent",l=Math.min(u,P.width),C=Math.min(s,P.height);for(let R=0;R<C;R++)for(let L=0;L<l;L++){if(!Yi(A.clip,L,R))continue;let q=(R*P.width+L)*4,G=P.data[q],F=P.data[q+1],B=P.data[q+2],Y=P.data[q+3];V&&G===0&&F===0&&B===0||Y<=0||ud(f.data,(R*u+L)*4,G,F,B,Y,A.opacity,A.blend)}}return w.putImageData(f,0,0),f};x();for(let u of H())try{Un(i.participant(u.id).cart.canvas,u)}catch{}return{get canvas(){return g},get width(){return a},get height(){return d},get dpr(){return c},compose(){return I(),b()},captureComposedFrame(){I();let u=b();return{imageData:u,pngDataUrl:g.toDataURL("image/png"),width:u.width,height:u.height,declaredOrder:H()}},resize(u,s,f){I(),a=Math.max(1,u|0),d=Math.max(1,s|0),f!==void 0&&(c=f>0?f:1);let A=m();i.resize(A.width,A.height),x()},setLayer(u,s){I();let f=r.get(u);if(!f)throw new Error(`createCompositor: unknown layer "${u}"`);let A=Wi({id:u,order:s.order??f.order,visible:s.visible??f.visible,opacity:s.opacity??f.opacity,blend:s.blend??f.blend,clip:s.clip===void 0?f.clip??void 0:s.clip,pointerEvents:s.pointerEvents??f.pointerEvents,clearPolicy:s.clearPolicy??f.clearPolicy},n);r.set(u,A);try{Un(i.participant(u).cart.canvas,A)}catch{}},layer(u){I();let s=r.get(u);if(!s)throw new Error(`createCompositor: unknown layer "${u}"`);return{...s,clip:s.clip?{...s.clip}:null}},layers(){return I(),H()},pointerTarget(u,s){I();let f=u|0,A=s|0,D=[...H()].reverse();for(let O of D)if(!(!O.visible||O.pointerEvents==="none")&&Yi(O.clip,f,A)){try{i.participant(O.id)}catch{continue}return O.id}},unmountLayer(u){if(I(),!r.has(u))throw new Error(`createCompositor: unknown layer "${u}"`);r.delete(u),i.detach(u)},inspect(){I();let u=H();return{viewport:{width:a,height:d,dpr:c},clearPolicy:n,layers:u,declaredOrder:u.map(s=>s.id)}},destroy(){k||(k=!0,y&&g.parentNode&&g.remove())}}}var fd=["invalid-ref","unknown-module","version-mismatch","not-allowlisted","load-failed","invoke-failed","timeout","rate-limited","destroyed"],Ji="executable module host has been destroyed";var md=/^[a-z0-9][a-z0-9.-]*$/i,hd=/^[a-z0-9][a-z0-9-]*$/i;function Pe(e){return{id:e.id,version:e.version}}function jn(e){return`${e.id}@${e.version}`}function st(e){return typeof e=="string"&&e.length>0&&md.test(e)}function yd(e){if(typeof e!="string"||e.length===0)return!1;let t=e.split(".");return t.some(n=>n.length===0)?!1:t.every(n=>n==="*"||hd.test(n))}function Zi(e,t){if(e===t)return!0;if(!e.includes("*"))return!1;let n=e.split("."),r=t.split(".");if(n.length!==r.length)return!1;for(let i=0;i<n.length;i++)if(n[i]!=="*"&&n[i]!==r[i])return!1;return!0}function gd(e,t){return t.some(n=>n.version===e.version&&Zi(n.id,e.id))}function at(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function bd(e){return typeof e=="object"&&e!==null&&typeof e.then=="function"}function Xi(e){return e instanceof Error&&e.message?e.message:String(e)}function zn(e){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return Object.freeze(e.map(n=>zn(n)));if(Object.getPrototypeOf(e)!==Object.prototype)return e;let t={};for(let n of Object.keys(e))t[n]=zn(e[n]);return Object.freeze(t)}function Qi(e){if(!at(e))return;let t=e.id,n=e.version;if(!(!st(t)||!st(n)))return{id:t,version:n}}function vd(e){if(e===void 0)return{};if(!at(e))throw new Error("createExecutableModuleHost: limits must be an object");let t={};if(e.maxInvokeMs!==void 0){if(typeof e.maxInvokeMs!="number"||!Number.isInteger(e.maxInvokeMs)||e.maxInvokeMs<1)throw new Error("createExecutableModuleHost: limits.maxInvokeMs must be an integer >= 1");t.maxInvokeMs=e.maxInvokeMs}if(e.maxInvokesPerTurn!==void 0){if(typeof e.maxInvokesPerTurn!="number"||!Number.isInteger(e.maxInvokesPerTurn)||e.maxInvokesPerTurn<1)throw new Error("createExecutableModuleHost: limits.maxInvokesPerTurn must be an integer >= 1");t.maxInvokesPerTurn=e.maxInvokesPerTurn}return t}function Ed(e){if(!at(e))throw new Error("createExecutableModuleHost: options are required");if(!Array.isArray(e.allowlist))throw new Error("createExecutableModuleHost: allowlist must be an array");if(!Array.isArray(e.modules))throw new Error("createExecutableModuleHost: modules must be an array");let t=e.allowlist.map((u,s)=>{if(!at(u))throw new Error(`createExecutableModuleHost: allowlist[${s}] must be an object`);if(!yd(u.id))throw new Error(`createExecutableModuleHost: allowlist[${s}].id is not a valid id or pattern`);if(!st(u.version)||u.version.includes("*"))throw new Error(`createExecutableModuleHost: allowlist[${s}].version must be an exact version`);return{id:u.id,version:u.version}}),n=new Map,r=new Map;for(let[u,s]of e.modules.entries()){if(!at(s))throw new Error(`createExecutableModuleHost: modules[${u}] must be an object`);if(!st(s.id))throw new Error(`createExecutableModuleHost: modules[${u}].id is invalid`);if(!st(s.version))throw new Error(`createExecutableModuleHost: modules[${u}].version is invalid`);if(typeof s.create!="function")throw new Error(`createExecutableModuleHost: modules[${u}].create must be a function`);let f=`${s.id}@${s.version}`;if(n.has(f))throw new Error(`createExecutableModuleHost: duplicate module ${f}`);n.set(f,{id:s.id,version:s.version,create:s.create,capabilities:s.capabilities});let A=r.get(s.id)??[];A.push(s.version),r.set(s.id,A)}let i=vd(e.limits),o=e.capabilities,a=new Map,d=new Set,c=[],v=0,y=0,g=!1;function w(u,s,f){let A=f?{code:u,detail:s,ref:Pe(f)}:{code:u,detail:s};return c.push(A),c.length>256&&c.shift(),A}function k(u,s,f){return{ok:!1,error:w(u,s,f)}}function I(u){if(g){let P=Qi(u);return k("destroyed",Ji,P)}let s=Qi(u);if(!s)return k("invalid-ref","module ref requires exact id and version");let f=n.get(jn(s)),A=r.has(s.id),D=gd(s,t),O=t.some(P=>Zi(P.id,s.id)&&P.version!==s.version);return D?f?{ok:!0,ref:s,registration:f}:A?k("version-mismatch",`no factory for ${s.id}@${s.version}`,s):k("unknown-module",`unknown module "${s.id}"`,s):O||A&&!f?k("version-mismatch",`no allowlisted factory for ${s.id}@${s.version}`,s):!f&&!A?k("unknown-module",`unknown module "${s.id}"`,s):k("not-allowlisted",`${s.id}@${s.version} is not allowlisted`,s)}function m(u,s){let f=jn(u);if(a.has(f))return{ok:!0,ref:Pe(u)};let A=zn({...o??{},...s.capabilities??{}});try{let D=s.create(A);return!D||typeof D.invoke!="function"?k("load-failed",`factory for ${u.id}@${u.version} did not return an invoke() module`,u):(a.set(f,{ref:Pe(u),instance:D}),{ok:!0,ref:Pe(u)})}catch(D){return k("load-failed",Xi(D),u)}}function x(u){let s=I(u);return s.ok?m(s.ref,s.registration):s}function H(u,s){let f=I(u);if(!f.ok)return Promise.resolve(f);if(i.maxInvokesPerTurn!==void 0&&y>=i.maxInvokesPerTurn)return Promise.resolve(k("rate-limited",`maxInvokesPerTurn ${i.maxInvokesPerTurn} exceeded`,f.ref));y+=1;let A=m(f.ref,f.registration);if(!A.ok)return Promise.resolve(A);let D=a.get(jn(f.ref));if(!D)return Promise.resolve(k("load-failed","module instance was not retained",f.ref));let O=new AbortController;d.add(O);let P=Date.now(),V=i.maxInvokeMs,l;V!==void 0&&(l=setTimeout(()=>O.abort(),V));let C=L=>(l!==void 0&&clearTimeout(l),d.delete(O),g?k("destroyed",Ji,f.ref):L),R=L=>O.signal.aborted&&V!==void 0?k("timeout",`invoke exceeded ${V}ms`,f.ref):k("invoke-failed",Xi(L),f.ref);try{let L=D.instance.invoke(s,{signal:O.signal,turn:v});return bd(L)?new Promise(q=>{let G=!1,F=B=>{G||(G=!0,q(C(B)))};if(V!==void 0){let B=l;B!==void 0&&clearTimeout(B),l=setTimeout(()=>{O.abort(),F(k("timeout",`invoke exceeded ${V}ms`,f.ref))},Math.max(0,V-(Date.now()-P)))}Promise.resolve(L).then(B=>F({ok:!0,value:B}),B=>F(R(B)))}):V!==void 0&&Date.now()-P>=V?(O.abort(),Promise.resolve(C(k("timeout",`invoke exceeded ${V}ms`,f.ref)))):Promise.resolve(C({ok:!0,value:L}))}catch(L){return Promise.resolve(C(R(L)))}}function E(){g||(v+=1,y=0)}function b(){return{allowlist:t.map(Pe),registered:[...n.values()].map(u=>({id:u.id,version:u.version})),loaded:[...a.values()].map(u=>Pe(u.ref)),turn:v,invokesThisTurn:y,diagnostics:c.map(u=>u.ref?{...u,ref:Pe(u.ref)}:{...u})}}function h(){if(!g){g=!0;for(let u of d)u.abort();d.clear();for(let u of a.values())try{u.instance.destroy?.()}catch{}a.clear(),n.clear(),r.clear(),t.length=0}}return{load:x,invoke:H,beginTurn:E,inspect:b,destroy:h}}var Wt={width:320,height:180,deviceScaleFactor:1},Sd="Browser harness has been destroyed";function Cd(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/([\0-\x1f\x7f!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,"\\$1")}function qn(e){return{...e,visibleNormalizedRect:{...e.visibleNormalizedRect}}}function Wn(e,t,n){Object.defineProperty(e,"clientWidth",{value:t,configurable:!0}),Object.defineProperty(e,"clientHeight",{value:n,configurable:!0})}function Yn(e,t,n,r,i){let o={x:t,y:n,width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,toJSON(){return this}};e.getBoundingClientRect=()=>o}function eo(e){return!e||!(e instanceof HTMLElement)||e===document.body?{tag:"body",id:"",role:null,name:""}:{tag:e.tagName.toLowerCase(),id:e.id,role:e.getAttribute("role"),name:e.getAttribute("aria-label")??e.textContent?.trim()??""}}function wd(e){return e.querySelector("[aria-live]")?.textContent??""}function to(e,t,n){let r={bubbles:!0,cancelable:!0,clientX:t,clientY:n},i=globalThis.PointerEvent;typeof i=="function"?(e.dispatchEvent(new i("pointerdown",{...r,pointerId:1,pointerType:"mouse",buttons:1})),e.dispatchEvent(new i("pointerup",{...r,pointerId:1,pointerType:"mouse",buttons:0}))):(e.dispatchEvent(new MouseEvent("mousedown",r)),e.dispatchEvent(new MouseEvent("mouseup",r))),e.dispatchEvent(new MouseEvent("click",r))}function Ad(e,t,n){let r=Array.from(e.querySelectorAll("*")),i=null,o=Number.POSITIVE_INFINITY;for(let a of r){if(!(a instanceof HTMLElement))continue;let d=a.getBoundingClientRect();if(t>=d.left&&t<d.right&&n>=d.top&&n<d.bottom){let c=Math.max(1,d.width*d.height);c<=o&&(i=a,o=c)}}return i??e}function no(e){let t=window.matchMedia;return window.matchMedia=n=>({matches:e&&/prefers-reduced-motion:\s*reduce/i.test(n),media:n,onchange:null,addListener(){},removeListener(){},addEventListener(){},removeEventListener(){},dispatchEvent(){return!1}}),()=>{window.matchMedia=t}}function kd(e={}){let t=e.seed??`0x${"00".repeat(32)}`,n=e.geometry,r=e.viewport?.width??Wt.width,i=e.viewport?.height??Wt.height,o=e.viewport?.deviceScaleFactor??Wt.deviceScaleFactor,a=e.reducedMotion===!0,d=e.inputModality??"pointer",c=e.origin??0,v=e.fit??"contain",y=Object.getOwnPropertyDescriptor(window,"devicePixelRatio"),g=Object.getOwnPropertyDescriptor(window,"innerWidth"),w=Object.getOwnPropertyDescriptor(window,"innerHeight"),k=no(a),I=()=>{Object.defineProperty(window,"devicePixelRatio",{value:o,configurable:!0}),Object.defineProperty(window,"innerWidth",{value:r,configurable:!0}),Object.defineProperty(window,"innerHeight",{value:i,configurable:!0})};I();let m=document.createElement("div");m.setAttribute("data-cyberart-browser-harness",""),m.style.position="relative",m.style.overflow="auto",m.tabIndex=-1,document.body.appendChild(m);let x=[],H=[],E=!1,b=0,h=e.createId??(()=>`br-${++b}`),u=()=>Nn({contentWidth:e.contentWidth??r,contentHeight:e.contentHeight??i,viewportWidth:r,viewportHeight:i,mode:v,devicePixelRatio:o}),s=u(),f=()=>Math.max(1,Math.round(r*o)),A=()=>Math.max(1,Math.round(i*o)),D=(T,U)=>{let j=n?.regions.find(de=>de.id===T);if(!j)return;let z=Bn(j,s);if(z)return U.style.position=U.style.position||"absolute",U.style.left=`${z.x}px`,U.style.top=`${z.y}px`,U.style.width=`${z.width}px`,U.style.height=`${z.height}px`,Yn(U,z.x,z.y,z.width,z.height),{...z}},O=()=>{s=u(),m.style.width=`${r}px`,m.style.height=`${i}px`,Wn(m,r,i),Yn(m,0,0,r,i),m.dataset.inputModality=d,m.dataset.reducedMotion=a?"true":"false",I()};O();let P=()=>({root:m,get layout(){return qn(s)},get reducedMotion(){return a},get inputModality(){return d},placeRegion:D}),V=e.mount?.(P())??{},l=V.participants??[],C,R,L=()=>{};if(l.length>0){for(let T of l)T.container&&Wn(T.container,f(),A());C=Kn({origin:c,width:f(),height:A(),createId:h,now:()=>c,participants:l.map(T=>({...T,seed:T.seed??t,width:T.width??f(),height:T.height??A()}))}),L=C.router.subscribe(["*.*","*.*.*","*.*.*.*","*.*.*.*.*",me],T=>{H.push(T)}),V.compositor&&(R=Gn({...V.compositor,group:C,width:r,height:i,dpr:o}))}let q=()=>({...P(),group:C,compositor:R,publish(T){if(!C)throw new Error("Browser harness: publish requires mounted carts");return C.publish(T)}}),G=()=>{if(O(),C){let T=f(),U=A();for(let j of l){j.container&&(Wn(j.container,T,U),j.container.style.width=`${r}px`,j.container.style.height=`${i}px`);try{let z=C.participant(j.id).cart.canvas;z&&(z.style.width=`${r}px`,z.style.height=`${i}px`,Yn(z,0,0,r,i))}catch{}}}},F=()=>{if(E)throw new Error(Sd)};G(),V.ready?.(q());let B=(T,U,j)=>{if(x.push({type:"click",x:T,y:U,...j?{selector:j}:{}}),j){let ct=m.querySelector(j);if(!(ct instanceof HTMLElement))throw new Error(`No element matches ${j}`);to(ct,T,U);return}let z=n!==void 0?Vn({x:T,y:U},s,n,{space:"css"}):void 0,ut=(z?m.querySelector(`#${Cd(z.id)}`):null)??Ad(m,T,U);to(ut,T,U)};return{root:m,get group(){return C},get compositor(){return R},get layout(){return qn(s)},get events(){return H.slice()},goto(){F()},setViewport(T,U,j){F(),r=Math.max(1,T|0),i=Math.max(1,U|0),j!==void 0&&(o=j>0?j:1),x.push({type:"viewport",width:r,height:i,dpr:o}),R?R.resize(r,i,o):C&&C.resize(f(),A()),G(),V.relayout?.(q())},setReducedMotion(T){F(),a=T,k(),k=no(a),x.push({type:"reducedMotion",value:T}),G(),V.relayout?.(q())},setInputModality(T){F(),d=T,x.push({type:"inputModality",value:T}),G()},click(T,U){if(F(),typeof T=="string"){let j=m.querySelector(T);if(!(j instanceof HTMLElement))throw new Error(`No element matches ${T}`);let z=j.getBoundingClientRect();B(z.left+z.width/2,z.top+z.height/2,T);return}if(U===void 0)throw new Error("click(x, y) requires a y coordinate");B(T,U)},key(T){F(),x.push({type:"key",key:T}),(document.activeElement instanceof HTMLElement?document.activeElement:m).dispatchEvent(new KeyboardEvent("keydown",{key:T,bubbles:!0,cancelable:!0}))},focus(T){F();let U=m.querySelector(T);if(!(U instanceof HTMLElement))throw new Error(`No element matches ${T}`);U.focus()},async step(T=1){F(),x.push({type:"step",frames:T}),C&&await C.step(T)},async advance(T){F(),x.push({type:"advance",ms:T}),C&&await C.step(Math.max(0,Math.round(T/1e3*30)))},screenshot(){if(F(),R){let T=R.captureComposedFrame();return{imageData:T.imageData,pngDataUrl:T.pngDataUrl,html:m.outerHTML,declaredOrder:T.declaredOrder.map(U=>U.id)}}return{imageData:null,pngDataUrl:null,html:m.outerHTML,declaredOrder:[]}},accessibilitySnapshot(){return F(),{focus:eo(document.activeElement),live:wd(m),html:m.outerHTML}},async inspect(){F();let T={},U={},j=0;if(C){let z=await C.inspect();for(let de of z.diagnostics.participantIds)T[de]=C.participant(de).events.slice(),U[de]=z.participants[de]?.state,j=z.diagnostics.clocks[de]?.framesElapsed??j}return{host:V.hostState?.()??null,layout:qn(s),events:H.slice(),participantEvents:T,state:U,focus:eo(document.activeElement),scrollTop:m.scrollTop,clock:{framesElapsed:j}}},reproduction(){return F(),{seed:t,viewport:{width:r,height:i,dpr:o},reducedMotion:a,inputModality:d,actions:x.map(T=>({...T}))}},captureComposedFrame(){if(F(),!R)throw new Error("Browser harness: captureComposedFrame requires a compositor");return R.captureComposedFrame()},destroy(){if(!E){E=!0,L(),document.activeElement instanceof HTMLElement&&m.contains(document.activeElement)&&document.activeElement.blur();try{V.destroy?.()}finally{try{R?.destroy()}finally{try{C?.destroy()}finally{m.remove(),k(),y&&Object.defineProperty(window,"devicePixelRatio",y),g&&Object.defineProperty(window,"innerWidth",g),w&&Object.defineProperty(window,"innerHeight",w)}}}}}}}function Rd(e){return{async goto(){e.goto()},async setViewportSize(t){e.setViewport(t.width,t.height,t.deviceScaleFactor)},async click(t){e.click(t)},async screenshot(){return e.screenshot()},keyboard:{async press(t){e.key(t)}},locator(t){return{async click(){e.click(t)},async focus(){e.focus(t)}}},async close(){e.destroy()}}}var xd=128,Pd=144,Id=176,Td=224,Md=0,Dd=15,Od=127,_d=8192,Nd=16383;function oo(e){return Number.isInteger(e)&&e>=0&&e<=15}function dt(e){return Number.isInteger(e)&&e>=0&&e<=127}function Yt(e,t){return e&240|t&15}function Ld(e){return e&15}function Zn(e){if(!oo(e.channel))return;let t=e.channel;if(e.kind==="noteon"||e.kind==="noteoff"){let n=e.velocity??(e.kind==="noteon"?100:0);if(!dt(e.note)||!dt(n))return;let r=e.kind==="noteon"?144:128;return Uint8Array.from([Yt(r,t),e.note,n])}if(e.kind==="cc")return!dt(e.controller)||!dt(e.value)?void 0:Uint8Array.from([Yt(176,t),e.controller,e.value]);if(e.kind==="pitch"&&!(!Number.isInteger(e.value)||e.value<0||e.value>16383))return Uint8Array.from([Yt(224,t),e.value&127,e.value>>7&127])}function Jn(e){let t=Xn(e);if(t.length===0)return;let n=t[0],r=n&240,i=n&15;if(n>=128&&t.length>=3){if(r===144||r===128){let o=t[1],a=t[2];return{kind:r===128||a===0?"noteoff":"noteon",channel:i,note:o,velocity:a,status:n,data:t}}if(r===176)return{kind:"cc",channel:i,controller:t[1],value:t[2],status:n,data:t};if(r===224){let o=t[1]|t[2]<<7;return{kind:"pitch",channel:i,value:o,status:n,data:t}}}return{kind:"raw",channel:n>=128?i:void 0,status:n,data:t}}function Xn(e){return e instanceof Uint8Array?new Uint8Array(e):Uint8Array.from(e)}function Fd(e){return Array.from(e)}function Hd(e){if(!("kind"in e))return!1;let t=e.kind;return t==="noteon"||t==="noteoff"||t==="cc"||t==="pitch"}function ro(e){if(e instanceof Uint8Array)return Xn(e);if(Array.isArray(e))return e.every(t=>Number.isInteger(t)&&t>=0&&t<=255)?Uint8Array.from(e):void 0;if(!(typeof e!="object"||e===null)){if("data"in e&&e.data instanceof Uint8Array&&e.data.length>0)return Xn(e.data);if(Hd(e))return Zn(e)}}function Vd(e,t){return e==="*"?!0:e==="note"?t.kind==="noteon"||t.kind==="noteoff":t.kind===e}function Bd(e){return{send(t,n){e.send(Array.from(t),n)}}}function Kd(e){if(typeof navigator>"u")return;let t=navigator.requestMIDIAccess;if(typeof t=="function")return t.call(navigator,e)}function io(e){if(e instanceof Error&&e.message)return e.message;if(typeof e=="string"&&e.length>0)return e}var Qn=class{constructor(t={}){this.listeners=[];this.attachedInputs=new Set;this.inputCount=0;this.outputCount=0;this.destroyed=!1;this.output=t.output,this.outputOwned=t.output!=null,this.requestMIDIAccess=t.requestMIDIAccess,this.onHardwareMessage=this.onHardwareMessage.bind(this),this.onAccessStateChange=this.onAccessStateChange.bind(this)}subscribe(t,n){if(this.destroyed)return()=>{};let r={kind:t,listener:n};return this.listeners.push(r),()=>{this.listeners=this.listeners.filter(i=>i!==r)}}inject(t){if(this.destroyed)return;let n=ro(t);if(!n)return;let r=Jn(n);r&&this.dispatch(r)}sendNoteOn(t,n,r=100){return this.sendEncoded({kind:"noteon",channel:t,note:n,velocity:r})}sendNoteOff(t,n,r=0){return this.sendEncoded({kind:"noteoff",channel:t,note:n,velocity:r})}sendCc(t,n,r){return this.sendEncoded({kind:"cc",channel:t,controller:n,value:r})}sendPitch(t,n){return this.sendEncoded({kind:"pitch",channel:t,value:n})}send(t){if(this.destroyed)return{ok:!1,reason:"destroyed"};let n=ro(t);return!n||n.length===0?{ok:!1,reason:"invalid",detail:"empty MIDI payload"}:this.write(n)}async requestAccess(t){if(this.destroyed)return{ok:!1,reason:"destroyed"};if(this.access)return{ok:!0,inputs:this.inputCount,outputs:this.outputCount,sysexEnabled:this.access.sysexEnabled};let n=this.requestMIDIAccess??Kd,r=typeof n=="function"?n({sysex:t?.sysex===!0}):void 0;if(r==null)return{ok:!1,reason:"unavailable",detail:"navigator.requestMIDIAccess is not available"};try{let i=await r;return this.destroyed?{ok:!1,reason:"destroyed"}:(this.attachAccess(i),{ok:!0,inputs:this.inputCount,outputs:this.outputCount,sysexEnabled:i.sysexEnabled})}catch(i){return{ok:!1,reason:"denied",detail:io(i)}}}destroy(){this.destroyed||(this.destroyed=!0,this.detachHardware(),this.listeners=[],this.access=void 0,this.outputOwned||(this.output=void 0))}sendEncoded(t){if(this.destroyed)return{ok:!1,reason:"destroyed"};let n=Zn(t);return n?this.write(n):{ok:!1,reason:"invalid",detail:"channel, data, or pitch out of range"}}write(t){if(!this.output)return{ok:!1,reason:"no-port"};try{this.output.send(Fd(t))}catch(n){return{ok:!1,reason:"invalid",detail:io(n)}}return{ok:!0,data:t}}dispatch(t){for(let n of this.listeners)Vd(n.kind,t)&&n.listener(t)}deliverBytes(t){let n=Jn(t);n&&this.dispatch(n)}onHardwareMessage(t){if(this.destroyed)return;let n="data"in t?t.data:void 0;!n||n.length===0||this.deliverBytes(n)}onAccessStateChange(){this.destroyed||!this.access||this.syncPorts(this.access)}attachAccess(t){this.access=t,this.syncPorts(t),t.addEventListener?.("statechange",this.onAccessStateChange)}syncPorts(t){let n=new Set;t.inputs.forEach(d=>n.add(d));for(let d of[...this.attachedInputs])n.has(d)||(d.removeEventListener("midimessage",this.onHardwareMessage),this.attachedInputs.delete(d));t.inputs.forEach(d=>{this.attachedInputs.has(d)||(d.addEventListener("midimessage",this.onHardwareMessage),this.attachedInputs.add(d))});let r=new Set,i=0;t.inputs.forEach(()=>{i+=1});let o=0;if(t.outputs.forEach(d=>{o+=1,r.add(d)}),this.inputCount=i,this.outputCount=o,this.outputOwned||(this.adoptedHardwareOutput&&!r.has(this.adoptedHardwareOutput)&&(this.output=void 0,this.adoptedHardwareOutput=void 0),this.output))return;let a;t.outputs.forEach(d=>{a||(a=d)}),a&&(this.adoptedHardwareOutput=a,this.output=Bd(a))}detachHardware(){for(let t of this.attachedInputs)t.removeEventListener("midimessage",this.onHardwareMessage);this.attachedInputs.clear(),this.access?.removeEventListener?.("statechange",this.onAccessStateChange),this.outputOwned||(this.output=void 0,this.adoptedHardwareOutput=void 0),this.inputCount=0,this.outputCount=0}};export{Ma as ANCHOR_ORIGINS,ye as ASSET_FAILED_EVENT,$r as ASSET_FAILURE_CODES,Kr as ASSET_KINDS,he as ASSET_READY_EVENT,ia as AUDIO_CUE_EVENTS,Bt as AUDIO_CUE_FAILED_EVENT,Ft as AUDIO_CUE_SCHEDULED_EVENT,Vt as AUDIO_CUE_SKIPPED_EVENT,Ht as AUDIO_CUE_STARTED_EVENT,Ci as CAPABILITY_ASSET_KINDS,Ut as CAPABILITY_BLEND_MODES,Gt as CAPABILITY_CLEAR_POLICIES,wi as CAPABILITY_INTEGRATIONS,Si as CAPABILITY_MANAGERS,ua as CAPABILITY_MANIFEST_VERSION,Ei as CAPABILITY_PHASES,rd as COMPOSITOR_BLEND_MODES,id as COMPOSITOR_CLEAR_POLICIES,Ta as COORDINATE_SPACES,xe as CUE_CANCELLED_EVENT,ze as CUE_COMPLETED_EVENT,ea as CUE_LIFECYCLE_EVENTS,Ce as CUE_REPLACED_EVENT,Re as CUE_STARTED_EVENT,lt as CYBERART_CANVAS_ATTR,Wt as DEFAULT_BROWSER_VIEWPORT,hn as DEFAULT_DUCK_GAIN,Bi as DEFAULT_GROUP_HEIGHT,Vi as DEFAULT_GROUP_WIDTH,Dt as DEFAULT_MAX_HOPS,ji as DEFAULT_MAX_INSPECTOR_RECORDS,xt as ENGINE_SNAPSHOT_RUNTIME,rt as EVENT_ENVELOPE_VERSION,fd as EXECUTABLE_MODULE_ERROR_CODES,xa as GEOMETRY_CONTRACT_VERSION,Ne as HostChannel,li as INVALID_PRESENTATION_MODEL_MESSAGE,Q as IncompatibleCartStateError,pt as KeyboardManager,Rt as LEGACY_SNAPSHOT_SCHEMA_VERSION,Dd as MIDI_CHANNEL_MAX,Md as MIDI_CHANNEL_MIN,Id as MIDI_CONTROL_CHANGE,Od as MIDI_DATA_MAX,xd as MIDI_NOTE_OFF,Pd as MIDI_NOTE_ON,Td as MIDI_PITCH_BEND,_d as MIDI_PITCH_CENTER,Nd as MIDI_PITCH_MAX,Qn as MidiManager,je as PRESENTATION_ADAPTER_VERSION,kn as PRESENTATION_MODEL_EVENT,ci as PRESENTATION_PHASES,js as PRESENTATION_SUBSCRIBE_PATTERNS,ui as PRESENTATION_UNSUPPORTED_EVENT,ft as PointerManager,zi as REDACTED_VALUE,me as REJECTED_EVENT_TYPE,zt as REPLAY_INSPECTOR_SCHEMA_VERSION,Pa as ROUND_TRIP_TOLERANCE,Ia as ROUND_TRIP_TOLERANCE_CANVAS_PX,Ye as Random,Ve as SILENT_ASSET_FALLBACK_REF,ee as SNAPSHOT_SCHEMA_VERSION,un as UNVERSIONED_CART_VERSION,gi as applyCueEasing,tt as applySnapshotMigrations,ke as assetStatusEvent,Na as assetToNormalized,hs as attachCartStatePersistence,hi as attachPresentationAdapter,gt as canonicalizeSeed,Ni as canvasToCss,Li as canvasToNormalized,ka as capabilityManifestToJSON,Le as cloneSnapshotJson,Ks as comparePayloadSchemas,ed as compareReplayTraces,J as createAssetFailure,fn as createAssetPreloader,yn as createAudioBroker,bi as createAudioCueTimeline,kd as createBrowserHarness,Gn as createCompositor,Gs as createContractRegistry,_r as createEngineSnapshotMigrations,Sn as createEventRouter,Ed as createExecutableModuleHost,ts as createFixtureAssetResolver,da as createHeadlessAudioAdapter,ns as createHostedAssetResolver,Fa as createLandmarkRegistry,Rd as createPlaywrightCompatibleAdapter,Nn as createPresentationLayout,An as createPresentationModelEvent,Mn as createPresentationTimeline,mi as createReferencePresentationCart,qi as createReplayInspector,gn as createRuntime,Kn as createRuntimeGroup,Nr as createSnapshotMigrationRegistry,mt as createVirtualClock,De as createWallClock,_i as cssToCanvas,Fn as cssToNormalized,Lr as defaultSnapshotMigrationRegistry,_n as defineCapabilityManifest,Bs as defineDiagnostic,Hs as defineIntent,Mr as defineSnapshot,Vs as defineStateEvent,$s as deriveAttachOptions,kr as describeReplayMismatch,Ze as detectSnapshotSchemaVersion,Va as drawGeometryDebug,Zn as encodeMidiMessage,jo as engineStateFromEnvelope,ai as familyPatternForType,ii as inferEventKind,It as isAssetFailure,Gr as isAssetFailureCode,Ur as isAssetKind,oa as isAudioCueEventType,ta as isCueLifecycleType,Fe as isLegacyCartStateBundle,oo as isMidiChannel,dt as isMidiData,Rn as isPresentationModel,pi as isPresentationPhase,Fo as isSnapshotEnvelope,Ho as isVersionedSnapshot,si as kindSegmentInType,oi as matchEventPattern,Ld as midiChannelFromStatus,Yt as midiStatus,Zs as mountPresentationAdapter,Ot as normalizeEvent,_a as normalizedToAsset,La as normalizedToCanvas,Ln as normalizedToCss,Aa as parseCapabilityManifest,Ka as parseGeometry,Jn as parseMidiBytes,Pt as parseSnapshot,Oa as pointFromOrigin,Vn as pointerToRegion,Fi as rectToCanvas,Hn as rectToCss,Bn as regionToViewport,as as registerCartStateHotkeys,nd as replayExportedTrace,cn as resolveImportableCartState,bt as resolveRuntimeSeed,ln as restoreSnapshotFromUnknown,qr as rewriteHostedAssetRef,aa as scheduleAudioCue,Ba as serializeGeometry,Ae as snapshotErrorsToMessage,et as snapshotFromCartBundle,Ra as validateCapabilityManifest,Ha as validateGeometry,He as validateSnapshot,Us as verifyAttachOptions};
|