@datamoc/mw_games 0.41.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +105 -0
- package/README.md +62 -1
- package/REFERENCE.md +73 -8
- package/api-surface.json +696 -0
- package/data/microgm-essential.PROVENANCE.md +13 -0
- package/data/microgm-essential.sf2 +0 -0
- package/data/soundfont-catalog.json +8 -0
- package/dist/audio/AudioLoader.d.ts +28 -0
- package/dist/audio/AudioLoader.d.ts.map +1 -0
- package/dist/audio/AudioLoader.js +53 -0
- package/dist/audio/AudioLoader.js.map +1 -0
- package/dist/audio/Channels.d.ts +1 -0
- package/dist/audio/Channels.d.ts.map +1 -1
- package/dist/audio/Channels.js +2 -1
- package/dist/audio/Channels.js.map +1 -1
- package/dist/audio/MidiRender.d.ts +19 -1
- package/dist/audio/MidiRender.d.ts.map +1 -1
- package/dist/audio/MidiRender.js +24 -1
- package/dist/audio/MidiRender.js.map +1 -1
- package/dist/audio/MusicPlayer.d.ts +80 -0
- package/dist/audio/MusicPlayer.d.ts.map +1 -0
- package/dist/audio/MusicPlayer.js +147 -0
- package/dist/audio/MusicPlayer.js.map +1 -0
- package/dist/audio/SampleDecoder.d.ts +16 -2
- package/dist/audio/SampleDecoder.d.ts.map +1 -1
- package/dist/audio/SampleDecoder.js +10 -6
- package/dist/audio/SampleDecoder.js.map +1 -1
- package/dist/audio/Sound.d.ts +2 -0
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +3 -0
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/SoundFont.d.ts +40 -5
- package/dist/audio/SoundFont.d.ts.map +1 -1
- package/dist/audio/SoundFont.js +52 -14
- package/dist/audio/SoundFont.js.map +1 -1
- package/dist/audio/Synth.d.ts +1 -1
- package/dist/audio/Synth.d.ts.map +1 -1
- package/dist/audio/Synth.js +4 -0
- package/dist/audio/Synth.js.map +1 -1
- package/dist/audio/index.d.ts +8 -4
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +4 -2
- package/dist/audio/index.js.map +1 -1
- package/dist/core/DialogueText.d.ts +25 -0
- package/dist/core/DialogueText.d.ts.map +1 -1
- package/dist/core/DialogueText.js +25 -0
- package/dist/core/DialogueText.js.map +1 -1
- package/dist/core/Motion.d.ts +20 -0
- package/dist/core/Motion.d.ts.map +1 -1
- package/dist/core/Motion.js +20 -0
- package/dist/core/Motion.js.map +1 -1
- package/dist/core/Save.d.ts +31 -0
- package/dist/core/Save.d.ts.map +1 -1
- package/dist/core/Save.js +31 -0
- package/dist/core/Save.js.map +1 -1
- package/dist/core/Twee.d.ts +34 -0
- package/dist/core/Twee.d.ts.map +1 -1
- package/dist/core/Twee.js +34 -0
- package/dist/core/Twee.js.map +1 -1
- package/dist/mw_games.global.js +22 -22
- package/dist/mwl/index.d.ts +2 -0
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +1 -0
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/objects.d.ts +31 -0
- package/dist/mwl/objects.d.ts.map +1 -0
- package/dist/mwl/objects.js +83 -0
- package/dist/mwl/objects.js.map +1 -0
- package/dist/mwl/schema.d.ts +1 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/tables.d.ts +2 -0
- package/dist/mwl/tables.d.ts.map +1 -1
- package/dist/mwl/tables.js +13 -0
- package/dist/mwl/tables.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts +68 -5
- package/dist/physics/XpbdWorld.d.ts.map +1 -1
- package/dist/physics/XpbdWorld.js +135 -6
- package/dist/physics/XpbdWorld.js.map +1 -1
- package/dist/testing/index.d.ts +16 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +21 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/three-d/Collision3D.d.ts +46 -2
- package/dist/three-d/Collision3D.d.ts.map +1 -1
- package/dist/three-d/Collision3D.js +46 -2
- package/dist/three-d/Collision3D.js.map +1 -1
- package/dist/three-d/Grid.d.ts +12 -1
- package/dist/three-d/Grid.d.ts.map +1 -1
- package/dist/three-d/Grid.js +12 -1
- package/dist/three-d/Grid.js.map +1 -1
- package/dist/three-d/Vox.d.ts +13 -1
- package/dist/three-d/Vox.d.ts.map +1 -1
- package/dist/three-d/Vox.js +13 -1
- package/dist/three-d/Vox.js.map +1 -1
- package/dist/two-d/Game.d.ts +21 -1
- package/dist/two-d/Game.d.ts.map +1 -1
- package/dist/two-d/Game.js +73 -6
- package/dist/two-d/Game.js.map +1 -1
- package/dist/two-d/Scene2D.d.ts +24 -0
- package/dist/two-d/Scene2D.d.ts.map +1 -1
- package/dist/two-d/Scene2D.js +30 -0
- package/dist/two-d/Scene2D.js.map +1 -1
- package/dist/two-d/render/SceneTransition.d.ts +272 -0
- package/dist/two-d/render/SceneTransition.d.ts.map +1 -0
- package/dist/two-d/render/SceneTransition.js +431 -0
- package/dist/two-d/render/SceneTransition.js.map +1 -0
- package/dist/two-d/render/index.d.ts +2 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +1 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +23 -0
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +37 -0
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/DropdownView.d.ts +49 -3
- package/dist/two-d/ui/DropdownView.d.ts.map +1 -1
- package/dist/two-d/ui/DropdownView.js +150 -9
- package/dist/two-d/ui/DropdownView.js.map +1 -1
- package/dist/two-d/ui/ScrollBox.d.ts +90 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -1
- package/dist/two-d/ui/ScrollBox.js +206 -4
- package/dist/two-d/ui/ScrollBox.js.map +1 -1
- package/dist/two-d/ui/ScrollText.d.ts +122 -0
- package/dist/two-d/ui/ScrollText.d.ts.map +1 -0
- package/dist/two-d/ui/ScrollText.js +202 -0
- package/dist/two-d/ui/ScrollText.js.map +1 -0
- package/dist/two-d/ui/Tooltip.d.ts +70 -1
- package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
- package/dist/two-d/ui/Tooltip.js +115 -3
- package/dist/two-d/ui/Tooltip.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +35 -2
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +58 -3
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +7 -5
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +3 -2
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/two-d/ui/theme.d.ts +18 -0
- package/dist/two-d/ui/theme.d.ts.map +1 -1
- package/dist/two-d/ui/theme.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +14 -3
- package/sbom.cdx.json +462 -243
- package/tools/browser-driver.mjs +3 -3
- package/tools/browser-smoke.mjs +19 -2
- package/tools/build-tablebases.mjs +7 -3
- package/tools/compile-openings.mjs +7 -3
- package/tools/compile-resources.d.mts +8 -0
- package/tools/compile-resources.mjs +62 -14
- package/tools/emit-page.d.mts +9 -0
- package/tools/emit-page.mjs +57 -4
- package/tools/find-chrome.mjs +4 -2
- package/tools/init.mjs +11 -3
- package/tools/play-uci.mjs +9 -5
- package/tools/svg-optimise.d.mts +8 -0
- package/tools/svg-optimise.mjs +45 -0
- package/tools/vite.mjs +10 -1
- package/tools.md +5 -2
package/dist/mw_games.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.41.0`,p=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}};function _(){let e=1,t=new Map;return{get size(){return t.size},put(n){let r=e++;return t.set(r,n),r},get(e){let n=t.get(e);if(n===void 0)throw Error(`unknown handle ${e}`);return n},drop(e){t.delete(e)},clear(){t.clear()},with(n,r){let i=e++;t.set(i,n);try{return r(i)}finally{t.delete(i)}}}}var v=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},y={debug:0,info:1,warn:2,error:3},b=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??x}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){y[e]<y[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function x(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var S=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,...t){for(let n of[...this.hooks])n.event===e&&n.handler(...t)}get size(){return this.hooks.length}clear(){this.hooks=[]}},C=l({Generator:()=>j,MersenneTwister:()=>he,RandomStreams:()=>ge,active:()=>ee,chance:()=>A,element:()=>re,float:()=>D,int:()=>O,normalRange:()=>k,pop:()=>T,push:()=>w,range:()=>ne,reset:()=>te,shuffle:()=>oe,weighted:()=>ie,weightedKey:()=>ae,withSeed:()=>E});function ee(){return le()}function w(e){let t=new j(e);return ce.push(t),t}function T(){if(ce.length===1)throw Error(`the base random generator cannot be popped`);ce.pop()}function E(e,t){w(e);try{return t()}finally{T()}}function te(){ce.length=0,ce.push(new j)}function D(e,t,n){let r=n??le();return e===void 0?r.float():t===void 0?r.float()*e:e+r.float()*(t-e)}function O(e,t,n){let r=n??le();return t===void 0?r.int(e):e+r.int(t-e)}function ne(e,t,n){return e+(n??le()).int(t-e+1)}function k(e,t,n){let r=n??le();return e+Math.floor((r.float()+r.float())*(t-e+1)/2)}function A(e,t){return(t??le()).float()<e}function re(e,t){return e.length>0?e[(t??le()).int(e.length)]:null}function ie(e,t){let n=0;for(let t of e)n+=t;if(n<=0)return null;let r=(t??le()).float()*n;for(let t=0;t<e.length;t++)if(r-=e[t],r<0)return t;return e.length-1}function ae(e,t){let n=[...e.keys()],r=ie(n.map(t=>e.get(t)??0),t);return r===null?null:n[r]}function oe(e,t){for(let n=e.length-1;n>0;n--){let r=(t??le()).int(n+1);[e[n],e[r]]=[e[r],e[n]]}return e}function se(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var j,ce,le,ue,de,fe,pe,me,he,ge,_e=s((()=>{j=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=this.seed,n=()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0};this.s0=n(),this.s1=n(),this.s2=n(),this.s3=n(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(this.rotl(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=this.rotl(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}rotl(e,t){return(e<<t|e>>>32-t)>>>0}},ce=[new j],le=()=>ce[ce.length-1],ue=624,de=397,fe=2567483615,pe=2147483648,me=2147483647,he=class{constructor(e=5489){this.state=new Uint32Array(ue),this.index=ue,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<ue;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=ue,this.produced=0}generate(){for(let e=0;e<ue;e++){let t=this.state[e]&pe|this.state[(e+1)%ue]&me,n=this.state[(e+de)%ue]^t>>>1;t&1&&(n^=fe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=ue&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<ue;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}},ge=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^se(e))>>>0;t={seed:n,engine:new he(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new he(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}}})),ve=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>gt,attachPointer:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>_t,dispatchAction:()=>Te,dispatchComposition:()=>Ee,dispatchText:()=>we,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>P,onComposition:()=>F,onKey:()=>xe,onText:()=>Se,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>Ce,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),M=new Map,N=new Set,ye=new Set,be=new Set,P=new p(!0),xe=new p(!0),Se=new p(!0),F=new p(!0);function Ce(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function we(e){e.length>0&&Se.dispatch(e)}function Te(e){P.dispatch(e)}function Ee(e){F.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function Me(e,t){M.set(e,new Set(t))}function Ne(e,t){let n=M.get(e)??new Set;for(let e of t)n.add(e);M.set(e,n)}function Pe(e){return Be(e)}function Fe(e){M.delete(e)}function Ie(e){return[...M.get(e)??[]]}function Le(){let e={};for(let[t,n]of M)e[t]=[...n];return e}function Re(e){M.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of M)r.has(e)&&t.push(n);return t}function Ve(e){if(!N.has(e)){N.add(e);for(let t of Be(e))ye.add(t),P.dispatch(t)}}function He(e){if(N.has(e)){N.delete(e);for(let t of Be(e))be.add(t)}}function Ue(e){let t=M.get(e);if(!t)return!1;for(let e of t)if(N.has(e))return!0;return!1}function We(e){return ye.has(e)}function Ge(e){return be.has(e)}function Ke(){ye.clear(),be.clear()}function qe(e){let t=Ce(e);t!==null&&we(t)}function Je(e){e.repeat?(xe.dispatch(e),qe(e)):(Ve(e.code),xe.dispatch(e),qe(e))}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){N.clear(),ye.clear(),be.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of N)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e,t={}){let n=t.dragThreshold??4,r=t.toWorld??((e,t)=>({x:e,y:t})),i=new p,a=new p,o=new p,s=new p,c=-1,l=!1,u=!1,d=0,f=0,m=null;function h(t){let n=e.getBoundingClientRect?.()??{left:0,top:0},i=t.clientX-n.left,a=t.clientY-n.top,o=r(i,a);return{x:i,y:a,worldX:o.x,worldY:o.y,dx:l?i-d:0,dy:l?a-f:0,pointerId:t.pointerId,pressed:l}}function g(t){if(l)return;l=!0,u=!1,c=t.pointerId;let n=e.getBoundingClientRect?.()??{left:0,top:0};d=t.clientX-n.left,f=t.clientY-n.top,m=h(t),i.dispatch(m)}function _(e){l&&e.pointerId!==c||(m=h(e),a.dispatch(m),l&&(!u&&Math.hypot(m.dx,m.dy)>=n&&(u=!0),u&&o.dispatch(m)))}function v(e){if(!l||e.pointerId!==c)return;let t=u,n=h(e);l=!1,u=!1,m={...n,pressed:!1,dx:0,dy:0},s.dispatch({...n,pressed:!1,dragged:t})}return e.addEventListener(`pointerdown`,g),e.addEventListener(`pointermove`,_),e.addEventListener(`pointerup`,v),e.addEventListener(`pointercancel`,v),{down:i,move:a,drag:o,up:s,get current(){return m},detach(){e.removeEventListener(`pointerdown`,g),e.removeEventListener(`pointermove`,_),e.removeEventListener(`pointerup`,v),e.removeEventListener(`pointercancel`,v)}}}function gt(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function _t(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var vt=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}},yt=25214903917n,bt=11n,xt=(1n<<48n)-1n,St=class{constructor(e=0,t={}){this.state=0n,this.onDraw=t.onDraw,this.setSeed(e)}setSeed(e){this.state=(BigInt.asIntN(64,BigInt(e))^yt)&xt}next(e){if(!Number.isInteger(e)||e<1||e>32)throw Error(`next needs 1 to 32 bits, got ${e}`);this.state=this.state*yt+bt&xt;let t=Number(this.state>>BigInt(48-e)),n=e===32?t|0:t;return this.onDraw?.({bits:e,value:n}),n}nextInt(e){if(e===void 0)return this.next(32);if(!Number.isInteger(e)||e<=0||e>2147483647)throw Error(`nextInt needs a bound from 1 to 2147483647, got ${e}`);if((e&-e)===e)return Math.floor(e*this.next(31)/2147483648);let t,n;do t=this.next(31),n=t%e;while(t-n+(e-1)>2147483647);return n}nextLong(){let e=BigInt(this.next(32)),t=BigInt(this.next(32));return BigInt.asIntN(64,(e<<32n)+t)}nextDouble(){return(this.next(26)*134217728+this.next(27))/2**53}nextFloat(){return this.next(24)/16777216}nextBoolean(){return this.next(1)!==0}};_e();function Ct(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return Tt(i)}function wt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=Et(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function Tt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Et(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var Dt=10485760;function Ot(e,t={}){let n=t.maxBytes??Dt,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function kt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function At(e,t={}){return Ot(e,t),kt(e),e}var jt=new Set([`__proto__`,`constructor`,`prototype`]);function Mt(e,t=`$`){if(Array.isArray(e))e.forEach((e,n)=>Mt(e,`${t}[${n}]`));else if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(jt.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Mt(e[n],`${t}.${n}`)}}function Nt(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Nt(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(jt.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Nt(e[r],i,`${n}.${r}`);return}}function Pt(e,t={}){let n=t.label??`inbound data`;At(e,t);try{return JSON.parse(e,(e,t)=>{if(jt.has(e))throw new Ft(e);return t})}catch(e){throw e instanceof Ft?Error(`${n} contains a forbidden key "${e.key}"`):Error(`${n} is not valid JSON (${e instanceof Error?e.message:String(e)})`)}}var Ft=class{constructor(e){this.key=e}};function It(e,t){let n=Pt(e,{label:t}),r=n?.meta;if(typeof n!=`object`||!n||Array.isArray(n)||!(`state`in n))throw Error(`${t} is not save data (expected { meta, state })`);if(typeof r!=`object`||!r||!Number.isSafeInteger(r.version)||r.version<0)throw Error(`${t} has no valid meta.version`);if(typeof r.savedAt!=`number`||!Number.isFinite(r.savedAt))throw Error(`${t} has no valid meta.savedAt`);return n}var Lt=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function Rt(){return typeof localStorage>`u`?new Lt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var zt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??Rt()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;try{let n=It(t,`save slot "${e}"`),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}catch{return null}}importExternal(e,t,n,r){Ot(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?Ct(n,t):n}importSlot(e,t,n){Ot(t);let r=It(n?wt(t,n):t,`SaveSystem.importSlot: payload`),i=r.state;for(let e=r.meta.version;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{...r.meta,version:this.version},state:i};this.storage.write(this.key(e),JSON.stringify(a))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);if(r)try{t.push({slot:n.slice(e.length),meta:It(r,n).meta})}catch{}}return t}},Bt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?Pt(t,{label:`stored value "${this.key}"`}):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}};function Vt(e,t=`value`){return Ht(e,t,new Set)}function Ht(e,t,n){if(typeof e==`function`||typeof e==`symbol`)return t;if(typeof e!=`object`||!e||n.has(e)||(n.add(e),Ut(e)))return null;let r=[];if(e instanceof Map)for(let[n,i]of e)r.push([`${t}.get(${JSON.stringify(n)??String(n)})`,i]);else if(e instanceof Set)for(let n of e)r.push([`${t}.item`,n]);else if(Array.isArray(e))e.forEach((e,n)=>r.push([`${t}[${n}]`,e]));else for(let[n,i]of Object.entries(e))r.push([`${t}.${n}`,i]);for(let[e,t]of r){let r=Ht(t,e,n);if(r)return r}return t}function Ut(e){try{return structuredClone(e),!0}catch{return!1}}function Wt(e,t){try{return structuredClone(e)}catch(n){let r=Vt(e,t)??t;throw TypeError(`${r} cannot be structured-cloned (${n instanceof Error?n.message:String(n)}). Journals, snapshots and undo checkpoints copy their contents with structuredClone, so they must hold plain data: refer to a live object (an actor, anything carrying callbacks such as a ReactionTable) by its id and resolve it inside the rule.`,{cause:n})}}var Gt=class{constructor(e,t={}){this._state=Wt(e,`initial state`),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Kt}get state(){return structuredClone(this._state)}set(e){this._state=Wt(e,`state`)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=Wt(e.state,`snapshot.state`);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=Wt(n,`migrated state`),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Kt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=Wt(n.capture(),`extension ${t}`);let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=Wt(e.extensions[n],`snapshot.extensions.${n}`);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(Wt(s,`migrated extension ${n}`)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},qt=new Set([`localhost`,`127.0.0.1`,`[::1]`]);function Jt(e,t,n=!1){if(n||!/^[a-z][a-z0-9+.-]*:/i.test(e))return;let r=new URL(e);if(r.protocol!==`https:`&&r.protocol!==`wss:`&&(r.protocol!==`http:`&&r.protocol!==`ws:`||!qt.has(r.hostname)))throw Error(`${t} url must use https: or wss: (got ${r.protocol}//${r.host}); pass allowInsecure: true to accept it`)}var Yt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(Jt(e.endpoint,`${t} endpoint`,e.allowInsecure),this.endpoint=e.endpoint,this.label=t,this.maxResponseBytes=e.maxResponseBytes??10485760,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}async readText(e){let t=this.maxResponseBytes,n=Number(e.headers?.get?.(`content-length`));if(n>t)throw Error(`${this.label} response exceeds the ${t}-byte limit (${n} bytes)`);if(!e.body){let n=await e.text();return Ot(n,{maxBytes:t}),n}let r=e.body.getReader(),i=[],a=0;for(;;){let{done:e,value:n}=await r.read();if(e)break;if(a+=n.byteLength,a>t)throw await r.cancel(),Error(`${this.label} response exceeds the ${t}-byte limit`);i.push(n)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return new TextDecoder().decode(o)}async readJson(e,t){return Pt(await this.readText(e),{maxBytes:this.maxResponseBytes,label:`${this.label} ${t}`})}},Xt=class extends Yt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await this.readJson(n,`download`);if(typeof r?.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await this.readJson(t,`slot list`);if(!Array.isArray(n?.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},Zt=1,Qt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.onProtocolError=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);Jt(e.url,`lockstep client`,e.allowInsecure),this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput,this.maxMessageBytes=e.maxMessageBytes??1048576}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===Zt}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);n===!1||typeof n==`string`?this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n}):this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t;try{if(typeof e!=`string`)throw Error(`lockstep message is not text`);t=en(Pt(e,{maxBytes:this.maxMessageBytes,label:`lockstep message`}))}catch(e){this.onProtocolError.dispatch({reason:e instanceof Error?e.message:String(e)});return}if(t.type===`welcome`)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},$t=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function en(e){if(!$t(e)||typeof e.type!=`string`)throw Error(`lockstep message has no type`);switch(e.type){case`welcome`:if(typeof e.id!=`string`||e.id===``)throw Error(`welcome needs a string id`);if(e.seed!==void 0&&!Number.isSafeInteger(e.seed))throw Error(`welcome seed must be an integer`);return e;case`tick`:if(!Number.isSafeInteger(e.tick)||e.tick<0)throw Error(`tick needs a non-negative integer tick`);if(!$t(e.inputs))throw Error(`tick needs an inputs object`);if(e.checksums!==void 0&&(!$t(e.checksums)||Object.values(e.checksums).some(e=>typeof e!=`number`)))throw Error(`tick checksums must map ids to numbers`);return e;case`rejected`:if(e.reason!==void 0&&typeof e.reason!=`string`)throw Error(`rejected reason must be a string`);return e;default:throw Error(`unknown lockstep message type "${e.type}"`)}}var tn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},nn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},rn=class extends Yt{constructor(e){super(e,`telemetry`),this.consented=!1,this.maxStringLength=e.maxStringLength??256,this.maxProperties=e.maxProperties??32,this.allowed=e.allowedProperties?new Set(e.allowedProperties):null}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(this.bounded(e)),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}bounded(e){let t=e=>e.length>this.maxStringLength?e.slice(0,this.maxStringLength):e;if(!e.properties)return{name:t(e.name)};let n={},r=0;for(let[i,a]of Object.entries(e.properties))if(!this.allowed||this.allowed.has(i)){if(r++>=this.maxProperties)break;n[t(i)]=typeof a==`string`?t(a):a}return{name:t(e.name),properties:n}}},an=class extends Yt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=await this.readJson(t,`response`);if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>on(e,t))})}};function on(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var sn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},cn=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??Rt()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:this.parse(t,this.prefix+e)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return this.parse(this.storage.read(e),e)}parse(e,t){return Pt(e,{label:`record "${t}"`})}},ln=class{constructor(e,t,n){if(this.recorded=[],this.fromFrame=n?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed recorder needs a non-negative fromFrame`);this.frameStamp=this.fromFrame,this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frameStamp,action:e})},this.onFrame=()=>{this.frameStamp++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}get frame(){return this.frameStamp}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},un=class{constructor(e,t,n,r){if(this.events=e,this.dispatch=t,this.frames=n,this.fromFrame=r?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed player needs a non-negative fromFrame`);this.index=this.events.findIndex(e=>e.frame>=this.fromFrame),this.index<0&&(this.index=this.events.length),this.frame=this.fromFrame,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function dn(e){return JSON.stringify(e)}function fn(e){return pn(JSON.parse(e))}function pn(e){if(!Array.isArray(e))throw Error(`a replay must be an array of {frame, action}`);return e.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}function mn(e,t){if(typeof t!=`string`||!t.length)throw TypeError(`a replay file needs a non-empty ${e}`);return t}function hn(e){let t=e;if(!Number.isInteger(t)||t<0||t>4294967295)throw RangeError(`a replay seed must be uint32`);return t}function gn(e,t){let n={format:`mwg-replay`,version:1,framework:mn(`framework`,t.framework),game:mn(`game`,t.game),events:pn(e)};if(t.seed!==void 0&&(n.seed=hn(t.seed)),t.recordedAt!==void 0){if(typeof t.recordedAt!=`number`||!Number.isFinite(t.recordedAt))throw TypeError(`recordedAt must be a finite number`);n.recordedAt=t.recordedAt}return JSON.stringify(n)}function _n(e,t){let n=Pt(e,{label:`replay file`});if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a replay file must be a JSON object`);if(n.format!==`mwg-replay`)throw Error(`not a replay file: expected format "mwg-replay", found ${JSON.stringify(n.format)}`);if(n.version!==1)throw Error(`replay file version ${JSON.stringify(n.version)} is not supported (this build reads 1)`);if(n.game!==t.game)throw Error(`a replay of ${JSON.stringify(n.game)} cannot be imported into ${JSON.stringify(t.game)}`);if(n.framework!==t.framework)throw Error(`a replay recorded against mwg ${JSON.stringify(n.framework)} cannot be imported into ${JSON.stringify(t.framework)}`);let r=pn(n.events);return{format:`mwg-replay`,version:1,framework:n.framework,game:n.game,...n.seed===void 0?{}:{seed:hn(n.seed)},...n.recordedAt===void 0?{}:{recordedAt:n.recordedAt},events:r}}var vn=class{constructor(e){if(typeof e.namespace!=`string`||!e.namespace.length)throw TypeError(`a last-run store needs a non-empty namespace`);let t=e.maxEvents??1e4;if(!Number.isInteger(t)||t<1||t>1e6)throw RangeError(`last-run maxEvents must be in 1..1000000`);this.maxEvents=t,this.store=new Bt(e.storage??Rt(),`mwg-last-run:${e.namespace}`)}keep(e,t){let n=pn(e);n.length>this.maxEvents&&(n=n.slice(n.length-this.maxEvents));let r=t===void 0?{version:1,events:n}:{version:1,seed:hn(t),events:n};Ot(JSON.stringify(r)),this.store.write(r)}load(){let e=this.store.read(null);if(e===null)return null;if(e?.version!==1)throw Error(`the kept last-run recording is not version 1; clear() it and record again`);return{version:1,...e.seed===void 0?{}:{seed:hn(e.seed)},events:pn(e.events)}}clear(){this.store.remove()}};function yn(e,t){return{version:1,frame:e.frame,events:e.toJSON(),state:t}}function bn(e,t,n){if(typeof e!=`object`||!e||e.version!==1)throw Error(`a run checkpoint must be { version: 1, frame, events, state }`);return new un(pn(e.events),t,n,{fromFrame:e.frame})}function xn(e,t){if(typeof document>`u`)throw Error(`downloadReplayFile needs a browser document`);let n=document.createElement(`a`);n.href=URL.createObjectURL(new Blob([e],{type:`application/json`})),n.download=t,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(n.href),0)}async function Sn(e){return await e.text()}async function Cn(e=`.json`){if(typeof document>`u`)throw Error(`pickReplayFile needs a browser document`);return await new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e,n.style.display=`none`;let r=!1,i=e=>{r||(r=!0,n.remove(),t(e))};n.addEventListener(`change`,()=>i(n.files?.[0]??null)),n.addEventListener(`cancel`,()=>i(null)),document.body.appendChild(n),n.click()})}var wn=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence,action:Wt(e,`action`),events:Wt([...t],`events`)};return this.nextSequence++,this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Tn(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var En=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let t of this.definitions.values()){let i=Tn(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Tn(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.target}})}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}},Dn=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},On=class{constructor(e={}){let t=e.storage??Rt(),n=`mwg-session:${e.namespace??`default`}`,r=Number(t.read(n)??`0`);this.launches=(Number.isFinite(r)?r:0)+1,t.write(n,String(this.launches))}};function kn(e,t,n){return e<t?t:e>n?n:e}function An(){return{musicVolume:1,sfxVolume:1,muted:!1,zoom:1,bindings:In(je),custom:{}}}function jn(e){return e.muted?0:e.musicVolume}function Mn(e){return e.muted?0:e.sfxVolume}var Nn=class{constructor(e={}){this.storage=e.storage??Rt(),this.key=`mwg-settings:${e.namespace??`default`}`,this.value=Vn(this.storage,this.key),Re(this.value.bindings)}get current(){return{...this.value,bindings:In(this.value.bindings),custom:{...this.value.custom}}}getCustom(e,t){return this.value.custom[e]??t}setCustom(e,t){this.value.custom[e]=t,Hn(this.storage,this.key,this.value)}setMusicVolume(e){this.update({musicVolume:e})}setSfxVolume(e){this.update({sfxVolume:e})}setMuted(e){this.update({muted:e})}setZoom(e){this.update({zoom:e})}setBindings(e){this.update({bindings:e})}update(e){e.musicVolume!==void 0&&(this.value.musicVolume=Pn(e.musicVolume)),e.sfxVolume!==void 0&&(this.value.sfxVolume=Pn(e.sfxVolume)),e.muted!==void 0&&(this.value.muted=e.muted),e.zoom!==void 0&&(this.value.zoom=Fn(e.zoom)),e.bindings!==void 0&&(this.value.bindings=Ln(e.bindings),Re(this.value.bindings)),e.custom!==void 0&&(this.value.custom=zn(e.custom)),Hn(this.storage,this.key,this.value)}applyBindings(){Re(this.value.bindings)}reset(){this.value=An(),Re(this.value.bindings),Hn(this.storage,this.key,this.value)}};function Pn(e){return Number.isFinite(e)?kn(e,0,1):1}function Fn(e){return Number.isFinite(e)?Math.max(.01,e):1}function In(e){let t={};for(let[n,r]of Object.entries(e))t[n]=[...r];return t}function Ln(e){if(typeof e!=`object`||!e||Array.isArray(e))return In(je);let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let e=r.filter(e=>typeof e==`string`);e.length>0&&(t[n]=e)}return Object.keys(t).length>0?t:In(je)}function Rn(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function zn(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))Rn(r)&&(t[n]=r);return t}function Bn(e){let t=An();if(typeof e!=`object`||!e||Array.isArray(e))return t;let n=e;return{musicVolume:typeof n.musicVolume==`number`?Pn(n.musicVolume):t.musicVolume,sfxVolume:typeof n.sfxVolume==`number`?Pn(n.sfxVolume):t.sfxVolume,muted:typeof n.muted==`boolean`?n.muted:t.muted,zoom:typeof n.zoom==`number`?Fn(n.zoom):t.zoom,bindings:Ln(n.bindings),custom:zn(n.custom)}}function Vn(e,t){let n=e.read(t);if(!n)return An();try{return Bn(Pt(n,{label:`settings`}))}catch{return An()}}function Hn(e,t,n){e.write(t,JSON.stringify(n))}var Un=class extends Yt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},Wn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function Gn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function Kn(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var qn=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function Jn(e,t){let n=Gn(e,t);return qn.map(e=>Kn({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function Yn(e,t){let n=Gn(e.x,e.y),r=Gn(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function Xn(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function Zn(e,t){let n=Yn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=Gn(e.x,e.y),i=Gn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(Kn(Xn({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function Qn(e,t){let n=Gn(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(Kn({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function $n(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function er(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=$n(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}function tr(e,t,n,r){return n>=0&&r>=0&&n<e&&r<t}function nr(e,t,n){return n*e+t}function rr(e,t){return t%e}function ir(e,t){return Math.floor(t/e)}function ar(e,t){return`${e},${t}`}function or(e){let t=/^(-?\d+),(-?\d+)$/.exec(e);return t?{x:Number(t[1]),y:Number(t[2])}:null}var sr=[[0,-1],[1,0],[0,1],[-1,0]],cr=[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]],lr=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]];function ur(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function dr(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function fr(e,t){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)}function pr(e,t,n){switch(e){case`euclidean`:return ur(t,n);case`manhattan`:return fr(t,n);case`chebyshev`:return dr(t,n);default:throw RangeError(`unknown distance metric: ${e}`)}}var mr=.12,hr=null,gr,_r=new p;function vr(){if(gr===void 0&&(gr=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gr)){let e=()=>{_r.dispatch(br())};typeof gr.addEventListener==`function`?gr.addEventListener(`change`,e):typeof gr.addListener==`function`&&gr.addListener(e)}return gr}function yr(){return vr()?.matches??!1}function br(){return hr??yr()}function xr(e){hr=e,_r.dispatch(br())}function Sr(e){return vr(),_r.add(e),()=>_r.remove(e)}function Cr(e,t=`decorative`){return br()?t===`meaningful`?Math.min(e,mr):0:e}var wr=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of sr){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},Tr=class{constructor(e=1/60,t=5){if(this.accumulator=0,!(e>0))throw Error(`a fixed step must be positive`);this.step=e,this.maxSubsteps=Math.max(1,Math.floor(t))}advance(e,t){this.accumulator+=Math.max(0,e);let n=0;for(;this.accumulator>=this.step&&n<this.maxSubsteps;)t(this.step),this.accumulator-=this.step,n++;return this.accumulator>=this.step&&(this.accumulator=0),n}get alpha(){return this.accumulator/this.step}reset(){this.accumulator=0}},Er={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dr=class{constructor(){this.tweens=[]}tween(e,t,n=Er.linear){let{ease:r=Er.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=br()&&a!==void 0,s=o?a:t,c=Cr(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&br()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},Or=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kr(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jr(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),Ar(i,c)}}return r}function Ar(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jr(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mr=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nr=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pr=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fr=2166136261,Ir=16777619;function Lr(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Lr(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Lr(t)}`).join(`,`)}}`}function Rr(e){let t=Lr(e),n=Fr;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,Ir)>>>0;return n>>>0}var zr=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Br(e,t={}){let n=Ur(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vr(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vr(e,t,n,r,i,a){return Hr(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hr(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Ur(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++}else o===`"`?(i=!0,a++):o===`,`?(n.push(r),r=``,a++):o===`\r`?a++:o===`
|
|
1
|
+
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.43.0`,p=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}};function _(){let e=1,t=new Map;return{get size(){return t.size},put(n){let r=e++;return t.set(r,n),r},get(e){let n=t.get(e);if(n===void 0)throw Error(`unknown handle ${e}`);return n},drop(e){t.delete(e)},clear(){t.clear()},with(n,r){let i=e++;t.set(i,n);try{return r(i)}finally{t.delete(i)}}}}var v=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},y={debug:0,info:1,warn:2,error:3},b=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??x}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){y[e]<y[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function x(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var S=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,...t){for(let n of[...this.hooks])n.event===e&&n.handler(...t)}get size(){return this.hooks.length}clear(){this.hooks=[]}},C=l({Generator:()=>j,MersenneTwister:()=>he,RandomStreams:()=>ge,active:()=>ee,chance:()=>A,element:()=>re,float:()=>D,int:()=>O,normalRange:()=>k,pop:()=>T,push:()=>w,range:()=>ne,reset:()=>te,shuffle:()=>oe,weighted:()=>ie,weightedKey:()=>ae,withSeed:()=>E});function ee(){return le()}function w(e){let t=new j(e);return ce.push(t),t}function T(){if(ce.length===1)throw Error(`the base random generator cannot be popped`);ce.pop()}function E(e,t){w(e);try{return t()}finally{T()}}function te(){ce.length=0,ce.push(new j)}function D(e,t,n){let r=n??le();return e===void 0?r.float():t===void 0?r.float()*e:e+r.float()*(t-e)}function O(e,t,n){let r=n??le();return t===void 0?r.int(e):e+r.int(t-e)}function ne(e,t,n){return e+(n??le()).int(t-e+1)}function k(e,t,n){let r=n??le();return e+Math.floor((r.float()+r.float())*(t-e+1)/2)}function A(e,t){return(t??le()).float()<e}function re(e,t){return e.length>0?e[(t??le()).int(e.length)]:null}function ie(e,t){let n=0;for(let t of e)n+=t;if(n<=0)return null;let r=(t??le()).float()*n;for(let t=0;t<e.length;t++)if(r-=e[t],r<0)return t;return e.length-1}function ae(e,t){let n=[...e.keys()],r=ie(n.map(t=>e.get(t)??0),t);return r===null?null:n[r]}function oe(e,t){for(let n=e.length-1;n>0;n--){let r=(t??le()).int(n+1);[e[n],e[r]]=[e[r],e[n]]}return e}function se(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var j,ce,le,ue,de,fe,pe,me,he,ge,_e=s((()=>{j=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=this.seed,n=()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0};this.s0=n(),this.s1=n(),this.s2=n(),this.s3=n(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(this.rotl(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=this.rotl(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}rotl(e,t){return(e<<t|e>>>32-t)>>>0}},ce=[new j],le=()=>ce[ce.length-1],ue=624,de=397,fe=2567483615,pe=2147483648,me=2147483647,he=class{constructor(e=5489){this.state=new Uint32Array(ue),this.index=ue,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<ue;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=ue,this.produced=0}generate(){for(let e=0;e<ue;e++){let t=this.state[e]&pe|this.state[(e+1)%ue]&me,n=this.state[(e+de)%ue]^t>>>1;t&1&&(n^=fe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=ue&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<ue;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}},ge=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^se(e))>>>0;t={seed:n,engine:new he(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new he(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}}})),ve=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>gt,attachPointer:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>_t,dispatchAction:()=>Te,dispatchComposition:()=>Ee,dispatchText:()=>we,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>P,onComposition:()=>F,onKey:()=>xe,onText:()=>Se,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>Ce,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),M=new Map,N=new Set,ye=new Set,be=new Set,P=new p(!0),xe=new p(!0),Se=new p(!0),F=new p(!0);function Ce(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function we(e){e.length>0&&Se.dispatch(e)}function Te(e){P.dispatch(e)}function Ee(e){F.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function Me(e,t){M.set(e,new Set(t))}function Ne(e,t){let n=M.get(e)??new Set;for(let e of t)n.add(e);M.set(e,n)}function Pe(e){return Be(e)}function Fe(e){M.delete(e)}function Ie(e){return[...M.get(e)??[]]}function Le(){let e={};for(let[t,n]of M)e[t]=[...n];return e}function Re(e){M.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of M)r.has(e)&&t.push(n);return t}function Ve(e){if(!N.has(e)){N.add(e);for(let t of Be(e))ye.add(t),P.dispatch(t)}}function He(e){if(N.has(e)){N.delete(e);for(let t of Be(e))be.add(t)}}function Ue(e){let t=M.get(e);if(!t)return!1;for(let e of t)if(N.has(e))return!0;return!1}function We(e){return ye.has(e)}function Ge(e){return be.has(e)}function Ke(){ye.clear(),be.clear()}function qe(e){let t=Ce(e);t!==null&&we(t)}function Je(e){e.repeat?(xe.dispatch(e),qe(e)):(Ve(e.code),xe.dispatch(e),qe(e))}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){N.clear(),ye.clear(),be.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of N)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e,t={}){let n=t.dragThreshold??4,r=t.toWorld??((e,t)=>({x:e,y:t})),i=new p,a=new p,o=new p,s=new p,c=-1,l=!1,u=!1,d=0,f=0,m=null;function h(t){let n=e.getBoundingClientRect?.()??{left:0,top:0},i=t.clientX-n.left,a=t.clientY-n.top,o=r(i,a);return{x:i,y:a,worldX:o.x,worldY:o.y,dx:l?i-d:0,dy:l?a-f:0,pointerId:t.pointerId,pressed:l}}function g(t){if(l)return;l=!0,u=!1,c=t.pointerId;let n=e.getBoundingClientRect?.()??{left:0,top:0};d=t.clientX-n.left,f=t.clientY-n.top,m=h(t),i.dispatch(m)}function _(e){l&&e.pointerId!==c||(m=h(e),a.dispatch(m),l&&(!u&&Math.hypot(m.dx,m.dy)>=n&&(u=!0),u&&o.dispatch(m)))}function v(e){if(!l||e.pointerId!==c)return;let t=u,n=h(e);l=!1,u=!1,m={...n,pressed:!1,dx:0,dy:0},s.dispatch({...n,pressed:!1,dragged:t})}return e.addEventListener(`pointerdown`,g),e.addEventListener(`pointermove`,_),e.addEventListener(`pointerup`,v),e.addEventListener(`pointercancel`,v),{down:i,move:a,drag:o,up:s,get current(){return m},detach(){e.removeEventListener(`pointerdown`,g),e.removeEventListener(`pointermove`,_),e.removeEventListener(`pointerup`,v),e.removeEventListener(`pointercancel`,v)}}}function gt(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function _t(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var vt=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}},yt=25214903917n,bt=11n,xt=(1n<<48n)-1n,St=class{constructor(e=0,t={}){this.state=0n,this.onDraw=t.onDraw,this.setSeed(e)}setSeed(e){this.state=(BigInt.asIntN(64,BigInt(e))^yt)&xt}next(e){if(!Number.isInteger(e)||e<1||e>32)throw Error(`next needs 1 to 32 bits, got ${e}`);this.state=this.state*yt+bt&xt;let t=Number(this.state>>BigInt(48-e)),n=e===32?t|0:t;return this.onDraw?.({bits:e,value:n}),n}nextInt(e){if(e===void 0)return this.next(32);if(!Number.isInteger(e)||e<=0||e>2147483647)throw Error(`nextInt needs a bound from 1 to 2147483647, got ${e}`);if((e&-e)===e)return Math.floor(e*this.next(31)/2147483648);let t,n;do t=this.next(31),n=t%e;while(t-n+(e-1)>2147483647);return n}nextLong(){let e=BigInt(this.next(32)),t=BigInt(this.next(32));return BigInt.asIntN(64,(e<<32n)+t)}nextDouble(){return(this.next(26)*134217728+this.next(27))/2**53}nextFloat(){return this.next(24)/16777216}nextBoolean(){return this.next(1)!==0}};_e();function Ct(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return Tt(i)}function wt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=Et(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function Tt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Et(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var Dt=10485760;function Ot(e,t={}){let n=t.maxBytes??Dt,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function kt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function At(e,t={}){return Ot(e,t),kt(e),e}var jt=new Set([`__proto__`,`constructor`,`prototype`]);function Mt(e,t=`$`){if(Array.isArray(e))e.forEach((e,n)=>Mt(e,`${t}[${n}]`));else if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(jt.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Mt(e[n],`${t}.${n}`)}}function Nt(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Nt(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(jt.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Nt(e[r],i,`${n}.${r}`);return}}function Pt(e,t={}){let n=t.label??`inbound data`;At(e,t);try{return JSON.parse(e,(e,t)=>{if(jt.has(e))throw new Ft(e);return t})}catch(e){throw e instanceof Ft?Error(`${n} contains a forbidden key "${e.key}"`):Error(`${n} is not valid JSON (${e instanceof Error?e.message:String(e)})`)}}var Ft=class{constructor(e){this.key=e}};function It(e,t){let n=Pt(e,{label:t}),r=n?.meta;if(typeof n!=`object`||!n||Array.isArray(n)||!(`state`in n))throw Error(`${t} is not save data (expected { meta, state })`);if(typeof r!=`object`||!r||!Number.isSafeInteger(r.version)||r.version<0)throw Error(`${t} has no valid meta.version`);if(typeof r.savedAt!=`number`||!Number.isFinite(r.savedAt))throw Error(`${t} has no valid meta.savedAt`);return n}var Lt=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function Rt(){return typeof localStorage>`u`?new Lt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var zt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??Rt()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;try{let n=It(t,`save slot "${e}"`),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}catch{return null}}importExternal(e,t,n,r){Ot(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?Ct(n,t):n}importSlot(e,t,n){Ot(t);let r=It(n?wt(t,n):t,`SaveSystem.importSlot: payload`),i=r.state;for(let e=r.meta.version;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{...r.meta,version:this.version},state:i};this.storage.write(this.key(e),JSON.stringify(a))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);if(r)try{t.push({slot:n.slice(e.length),meta:It(r,n).meta})}catch{}}return t}},Bt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?Pt(t,{label:`stored value "${this.key}"`}):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}};function Vt(e,t=`value`){return Ht(e,t,new Set)}function Ht(e,t,n){if(typeof e==`function`||typeof e==`symbol`)return t;if(typeof e!=`object`||!e||n.has(e)||(n.add(e),Ut(e)))return null;let r=[];if(e instanceof Map)for(let[n,i]of e)r.push([`${t}.get(${JSON.stringify(n)??String(n)})`,i]);else if(e instanceof Set)for(let n of e)r.push([`${t}.item`,n]);else if(Array.isArray(e))e.forEach((e,n)=>r.push([`${t}[${n}]`,e]));else for(let[n,i]of Object.entries(e))r.push([`${t}.${n}`,i]);for(let[e,t]of r){let r=Ht(t,e,n);if(r)return r}return t}function Ut(e){try{return structuredClone(e),!0}catch{return!1}}function Wt(e,t){try{return structuredClone(e)}catch(n){let r=Vt(e,t)??t;throw TypeError(`${r} cannot be structured-cloned (${n instanceof Error?n.message:String(n)}). Journals, snapshots and undo checkpoints copy their contents with structuredClone, so they must hold plain data: refer to a live object (an actor, anything carrying callbacks such as a ReactionTable) by its id and resolve it inside the rule.`,{cause:n})}}var Gt=class{constructor(e,t={}){this._state=Wt(e,`initial state`),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Kt}get state(){return structuredClone(this._state)}set(e){this._state=Wt(e,`state`)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=Wt(e.state,`snapshot.state`);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=Wt(n,`migrated state`),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Kt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=Wt(n.capture(),`extension ${t}`);let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=Wt(e.extensions[n],`snapshot.extensions.${n}`);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(Wt(s,`migrated extension ${n}`)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},qt=new Set([`localhost`,`127.0.0.1`,`[::1]`]);function Jt(e,t,n=!1){if(n||!/^[a-z][a-z0-9+.-]*:/i.test(e))return;let r=new URL(e);if(r.protocol!==`https:`&&r.protocol!==`wss:`&&(r.protocol!==`http:`&&r.protocol!==`ws:`||!qt.has(r.hostname)))throw Error(`${t} url must use https: or wss: (got ${r.protocol}//${r.host}); pass allowInsecure: true to accept it`)}var Yt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(Jt(e.endpoint,`${t} endpoint`,e.allowInsecure),this.endpoint=e.endpoint,this.label=t,this.maxResponseBytes=e.maxResponseBytes??10485760,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}async readText(e){let t=this.maxResponseBytes,n=Number(e.headers?.get?.(`content-length`));if(n>t)throw Error(`${this.label} response exceeds the ${t}-byte limit (${n} bytes)`);if(!e.body){let n=await e.text();return Ot(n,{maxBytes:t}),n}let r=e.body.getReader(),i=[],a=0;for(;;){let{done:e,value:n}=await r.read();if(e)break;if(a+=n.byteLength,a>t)throw await r.cancel(),Error(`${this.label} response exceeds the ${t}-byte limit`);i.push(n)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return new TextDecoder().decode(o)}async readJson(e,t){return Pt(await this.readText(e),{maxBytes:this.maxResponseBytes,label:`${this.label} ${t}`})}},Xt=class extends Yt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await this.readJson(n,`download`);if(typeof r?.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await this.readJson(t,`slot list`);if(!Array.isArray(n?.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},Zt=1,Qt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.onProtocolError=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);Jt(e.url,`lockstep client`,e.allowInsecure),this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput,this.maxMessageBytes=e.maxMessageBytes??1048576}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===Zt}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);n===!1||typeof n==`string`?this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n}):this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t;try{if(typeof e!=`string`)throw Error(`lockstep message is not text`);t=en(Pt(e,{maxBytes:this.maxMessageBytes,label:`lockstep message`}))}catch(e){this.onProtocolError.dispatch({reason:e instanceof Error?e.message:String(e)});return}if(t.type===`welcome`)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},$t=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function en(e){if(!$t(e)||typeof e.type!=`string`)throw Error(`lockstep message has no type`);switch(e.type){case`welcome`:if(typeof e.id!=`string`||e.id===``)throw Error(`welcome needs a string id`);if(e.seed!==void 0&&!Number.isSafeInteger(e.seed))throw Error(`welcome seed must be an integer`);return e;case`tick`:if(!Number.isSafeInteger(e.tick)||e.tick<0)throw Error(`tick needs a non-negative integer tick`);if(!$t(e.inputs))throw Error(`tick needs an inputs object`);if(e.checksums!==void 0&&(!$t(e.checksums)||Object.values(e.checksums).some(e=>typeof e!=`number`)))throw Error(`tick checksums must map ids to numbers`);return e;case`rejected`:if(e.reason!==void 0&&typeof e.reason!=`string`)throw Error(`rejected reason must be a string`);return e;default:throw Error(`unknown lockstep message type "${e.type}"`)}}var tn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},nn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},rn=class extends Yt{constructor(e){super(e,`telemetry`),this.consented=!1,this.maxStringLength=e.maxStringLength??256,this.maxProperties=e.maxProperties??32,this.allowed=e.allowedProperties?new Set(e.allowedProperties):null}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(this.bounded(e)),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}bounded(e){let t=e=>e.length>this.maxStringLength?e.slice(0,this.maxStringLength):e;if(!e.properties)return{name:t(e.name)};let n={},r=0;for(let[i,a]of Object.entries(e.properties))if(!this.allowed||this.allowed.has(i)){if(r++>=this.maxProperties)break;n[t(i)]=typeof a==`string`?t(a):a}return{name:t(e.name),properties:n}}},an=class extends Yt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=await this.readJson(t,`response`);if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>on(e,t))})}};function on(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var sn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},cn=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??Rt()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:this.parse(t,this.prefix+e)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return this.parse(this.storage.read(e),e)}parse(e,t){return Pt(e,{label:`record "${t}"`})}},ln=class{constructor(e,t,n){if(this.recorded=[],this.fromFrame=n?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed recorder needs a non-negative fromFrame`);this.frameStamp=this.fromFrame,this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frameStamp,action:e})},this.onFrame=()=>{this.frameStamp++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}get frame(){return this.frameStamp}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},un=class{constructor(e,t,n,r){if(this.events=e,this.dispatch=t,this.frames=n,this.fromFrame=r?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed player needs a non-negative fromFrame`);this.index=this.events.findIndex(e=>e.frame>=this.fromFrame),this.index<0&&(this.index=this.events.length),this.frame=this.fromFrame,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function dn(e){return JSON.stringify(e)}function fn(e){return pn(JSON.parse(e))}function pn(e){if(!Array.isArray(e))throw Error(`a replay must be an array of {frame, action}`);return e.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}function mn(e,t){if(typeof t!=`string`||!t.length)throw TypeError(`a replay file needs a non-empty ${e}`);return t}function hn(e){let t=e;if(!Number.isInteger(t)||t<0||t>4294967295)throw RangeError(`a replay seed must be uint32`);return t}function gn(e,t){let n={format:`mwg-replay`,version:1,framework:mn(`framework`,t.framework),game:mn(`game`,t.game),events:pn(e)};if(t.seed!==void 0&&(n.seed=hn(t.seed)),t.recordedAt!==void 0){if(typeof t.recordedAt!=`number`||!Number.isFinite(t.recordedAt))throw TypeError(`recordedAt must be a finite number`);n.recordedAt=t.recordedAt}return JSON.stringify(n)}function _n(e,t){let n=Pt(e,{label:`replay file`});if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a replay file must be a JSON object`);if(n.format!==`mwg-replay`)throw Error(`not a replay file: expected format "mwg-replay", found ${JSON.stringify(n.format)}`);if(n.version!==1)throw Error(`replay file version ${JSON.stringify(n.version)} is not supported (this build reads 1)`);if(n.game!==t.game)throw Error(`a replay of ${JSON.stringify(n.game)} cannot be imported into ${JSON.stringify(t.game)}`);if(n.framework!==t.framework)throw Error(`a replay recorded against mwg ${JSON.stringify(n.framework)} cannot be imported into ${JSON.stringify(t.framework)}`);let r=pn(n.events);return{format:`mwg-replay`,version:1,framework:n.framework,game:n.game,...n.seed===void 0?{}:{seed:hn(n.seed)},...n.recordedAt===void 0?{}:{recordedAt:n.recordedAt},events:r}}var vn=class{constructor(e){if(typeof e.namespace!=`string`||!e.namespace.length)throw TypeError(`a last-run store needs a non-empty namespace`);let t=e.maxEvents??1e4;if(!Number.isInteger(t)||t<1||t>1e6)throw RangeError(`last-run maxEvents must be in 1..1000000`);this.maxEvents=t,this.store=new Bt(e.storage??Rt(),`mwg-last-run:${e.namespace}`)}keep(e,t){let n=pn(e);n.length>this.maxEvents&&(n=n.slice(n.length-this.maxEvents));let r=t===void 0?{version:1,events:n}:{version:1,seed:hn(t),events:n};Ot(JSON.stringify(r)),this.store.write(r)}load(){let e=this.store.read(null);if(e===null)return null;if(e?.version!==1)throw Error(`the kept last-run recording is not version 1; clear() it and record again`);return{version:1,...e.seed===void 0?{}:{seed:hn(e.seed)},events:pn(e.events)}}clear(){this.store.remove()}};function yn(e,t){return{version:1,frame:e.frame,events:e.toJSON(),state:t}}function bn(e,t,n){if(typeof e!=`object`||!e||e.version!==1)throw Error(`a run checkpoint must be { version: 1, frame, events, state }`);return new un(pn(e.events),t,n,{fromFrame:e.frame})}function xn(e,t){if(typeof document>`u`)throw Error(`downloadReplayFile needs a browser document`);let n=document.createElement(`a`);n.href=URL.createObjectURL(new Blob([e],{type:`application/json`})),n.download=t,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(n.href),0)}async function Sn(e){return await e.text()}async function Cn(e=`.json`){if(typeof document>`u`)throw Error(`pickReplayFile needs a browser document`);return await new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e,n.style.display=`none`;let r=!1,i=e=>{r||(r=!0,n.remove(),t(e))};n.addEventListener(`change`,()=>i(n.files?.[0]??null)),n.addEventListener(`cancel`,()=>i(null)),document.body.appendChild(n),n.click()})}var wn=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence,action:Wt(e,`action`),events:Wt([...t],`events`)};return this.nextSequence++,this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Tn(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var En=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let t of this.definitions.values()){let i=Tn(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Tn(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.target}})}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}},Dn=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},On=class{constructor(e={}){let t=e.storage??Rt(),n=`mwg-session:${e.namespace??`default`}`,r=Number(t.read(n)??`0`);this.launches=(Number.isFinite(r)?r:0)+1,t.write(n,String(this.launches))}};function kn(e,t,n){return e<t?t:e>n?n:e}function An(){return{musicVolume:1,sfxVolume:1,muted:!1,zoom:1,bindings:In(je),custom:{}}}function jn(e){return e.muted?0:e.musicVolume}function Mn(e){return e.muted?0:e.sfxVolume}var Nn=class{constructor(e={}){this.storage=e.storage??Rt(),this.key=`mwg-settings:${e.namespace??`default`}`,this.value=Vn(this.storage,this.key),Re(this.value.bindings)}get current(){return{...this.value,bindings:In(this.value.bindings),custom:{...this.value.custom}}}getCustom(e,t){return this.value.custom[e]??t}setCustom(e,t){this.value.custom[e]=t,Hn(this.storage,this.key,this.value)}setMusicVolume(e){this.update({musicVolume:e})}setSfxVolume(e){this.update({sfxVolume:e})}setMuted(e){this.update({muted:e})}setZoom(e){this.update({zoom:e})}setBindings(e){this.update({bindings:e})}update(e){e.musicVolume!==void 0&&(this.value.musicVolume=Pn(e.musicVolume)),e.sfxVolume!==void 0&&(this.value.sfxVolume=Pn(e.sfxVolume)),e.muted!==void 0&&(this.value.muted=e.muted),e.zoom!==void 0&&(this.value.zoom=Fn(e.zoom)),e.bindings!==void 0&&(this.value.bindings=Ln(e.bindings),Re(this.value.bindings)),e.custom!==void 0&&(this.value.custom=zn(e.custom)),Hn(this.storage,this.key,this.value)}applyBindings(){Re(this.value.bindings)}reset(){this.value=An(),Re(this.value.bindings),Hn(this.storage,this.key,this.value)}};function Pn(e){return Number.isFinite(e)?kn(e,0,1):1}function Fn(e){return Number.isFinite(e)?Math.max(.01,e):1}function In(e){let t={};for(let[n,r]of Object.entries(e))t[n]=[...r];return t}function Ln(e){if(typeof e!=`object`||!e||Array.isArray(e))return In(je);let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let e=r.filter(e=>typeof e==`string`);e.length>0&&(t[n]=e)}return Object.keys(t).length>0?t:In(je)}function Rn(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function zn(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))Rn(r)&&(t[n]=r);return t}function Bn(e){let t=An();if(typeof e!=`object`||!e||Array.isArray(e))return t;let n=e;return{musicVolume:typeof n.musicVolume==`number`?Pn(n.musicVolume):t.musicVolume,sfxVolume:typeof n.sfxVolume==`number`?Pn(n.sfxVolume):t.sfxVolume,muted:typeof n.muted==`boolean`?n.muted:t.muted,zoom:typeof n.zoom==`number`?Fn(n.zoom):t.zoom,bindings:Ln(n.bindings),custom:zn(n.custom)}}function Vn(e,t){let n=e.read(t);if(!n)return An();try{return Bn(Pt(n,{label:`settings`}))}catch{return An()}}function Hn(e,t,n){e.write(t,JSON.stringify(n))}var Un=class extends Yt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},Wn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function Gn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function Kn(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var qn=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function Jn(e,t){let n=Gn(e,t);return qn.map(e=>Kn({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function Yn(e,t){let n=Gn(e.x,e.y),r=Gn(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function Xn(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function Zn(e,t){let n=Yn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=Gn(e.x,e.y),i=Gn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(Kn(Xn({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function Qn(e,t){let n=Gn(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(Kn({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function $n(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function er(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=$n(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}function tr(e,t,n,r){return n>=0&&r>=0&&n<e&&r<t}function nr(e,t,n){return n*e+t}function rr(e,t){return t%e}function ir(e,t){return Math.floor(t/e)}function ar(e,t){return`${e},${t}`}function or(e){let t=/^(-?\d+),(-?\d+)$/.exec(e);return t?{x:Number(t[1]),y:Number(t[2])}:null}var sr=[[0,-1],[1,0],[0,1],[-1,0]],cr=[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]],lr=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]];function ur(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function dr(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function fr(e,t){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)}function pr(e,t,n){switch(e){case`euclidean`:return ur(t,n);case`manhattan`:return fr(t,n);case`chebyshev`:return dr(t,n);default:throw RangeError(`unknown distance metric: ${e}`)}}var mr=.12,hr=null,gr,_r=new p;function vr(){if(gr===void 0&&(gr=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gr)){let e=()=>{_r.dispatch(br())};typeof gr.addEventListener==`function`?gr.addEventListener(`change`,e):typeof gr.addListener==`function`&&gr.addListener(e)}return gr}function yr(){return vr()?.matches??!1}function br(){return hr??yr()}function xr(e){hr=e,_r.dispatch(br())}function Sr(e){return vr(),_r.add(e),()=>_r.remove(e)}function Cr(e,t=`decorative`){return br()?t===`meaningful`?Math.min(e,mr):0:e}var wr=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of sr){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},Tr=class{constructor(e=1/60,t=5){if(this.accumulator=0,!(e>0))throw Error(`a fixed step must be positive`);this.step=e,this.maxSubsteps=Math.max(1,Math.floor(t))}advance(e,t){this.accumulator+=Math.max(0,e);let n=0;for(;this.accumulator>=this.step&&n<this.maxSubsteps;)t(this.step),this.accumulator-=this.step,n++;return this.accumulator>=this.step&&(this.accumulator=0),n}get alpha(){return this.accumulator/this.step}reset(){this.accumulator=0}},Er={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dr=class{constructor(){this.tweens=[]}tween(e,t,n=Er.linear){let{ease:r=Er.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=br()&&a!==void 0,s=o?a:t,c=Cr(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&br()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},Or=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kr(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jr(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),Ar(i,c)}}return r}function Ar(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jr(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mr=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nr=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pr=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fr=2166136261,Ir=16777619;function Lr(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Lr(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Lr(t)}`).join(`,`)}}`}function Rr(e){let t=Lr(e),n=Fr;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,Ir)>>>0;return n>>>0}var zr=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Br(e,t={}){let n=Ur(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vr(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vr(e,t,n,r,i,a){return Hr(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hr(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Ur(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++}else o===`"`?(i=!0,a++):o===`,`?(n.push(r),r=``,a++):o===`\r`?a++:o===`
|
|
2
2
|
`?(n.push(r),t.push(n),n=[],r=``,a++):(r+=o,a++)}return(r.length>0||n.length>0)&&(n.push(r),t.push(n)),t.filter(e=>e.length!==1||e[0]!==``)}function Wr(e){let t=[],n=[],r,i=e=>{if(!n.includes(e)){if(n.length>=2)throw Error(`dialogue text supports at most two speakers for the "-" shorthand; found a third speaker "${e}" after "${n[0]}" and "${n[1]}" were already established`);n.push(e)}};for(let a of e.split(`
|
|
3
3
|
`)){let e=a.trim();if(e===``)continue;let o=/^@(\S+)(?:\s+(.*))?$/.exec(e);if(o){let[,e,n]=o;i(e),n&&(t.push({text:n.trim(),speaker:e}),r=e)}else if(e.startsWith(`-`)){if(n.length<2)throw Error(`a "-" line needs two established speakers first (write two "@id text" lines before it)`);let i=e.slice(1).trim(),a=n.find(e=>e!==r)??n[0];t.push({text:i,speaker:a}),r=a}else t.push({text:e}),r=void 0}return t}function Gr(e){let t=Kr(e);if(t.length===0)throw Error(`this twee source has no passages - passages start with ":: Name"`);let n={},r,i;for(let e of t)if(e.name===`StoryTitle`)r=e.body.trim()||void 0;else if(e.name===`StoryData`)i=Jr(e.body);else{if(Object.prototype.hasOwnProperty.call(n,e.name))throw Error(`this twee source defines "${e.name}" twice`);n[e.name]=Yr(e.name,e.body)}let a=Object.keys(n);if(a.length===0)throw Error(`this twee source has no story passages, only StoryTitle/StoryData`);if(i!==void 0&&!Object.prototype.hasOwnProperty.call(n,i))throw Error(`StoryData starts at "${i}", which is not a passage in this file`);for(let[e,t]of Object.entries(n))for(let r of t)if(`ask`in r){for(let t of r.choices)if(t.goto!==void 0&&!Object.prototype.hasOwnProperty.call(n,t.goto))throw Error(`passage "${e}" links to "${t.goto}", which is not a passage in this file`)}return{story:n,start:i??a[0],title:r}}function Kr(e){let t=[],n=null,r=[],i=()=>{n!==null&&t.push({name:n,body:r.join(`
|
|
4
4
|
`)})};for(let t of e.split(`
|
|
@@ -1343,7 +1343,7 @@ fn mainFragment(
|
|
|
1343
1343
|
src: url('${n}');
|
|
1344
1344
|
}`}Xl();var cj=new Map;async function lj(e){let t=e.filter(e=>Yl.has(`${e}-and-url`)).map(e=>{if(!cj.has(e)){let{entries:t}=Yl.get(`${e}-and-url`),n=[];t.forEach(t=>{let r=t.url,i=t.faces.map(e=>({weight:e.weight,style:e.style}));n.push(...i.map(t=>sj({fontWeight:t.weight,fontStyle:t.style,fontFamily:e},r)))}),cj.set(e,Promise.all(n).then(e=>e.join(`
|
|
1345
1345
|
`)))}return cj.get(e)});return(await Promise.all(t)).join(`
|
|
1346
|
-
`)}function uj(e,t,n,r,i){let{domElement:a,styleElement:o,svgRoot:s}=i;a.innerHTML=`<style>${t.cssStyle}</style><div style='padding:0;'>${e}</div>`,a.setAttribute(`style`,`transform: scale(${n});transform-origin: top left; display: inline-block`),o.textContent=r;let{width:c,height:l}=i.image;return s.setAttribute(`width`,c.toString()),s.setAttribute(`height`,l.toString()),new XMLSerializer().serializeToString(s)}fu();function dj(e,t){let n=du.getOptimalCanvasAndContext(e.width,e.height,t),{context:r}=n;return r.clearRect(0,0,e.width,e.height),r.drawImage(e,0,0),n}function fj(e,t,n){return new Promise(async r=>{n&&await new Promise(e=>setTimeout(e,100)),e.onload=()=>{r()},e.src=`data:image/svg+xml;charset=utf8,${encodeURIComponent(t)}`,e.crossOrigin=`anonymous`})}R(),fu(),fs(),Gd(),NS(),W(),ha(),Fu();var pj=class{constructor(e){this._activeTextures={},this._renderer=e,this._createCanvas=e.type===Wd.WEBGPU}getTexture(e){return this.getTexturePromise(e)}getManagedTexture(e){let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].promise;let n=this._buildTexturePromise(e).then(e=>(this._activeTextures[t].texture=e,e));return this._activeTextures[t]={texture:null,promise:n,usageCount:1},n}getReferenceCount(e){return this._activeTextures[e]?.usageCount??null}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(t.texture?this._cleanUp(t.texture):t.promise.then(e=>{t.texture=e,this._cleanUp(t.texture)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)}),this._activeTextures[e]=null))}getTexturePromise(e){return this._buildTexturePromise(e)}async _buildTexturePromise(e){let{text:t,style:n,resolution:r,textureStyle:i,autoGenerateMipmaps:a}=e,o=ma.get(ej),s=aj(t,n),c=await lj(s),l=nj(t,n,c,o),u=Math.ceil(Math.ceil(Math.max(1,l.width)+n.padding*2)*r),d=Math.ceil(Math.ceil(Math.max(1,l.height)+n.padding*2)*r),f=o.image;f.width=(u|0)+2,f.height=(d|0)+2,await fj(f,uj(t,n,r,c,o),MS()&&s.length>0);let p=f,m;this._createCanvas&&(m=dj(f,r));let h=Nu(m?m.canvas:p,f.width-2,f.height-2,r,a,i?.scaleMode);return this._renderer?.texture.initSource(h.source),this._createCanvas&&du.returnCanvasAndContext(m),ma.return(o),h}returnTexturePromise(e){e.then(e=>{this._cleanUp(e)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)})}_cleanUp(e){let t=e.source;ds.returnTexture(e),t.resource=null,t.uploadMethodId=`unknown`}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexturePromise(this._activeTextures[e].promise);this._activeTextures=null}};pj.extension={type:[I.WebGLSystem,I.WebGPUSystem,I.CanvasSystem],name:`htmlText`},R(),L.add(pj),L.add(ij),Po(),ko();var mj=class extends fA{constructor(...e){let t=pA(e,`HtmlText`);super(t,ZA),this.renderPipeId=`htmlText`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof Oo?t.textureStyle:new Oo(t.textureStyle),wA(this.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??No.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,{width:n,height:r}=nj(this.text,this._style);e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}get text(){return this._text}set text(e){let t=this._sanitiseText(e.toString());super.text=t}_sanitiseText(e){return this._removeInvalidHtmlTags(e.replace(/<br>/gi,`<br/>`).replace(/<hr>/gi,`<hr/>`).replace(/ /gi,` `))}_removeInvalidHtmlTags(e){return e.replace(/<[^>]*?(?=<|$)/g,``)}};oa();var hj=class e extends Hk{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(H(V,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};hj.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var gj=hj;wo();var _j=class extends Kk{constructor(e){let{texture:t,verticesX:n,verticesY:r,...i}=e,a=new gj(Co({width:t.width,height:t.height,verticesX:n,verticesY:r}));super(Co({...i,geometry:a,texture:t})),this.texture=t,this.autoResize=!0}textureUpdated(){let e=this.geometry,{width:t,height:n}=this.texture;this.autoResize&&(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.build({}))}set texture(e){this._texture?.off(`update`,this.textureUpdated,this),super.texture=e,e.on(`update`,this.textureUpdated,this),this.textureUpdated()}get texture(){return this._texture}destroy(e){this.texture.off(`update`,this.textureUpdated,this),super.destroy(e)}};R(),su(),to(),Ya();var vj=[[0,0],[0,0],[0,0]],yj=[[0,0],[0,0],[0,0]],bj=[[0,0],[0,0],[0,0]],xj=[[0,0],[0,0],[0,0]];function Sj(e,t,n,r,i,a,o){e[0][0]=t,e[0][1]=n,e[1][0]=r,e[1][1]=i,e[2][0]=a,e[2][1]=o}var Cj=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=$a(Ja(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:ee,height:w}=e,T=b+S,E=x+C,te=Math.min(T>ee?ee/T:1,E>w?w/E:1,1),D=b*te,O=S*te,ne=x*te,k=C*te,A=Math.max(0,ee-D-O),re=Math.max(0,w-ne-k),ie=e.anchor,ae=m.source._resolution??m.source.resolution??1,oe=m.frame.x*ae,se=m.frame.y*ae,j=-ie.x*ee,ce=-ie.y*w,le=b*ae,ue=x*ae,de=S*ae,fe=C*ae,pe=m.frame.width*ae,me=m.frame.height*ae;v&&(oe=0,se=0,pe=y.width,me=y.height);let he=pe-le-de,ge=me-ue-fe,_e=he>0?oe+le:Math.max(oe,Math.min(oe+le,oe+pe-1)),ve=he>0?he:1,M=ge>0?se+ue:Math.max(se,Math.min(se+ue,se+me-1)),N=ge>0?ge:1;Sj(vj,oe,le,_e,ve,oe+pe-de,de),Sj(yj,se,ue,M,N,se+me-fe,fe),Sj(bj,j,D,j+D,A,j+ee-O,O),Sj(xj,ce,ne,ce+ne,re,ce+w-k,k);for(let e=0;e<3;e++){let t=bj[e][1];if(t<=0)continue;let n=vj[e][0],i=vj[e][1],a=bj[e][0];for(let e=0;e<3;e++){let o=xj[e][1];o<=0||r.drawImage(y,n,yj[e][0],i,yj[e][1],a,xj[e][0],t,o)}}r.restore()}destroy(){this._renderer=null}};Cj.extension={type:[I.CanvasPipes],name:`nineSliceSprite`};var wj=class e extends gj{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};wj.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Tj=wj;R(),cv();var Ej=class extends Uk{constructor(){super(),this.geometry=new Tj}destroy(){this.geometry.destroy()}},Dj=class{constructor(e){this._renderer=e,this._managedSprites=new sv({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Ej,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Dj.extension={type:[I.WebGLPipes,I.WebGPUPipes],name:`nineSliceSprite`},R(),L.add(Cj),L.add(Dj),Zi(),$o(),yc();var Oj=class e extends vc{constructor(t){t instanceof q&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Tj.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Tj.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Tj.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Tj.defaultOptions.bottomHeight,this._width=n??l.width??Tj.defaultOptions.width,this._height=r??l.height??Tj.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Xi({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=q.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Oj.defaultOptions={texture:q.EMPTY};var kj=Oj;R(),nu(),xl(),B(),Pa(),Eg(),Xm(),$m(),sh(),mh(),Ng(),Af(),Of(),Lf(),rf(),g_(),Po(),$o(),tu(),xs(),TC(),TE(),Tl(),oO(),ri(),L.add(Gf,Jf);function Aj(e,t,n,r){let i=Math.max(e,t);return!Number.isFinite(r)||r<=0||!Number.isFinite(i)||i<=0||i*n<=r?n:Math.max(1,Math.floor(r/i))}var jj=class{constructor(e){this.over=0,this.under=0,this.ceiling=Mj(e.ceiling);let t=e.minRatio??1;this.floor=Math.min(Number.isFinite(t)&&t>0?t:1,this.ceiling);let n=e.targetFps??60;this.budget=Number.isFinite(n)&&n>0?1/n:1/60,this.downAfter=Nj(e.overBudgetFrames,60),this.upAfter=Nj(e.underBudgetFrames,600),this.step=Number.isFinite(e.step)&&e.step>0?e.step:.25,this.ratio_=this.ceiling}get ratio(){return this.ratio_}setCeiling(e){return this.ceiling=Mj(e),this.ratio_>this.ceiling&&(this.ratio_=this.ceiling,this.over=0,this.under=0),this.ratio_}observe(e){return!Number.isFinite(e)||e<=0||(e>this.budget?(this.over++,this.under=0,this.over>=this.downAfter&&this.ratio_>this.floor&&(this.ratio_=Math.max(this.floor,this.ratio_-this.step),this.over=0)):(this.under++,this.over=0,this.under>=this.upAfter&&this.ratio_<this.ceiling&&(this.ratio_=Math.min(this.ceiling,this.ratio_+this.step),this.under=0))),this.ratio_}reset(){this.ratio_=this.ceiling,this.over=0,this.under=0}};function Mj(e){return Number.isFinite(e)&&e>0?e:1}function Nj(e,t){return Number.isFinite(e)?Math.max(1,Math.floor(e)):t}var Pj=`mwg-pixel-art`,Fj=new b(`renderer`);function Ij(){if(document.getElementById(Pj))return;let e=document.createElement(`style`);e.id=Pj,e.textContent=`.${Pj} { image-rendering: pixelated; }`,document.head.appendChild(e)}function Lj(e){let t=null,n=()=>{t=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t.addEventListener(`change`,r,{once:!0})},r=()=>{e(),n()};return n(),()=>t?.removeEventListener(`change`,r)}var Rj=class e{static{this.instance=null}constructor(t={}){this.app=new sD,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new p,this.hitStopRemaining=0,this.hitStopScale=0,this.stack=new h,this.pending=[],this.started=!1,this.stopWatchingDpr=null,this.stopWatchingVisibility=null,this.suspended_=!1,this.timeScaleBeforeSuspend=1,this.scaler=null,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window,extensions:t.extensions??[],autoPause:t.autoPause??!0,audio:t.audio??null,qualityScaling:t.qualityScaling??null},this.options.pixelArt&&(No.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0;for(let e of this.options.extensions)e();if(gt(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(Ij(),this.options.canvas.classList.add(Pj)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height),this.fitResolutionToDevice()}),this.fitResolutionToDevice(),this.stopWatchingDpr=Lj(()=>{this.fitResolutionToDevice()}),this.options.autoPause&&typeof document<`u`){let e=()=>{document.hidden?this.suspend():this.resume()};document.addEventListener(`visibilitychange`,e),this.stopWatchingVisibility=()=>document.removeEventListener(`visibilitychange`,e)}this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e){this.pending.push({kind:`switch`,next:e})}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}hitStop(e,t=0){this.hitStopRemaining=e,this.hitStopScale=t}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}get suspended(){return this.suspended_}suspend(){this.suspended_||(this.suspended_=!0,this.timeScaleBeforeSuspend=this.timeScale,this.timeScale=0,this.stack.current?.onSuspend(),this.options.audio?.suspend())}resume(){this.suspended_&&(this.suspended_=!1,this.timeScale=this.timeScaleBeforeSuspend,this.stack.current?.onResume(void 0),this.options.audio?.resume())}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}fitResolutionToDevice(){let e=this.app.renderer.gl,t=e?e.getParameter(e.MAX_TEXTURE_SIZE):1/0,n=window.devicePixelRatio||1,r=Aj(this.width,this.height,n,t);!this.scaler&&this.options.qualityScaling&&(this.scaler=new jj({...this.options.qualityScaling,ceiling:r}));let i=this.scaler?this.scaler.setCeiling(r):r;i!==this.app.renderer.resolution&&(Fj.warn(`this device cannot render a ${this.width}x${this.height} canvas at ${n}x (its limit is ${t}); using ${r}x instead, which is softer than the display`),this.app.renderer.resize(this.width,this.height,i))}frame(e){for(let e of this.pending)e.kind===`switch`?this.applySwitch(e.next):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result);this.pending.length=0,this.hitStopRemaining>0&&!this.suspended_&&(this.hitStopRemaining-=e,this.timeScale=this.hitStopRemaining>0?this.hitStopScale:1),this.elapsed=Math.min(e,this.options.maxDelta)*this.timeScale;let t=this.suspended_||this.elapsed<=0?null:this.scaler;if(t){let e=t.observe(this.elapsed);e!==this.app.renderer.resolution&&this.app.renderer.resize(this.width,this.height,e)}this.timeTotal+=this.elapsed,ot(),this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),Ke()}switchNow(e){this.applySwitch(e)}applySwitch(e){let t=new e;this.stack.replace(t),this.app.stage.removeChildren(),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){_t(),this.stopWatchingDpr?.(),this.stopWatchingVisibility?.(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},zj=class extends m{constructor(...e){super(...e),this.stage=new J}teardown(){this.stage.destroy({children:!0})}},Bj={name:`color-add-bit`,vertex:{header:`
|
|
1346
|
+
`)}function uj(e,t,n,r,i){let{domElement:a,styleElement:o,svgRoot:s}=i;a.innerHTML=`<style>${t.cssStyle}</style><div style='padding:0;'>${e}</div>`,a.setAttribute(`style`,`transform: scale(${n});transform-origin: top left; display: inline-block`),o.textContent=r;let{width:c,height:l}=i.image;return s.setAttribute(`width`,c.toString()),s.setAttribute(`height`,l.toString()),new XMLSerializer().serializeToString(s)}fu();function dj(e,t){let n=du.getOptimalCanvasAndContext(e.width,e.height,t),{context:r}=n;return r.clearRect(0,0,e.width,e.height),r.drawImage(e,0,0),n}function fj(e,t,n){return new Promise(async r=>{n&&await new Promise(e=>setTimeout(e,100)),e.onload=()=>{r()},e.src=`data:image/svg+xml;charset=utf8,${encodeURIComponent(t)}`,e.crossOrigin=`anonymous`})}R(),fu(),fs(),Gd(),NS(),W(),ha(),Fu();var pj=class{constructor(e){this._activeTextures={},this._renderer=e,this._createCanvas=e.type===Wd.WEBGPU}getTexture(e){return this.getTexturePromise(e)}getManagedTexture(e){let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].promise;let n=this._buildTexturePromise(e).then(e=>(this._activeTextures[t].texture=e,e));return this._activeTextures[t]={texture:null,promise:n,usageCount:1},n}getReferenceCount(e){return this._activeTextures[e]?.usageCount??null}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(t.texture?this._cleanUp(t.texture):t.promise.then(e=>{t.texture=e,this._cleanUp(t.texture)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)}),this._activeTextures[e]=null))}getTexturePromise(e){return this._buildTexturePromise(e)}async _buildTexturePromise(e){let{text:t,style:n,resolution:r,textureStyle:i,autoGenerateMipmaps:a}=e,o=ma.get(ej),s=aj(t,n),c=await lj(s),l=nj(t,n,c,o),u=Math.ceil(Math.ceil(Math.max(1,l.width)+n.padding*2)*r),d=Math.ceil(Math.ceil(Math.max(1,l.height)+n.padding*2)*r),f=o.image;f.width=(u|0)+2,f.height=(d|0)+2,await fj(f,uj(t,n,r,c,o),MS()&&s.length>0);let p=f,m;this._createCanvas&&(m=dj(f,r));let h=Nu(m?m.canvas:p,f.width-2,f.height-2,r,a,i?.scaleMode);return this._renderer?.texture.initSource(h.source),this._createCanvas&&du.returnCanvasAndContext(m),ma.return(o),h}returnTexturePromise(e){e.then(e=>{this._cleanUp(e)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)})}_cleanUp(e){let t=e.source;ds.returnTexture(e),t.resource=null,t.uploadMethodId=`unknown`}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexturePromise(this._activeTextures[e].promise);this._activeTextures=null}};pj.extension={type:[I.WebGLSystem,I.WebGPUSystem,I.CanvasSystem],name:`htmlText`},R(),L.add(pj),L.add(ij),Po(),ko();var mj=class extends fA{constructor(...e){let t=pA(e,`HtmlText`);super(t,ZA),this.renderPipeId=`htmlText`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof Oo?t.textureStyle:new Oo(t.textureStyle),wA(this.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??No.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,{width:n,height:r}=nj(this.text,this._style);e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}get text(){return this._text}set text(e){let t=this._sanitiseText(e.toString());super.text=t}_sanitiseText(e){return this._removeInvalidHtmlTags(e.replace(/<br>/gi,`<br/>`).replace(/<hr>/gi,`<hr/>`).replace(/ /gi,` `))}_removeInvalidHtmlTags(e){return e.replace(/<[^>]*?(?=<|$)/g,``)}};oa();var hj=class e extends Hk{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(H(V,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};hj.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var gj=hj;wo();var _j=class extends Kk{constructor(e){let{texture:t,verticesX:n,verticesY:r,...i}=e,a=new gj(Co({width:t.width,height:t.height,verticesX:n,verticesY:r}));super(Co({...i,geometry:a,texture:t})),this.texture=t,this.autoResize=!0}textureUpdated(){let e=this.geometry,{width:t,height:n}=this.texture;this.autoResize&&(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.build({}))}set texture(e){this._texture?.off(`update`,this.textureUpdated,this),super.texture=e,e.on(`update`,this.textureUpdated,this),this.textureUpdated()}get texture(){return this._texture}destroy(e){this.texture.off(`update`,this.textureUpdated,this),super.destroy(e)}};R(),su(),to(),Ya();var vj=[[0,0],[0,0],[0,0]],yj=[[0,0],[0,0],[0,0]],bj=[[0,0],[0,0],[0,0]],xj=[[0,0],[0,0],[0,0]];function Sj(e,t,n,r,i,a,o){e[0][0]=t,e[0][1]=n,e[1][0]=r,e[1][1]=i,e[2][0]=a,e[2][1]=o}var Cj=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=$a(Ja(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:ee,height:w}=e,T=b+S,E=x+C,te=Math.min(T>ee?ee/T:1,E>w?w/E:1,1),D=b*te,O=S*te,ne=x*te,k=C*te,A=Math.max(0,ee-D-O),re=Math.max(0,w-ne-k),ie=e.anchor,ae=m.source._resolution??m.source.resolution??1,oe=m.frame.x*ae,se=m.frame.y*ae,j=-ie.x*ee,ce=-ie.y*w,le=b*ae,ue=x*ae,de=S*ae,fe=C*ae,pe=m.frame.width*ae,me=m.frame.height*ae;v&&(oe=0,se=0,pe=y.width,me=y.height);let he=pe-le-de,ge=me-ue-fe,_e=he>0?oe+le:Math.max(oe,Math.min(oe+le,oe+pe-1)),ve=he>0?he:1,M=ge>0?se+ue:Math.max(se,Math.min(se+ue,se+me-1)),N=ge>0?ge:1;Sj(vj,oe,le,_e,ve,oe+pe-de,de),Sj(yj,se,ue,M,N,se+me-fe,fe),Sj(bj,j,D,j+D,A,j+ee-O,O),Sj(xj,ce,ne,ce+ne,re,ce+w-k,k);for(let e=0;e<3;e++){let t=bj[e][1];if(t<=0)continue;let n=vj[e][0],i=vj[e][1],a=bj[e][0];for(let e=0;e<3;e++){let o=xj[e][1];o<=0||r.drawImage(y,n,yj[e][0],i,yj[e][1],a,xj[e][0],t,o)}}r.restore()}destroy(){this._renderer=null}};Cj.extension={type:[I.CanvasPipes],name:`nineSliceSprite`};var wj=class e extends gj{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};wj.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Tj=wj;R(),cv();var Ej=class extends Uk{constructor(){super(),this.geometry=new Tj}destroy(){this.geometry.destroy()}},Dj=class{constructor(e){this._renderer=e,this._managedSprites=new sv({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Ej,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Dj.extension={type:[I.WebGLPipes,I.WebGPUPipes],name:`nineSliceSprite`},R(),L.add(Cj),L.add(Dj),Zi(),$o(),yc();var Oj=class e extends vc{constructor(t){t instanceof q&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Tj.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Tj.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Tj.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Tj.defaultOptions.bottomHeight,this._width=n??l.width??Tj.defaultOptions.width,this._height=r??l.height??Tj.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Xi({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=q.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Oj.defaultOptions={texture:q.EMPTY};var kj=Oj;R(),nu(),xl(),B(),qi(),Pa(),Eg(),Xm(),$m(),sh(),mh(),Ng(),Af(),Of(),Lf(),rf(),g_(),Po(),$o(),tu(),xs(),TC(),TE(),Tl(),$D(),oO(),ri(),L.add(Gf,Jf);function Aj(e,t,n,r){let i=Math.max(e,t);return!Number.isFinite(r)||r<=0||!Number.isFinite(i)||i<=0||i*n<=r?n:Math.max(1,Math.floor(r/i))}var jj=class{constructor(e){this.over=0,this.under=0,this.ceiling=Mj(e.ceiling);let t=e.minRatio??1;this.floor=Math.min(Number.isFinite(t)&&t>0?t:1,this.ceiling);let n=e.targetFps??60;this.budget=Number.isFinite(n)&&n>0?1/n:1/60,this.downAfter=Nj(e.overBudgetFrames,60),this.upAfter=Nj(e.underBudgetFrames,600),this.step=Number.isFinite(e.step)&&e.step>0?e.step:.25,this.ratio_=this.ceiling}get ratio(){return this.ratio_}setCeiling(e){return this.ceiling=Mj(e),this.ratio_>this.ceiling&&(this.ratio_=this.ceiling,this.over=0,this.under=0),this.ratio_}observe(e){return!Number.isFinite(e)||e<=0||(e>this.budget?(this.over++,this.under=0,this.over>=this.downAfter&&this.ratio_>this.floor&&(this.ratio_=Math.max(this.floor,this.ratio_-this.step),this.over=0)):(this.under++,this.over=0,this.under>=this.upAfter&&this.ratio_<this.ceiling&&(this.ratio_=Math.min(this.ceiling,this.ratio_+this.step),this.under=0))),this.ratio_}reset(){this.ratio_=this.ceiling,this.over=0,this.under=0}};function Mj(e){return Number.isFinite(e)&&e>0?e:1}function Nj(e,t){return Number.isFinite(e)?Math.max(1,Math.floor(e)):t}var Pj=e=>Math.min(1,Math.max(0,e));function Fj(e,t,n=`diagonal`,r=1){let i=e*t,a=[],o=r>>>0||1;for(let r=0;r<t;r++)for(let i=0;i<e;i++)n===`diagonal`?a.push(i+r):n===`rows`?a.push(r*e+i):n===`spiral`?a.push(Math.min(i,r,e-1-i,t-1-r)):(o=Math.imul(o,1664525)+1013904223>>>0,a.push(o/2**32));let s=Math.min(...a),c=Math.max(...a);return a.map(e=>i===1||c===s?0:(e-s)/(c-s))}function Ij(e,t,n){let r=Pj(n);return Pj((t-e*r)/(1-r||1))}function Lj(e,t=1.08){let n=Pj(e);return n<.7?Er.easeOutCubic(n/.7)*t:t+(1-t)*Er.easeInOutQuad((n-.7)/.3)}function Rj(e){return typeof e==`function`?e:Er[e??`easeInOutQuad`]}function zj(e,t){return e??{x:t.width/2,y:t.height/2}}function Bj(e){if(!e.snapshot)return null;let t=new wl(e.snapshot);return t.width=e.width,t.height=e.height,t}function Vj(e,t,n){return{update:t,destroy(){n?.(),e.destroy({children:!0})}}}function Hj(e={}){let t=Math.max(1,Math.floor(e.columns??8)),n=Math.max(1,Math.floor(e.rows??5)),r=e.stagger??.5,i=e.rotation??0;return{name:`tileShrink`,start(a){let o=new J;a.over.addChild(o);let s=Fj(t,n,e.order??`diagonal`,e.seed),c=[],l=a.snapshot,u=a.width/t,d=a.height/n;if(l){let e=l.frame;for(let r=0;r<n;r++)for(let i=0;i<t;i++){let a=new G(e.x+i*e.width/t,e.y+r*e.height/n,e.width/t,e.height/n),s=new wl(new q({source:l.source,frame:a}));s.anchor.set(.5),s.width=u,s.height=d,s.position.set((i+.5)*u,(r+.5)*d),c.push({sprite:s,width:s.scale.x,height:s.scale.y}),o.addChild(s)}}return Vj(o,e=>{c.forEach(({sprite:t,width:n,height:a},o)=>{let c=1-Ij(s[o],e,r);t.scale.set(n*c,a*c),t.rotation=(1-c)*i,t.visible=c>0})})}}}function Uj(e={}){return{name:`shrink`,start(t){let n=new J;t.over.addChild(n);let r=Bj(t);r&&n.addChild(r);let i=zj(e.to,t);return Vj(n,e=>{let t=1-e;n.scale.set(t),n.position.set(i.x*(1-t),i.y*(1-t)),n.alpha=1-e*e})}}}function Wj(e,t,n){return{name:e,start(e){let r=new J;e.under.addChild(r);let i=Bj(e);i&&r.addChild(i);let a=zj(t,e),o=e.incoming;return Vj(r,e=>{let t=n(e);o.scale.set(t),o.position.set(a.x*(1-t),a.y*(1-t)),o.alpha=Pj(e*3)},()=>{o.scale.set(1),o.position.set(0,0),o.alpha=1})}}}function Gj(e={}){return Wj(`pop`,e.from,t=>Lj(t,e.overshoot))}function Kj(e={}){return Wj(`grow`,e.from,e=>e)}function qj(e={}){let t=e.direction??`left`,n=t===`left`?-1:+(t===`right`),r=t===`up`?-1:+(t===`down`);return{name:`slide`,start(e){let t=new J;e.over.addChild(t);let i=Bj(e);i&&t.addChild(i);let a=e.incoming;return Vj(t,i=>{t.position.set(n*e.width*i,r*e.height*i),a.position.set(-n*e.width*(1-i),-r*e.height*(1-i))},()=>a.position.set(0,0))}}}function Jj(e={}){return{name:`iris`,start(t){let n=new J;t.under.addChild(n);let r=Bj(t);r&&n.addChild(r);let i=zj(e.from,t),a=Math.hypot(Math.max(i.x,t.width-i.x),Math.max(i.y,t.height-i.y)),o=new Z;return t.incoming.addChild(o),t.incoming.mask=o,Vj(n,e=>{o.clear().circle(i.x,i.y,a*e).fill({color:16777215})},()=>{t.incoming.mask=null,o.destroy()})}}}function Yj(){return{name:`dissolve`,start(e){let t=new J;e.over.addChild(t);let n=Bj(e);return n&&t.addChild(n),Vj(t,e=>{t.alpha=1-e})}}}function Xj(e,t,n=!1){let r=Pj(t),i=Er.easeOutCubic(r);return e===`pop`?{scale:n?i:Lj(r),alpha:Pj(r*3),offset:0}:e===`grow`?{scale:i,alpha:Pj(r*3),offset:0}:e===`slide`?{scale:1,alpha:i,offset:(1-i)*48}:{scale:1,alpha:i,offset:0}}var Zj=class{constructor(e,t,n,r){this.under=new J,this.over=new J,this.elapsed=0,this.finished=!1,this.snapshot=n,this.duration=Math.max(1e-4,e.duration??.5),this.ease=Rj(e.easing),this.pause=e.pause??!1,this.onDone=e.onDone,this.runtime=e.transition.start({width:t.width,height:t.height,snapshot:n,incoming:r,under:this.under,over:this.over}),this.runtime.update(0)}get progress(){return this.finished?1:Math.min(1,this.elapsed/this.duration)}get done(){return this.finished}update(e){return this.finished?!0:(this.elapsed+=e,this.elapsed>=this.duration?(this.finish(),!0):(this.runtime.update(this.ease(this.progress)),!1))}finish(){this.finished||(this.finished=!0,this.runtime.update(1),this.runtime.destroy(),this.snapshot?.destroy(!0),this.under.destroy({children:!0}),this.over.destroy({children:!0}),this.onDone?.())}},Qj=`mwg-pixel-art`,$j=new b(`renderer`);function eM(){if(document.getElementById(Qj))return;let e=document.createElement(`style`);e.id=Qj,e.textContent=`.${Qj} { image-rendering: pixelated; }`,document.head.appendChild(e)}function tM(e){let t=null,n=()=>{t=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t.addEventListener(`change`,r,{once:!0})},r=()=>{e(),n()};return n(),()=>t?.removeEventListener(`change`,r)}var nM=class e{static{this.instance=null}constructor(t={}){this.app=new sD,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new p,this.hitStopRemaining=0,this.hitStopScale=0,this.stack=new h,this.pending=[],this.running=null,this.started=!1,this.stopWatchingDpr=null,this.stopWatchingVisibility=null,this.suspended_=!1,this.timeScaleBeforeSuspend=1,this.scaler=null,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window,extensions:t.extensions??[],autoPause:t.autoPause??!0,audio:t.audio??null,qualityScaling:t.qualityScaling??null},this.options.pixelArt&&(No.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get active(){return e.instance}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0;for(let e of this.options.extensions)e();if(gt(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(eM(),this.options.canvas.classList.add(Qj)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height),this.fitResolutionToDevice()}),this.fitResolutionToDevice(),this.stopWatchingDpr=tM(()=>{this.fitResolutionToDevice()}),this.options.autoPause&&typeof document<`u`){let e=()=>{document.hidden?this.suspend():this.resume()};document.addEventListener(`visibilitychange`,e),this.stopWatchingVisibility=()=>document.removeEventListener(`visibilitychange`,e)}this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e,t){this.pending.push({kind:`switch`,next:e,transition:t})}transition(e,t){this.pending.push({kind:`swap`,swap:e,transition:t})}get transitioning(){return this.running!==null}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}hitStop(e,t=0){this.hitStopRemaining=e,this.hitStopScale=t}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}get suspended(){return this.suspended_}suspend(){this.suspended_||(this.suspended_=!0,this.timeScaleBeforeSuspend=this.timeScale,this.timeScale=0,this.stack.current?.onSuspend(),this.options.audio?.suspend())}resume(){this.suspended_&&(this.suspended_=!1,this.timeScale=this.timeScaleBeforeSuspend,this.stack.current?.onResume(void 0),this.options.audio?.resume())}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}fitResolutionToDevice(){let e=this.app.renderer.gl,t=e?e.getParameter(e.MAX_TEXTURE_SIZE):1/0,n=window.devicePixelRatio||1,r=Aj(this.width,this.height,n,t);!this.scaler&&this.options.qualityScaling&&(this.scaler=new jj({...this.options.qualityScaling,ceiling:r}));let i=this.scaler?this.scaler.setCeiling(r):r;i!==this.app.renderer.resolution&&($j.warn(`this device cannot render a ${this.width}x${this.height} canvas at ${n}x (its limit is ${t}); using ${r}x instead, which is softer than the display`),this.app.renderer.resize(this.width,this.height,i))}frame(e){this.pending.length>0&&this.endTransition();for(let e of this.pending)e.kind===`switch`?this.applySwitch(e.next,e.transition):e.kind===`swap`?this.applySwap(e.swap,e.transition):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result);this.pending.length=0,this.hitStopRemaining>0&&!this.suspended_&&(this.hitStopRemaining-=e,this.timeScale=this.hitStopRemaining>0?this.hitStopScale:1),this.running&&this.running.runner.update(e)&&this.endTransition();let t=this.running?.runner.pause===!0;this.elapsed=t?0:Math.min(e,this.options.maxDelta)*this.timeScale;let n=this.suspended_||this.elapsed<=0?null:this.scaler;if(n){let e=n.observe(this.elapsed);e!==this.app.renderer.resolution&&this.app.renderer.resize(this.width,this.height,e)}this.timeTotal+=this.elapsed,ot(),this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),Ke()}switchNow(e){this.applySwitch(e)}snapshot(e){return!e||br()?null:this.app.renderer.generateTexture(this.app.stage)}beginTransition(e,t){let n=new J;n.addChild(...this.app.stage.removeChildren());let r=new Zj(e,{width:this.width,height:this.height},t,n);this.app.stage.addChild(r.under,n,r.over),this.running={runner:r,wrapper:n}}endTransition(){let e=this.running;if(!e)return;this.running=null,e.runner.finish();let t=e.wrapper.removeChildren();this.app.stage.removeChildren(),this.app.stage.addChild(...t),e.wrapper.destroy()}applySwap(e,t){let n=this.snapshot(t);e(),n?this.beginTransition(t,n):t.onDone?.()}applySwitch(e,t){let n=this.snapshot(t),r=new e;this.stack.replace(r),this.app.stage.removeChildren(),this.app.stage.addChild(r.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,r.resize(this.width,this.height),n&&t?this.beginTransition(t,n):t?.onDone?.()}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){_t(),this.stopWatchingDpr?.(),this.stopWatchingVisibility?.(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},rM=class extends m{constructor(...e){super(...e),this.stage=new J}transitionTo(e,t){let n=nM.active;n?n.transition(e,t):e()}teardown(){this.stage.destroy({children:!0})}},iM={name:`color-add-bit`,vertex:{header:`
|
|
1347
1347
|
in vec4 aColorAdd;
|
|
1348
1348
|
out vec4 vColorAdd;
|
|
1349
1349
|
`,main:`
|
|
@@ -1356,7 +1356,7 @@ fn mainFragment(
|
|
|
1356
1356
|
// a coloured halo where the sprite is empty.
|
|
1357
1357
|
float addedAlpha = finalColor.a + vColorAdd.a;
|
|
1358
1358
|
finalColor = vec4(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
1359
|
-
`}},
|
|
1359
|
+
`}},aM={name:`color-add-bit`,vertex:{header:`
|
|
1360
1360
|
@in aColorAdd: vec4<f32>;
|
|
1361
1361
|
@out vColorAdd: vec4<f32>;
|
|
1362
1362
|
`,main:`
|
|
@@ -1366,24 +1366,24 @@ fn mainFragment(
|
|
|
1366
1366
|
`,end:`
|
|
1367
1367
|
let addedAlpha = finalColor.a + vColorAdd.a;
|
|
1368
1368
|
finalColor = vec4<f32>(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
1369
|
-
`}},Hj=class extends nf{constructor(e){super({glProgram:Ym({name:`color-transform-batch`,bits:[Qm,Bj,ih(e),ph]}),gpuProgram:Jm({name:`color-transform-batch`,bits:[Zm,Vj,nh(e),fh]}),resources:{batchSamplers:jg(e)}}),this.maxTextures=e}},Uj=7,Wj=class extends If{constructor(){let e=new kf({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Df.VERTEX|Df.COPY_DST,shrinkToFit:!1}),t=new kf({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Df.INDEX|Df.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},Gj=0,Kj=e=>e.colorAdd??Gj;function qj(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){e[n]=r*l+a*u+s,e[n+1]=o*u+i*l+c,e[n+2]=d,e[n+3]=f,t[n+4]=p,t[n+5]=m,t[n+6]=h}var Jj=class e extends Tg{static{this.extension={type:[I.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new Wj,this.name=e.extension.name,this.vertexSize=Uj,this.shader=new Hj(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=Kj(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=Kj(e),y=i<<16|e.roundPixels&65535;qj(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=Uj,qj(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=Uj,qj(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=Uj,qj(t,n,r,a,o,s,c,l,u,m,h,f.x3,f.y3,_,y,v)}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new Hj(e))}destroy(){this.shader.destroy(),super.destroy()}},Yj=`mwg-tinted-sprite`;function Xj(e){e.renderPipeId=Yj}var Zj=class{static{this.extension={type:[I.WebGLPipes,I.WebGPUPipes,I.CanvasPipes],name:Yj}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new Qj;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},Qj=class{constructor(){this.batcherName=Jj.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},$j=!1;function eM(){$j||($j=!0,L.add(Jj),L.add(Zj))}function tM(e,t,n,r=0){return(rM(r)<<24|rM(n)<<16|rM(t)<<8|rM(e))>>>0}function nM(e,t){return tM((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function rM(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var iM=Gj;eM();var aM=class extends wl{constructor(e){super(e),this._colorAdd=0,Xj(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=tM(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=nM(e,t)}silhouette(e){this.tint=0,this.colorAdd=nM(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function oM(e){return[e>>16&255,e>>8&255,e&255]}function sM(e){let[t,n,r]=oM(e);return Math.floor((t+n+r)/3)}function cM(e,t,n){return Math.trunc(n*e+(1-n)*t)}function lM(e,t,n){let[r,i,a]=oM(e),[o,s,c]=oM(t);return cM(r,o,n)<<16|cM(i,s,n)<<8|cM(a,c,n)}function uM(e,t){let n=e.length>0?sM(e[0]):255;return{from:e,to:e.map(e=>{let r=sM(e);return n!==0&&r<=n?lM(t.mid,t.min,r/n):lM(t.mid,t.max,(255-r)/(255-n))})}}function dM(e,t,n=`exact`){let r=t.from.map(oM),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=oM(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=oM(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function fM(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),q.from(o)}function pM(e,t,n={},r=`exact`){return fM(e,n,(e,n,i)=>{let a=dM(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function mM(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function hM(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function gM(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function _M(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function vM(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function yM(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function bM(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function xM(e,t){let n=new Bk;n.matrix=t,e.filters=[n]}function SM(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function CM(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function wM(e,t,n=1){let r=hM(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=hM(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(hM(t,`GS`)){let t=new Bk;t.greyscale(1,!1),e.filters=[...e.filters??[],t]}let a=hM(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new Bk;n.matrix=_M(t[0],t[1],t[2]),e.filters=[...e.filters??[],n]}}let o=hM(t,`R`),s=hM(t,`G`),c=hM(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new Bk;i.matrix=vM({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),e.filters=[...e.filters??[],i]}let l=hM(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new Bk;n.matrix=bM(t),e.filters=[...e.filters??[],n]}let u=hM(t,`O`);if(u){let t=SM(u.args[0]);t!==void 0&&(e.alpha*=Math.min(1,Math.max(0,t)))}}function TM(e,t,n={},r=1){e.texture=AM(e.texture,t,n),wM(e,t,r)}function EM(e,t){let n=hM(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new q({source:e.source,frame:new G(i,a,o,s)}):e}function DM(e,t){let n=e.trim();return CM(n)??t?.(n)}function OM(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=DM(e,t),s=DM(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function kM(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>DM(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function AM(e,t,n={}){let r=e,i=hM(t,`RC`);if(i&&i.args.length>0){let e=OM(i.args,n.resolveColor);e.from.length>0&&(r=pM(r,e,n,`exact`))}let a=hM(t,`PAL`);if(a){let e=kM(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=pM(r,e,n,`exact`))}let o=hM(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=fM(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=hM(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=fM(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=jM(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=MM(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=hM(t,`BLEND`);if(c){let e=DM(c.args[0]??``,n.resolveColor),t=SM(c.args[1]);e!==void 0&&t!==void 0&&(r=fM(r,n,(n,r,i)=>{let a=NM(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=hM(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=jM(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=PM(o.getImageData(0,0,t,i).data,t,i,e,gM(l.args[1])),s=jM(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=q.from(s))}}}}return r}function jM(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function MM(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function NM(e,t,n){let r=Math.min(1,Math.max(0,n)),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];s[t+3]=n,n===0?(s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2]):(s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r)}return s}function PM(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(y)FM(e,t,n,l,u,m,d);else{let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3]}}return{data:m,width:f,height:p}}function FM(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=kn(s+i,0,t-1),h=(kn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var IM=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>LM(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function LM(e){return e.texture!==void 0}var RM=class extends aM{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new IM(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}};function zM(e,t,n,r){return t>=e.x-r&&t<=e.x+e.width+r&&n>=e.y-r&&n<=e.y+e.height+r}function BM(e,t,n,r=0){return zM(e.view,t,n,r)}var VM=class{constructor(){this.members=[]}get size(){return this.members.length}add(e){return this.members.includes(e)||this.members.push(e),this}remove(e){let t=this.members.indexOf(e);return t<0?!1:(this.members.splice(t,1),!0)}clear(){this.members.length=0}update(e,t,n=0){let r=e.view;for(let e of[...this.members])zM(r,e.x,e.y,n)&&e.update(t)}};function HM(e){for(let t of[`columns`,`rows`])if(!Number.isInteger(e[t])||e[t]<2)throw RangeError(`a pinned deform grid needs integer ${t} of at least 2, saw ${e[t]}`);for(let t of[`width`,`height`])if(!Number.isFinite(e[t])||e[t]<=0)throw RangeError(`a pinned deform grid needs ${t} above 0, saw ${e[t]}`)}function UM(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw Error(`a deform control point needs finite coordinates, saw (${e}, ${t})`)}var WM=class{constructor(e){HM(e),this.columns=e.columns,this.rows=e.rows,this.width=e.width,this.height=e.height,this.rest=new Float32Array(this.count*2),this.offsets=new Float32Array(this.count*2);for(let e=0;e<this.rows;e++)for(let t=0;t<this.columns;t++){let n=(e*this.columns+t)*2;this.rest[n]=t/(this.columns-1)*this.width,this.rest[n+1]=e/(this.rows-1)*this.height}}get count(){return this.columns*this.rows}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>=this.columns||t>=this.rows)throw RangeError(`control point (${e}, ${t}) is outside a ${this.columns}x${this.rows} grid`);return t*this.columns+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.count)throw RangeError(`control point ${e} is outside a grid of ${this.count} points`)}restAt(e){return this.checkIndex(e),{x:this.rest[e*2],y:this.rest[e*2+1]}}at(e){return this.checkIndex(e),{x:this.rest[e*2]+this.offsets[e*2],y:this.rest[e*2+1]+this.offsets[e*2+1]}}isMoved(e){return this.checkIndex(e),this.offsets[e*2]!==0||this.offsets[e*2+1]!==0}movedCount(){let e=0;for(let t=0;t<this.count;t++)(this.offsets[t*2]!==0||this.offsets[t*2+1]!==0)&&e++;return e}drag(e,t,n){this.checkIndex(e),UM(t,n),this.offsets[e*2]=t-this.rest[e*2],this.offsets[e*2+1]=n-this.rest[e*2+1]}dragMany(e){for(let t of e)this.checkIndex(t.index),UM(t.x,t.y);for(let t of e)this.drag(t.index,t.x,t.y)}nudge(e,t,n){this.checkIndex(e),UM(t,n),this.offsets[e*2]+=t,this.offsets[e*2+1]+=n}reset(e){e===void 0?this.offsets.fill(0):(this.checkIndex(e),this.offsets[e*2]=0,this.offsets[e*2+1]=0)}rebase(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`rebase needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t of e)if(!Number.isFinite(t))throw Error(`rebase needs finite rest positions`);this.rest.set(e),this.offsets.fill(0)}positions(){let e=new Float32Array(this.rest.length);return this.writePositions(e),e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`a deform target needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t=0;t<this.rest.length;t++)e[t]=this.rest[t]+this.offsets[t]}},GM=class extends _j{constructor(e,t){let n=t?.columns??4,r=t?.rows??4,i=new WM({columns:n,rows:r,width:e.width,height:e.height});super({texture:e,verticesX:n,verticesY:r}),this.deform=i,this.autoResize=!1,this.deform.rebase(Float32Array.from(this.positionArray())),this.sync()}positionArray(){return this.geometry.getAttribute(`aPosition`).buffer.data}sync(){let e=this.geometry.getAttribute(`aPosition`);this.deform.writePositions(e.buffer.data),e.buffer.update()}get columns(){return this.deform.columns}get rows(){return this.deform.rows}get count(){return this.deform.count}indexOf(e,t){return this.deform.indexOf(e,t)}restAt(e){return this.deform.restAt(e)}vertexAt(e){return this.deform.at(e)}isMoved(e){return this.deform.isMoved(e)}movedCount(){return this.deform.movedCount()}dragVertex(e,t,n){this.deform.drag(e,t,n),this.sync()}dragVertices(e){this.deform.dragMany(e),this.sync()}nudgeVertex(e,t,n){this.deform.nudge(e,t,n),this.sync()}resetVertices(e){this.deform.reset(e),this.sync()}},KM=l({advance:()=>nN,advancePlayback:()=>QM,advancePose:()=>rN,boneOrder:()=>qM,create:()=>JM,createMixer:()=>$M,crossfadeTo:()=>eN,mixPoses:()=>tN,resolve:()=>YM,samplePose:()=>XM,sampleTransformPose:()=>ZM,solveTwoBoneIK:()=>oN,validatePose:()=>aN});function qM(e){let t=new Map(e.bones.map(e=>[e.name,e])),n=[],r=new Set,i=new Set,a=e=>{if(!r.has(e.name)){if(i.has(e.name))throw Error(`skeleton cycle involving ${e.name}`);if(e.parent&&!t.has(e.parent))throw Error(`skeleton bone ${e.name} names no parent ${e.parent}`);if(e.parent){i.add(e.name);let n=t.get(e.parent);n&&a(n),i.delete(e.name)}r.has(e.name)||(r.add(e.name),n.push(e.name))}};for(let t of e.bones)a(t);return n}function JM(e){let t=new Set;for(let n of e){if(t.has(n.name))throw Error(`duplicate skeleton bone ${n.name}`);if(t.add(n.name),n.limits&&!(n.limits.min<=n.limits.max))throw Error(`invalid joint limits for bone ${n.name}`)}let n=qM({bones:e});for(let t of e)if(t.parent&&n.indexOf(t.parent)>=n.indexOf(t.name))throw Error(`skeleton bone ${t.name} cannot precede its parent ${t.parent}`);return{bones:e}}function YM(e,t={}){let n=typeof t.rotations==`object`?t.rotations:t,r=t.translations??{},i=t.scales??{},a=new Map(e.bones.map(e=>[e.name,e])),o=new Map;for(let t of qM(e)){let e=a.get(t);if(!e)throw Error(`skeleton bone ${t} went missing`);let s=e.parent?o.get(e.parent):void 0,c=(e.rotation??0)+(n[t]??0),l=(s?s.angle:0)+c,u=i[t]??{x:1,y:1},d=(s?s.scaleX:1)*u.x,f=(s?s.scaleY:1)*u.y,p=l*Math.PI/180,m={a:Math.cos(p)*d,b:Math.sin(p)*d,c:-Math.sin(p)*f,d:Math.cos(p)*f},h=s?{a:s.matrix.a,b:s.matrix.b,c:s.matrix.c,d:s.matrix.d}:{a:1,b:0,c:0,d:1},g=e.origin?.x??0,_=e.origin?.y??0,v=g+(r[t]?.x??0),y=_+(r[t]?.y??0),b=(s?s.tipX:0)+h.a*v+h.c*y,x=(s?s.tipY:0)+h.b*v+h.d*y;for(let e of[m.a,m.b,m.c,m.d])if(!Number.isFinite(e))throw Error(`invalid transform for bone ${t}`);o.set(t,{name:t,x:b,y:x,angle:l,scaleX:d,scaleY:f,matrix:m,tipX:b+m.a*(e.length??0),tipY:x+m.b*(e.length??0)})}return[...o.values()]}function XM(e,t,n){return{...ZM(e,t,n).rotations}}function ZM(e,t,n){let r=e.frames;if(!r.length)return n&&aN(n,{}),{rotations:{}};let i=e.loop&&e.duration>0?(t%e.duration+e.duration)%e.duration:t,a=r[0];if(!e.loop&&i>=e.duration)a=r[r.length-1];else if(i>=r[0].time){a=r[r.length-1];for(let e=1;e<r.length;e++)if(i<r[e].time){let t=r[e].time-r[e-1].time;a=iN(r[e-1],r[e],t>0?(i-r[e-1].time)/t:0,!0);break}}let o=iN(a,a,0,!0);return n&&aN(n,o.rotations),o}function QM(e,t){let n=e.clip,r=e.time+t*e.rate;return n.loop&&n.duration>0?(r%=n.duration,r<0&&(r+=n.duration)):r=Math.max(0,Math.min(n.duration,r)),{clip:n,time:r,rate:e.rate}}function $M(e,t,n=1){return{skeleton:e,base:{clip:t,time:0,rate:n},layers:[]}}function eN(e,t,n=.25,r=e.base.rate){n<=0?(e.base={clip:t,time:0,rate:r},e.crossfade=void 0):(e.crossfade={from:e.base,remaining:n,duration:n},e.base={clip:t,time:0,rate:r})}function tN(e,t){let n={rotations:e};for(let e of[...t].sort((e,t)=>e.priority-t.priority)){let t=Math.max(0,Math.min(1,e.weight));t&&(n=iN(n,{rotations:e.pose},t,!1))}return{...n.rotations}}function nN(e,t){return{...rN(e,t).rotations}}function rN(e,t){e.base=QM(e.base,t);for(let n of e.layers)n.playback=QM(n.playback,t);let n=ZM(e.base.clip,e.base.time,e.skeleton);if(e.crossfade){let r=e.crossfade;r.from=QM(r.from,t),r.remaining=Math.max(0,r.remaining-t);let i=ZM(r.from.clip,r.from.time,e.skeleton),a=r.duration>0?1-r.remaining/r.duration:1;n=iN(i,n,a,!0),r.remaining===0&&(e.crossfade=void 0)}for(let t of[...e.layers].sort((e,t)=>e.priority-t.priority))n=iN(n,ZM(t.playback.clip,t.playback.time,e.skeleton),Math.max(0,Math.min(1,t.weight)),!1);return n}function iN(e,t,n,r){let i={...e.rotations};for(let a of new Set([...Object.keys(t.rotations),...r?Object.keys(e.rotations):[]]))i[a]=(e.rotations[a]??0)*(1-n)+(t.rotations[a]??0)*n;let a={rotations:i};for(let i of[`translations`,`scales`]){let o=e[i]??{},s=t[i]??{},c=+(i===`scales`),l={...o};for(let e of new Set([...Object.keys(s),...r?Object.keys(o):[]]))l[e]={x:(o[e]?.x??c)*(1-n)+(s[e]?.x??c)*n,y:(o[e]?.y??c)*(1-n)+(s[e]?.y??c)*n};Object.keys(l).length&&(a[i]=l)}return a}function aN(e,t){for(let n of e.bones){let e=(n.rotation??0)+(t[n.name]??0);if(!Number.isFinite(e))throw Error(`invalid rotation for bone ${n.name}`);if(n.limits&&(e<n.limits.min||e>n.limits.max))throw Error(`joint limit for bone ${n.name}: ${e} outside [${n.limits.min}, ${n.limits.max}]`)}}function oN(e,t,n,r,i=1,a={}){let o=e.bones.find(e=>e.name===t),s=e.bones.find(e=>e.name===n);if(!o||!s||s.parent!==t)throw Error(`IK chain ${t}/${n} must be connected`);if((s.origin?.x??0)!==0||(s.origin?.y??0)!==0)throw Error(`IK bone ${n} needs a zero origin`);let c=o.length??0,l=s.length??0;if(!(c>0&&l>0)||!Number.isFinite(c+l))throw Error(`IK chain ${t}/${n} needs positive finite lengths`);if(!Number.isFinite(r.x)||!Number.isFinite(r.y)||i!==1&&i!==-1)throw Error(`invalid IK target or bend for ${t}/${n}`);let u=YM(e,a),d=u.find(e=>e.name===t);if(!d)throw Error(`IK chain ${t}/${n} resolves no base`);let f=r.x-d.x,p=r.y-d.y,m=Math.hypot(f,p);if(m>c+l+1e-9||m<Math.abs(c-l)-1e-9)throw Error(`unreachable IK target for ${t}/${n}`);let h=i*Math.acos(Math.max(-1,Math.min(1,(m*m-c*c-l*l)/(2*c*l)))),g=Math.atan2(p,f)-Math.atan2(l*Math.sin(h),c+l*Math.cos(h)),_=o.parent?u.find(e=>e.name===o.parent):void 0,v=_?_.angle:0,y={...a,[t]:g*180/Math.PI-v-(o.rotation??0),[n]:h*180/Math.PI-(s.rotation??0)};return aN(e,y),y}var sN=class extends J{constructor(e,t){super(),this.parts=new Map,this.skeleton=e,this.mixer=t}bind(e,t){let n=new aM(t);return this.parts.set(e,n),this.addChild(n),n}part(e){return this.parts.get(e)}apply(e){let t=new Map(YM(this.skeleton,e).map(e=>[e.name,e]));for(let[e,n]of this.parts){let r=t.get(e);if(!r)throw Error(`skeletal sprite binds no bone named ${e}`);let{a:i,b:a,c:o,d:s}=r.matrix;n.setFromMatrix(new z(i,a,o,s,r.x,r.y))}if(this.diagnostics){this.setChildIndex(this.diagnostics,this.children.length-1);let e=this.diagnostics.clear();for(let n of t.values())e.moveTo(n.x,n.y).lineTo(n.tipX,n.tipY).stroke({color:65535,width:2}),e.circle(n.x,n.y,4).fill(16768256),e.circle(n.tipX,n.tipY,2).fill(16729224),e.moveTo(n.x-7,n.y).lineTo(n.x+7,n.y).moveTo(n.x,n.y-7).lineTo(n.x,n.y+7).stroke({color:16768256,width:1})}}setDiagnostics(e){e&&!this.diagnostics&&(this.diagnostics=this.addChild(new Z)),!e&&this.diagnostics&&(this.diagnostics.destroy(),this.diagnostics=void 0)}update(e){if(!this.mixer)throw Error(`a skeletal sprite without a mixer needs apply(pose)`);this.apply(nN(this.mixer,e))}},cN=class{constructor(e){if(this.points=[],this.previous=[],e.segments<2)throw Error(`an articulated chain needs at least two segments`);if(e.length<=0)throw Error(`an articulated chain needs a positive length`);this.length=e.length,this.stiffness=Math.max(0,Math.min(1,e.stiffness??1)),this.bendLimit=(e.bendLimit??90)*(Math.PI/180);for(let t=0;t<e.segments;t++)this.points.push({x:-t*e.length,y:0}),this.previous.push({x:-t*e.length,y:0})}pull(e,t){this.points[0].x=e,this.points[0].y=t}update(e){for(let e=0;e<this.points.length;e++)this.previous[e]={x:this.points[e].x,y:this.points[e].y};for(let e=1;e<this.points.length;e++){let t=this.previous[e-1],n=this.points[e],r=t.x-n.x,i=t.y-n.y,a=Math.hypot(r,i);if(a>this.length){let e=a>0?(a-this.length)/a:0;n.x+=r*e*this.stiffness,n.y+=i*e*this.stiffness}}for(let e=2;e<this.points.length;e++){let t=this.points[e-2],n=this.points[e-1],r=this.points[e],i=Math.atan2(n.y-t.y,n.x-t.x),a=Math.atan2(r.y-n.y,r.x-n.x)-i;for(;a>Math.PI;)a-=2*Math.PI;for(;a<-Math.PI;)a+=2*Math.PI;if(Math.abs(a)<=this.bendLimit)continue;let o=i+Math.sign(a)*this.bendLimit;r.x=n.x+Math.cos(o)*this.length,r.y=n.y+Math.sin(o)*this.length}}},lN=class extends J{constructor(e,t){if(super(),t.length!==e.points.length)throw Error(`a chain rig needs one texture per segment`);this.chain=e,this.segments=t.map(e=>{let t=new aM(e);return t.anchor.set(0,.5),this.addChild(t),t})}update(e){this.chain.update(e);for(let e=0;e<this.segments.length;e++){let t=this.chain.points[e],n=this.chain.points[e+1]??t;this.segments[e].position.set(t.x,t.y),this.segments[e].rotation=Math.atan2(n.y-t.y,n.x-t.x)}}},uN=``;function dN(e){uN=e.endsWith(`/`)||e===``?e:e+`/`}var fN;function pN(e){fN=e}function mN(){return fN||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function hN(){return mN()!==void 0}function gN(){return Object.keys(mN()??{})}function _N(e){let t=mN();return!t||e in t}function vN(e){if(/^(data|blob):/.test(e))return e;let t=mN();if(!t)return uN+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}var yN={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`,"image/gif":`gif`,"image/svg+xml":`svg`};async function bN(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!Ik.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=vN(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let r=/^data:([^;,]+)/.exec(t)?.[1],i=(r&&yN[r])??/\.([a-z0-9]+)$/i.exec(e)?.[1];i&&(n.format=i)}Ik.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?Ik.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await Ik.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function xN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function SN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function CN(e){return Ik.cache.has(e)}async function wN(e){let t=e.filter(e=>Ik.cache.has(e));t.length!==0&&await Ik.unload(t)}var TN=new Map;async function EN(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!TN.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(vN(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);TN.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function DN(e){let t=TN.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function ON(e){return TN.has(e)}function kN(e){for(let t of e)TN.delete(t)}var AN=[{name:`<script>`,pattern:/<script[\s/>]/i},{name:`<foreignObject>`,pattern:/<foreignobject[\s/>]/i},{name:`<iframe>`,pattern:/<iframe[\s/>]/i},{name:`<embed>`,pattern:/<embed[\s/>]/i},{name:`<object>`,pattern:/<object[\s/>]/i},{name:`an event-handler attribute`,pattern:/\son[a-z]+\s*=/i},{name:`a javascript: URL`,pattern:/javascript\s*:/i},{name:`a data: URL of an active type`,pattern:/data:(?:text\/html|application\/xml|image\/svg\+xml)/i}];function jN(e){for(let{name:t,pattern:n}of AN)if(n.test(e))throw Error(`SVG refused: contains ${t}`);return e}function MN(e){return`data:image/svg\+xml,${encodeURIComponent(e)}`}function NN(e,t){let n=jN(e);if(t.length===0)throw Error(`SVG scale variants need at least one named scale`);let r=new Set;for(let e of t){if(!e.name)throw Error(`an SVG scale variant needs a name`);if(!Number.isFinite(e.resolution)||e.resolution<=0)throw Error(`SVG scale variant ${e.name} needs a positive resolution`);if(r.has(e.name))throw Error(`duplicate SVG scale variant ${e.name}`);r.add(e.name)}let i=MN(n);return t.map(e=>({name:e.name,src:i,resolution:e.resolution}))}function PN(e){let t=jN(e),n=/^([\s\S]*?)<svg([^>]*)>/i.exec(t),r=t.lastIndexOf(`</svg>`);if(!n||r<0)throw Error(`SVG group split needs an <svg> root`);let i=t.slice(n[0].length,r),a=[...i.matchAll(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi)].map(e=>e[0]).join(``),o=i.replace(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,``),s=Object.create(null),c=0;for(;c<o.length;){let e=/<g\b([^>]*?)(\/?)>/i.exec(o.slice(c));if(!e)break;let t=e[1],r=/\bid\s*=\s*["']([^"']+)["']/i.exec(t)?.[1],i=c+e.index+e[0].length;if(e[2]===`/`){if(!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}</svg>`,c=i;continue}let l=1,u=i,d=``;for(;l>0&&u<o.length;){let e=o.slice(u).match(/<g\b[^>]*>|<\/g\s*>/i);if(!e)throw Error(`SVG group ${r??`<unnamed>`} never closes`);e[0].startsWith(`</`)?(l--,l===0&&(d=e[0])):/\/\s*>$/.test(e[0])||l++,u+=e.index+e[0].length}if(l!==0)throw Error(`SVG group ${r??`<unnamed>`} never closes`);let f=o.slice(i,u-d.length);if(c=u,!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}${f}</g></svg>`}if(Object.keys(s).length===0)throw Error(`SVG group split found no named groups`);return s}var FN=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??bN,this.releaseAssets=e.release??wN}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function IN(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}async function LN(e){if(e.trimStart().startsWith(`<`))return jN(e);let t=vN(e);if(t.startsWith(`data:`)){let n=t.indexOf(`,`);if(n<0)throw Error(`invalid SVG data URI for ${e}`);return jN(/;base64/i.test(t.slice(0,n))?new TextDecoder().decode(Uint8Array.from(atob(t.slice(n+1)),e=>e.charCodeAt(0))):decodeURIComponent(t.slice(n+1)))}let n=await fetch(t);if(!n.ok)throw Error(`SVG failed to load ${e}: ${n.status}`);return jN(await n.text())}var RN=new WeakMap;async function zN(e,t={}){let n=t.resolution??1;if(!Number.isFinite(n)||n<=0)throw Error(`SVG parts need a positive finite resolution`);let r=PN(await LN(e)),i=t.groups??Object.keys(r);for(let e of i)if(!Object.hasOwn(r,e))throw Error(`SVG parts unknown group ${e}`);let a=Object.create(null);for(let e of i){let t=MN(r[e].replace(`</svg>`,`<!-- mwg-resolution:${n} --></svg>`)),i=`mwg-svg-part:${n}:${t}`;a[e]=await Ik.load({alias:i,src:t,format:`svg`,data:{resolution:n}}),RN.set(a[e],i)}return Object.freeze(a)}async function BN(e){for(let t of new Set(Object.values(e))){let e=RN.get(t);e&&(await Ik.unload(e),RN.delete(t))}}var VN=l({AssetStream:()=>FN,fetchWithByteProgress:()=>IN,get:()=>SN,getBinary:()=>DN,has:()=>_N,isBinaryLoaded:()=>ON,isCompiled:()=>hN,isLoaded:()=>CN,load:()=>bN,loadBinary:()=>EN,loadSvgParts:()=>zN,paths:()=>gN,release:()=>wN,releaseBinary:()=>kN,releaseSvgParts:()=>BN,resolve:()=>vN,sanitizeSvg:()=>jN,setAssetMap:()=>pN,setBase:()=>dN,splitSvgGroups:()=>PN,svgDataUri:()=>MN,svgScaleVariants:()=>NN,texture:()=>xN});function HN(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var UN=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0,t>0&&(e.width%t!==0||e.height%n!==0)&&console.warn(`sprite sheet ${e.width}x${e.height} is not a whole number of ${t}x${n} frames; the frames will be cut from the wrong places`)}static grid(t,n=0,r=n){return new e(xN(t),n,r)}static strip(t,n){if(!(n>0))throw Error(`a sprite strip needs at least one frame`);let r=xN(t);return new e(r,r.width/n,r.height)}static fromTexture(t,n=0,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new q({source:this.texture.source,frame:new G(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new q({source:this.texture.source,frame:new G(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:HN(t.frame)}}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},WN=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.requestedZoom=1,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this.resolution=e.resolution??(()=>1),this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this.pixelPerfectTileSize?KN(this.requestedZoom,this.pixelPerfectTileSize,this.resolution()):this.requestedZoom}set zoom(e){this.requestedZoom=Math.max(.01,e)}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}fit(e,t){this.zoom=Math.min(this.viewWidth/e,this.viewHeight/t),this.snapTo(e/2,t/2)}get view(){let e=this.viewWidth/this.zoom,t=this.viewHeight/this.zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){br()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this.zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this.zoom*this.deadzone/2,n=this.viewHeight/this.zoom*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=br()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=GN(this._angle,this.targetAngle),n=br()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this.zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this.zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this.zoom,s=(t-this.screenY-this.viewHeight/2)/this.zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}clampedCentre(e,t){if(!this.bounds)return{x:e,y:t};let n=this.viewWidth/this.zoom/2,r=this.viewHeight/this.zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;return{x:o-i<n*2?(i+o)/2:kn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:kn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);this.world.scale.set(this.zoom),this._angle===0?(this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2-e*this.zoom),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2-t*this.zoom)):(this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2))}snapToDevice(e){let t=this.resolution();return Math.round(e*t)/t}};function GN(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function KN(e,t,n=1){return Math.max(1,Math.round(e*t*n))/(t*n)}function qN(e={}){let t=Rj.current,n=new WN({resolution:()=>t.app.renderer.resolution,...e});return n.setViewport(t.width,t.height),n}var JN=class{constructor(e){this.container=new J,this.clip=new Z,this.camera=new WN(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function YN(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var XN={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function ZN(e){let t=new Bk;return t.matrix=XN[e],t}function QN(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function $N(e,t,n,r=`square`){return r===`hex`?$n(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var eP=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new Z,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=h_.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new wl(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=QN(e,this.drawn);if(n.length===0)return;let r=new Z;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=$N(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}Rj.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=$N(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),Rj.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},tP=24,nP=48,rP=[0,16,48,80];function iP(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function aP(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function oP(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function sP(e,t){let n=rP[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function cP(e,t,n,r){if(iP(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(aP(t),iP(`RPG Maker autotile shape`,n),oP(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=sP(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*nP,destinationY:Math.floor(e/16)*nP,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*tP,sourceY:(a*2+t)*tP,destinationX:n%2*tP,destinationY:Math.floor(n/2)*tP}))}}var lP=class{constructor(e){this.cache=new Map,this.table=e,oP(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=cP(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}},uP=[2048,2816,4352,5888],dP=[768,1536,1536,2304];function fP(e){if(!Number.isInteger(e))return null;for(let t=0;t<4;t++)if(e>=uP[t]&&e<uP[t]+dP[t])return t;return null}var pP=[[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]],mP=[[[2,2],[1,2],[2,1],[1,1]],[[0,2],[1,2],[0,1],[1,1]],[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,2],[3,2],[2,1],[3,1]],[[0,2],[3,2],[0,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[0,2],[1,2],[0,3],[1,3]],[[2,0],[1,0],[2,3],[1,3]],[[0,0],[1,0],[0,3],[1,3]],[[2,2],[3,2],[2,3],[3,3]],[[0,2],[3,2],[0,3],[3,3]],[[2,0],[3,0],[2,3],[3,3]],[[0,0],[3,0],[0,3],[3,3]]],hP=[[26,27,32,33],[4,27,32,33],[26,5,32,33],[4,5,32,33],[26,27,32,11],[4,27,32,11],[26,5,32,11],[4,5,32,11],[26,27,10,33],[4,27,10,33],[26,5,10,33],[4,5,10,33],[26,27,10,11],[4,27,10,11],[26,5,10,11],[4,5,10,11],[24,25,30,31],[24,5,30,31],[24,25,30,11],[24,5,30,11],[14,15,20,21],[14,15,20,11],[14,15,10,21],[14,15,10,11],[28,29,34,35],[28,29,10,35],[4,29,34,35],[4,29,10,35],[38,39,44,45],[4,39,44,45],[38,5,44,45],[4,5,44,45],[24,29,30,35],[14,15,44,45],[12,13,18,19],[12,13,18,11],[16,17,22,23],[16,17,10,23],[40,41,46,47],[4,41,46,47],[36,37,42,43],[36,5,42,43],[12,17,18,23],[12,13,42,43],[36,41,42,47],[16,17,46,47],[12,17,42,47],[0,1,6,7]],gP=[46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,37,27,37,27,23,15,23,13,37,27,37,27,22,11,22,9,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,36,26,36,26,21,7,21,5,36,26,36,26,20,3,20,1,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,37,25,37,25,23,14,23,12,37,25,37,25,22,10,22,8,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,36,24,36,24,21,6,21,4,36,24,36,24,20,2,20,0];function _P(e){return!Number.isInteger(e)||e<=0||e>=384?null:{index:Math.floor(e/48),pattern:e%48}}function vP(e){let t=0;return e(0,-1)&&(t|=1),e(1,-1)&&(t|=2),e(1,0)&&(t|=4),e(1,1)&&(t|=8),e(0,1)&&(t|=16),e(-1,1)&&(t|=32),e(-1,0)&&(t|=64),e(-1,-1)&&(t|=128),gP[t]}var yP=[16,32,32,48];function bP(e){if(e.format===`rpgm-mv`){if(aP(e.slot),oP(e.table),e.tableEdge&&e.slot!==1)throw Error(`a table-edge layout needs slot 1 (A2), got slot ${e.slot}`);let t=yP[e.slot],n=rP[e.slot];for(let r of e.cycles){if(r.length===0)throw Error(`an autotile animation cycle needs at least one kind`);for(let i of r)if(!Number.isInteger(i)||i<n||i>=n+t)throw Error(`animation cycle kind ${i} is outside slot ${e.slot}'s kinds ${n}-${n+t-1}`)}}else{if(!Number.isInteger(e.index)||e.index<0||e.index>7)throw Error(`an XP autotile index must be 0-7, got ${e.index}`);if(!Number.isInteger(e.frames)||e.frames<1)throw Error(`an XP autotile frame count must be at least 1, got ${e.frames}`)}}var xP=24,SP=16,CP=6,wP=96,TP=32;function EP(e,t,n){if(t<=0)return null;if(!Number.isInteger(n)||n<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${n}`);return e.format===`rpgm-mv`?OP(e,t,n):kP(e,t,n)}function DP(e,t){let n=rP[e.slot]+Math.floor(t/48),r=t%48%e.table.length,i=n%8*2,a=(Math.floor(n/8)-2)*3,o=xP/2;return[2,3].map((t,n)=>{let[s,c]=e.table[r][t];return{sourceX:(i*2+s)*xP,sourceY:(a*2+c)*xP+o,sourceWidth:xP,sourceHeight:o,destX:n/2,destY:0,destWidth:1/2,destHeight:1/4}})}function OP(e,t,n){let r=uP[e.slot],i=dP[e.slot];if(!Number.isInteger(t)||t<r||t>=r+i)throw Error(`tile ${t} is outside slot ${e.slot}'s ids ${r}-${r+i-1}`);let a=t-r;if(e.tableEdge)return DP(e,a);let o=rP[e.slot]+Math.floor(a/48),s=e.tableFor?e.tableFor(o):e.table,c=a%48%s.length;for(let t of e.cycles){let e=t.indexOf(o);if(e>=0){o=t[(e+n)%t.length];break}}return cP((o-rP[e.slot])*48+a%48,e.slot,c,s).quadrants.map((e,t)=>({sourceX:e.sourceX,sourceY:e.sourceY,sourceWidth:xP,sourceHeight:xP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}function kP(e,t,n){if(!Number.isInteger(t)||t<e.index*48||t>=e.index*48+48||t<=0)throw Error(`tile ${t} is outside XP autotile ${e.index}'s ids ${e.index*48}-${e.index*48+47}`);if(e.single)return[{sourceX:n%e.frames*TP,sourceY:0,sourceWidth:TP,sourceHeight:TP,destX:0,destY:0,destWidth:1,destHeight:1}];let r=hP[t%48],i=n%e.frames*wP;return r.map((e,t)=>({sourceX:e%CP*SP+i,sourceY:Math.floor(e/CP)*SP,sourceWidth:SP,sourceHeight:SP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}var AP=128;function jP(e){let t=new Int32Array(e.width*e.height),n=t=>fP(t)===1&&((e.flags[t]??0)&AP)!==0;for(let r=1;r<e.height;r++)for(let i=0;i<e.width;i++){let a=r*e.width+i,o=e.objects[a-e.width]??0;if(!n(o)||n(e.objects[a]??0))continue;let s=fP(e.ground[a]??0);s!==2&&s!==3&&(t[a]=o)}return t}var MP=-1,NP=7237230,PP=10132122;function FP(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function IP(e){return e>>>20}function LP(e){return e&(1<<20)-1}var RP=class extends J{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){let{cells:n,container:r,chunks:i}=this.beginLayer(e,t?.length),a={kind:`tiles`,name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}beginLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t!==void 0&&t!==n)throw Error(`layer "${e}" has ${t} cells, but the map has ${n}`);let r=new J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;i.push(e),r.addChild(e)}return{cells:n,container:r,chunks:i}}addAutotileLayer(e,t,n){let r=Array.isArray(n)?n:[n];if(r.length===0)throw Error(`autotile layer "${e}" needs at least one set`);let{cells:i,container:a,chunks:o}=this.beginLayer(e,t.length),s=r.map((t,n)=>this.resolveAutotileSet(e,t,n)),c=new Set;for(let t of s){let n=t.layout.format===`rpgm-mv`?`slot ${t.layout.slot}`:`autotile ${t.layout.index}`;if(c.has(n))throw Error(`autotile layer "${e}" has two sets for ${n}`);c.add(n)}let l=0;r.forEach((t,n)=>{let r=t.animationFrame??0;if(!Number.isInteger(r)||r<0)throw Error(`autotile layer "${e}" set ${n} starts at an invalid animation frame, got ${t.animationFrame}`);if(n===0)l=r;else if(r!==l)throw Error(`autotile layer "${e}" sets disagree on their initial animation frame (${l} vs ${r})`)});let u=Int32Array.from(t);for(let t=0;t<i;t++)u[t]>0&&this.claimAutotileSets(s,e,u[t]);let d={kind:`autotile`,name:e,data:u,sprites:Array(i).fill(null),container:a,sets:s,frame:l};this.layers.push(d),this.layersByName.set(e,d),this.chunks.push(o),this.addChild(a);let f=this.layers.length===1;for(let t=0;t<this.heightInTiles;t++)for(let n=0;n<this.widthInTiles;n++){let r=this.index(n,t),i=u[r];i<=0||(d.sprites[r]=this.makeAutotileSprites(d,this.claimAutotileSets(s,e,i),n,t,i),f&&this.syncFaces(n,t))}return this}setAutotileFrame(e,t){let n=this.layerAt(e);if(n.kind!==`autotile`)throw Error(`layer "${n.name}" is not an autotile layer`);if(!Number.isInteger(t)||t<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${t}`);if(n.frame!==t){n.frame=t;for(let e=0;e<this.heightInTiles;e++)for(let r=0;r<this.widthInTiles;r++){let i=this.index(r,e),a=n.data[i];if(a<=0)continue;let o=this.claimAutotileSets(n.sets,n.name,a),s=this.autotilePieces(o,a,t),c=n.sprites[i];if(c)for(let e=0;e<c.length;e++)c[e].texture=s.textures[e]}}}addShadowLayer(e,t,n={}){let{cells:r,container:i,chunks:a}=this.beginLayer(e,t.length),o=n.color??0,s=n.alpha??.5;if(!Number.isFinite(s)||s<0||s>1)throw Error(`shadow layer "${e}" alpha must be between 0 and 1, got ${n.alpha}`);let c=Int32Array.from(t,e=>e>0?e&15:0),l={kind:`shadow`,name:e,data:c,sprites:Array(r).fill(null),container:i,color:o,alpha:s};this.layers.push(l),this.layersByName.set(e,l),this.chunks.push(a),this.addChild(i);for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)c[this.index(t,e)]>0&&this.buildShadowSprites(l,t,e);return this}buildShadowSprites(e,t,n){let r=this.index(t,n),i=this.cellOrigin(t,n),a=this.cellHeight[r]*this.heightStep,o=this.tileWidth/2,s=this.tileHeight/2,c=this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)],l=[];for(let t=0;t<4;t++){if(!(e.data[r]&1<<t))continue;let n=new aM(q.WHITE);n.x=i.x+t%2*o,n.y=i.y-a+Math.floor(t/2)*s,n.width=o,n.height=s,n.tint=e.color,n.alpha=e.alpha,c.addChild(n),l.push(n)}e.sprites[r]=l}setShadowCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r>0?r&15:0;for(let t of e.sprites[i]??[])t.destroy();e.sprites[i]=null,e.data[i]>0&&this.buildShadowSprites(e,t,n)}getAutotileFrame(e){let t=this.layerAt(e);if(t.kind!==`autotile`)throw Error(`layer "${t.name}" is not an autotile layer`);return t.frame}resolveAutotileSet(e,t,n){let r=`autotile layer "${e}" set ${n}`;if(!t||!t.sheet)throw Error(`${r} needs a source sheet`);let i=t.format??`rpgm-mv`;if(i!==`rpgm-mv`&&i!==`rpgm-xp`)throw Error(`${r} has an unknown format "${t.format}"`);return i===`rpgm-mv`?this.resolveRpgmSet(r,t):this.resolveXpSet(r,t)}resolveRpgmSet(e,t){if(t.slot===void 0)throw Error(`${e} needs a slot (0-3) for its MV sheet`);if(t.mode!==void 0&&t.mode!==`floor`&&t.mode!==`wall`&&t.mode!==`mixed`)throw Error(`${e} has an unknown mode "${t.mode}"`);if(t.animation!==void 0&&!Array.isArray(t.animation))throw Error(`${e} animation must list kind runs, got ${typeof t.animation}`);let n=t.mode??(t.slot<2?`floor`:`wall`),r=n===`mixed`&&t.slot===3&&t.table===void 0,i={format:`rpgm-mv`,slot:t.slot,table:t.table??(n===`floor`||t.tableEdge||n===`mixed`&&t.slot<2?pP:mP),...r?{tableFor:e=>Math.floor(e/8)%2==0?pP:mP}:{},...t.tableEdge?{tableEdge:!0}:{},cycles:t.animation??[]};return bP(i),{sheet:t.sheet,layout:i,cache:new Map,claims:e=>fP(e)===t.slot}}resolveXpSet(e,t){let n=t.index??0,r=t.sheet.texture,i=r.height===32;if(r.height!==32&&r.height!==128)throw Error(`${e} is ${r.height}px tall - XP autotile images are 128px templates or 32px single-tile strips`);let a=i?32:96,o=t.frames??Math.max(1,Math.floor(r.width/a)),s={format:`rpgm-xp`,index:n,frames:o,single:i};if(bP(s),o>Math.floor(r.width/a))throw Error(`${e} asks for ${o} frames but its sheet fits ${Math.floor(r.width/a)}`);return{sheet:t.sheet,layout:s,cache:new Map,claims:e=>{let t=_P(e);return t!==null&&t.index===n}}}claimAutotileSets(e,t,n){for(let t of e)if(t.claims(n))return t;throw Error(`tile ${n} in autotile layer "${t}" matches none of its sets`)}autotilePieces(e,t,n){let r=`${t}:${n}`,i=e.cache.get(r);if(i)return i;let a=EP(e.layout,t,n),o={parts:a,textures:a.map(t=>new q({source:e.sheet.texture.source,frame:new G(t.sourceX,t.sourceY,t.sourceWidth,t.sourceHeight)}))};return e.cache.set(r,o),o}makeAutotileSprites(e,t,n,r,i){let a=this.index(n,r),o=this.autotilePieces(t,i,e.frame),s=this.cellOrigin(n,r),c=this.cellHeight[a]*this.heightStep,l=o.textures.map((e,t)=>{let n=o.parts[t],r=new aM(e);return r.x=s.x+n.destX*this.tileWidth,r.y=s.y-c+n.destY*this.tileHeight,r.scale.set(n.destWidth*this.tileWidth/n.sourceWidth,n.destHeight*this.tileHeight/n.sourceHeight),r.tint=this.cellTint[a],r.colorAdd=this.cellAdd[a],r}),u=this.chunks[this.layers.indexOf(e)][this.chunkIndex(n,r)];for(let e of l)u.addChild(e);return l}setAutotileCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r;let a=e.sprites[i];if(r<=0){if(a)for(let e of a)e.destroy();e.sprites[i]=null;return}let o=this.claimAutotileSets(e.sets,e.name,r),s=this.autotilePieces(o,r,e.frame);if(a&&a.length===s.textures.length)for(let e=0;e<a.length;e++)a[e].texture=s.textures[e];else{if(a)for(let e of a)e.destroy();e.sprites[i]=this.makeAutotileSprites(e,o,t,n,r)}}eachCellSprite(e,t,n){let r=e.sprites[t];if(r){if(Array.isArray(r))for(let e of r)n(e);else n(r)}}firstCellSprite(e,t){let n=e.sprites[t];return n?Array.isArray(n)?n[0]:n:null}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return $n(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return er(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=IP(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(LP(e))}buildSprite(e,t,n,r){let i=new aM(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]!==r){if(i.kind===`autotile`)this.setAutotileCell(i,t,n,r);else if(i.kind===`shadow`)this.setShadowCell(i,t,n,r);else{i.data[a]=r;let e=i.sprites[a];r===-1?(e?.destroy(),i.sprites[a]=null):e?e.texture=this.textureFor(r):this.buildSprite(i,t,n,r)}this.layers[0]===i&&this.syncFaces(t,n)}}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}stampRect(e,t,n,r,i,a){if(this.layerAt(e),a.length!==r*i)throw Error(`a ${r}x${i} stamp needs ${r*i} frames, got ${a.length}`);if(t<0||n<0||t+r>this.widthInTiles||n+i>this.heightInTiles)throw Error(`a ${r}x${i} stamp at (${t},${n}) does not fit the ${this.widthInTiles}x${this.heightInTiles} map`);for(let o=0;o<i;o++)for(let i=0;i<r;i++)this.setTile(e,t+i,n+o,a[o*r+i])}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers)e.kind!==`shadow`&&this.eachCellSprite(e,i,e=>{e.tint=n,e.colorAdd=r});let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;let i=(n-this.cellHeight[r])*this.heightStep;this.cellHeight[r]=n;for(let e of this.layers)this.eachCellSprite(e,r,e=>{e.y-=i});this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new Z;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.firstCellSprite(this.layers[0],n);i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill(NP),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(PP)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=this.projectedTile(t.x,t.y),r=this.projectedTile(t.x+t.width,t.y),i=this.projectedTile(t.x,t.y+t.height),a=this.projectedTile(t.x+t.width,t.y+t.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y),u=Math.floor(o/this.chunkSize)-1,d=Math.floor(s/this.chunkSize)+1,f=Math.floor(c/this.chunkSize)-1,p=Math.floor(l/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=f&&e<=p;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=u&&n<=d,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},zP=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new aM(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},BP=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y,this.animation=r.animation;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}};function VP(e){return e===!0||e===`progress`?`progress`:typeof e==`number`&&e>0?`seconds`:`none`}var HP=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n,r={}){let i,a;e instanceof q?(a=new wl(e),this.addChild(a),i=a):i=e,r.tint!==void 0&&typeof i.tint==`number`&&(i.tint=r.tint);let o=VP(r.fadeIn),s=typeof r.fadeIn==`number`?r.fadeIn:0,c=typeof i.alpha==`number`?i.alpha:1;o!==`none`&&(i.alpha=0);let l={projectile:new BP(i,t,n,r),sprite:i,built:a,onArrive:r.onArrive,spin:r.spin??(r.spinDegrees===void 0?void 0:r.spinDegrees*Math.PI/180),fadeMode:o,fadeIn:s,baseAlpha:c,elapsed:0};return this.live.push(l),{projectile:l.projectile,get done(){return l.projectile.done},cancel:()=>{let e=this.live.indexOf(l);e!==-1&&(this.live.splice(e,1),this.release(l))}}}update(e){for(let t=this.live.length-1;t>=0;t--){let n=this.live[t];n.elapsed+=e,n.spin!==void 0&&(n.sprite.rotation=(n.sprite.rotation??0)+n.spin*e),n.fadeMode===`seconds`&&(n.sprite.alpha=n.baseAlpha*Math.min(1,n.elapsed/n.fadeIn));let r=n.projectile.update(e);n.fadeMode===`progress`&&(n.sprite.alpha=n.baseAlpha*n.projectile.progress),r&&(this.live.splice(t,1),this.release(n),n.onArrive?.())}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.release(e)}destroy(){this.clear(),super.destroy()}release(e){e.built&&(this.removeChild(e.built),e.built.destroy())}},UP=class extends J{constructor(e,t,n={}){super(),this.elapsed=0,this.expired=!1,this.lifeFraction=1,this.from={...e},this.to={...t},this.colour=n.colour??16777215,this.thin=n.thin??!1;let r=n.texture;if(r===void 0?(this.texture=void 0,this.stretch=!1,this.textureAnchor=0):r instanceof q?(this.texture=r,this.stretch=!1,this.textureAnchor=0):(this.texture=r.source,this.stretch=r.stretch??!1,this.textureAnchor=r.anchor??.5),this.thickness=n.width??2,this.duration=Math.max(1e-6,n.duration??.2),this.texture&&this.stretch)this.body=new wl(this.texture),this.body.anchor.set(0,this.textureAnchor);else if(this.texture){let e=new dA({texture:this.texture,width:1,height:this.thickness});e.anchor.set(0,this.textureAnchor),this.body=e}else this.body=new Z;(n.additive??!0)&&(this.body.blendMode=`add`),this.addChild(this.body),this.redraw()}get progress(){return Math.min(1,this.elapsed/this.duration)}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.redraw()}update(e){return!this.expired&&(this.elapsed+=e,this.alpha=1-this.progress,this.lifeFraction=this.thin?1-this.progress:1,this.thin&&this.redraw(),this.elapsed>=this.duration&&(this.expired=!0,!0))}destroy(){this.removeChild(this.body),this.body.destroy(),super.destroy()}redraw(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t);if(this.position.set(this.from.x,this.from.y),this.rotation=n>0?Math.atan2(t,e):0,this.body instanceof dA)this.body.width=n,this.body.height=this.thickness*this.lifeFraction;else if(this.body instanceof wl){let e=this.texture?.width||1,t=this.texture?.height||1;this.body.scale.x=n/e,this.body.scale.y=this.thickness/t*this.lifeFraction}else{let e=this.body;e.clear(),e.moveTo(0,0),e.lineTo(n,0),e.stroke({width:this.thickness*this.lifeFraction,color:this.colour})}}},WP=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n){let r=new UP(e,t,n);return this.addChild(r),this.live.push(r),r}update(e){for(let t=this.live.length-1;t>=0;t--)if(this.live[t].update(e)){let[e]=this.live.splice(t,1);this.removeChild(e),e.destroy()}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.removeChild(e),e.destroy()}destroy(){this.clear(),super.destroy()}},GP=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},KP=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},qP=class extends J{constructor(e){super(),this.cells=new Map,this.ripples=[],this.offset=0,this.eventMode=`none`,this.columns=e.width,this.tileSize=e.tileSize??16,this.speed=e.speed??5,this.rippleTexture=e.rippleTexture,this.rippleDuration=e.rippleDuration??.5;for(let t=0;t<e.height;t++)for(let n=0;n<e.width;n++){if(!e.isLiquid(n,t))continue;let r=new dA({texture:e.texture,width:this.tileSize,height:this.tileSize});r.eventMode=`none`,r.position.set(n*this.tileSize,t*this.tileSize),r.tilePosition.set(-r.x,-r.y),r.visible=!1,this.cells.set(n+t*this.columns,r),this.addChild(r)}}setCellColor(e,t,n){let r=this.cells.get(e+t*this.columns);r&&(r.tint=n,r.visible=n!==0)}ripple(e,t){if(!this.rippleTexture||!this.cells.get(e+t*this.columns)?.visible)return;let n=new wl(this.rippleTexture);n.eventMode=`none`,n.anchor.set(.5),n.position.set((e+.5)*this.tileSize,(t+.5)*this.tileSize),n.scale.set(0),this.addChild(n),this.ripples.push({sprite:n,age:0})}get rippleCount(){return this.ripples.length}update(e){this.offset+=this.speed*e;for(let e of this.cells.values())e.visible&&(e.tilePosition.y=-e.y+this.offset);for(let t=this.ripples.length-1;t>=0;t--){let n=this.ripples[t];if(n.age+=e,n.age>=this.rippleDuration)n.sprite.destroy(),this.ripples.splice(t,1);else{let e=n.age/this.rippleDuration;n.sprite.scale.set(e),n.sprite.alpha=1-e}}}};function JP(e,t,n,r,i,a){let o=t*r;for(let s=0;s<n;s++)for(let n=0;n<t;n++){let t=i(n,s);for(let i=0;i<r;i++)for(let c=0;c<r;c++){let l=a[typeof t==`number`?t:t[i*r+c]??0]??[0,0,0,0];e.set(l,((s*r+i)*o+n*r+c)*4)}}}var YP=class extends wl{constructor(e){let t=e.resolution??2,n=document.createElement(`canvas`);n.width=e.width*t,n.height=e.height*t;let r=n.getContext(`2d`);if(!r)throw Error(`FogLayer needs a 2D canvas context`);super(q.from(n)),this.context=r,this.image=r.createImageData(n.width,n.height),this.columns=e.width,this.rows=e.height,this.cellResolution=t,this.palette=e.palette,this.texture.source.scaleMode=`linear`,this.scale.set((e.tileSize??16)/t),this.eventMode=`none`}setPalette(e){this.palette=e}refresh(e){JP(this.image.data,this.columns,this.rows,this.cellResolution,e,this.palette),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}},XP=`halo`,ZP=class extends RM{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(XP,e.frames,e.animation),this.play(XP)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};_e();function QP(e){return typeof e==`number`?e:D(e[0],e[1])}function $P(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function eF(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var tF=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.tintOverridden=!1,this.emitting=!1,this.followTarget=null,this.followOffsetX=0,this.followOffsetY=0,this.followEnabled=null,this.followVisible=null,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=eF(e.scale??[1,1]),this.alphaOf=eF(e.alpha??[1,0]),this.flicker=Math.min(1,Math.max(0,e.flicker??0)),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new wl(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}attach(e,t={}){this.followTarget=e,this.followOffsetX=t.offsetX??0,this.followOffsetY=t.offsetY??0,this.followEnabled=t.enabled??null,this.followVisible=t.visible??null,this.syncFollow()}detach(){this.followTarget=null,this.followEnabled=null,this.followVisible!==null&&(this.visible=!0),this.followVisible=null,this.followOffsetX=0,this.followOffsetY=0}get attachedTo(){return this.followTarget}syncFollow(){let e=this.followTarget;if(!e)return;if(typeof e!=`function`&&e.destroyed){this.detach();return}let t=typeof e==`function`?e():e;this.x=t.x+this.followOffsetX,this.y=t.y+this.followOffsetY,this.followVisible!==null&&(this.visible=this.followVisible())}followEmissionAllowed(){return this.followEnabled?.()??!0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e,t={}){this.syncFollow(),t.tint!==void 0&&(this.tintOverridden=!0);let n=0;for(let r=0;r<e&&this.spawn(t);r++)n++;return n}spawn(e={}){let t=null;for(let e=0;e<this.pool.length;e++){let e=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!e.active){t=e;break}}if(!t)return!1;let n=QP(this.angleRange),r=QP(this.speed),i=+!br(),a=this.spawnOffset();return t.x=(e.x??this.x)+a.x,t.y=(e.y??this.y)+a.y,t.vx=Math.cos(n)*r*i,t.vy=Math.sin(n)*r*i,t.age=0,t.life=Math.max(1e-6,QP(this.life)),t.rotation=0,t.spin=QP(this.spin)*i,t.scale=this.scaleOf(0),t.alpha=this.alphaOf(0),t.tint=e.tint??$P(this.tintRange),t.frame=0,t.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.syncFollow(),this.emitting&&this.rate>0&&this.followEmissionAllowed()){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=br();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`||this.tintOverridden;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},nF=class extends J{constructor(e={}){super(),this.overlay=new Z,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){this.queue=e.slice(1),e.length===0?this.phase=`idle`:this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=Math.max(0,Math.min(1,t))}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return br()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(br())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?Er.easeOutQuad(t*2):1-Er.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=Er.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},rF=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){(!this.inAction||t)&&(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},iF=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=tM(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},aF={scaleX:1,scaleY:1,dy:0,rotation:0,skewX:0},oF={done:Promise.resolve(),cancel(){}},sF=class{constructor(e,t={}){this.contributions=new Map,this.loops=new Set,this.nextId=0,this.flipX=!1,this.flipY=!1,this.destroyed=!1,this.target=e,this.tweener=t.tweener??new Dr,this.ownsTweener=t.tweener===void 0,this.intent=t.intent??`decorative`,this.rest={y:e.y,rotation:e.rotation,scaleX:e.scale.x,scaleY:e.scale.y,skewX:e.skew.x}}squash(e){let{amount:t,duration:n}=e;return this.run(n,e=>{let n=Math.sin(Math.PI*e)*t;return{scaleX:1+n,scaleY:1-n}})}hop(e){let{height:t,duration:n}=e;return this.run(n,e=>({dy:-Math.sin(Math.PI*e)*t}))}bob(e){let{amplitude:t,period:n,cycles:r}=e;return r===void 0?this.loop(e=>({dy:Math.sin(2*Math.PI*e/n)*t})):this.run(n*r,e=>({dy:Math.sin(2*Math.PI*r*e)*t}))}wobble(e){let{angle:t,duration:n}=e;return this.run(n,e=>({rotation:Math.sin(4*Math.PI*e)*(1-e)*t}))}spin(e){let{turns:t,duration:n}=e;return this.run(n,e=>({rotation:Math.PI*2*t*e}),Er.easeInOutQuad)}shear(e){let{amount:t,duration:n}=e;return this.run(n,e=>({skewX:Math.sin(Math.PI*e)*t}))}flip(e,t){return e===`x`?this.flipX=t??!this.flipX:this.flipY=t??!this.flipY,this.write(),e===`x`?this.flipX:this.flipY}update(e){this.ownsTweener&&this.tweener.update(e);for(let t of[...this.loops])t(e)}get isBusy(){return this.contributions.size>0}destroy(){this.destroyed=!0,this.contributions.clear(),this.loops.clear(),this.flipX=this.flipY=!1,this.write()}run(e,t,n=Er.linear){if(this.destroyed)return oF;let r=this.nextId++,i=()=>{this.contributions.delete(r),this.write()};return this.contributions.set(r,aF),{done:this.tweener.tween(e,e=>{this.contributions.has(r)&&(this.contributions.set(r,{...aF,...t(e)}),this.write())},{ease:n,intent:this.intent}).then(i),cancel:i}}loop(e){if(this.destroyed)return oF;let t=this.nextId++,n=0,r,i=new Promise(e=>r=e),a=r=>{n+=r;let i=br()&&this.intent===`decorative`;this.contributions.set(t,i?aF:{...aF,...e(n)}),this.write()};return this.contributions.set(t,aF),this.loops.add(a),{done:i,cancel:()=>{this.loops.delete(a),this.contributions.delete(t),this.write(),r()}}}write(){let e=1,t=1,n=0,r=0,i=0;for(let a of this.contributions.values())e*=a.scaleX,t*=a.scaleY,n+=a.dy,r+=a.rotation,i+=a.skewX;let{rest:a,target:o}=this;o.y=a.y+n,o.rotation=a.rotation+r,o.scale.x=a.scaleX*e*(this.flipX?-1:1),o.scale.y=a.scaleY*t*(this.flipY?-1:1),o.skew.x=a.skewX+i}};function cF(e,t){let n=e??{x:0,y:0};if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw RangeError(`a cloth ${t} needs finite coordinates, saw (${n.x}, ${n.y})`);return{x:n.x,y:n.y}}var lF=class{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a cloth needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a cloth needs height above 0, saw ${e.height}`);for(let t of[`segmentsX`,`segmentsY`])if(!Number.isInteger(e[t])||e[t]<1)throw RangeError(`a cloth needs integer ${t} of at least 1, saw ${e[t]}`);let t=e.stiffness??.9;if(!Number.isFinite(t)||t<0||t>1)throw RangeError(`a cloth needs stiffness between 0 and 1, saw ${t}`);let n=e.damping??.02;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a cloth needs damping between 0 and 1, saw ${n}`);this.segmentsX=e.segmentsX,this.segmentsY=e.segmentsY,this.stiffness=t,this.damping=n,this.gravity=cF(e.gravity,`gravity`),this.wind=cF(e.wind,`wind`);let r=this.pointCount;this.rest=new Float32Array(r*2),this.positions=new Float32Array(r*2),this.previous=new Float32Array(r*2),this.pinned=new Uint8Array(r),this.links=[];let i=e.width/e.segmentsX,a=e.height/e.segmentsY;for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++){let e=this.indexOf(n,t);this.rest[e*2]=n*i,this.rest[e*2+1]=t*a,t===0&&(this.pinned[e]=1)}this.reset();let o=(e,t)=>this.indexOf(e,t);for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<e.segmentsX;n++)this.links.push([o(n,t),o(n+1,t),i]);for(let t=0;t<e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++)this.links.push([o(n,t),o(n,t+1),a])}get pointCount(){return(this.segmentsX+1)*(this.segmentsY+1)}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>this.segmentsX||t>this.segmentsY)throw RangeError(`cloth point (${e}, ${t}) is outside a ${this.segmentsX+1}x${this.segmentsY+1} grid`);return t*(this.segmentsX+1)+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.pointCount)throw RangeError(`cloth point ${e} does not exist`)}pointPosition(e){return this.checkIndex(e),{x:this.positions[e*2],y:this.positions[e*2+1]}}isPinned(e){return this.checkIndex(e),this.pinned[e]===1}pointLinks(){return this.links.map(([e,t])=>[e,t])}pinPoint(e){this.checkIndex(e),this.pinned[e]=1,this.previous[e*2]=this.positions[e*2],this.previous[e*2+1]=this.positions[e*2+1]}unpinPoint(e){this.checkIndex(e),this.pinned[e]=0}setWind(e,t){let n=cF({x:e,y:t},`wind`);this.wind=n}setGravity(e,t){let n=cF({x:e,y:t},`gravity`);this.gravity=n}reset(){this.positions.set(this.rest),this.previous.set(this.rest)}movedCount(){let e=0;for(let t=0;t<this.pointCount;t++)this.positions[t*2]===this.rest[t*2]?this.positions[t*2+1]!==this.rest[t*2+1]&&e++:e++;return e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.positions.length)throw RangeError(`a cloth target needs a Float32Array of ${this.positions.length} floats, saw length ${e?.length}`);e.set(this.positions)}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a cloth update needs dt of at least 0, saw ${e}`);if(e===0)return;let t=1-this.damping,n=(this.gravity.x+this.wind.x)*e*e,r=(this.gravity.y+this.wind.y)*e*e,{positions:i,previous:a,pinned:o}=this;for(let e=0;e<this.pointCount;e++){if(o[e]===1)continue;let s=i[e*2],c=i[e*2+1];i[e*2]=s+(s-a[e*2])*t+n,i[e*2+1]=c+(c-a[e*2+1])*t+r,a[e*2]=s,a[e*2+1]=c}for(let e=0;e<2;e++)this.relax()}relax(){let{positions:e,pinned:t,stiffness:n}=this;if(n!==0)for(let[r,i,a]of this.links){let o=e[i*2]-e[r*2],s=e[i*2+1]-e[r*2+1],c=Math.hypot(o,s);if(c===0)continue;let l=(c-a)/c*n,u=t[r]===1,d=t[i]===1;if(u&&d)continue;let f=u?0:d?1:.5,p=d?0:u?1:.5;e[r*2]+=o*l*f,e[r*2+1]+=s*l*f,e[i*2]-=o*l*p,e[i*2+1]-=s*l*p}}},uF=class extends _j{constructor(e,t={}){let n=t.segmentsX??8,r=t.segmentsY??8,i=new lF({width:e.width,height:e.height,segmentsX:n,segmentsY:r,stiffness:t.stiffness,damping:t.damping,gravity:t.gravity,wind:t.wind});super({texture:e,verticesX:n+1,verticesY:r+1}),this.cloth=i,this.intent=t.intent??`decorative`,this.autoResize=!1,this.sync()}get segmentsX(){return this.cloth.segmentsX}get segmentsY(){return this.cloth.segmentsY}get pointCount(){return this.cloth.pointCount}indexOf(e,t){return this.cloth.indexOf(e,t)}pointPosition(e){return this.cloth.pointPosition(e)}isPinned(e){return this.cloth.isPinned(e)}movedCount(){return this.cloth.movedCount()}pinPoint(e){this.cloth.pinPoint(e)}unpinPoint(e){this.cloth.unpinPoint(e)}setWind(e,t){this.cloth.setWind(e,t)}setGravity(e,t){this.cloth.setGravity(e,t)}update(e){br()&&this.intent===`decorative`||(this.cloth.update(e),this.sync())}sync(){let e=this.geometry.getAttribute(`aPosition`);this.cloth.writePositions(e.buffer.data),e.buffer.update()}},dF=class extends Z{constructor(e){super(),this.spring=e.spring,this.color=e.color??16777215,this.opacity=e.alpha??1,this.lineWidth=e.lineWidth??2,this.sync()}sync(){let e=this.spring.anchorPosition,t=this.spring.position;this.clear(),this.moveTo(e.x,e.y).lineTo(t.x,t.y).stroke({color:this.color,width:this.lineWidth,alpha:this.opacity})}},fF=.35,pF=.12;function mF(e,t,n){let r=Math.sin(e*127.1+t*311.7+n*74.7)*43758.5453;return r-Math.floor(r)}function hF(e,t,n){let r=Math.floor(e),i=Math.floor(t),a=e-r,o=t-i,s=a*a*(3-2*a),c=o*o*(3-2*o),l=mF(r,i,n)+(mF(r+1,i,n)-mF(r,i,n))*s,u=mF(r,i+1,n)+(mF(r+1,i+1,n)-mF(r,i+1,n))*s;return Math.min(1,Math.max(0,l+(u-l)*c))}function gF(e,t,n,r){if(![e,t,n,r].every(Number.isFinite))throw RangeError(`a haze sample needs finite x, y, time and seed, saw (${e}, ${t}, ${n}, ${r})`);let i=e+n*fF,a=t+n*pF;return hF(i/8,a/8,r)*.65+hF(i/3+11,a/3+7,r+1)*.35}function _F(e,t,n,r){if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*n*4)throw RangeError(`haze needs a pixel buffer of ${t*n*4} bytes`);if(!Number.isFinite(r.time)||!Number.isFinite(r.seed))throw RangeError(`haze needs a finite time and seed, saw (${r.time}, ${r.seed})`);if(!Number.isFinite(r.density)||r.density<0||r.density>1)throw RangeError(`haze needs density between 0 and 1, saw ${r.density}`);let i=r.drift??{x:0,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`haze needs a finite drift, saw (${i.x}, ${i.y})`);for(let a=0;a<n;a++)for(let n=0;n<t;n++){let o=Math.round(255*r.density*gF(n+i.x*r.time,a+i.y*r.time,r.time,r.seed));e.set([255,255,255,o],(a*t+n)*4)}}var vF=class extends wl{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a haze sheet needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a haze sheet needs height above 0, saw ${e.height}`);let t=e.cellsX??64,n=e.cellsY??36;if(!Number.isInteger(t)||t<1)throw RangeError(`a haze sheet needs integer cellsX of at least 1, saw ${t}`);if(!Number.isInteger(n)||n<1)throw RangeError(`a haze sheet needs integer cellsY of at least 1, saw ${n}`);let r=e.density??.5;if(!Number.isFinite(r)||r<0||r>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${r}`);let i=e.drift??{x:.25,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`a haze sheet needs a finite drift, saw (${i.x}, ${i.y})`);if(e.seed!==void 0&&!Number.isFinite(e.seed))throw RangeError(`a haze sheet needs a finite seed, saw ${e.seed}`);let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw Error(`HazeLayer needs a 2D canvas context`);super(q.from(a)),this.time=0,this.context=o,this.image=o.createImageData(t,n),this.cellsX=t,this.cellsY=n,this.density=r,this.drift={...i},this.seed=e.seed??1,this.intent=e.intent??`decorative`,this.tint=e.tint??16777215,this.alpha=e.opacity??1,this.scale.set(e.width/t,e.height/n),this.eventMode=`none`,this.refresh()}get elapsed(){return this.time}setDensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${e}`);this.density=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a haze update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.time+=e),this.refresh()}refresh(){_F(this.image.data,this.cellsX,this.cellsY,{time:this.time,density:this.density,seed:this.seed,drift:this.drift}),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}};function yF(e){if(!Number.isInteger(e)||e<0||e>16777215)throw RangeError(`a glow needs an integer color between 0x000000 and 0xffffff, saw ${e}`);return[e>>16&255,e>>8&255,e&255]}function bF(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||t<=0)throw RangeError(`a glow falloff needs a finite distance and a radius above 0, saw (${e}, ${t})`);if(e<=0)return 1;if(e>=t)return 0;let n=1-e/t*(e/t);return n*n}function xF(e,t,n){if(!Number.isInteger(t)||t<1)throw RangeError(`a glow needs an integer size of at least 1, saw ${t}`);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*t*4)throw RangeError(`a glow needs a pixel buffer of ${t*t*4} bytes`);if(!Number.isFinite(n.radius)||n.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${n.radius}`);if(!Number.isFinite(n.intensity)||n.intensity<0||n.intensity>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n.intensity}`);let[r,i,a]=yF(n.color),o=(t-1)/2;for(let s=0;s<t;s++)for(let c=0;c<t;c++){let l=bF(Math.hypot(c-o,s-o),n.radius)*n.intensity;e.set([Math.round(r*l),Math.round(i*l),Math.round(a*l),Math.round(255*l)],(s*t+c)*4)}}var SF=class e extends wl{constructor(t){if(!Number.isFinite(t.radius)||t.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${t.radius}`);let n=t.intensity??1;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n}`);let r=t.flicker??{amount:0,frequency:1};if(!Number.isFinite(r.amount)||r.amount<0||r.amount>1)throw RangeError(`a glow needs a flicker amount between 0 and 1, saw ${r.amount}`);if(!Number.isFinite(r.frequency)||r.frequency<=0)throw RangeError(`a glow needs a flicker frequency above 0, saw ${r.frequency}`);let i=e.paintCanvas(t.color,t.radius);super(q.from(i)),this.clock=0,this.canvas=i,this.color=t.color,this.radius=t.radius,this.peak=n,this.flickerAmount=r.amount,this.flickerFrequency=r.frequency,this.intent=t.intent??`decorative`,this.blendMode=`add`,this.anchor.set(.5),this.eventMode=`none`,this.alpha=this.peak}get elapsed(){return this.clock}setColor(e){yF(e),this.color=e,this.repaint()}setRadius(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`a glow needs a radius above 0, saw ${e}`);this.radius=e,this.repaint()}setIntensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${e}`);this.peak=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a glow update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.clock+=e);let t=1+this.flickerAmount*Math.sin(2*Math.PI*this.flickerFrequency*this.clock);this.alpha=Math.min(1,Math.max(0,this.peak*t))}static paintCanvas(e,t){let n=Math.ceil(t)*2+1,r=document.createElement(`canvas`);r.width=n,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`NeonGlow needs a 2D canvas context`);let a=i.createImageData(n,n);return xF(a.data,n,{color:e,radius:t,intensity:1}),i.putImageData(a,0,0),r}repaint(){let t=this.texture;this.canvas=e.paintCanvas(this.color,this.radius),this.texture=q.from(this.canvas),t.destroy(!0)}destroy(){super.destroy({texture:!0,textureSource:!0})}},CF=EF(),wF=new Map(CF.map((e,t)=>[TF(e),t]));function TF(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function EF(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=TF(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function DF(e){return wF.get(TF(e))}function OF(e,t,n,r){if(r.length!==CF.length)throw Error(`autotileFrames needs exactly ${CF.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;i[o]=n(t,a)?r[DF({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]:-1}return i}_e();function kF(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function AF(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function jF(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function MF(e,t,n,r,i=kF,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return jF(e,r(t+s.dx,n+s.dy))})}function NF(e,t,n,r,i={}){let a=i.rotate??kF,o=i.random??new j,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!MF(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[PF(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function PF(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var FF=class extends J{};function IF(e,t){let n={};for(let r of t){let t=new FF;t.label=r,e.addChild(t),n[r]=t}return n}var LF=class extends Z{dashedLine(e,t,n,r,i=6,a=4){let o=Math.hypot(n-e,r-t);if(o===0||i<=0)return this;let s=(n-e)/o,c=(r-t)/o;for(let n=0;n<o;n+=i+Math.max(0,a)){let r=Math.min(n+i,o);this.moveTo(e+s*n,t+c*n).lineTo(e+s*r,t+c*r)}return this}},RF=class extends jA{},zF=class extends wl{},BF=class extends dA{},VF=wC,HF=class extends FF{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>xN(e,q.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new zF(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},UF=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function WF(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function GF(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var KF=536870911,qF={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function JF(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function YF(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function XF(e,t){let n=e.orientation??`orthogonal`,r=qF[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof UN){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);JF(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return JF(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new RP({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&KF;if(n===0)return-1;let r=YF(n,o,t.name);return o.length===1?n-o[0]:FP(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}async function ZF(e,t){if(t.mixer&&t.mixer.skeleton!==t.skeleton)throw Error(`SVG skeleton mixer must use the supplied skeleton`);let n=await LN(e),r=new DOMParser().parseFromString(n,`image/svg+xml`),i=r.documentElement;if(r.querySelector(`parsererror`)||i.localName!==`svg`)throw Error(`SVG skeleton needs a valid svg root`);let a=i.getAttribute(`viewBox`)?.trim().split(/[\s,]+/).map(Number)??[0,0,Number(i.getAttribute(`width`)),Number(i.getAttribute(`height`))];if(a.length!==4||!a.every(Number.isFinite)||a[2]<=0||a[3]<=0)throw Error(`SVG skeleton needs a finite viewBox or positive numeric width and height`);let o=new Map;for(let e of i.querySelectorAll(`g[id]`)){if(o.has(e.id))throw Error(`duplicate SVG skeleton group ${e.id}`);o.set(e.id,e)}let s=new Map(YM(t.skeleton).map(e=>[e.name,e])),c=t.bindings??[...o.keys()].filter(e=>s.has(e)).map(e=>({bone:e}));if(!c.length)throw Error(`SVG skeleton found no matching bone groups`);let l=new Set(c.map(e=>e.group??e.bone)),u=new Set,d=[],f=new XMLSerializer;for(let e of c){let n=e.group??e.bone;if(u.has(e.bone))throw Error(`duplicate SVG binding for bone ${e.bone}`);u.add(e.bone);let c=s.get(e.bone);if(!c)throw Error(`SVG binding names no bone ${e.bone}`);let p=o.get(n);if(!p)throw Error(`SVG skeleton missing group ${n}`);let m=e.pivot??t.pivots?.[n]??{x:p.hasAttribute(`data-pivot-x`)?Number(p.getAttribute(`data-pivot-x`)):NaN,y:p.hasAttribute(`data-pivot-y`)?Number(p.getAttribute(`data-pivot-y`)):NaN},h=e.rotation??c.angle;if(![m.x,m.y,h].every(Number.isFinite))throw Error(`SVG skeleton group ${n} needs a finite pivot and rest angle`);let g=Math.max(Math.abs(a[0]-m.x),Math.abs(a[0]+a[2]-m.x)),_=Math.max(Math.abs(a[1]-m.y),Math.abs(a[1]+a[3]-m.y)),v=Math.ceil(Math.hypot(g,_))+1,y=i.cloneNode(!1);y.setAttribute(`viewBox`,`${-v} ${-v} ${v*2} ${v*2}`),y.setAttribute(`width`,String(v*2)),y.setAttribute(`height`,String(v*2));for(let e of i.querySelectorAll(`defs, style`))y.appendChild(e.cloneNode(!0));let b=p.cloneNode(!0);for(let e of b.querySelectorAll(`g[id]`))l.has(e.id)&&e.remove();let x=b;for(let e=p.parentElement;e&&e!==i;e=e.parentElement){let t=e.cloneNode(!1);t.appendChild(x),x=t}let S=r.createElementNS(i.namespaceURI,`g`);S.setAttribute(`id`,`mwg-part`),S.setAttribute(`transform`,`rotate(${-h}) translate(${-m.x} ${-m.y})`),S.appendChild(x),y.appendChild(S),d.push({bone:e.bone,svg:f.serializeToString(y)})}let p=Object.create(null);for(let e of d)p[e.bone]=(await zN(e.svg,{resolution:t.resolution}))[`mwg-part`];let m=new sN(t.skeleton,t.mixer);for(let e of d){let t=m.bind(e.bone,p[e.bone]);t.anchor.set(.5),t.label=e.bone}return m.apply({}),{sprite:m,textures:Object.freeze(p)}}var QF={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},$F={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:QF.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},eI=QF;function Q(){return eI}var $=new p;function tI(e){eI={...QF,...e,font:{...QF.font,...e.font},color:{...QF.color,...e.color}},$.dispatch(eI)}function nI(e){return typeof e==`string`?{text:e}:e}function rI(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function iI(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function aI(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),sI(e)}function oI(e){e.revealed=e.total}function sI(e){return e.revealed>=e.total}var cI=class extends jA{constructor(e={}){let t=nI(e),n=Q();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new aO({fontFamily:n.font.family,stroke:t.stroke,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:rI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,$.add(this.themeListener)}setColor(e){this.destroyed||(this.style.fill=e)}setWrapWidth(e){this.destroyed||(this.style.wordWrap=e!==void 0,this.style.wordWrapWidth=e??0)}setText(e){this.destroyed||(this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e))}showProgressive(e,t){this.destroyed||(this.revealSource=e,this.reveal=iI(e.length,t),this.renderRevealed())}updateReveal(e){if(this.destroyed||!this.reveal)return!0;let t=aI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){!this.destroyed&&this.reveal&&(oI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.destroyed||(this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=rI(this.opts,e)))}destroy(e){$.remove(this.themeListener),super.destroy(e)}},lI={positive:5627255,negative:16733525,warning:16757575};function uI(e,t){return t>0?e.slice(Math.max(0,e.length-Math.floor(t))):[]}function dI(e,t){let n=0;for(let t of e)n+=t;let r=0;for(;n>t&&r<e.length-1;)n-=e[r++];return r}var fI=class extends J{constructor(e){super(),this.blocks=[],this.options=e,this.maxLines=e.maxLines??3}get entryCount(){return this.blocks.length}get contentHeight(){return this.blocks.reduce((e,t)=>e+t.label.height,0)}lastEntries(e){return uI(this.blocks.map(e=>({text:e.text,level:e.level})),e)}add(e,t=`info`){let n=new cI({text:e,size:this.options.size,color:this.colorOf(t),wrapWidth:this.options.wrapWidth,resolution:this.options.resolution});this.addChild(n),this.blocks.push({label:n,level:t,text:e}),this.trim(),this.layout()}setMaxLines(e){this.maxLines=Math.max(1,Math.floor(e)),this.trim(),this.layout()}setWrapWidth(e){this.options.wrapWidth=e;for(let t of this.blocks)t.label.style.wordWrapWidth=e;this.trim(),this.layout()}clear(){for(let e of this.blocks.splice(0))e.label.destroy()}colorOf(e){let t=this.options.colors?.[e];return t===void 0?e===`info`?Q().color.text:e===`highlight`?Q().color.textHighlight:lI[e]:t}linesOf(e){let t=Number(e.style.lineHeight)||Number(e.style.fontSize)||1;return Math.max(1,Math.round(e.height/t))}trim(){let e=dI(this.blocks.map(e=>this.linesOf(e.label)),this.maxLines);for(let t of this.blocks.splice(0,e))t.label.destroy()}layout(){let e=0;for(let t of this.blocks)t.label.position.set(0,e),e+=t.label.height}};function pI(e,t,n){let r=Math.max(1,Math.floor(e));for(;r>1&&t*r>n;)r--;return r}function mI(e){let t=1;for(let n=e;n;n=n.parent)t*=Math.abs(n.scale.x);return t}function hI(e,t){let n=(e,r)=>{if(e instanceof jA){let n=t*Math.max(1,Math.round(r));e.resolution!==n&&(e.resolution=n)}for(let t of e.children)n(t,r*Math.abs(t.scale.x))};n(e,mI(e))}var gI=``,_I=``,vI=``;function yI(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?gI:r===`_`?_I:vI,n++}else t+=e[n];return t}function bI(e){return e.replaceAll(gI,`*`).replaceAll(_I,`_`).replaceAll(vI,`\\`)}function xI(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function SI(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&xI(e[i-1])&&xI(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function CI(e,t,n,r,i,a){let o=SI(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function wI(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function TI(e){let t=yI(e),n=[],r=[];CI(t,`*`,!0,`bold`,n,r),CI(t,`_`,!0,`bold`,n,r),CI(t,`*`,!1,`italic`,n,r),CI(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return wI(o).map(e=>({...e,text:bI(e.text)}))}function EI(e){return TI(e).map(e=>e.text).join(``)}function DI(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var OI=class extends mj{constructor(e={}){let t=nI(e),n=Q(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:kI(t.text??``,r),resolution:t.resolution,style:new ZA({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:rI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,$.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=kI(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=TI(e),this.reveal=iI(EI(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=aI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(oI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=AI(DI(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=rI(this.opts,e))}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function kI(e,t){return AI(TI(e),t)}function AI(e,t){return e.map(e=>{let n=jI(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function jI(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var MI=new Set([`b`,`i`,`span`,`br`,`img`]);function NI(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=GI(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=KI(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=UI(e,t);if(n&&(MI.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=WI(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1370
|
-
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=
|
|
1371
|
-
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})}):r.push({...t});let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:RI(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function RI(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function zI(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function BI(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function VI(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=HI(n,`color`),i=Number(HI(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function HI(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function UI(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function WI(e,t){if(t.selfClosing){let e=HI(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function GI(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function KI(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var qI=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild(Q()),$.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild(Q())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>xN(e,q.EMPTY)),o=YI(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=zI(LI(NI(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return QI(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:XI(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:ZI(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new RF({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=QI(r,t),a=new zF(r);return a.width=i.width,a.height=i.height,a}destroy(e){$.remove(this.themeListener),super.destroy(e)}},JI=null;function YI(){return typeof document>`u`?null:(JI??=document.createElement(`canvas`).getContext(`2d`),JI)}function XI(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function ZI(e){return e===`italic`||e===`oblique`}function QI(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var $I=class extends WA{constructor(e={}){let t=nI(e),n=Q();super({text:t.text??``,style:eL(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,$.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=eL(this.opts,e)}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function eL(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:rI(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var tL=class extends J{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new kj({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},nL=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,rL=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,nL),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},iL=new rL,aL=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.closeMark=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=Q();this.colors={...e.colors},this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new tL(t.panel,{border:t.panelBorder}):new Z,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new cI({text:e.title,color:this.colors.title??t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),iL.announce(e.title)),e.closeButton===!0&&this.closable&&(this.closeMark=new cI({text:`✕`,color:this.colors.title??t.color.textHighlight,bold:!0}),this.closeMark.eventMode=`static`,this.closeMark.cursor=`pointer`,this.closeMark.on(`pointertap`,()=>this.close()),this.addChild(this.closeMark)),this.addChild(this.content),this.resize(e.width,e.height),$.add(this.themeListener)}restyle(){this.titleLabel?.setColor(this.colors.title??Q().color.textHighlight),this.closeMark?.setColor(this.colors.title??Q().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=Q(),r=(this.background instanceof tL?this.background.border.left:2)+n.padding;this.background instanceof tL?(this.background.resize(e,t),this.background.tint=this.colors.background??16777215):this.background.clear().roundRect(0,0,e,t,4).fill({color:this.colors.background??n.color.panelFill}).stroke({color:this.colors.border??n.color.panelBorder,width:1}),this.closeMark&&(this.closeMark.x=n.direction===`rtl`?r:e-r-this.closeMark.width,this.closeMark.y=r);let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}setColors(e){this.colors={...e},this.restyle()}handleAction(e){return this.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){}close(){this.isClosed||(this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0}))}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=Q().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new G(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,$.remove(this.themeListener),super.destroy(e)}},oL=class extends J{constructor(){super(),this.windows=[],this.overlay=new Z,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),P.add(this.listener),$.add(this.themeListener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){if(e.closed)throw Error(`cannot open a window that was already closed`);return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);e===-1?this.overlay.visible=!1:(this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1)))}drawOverlay(){let e=Q();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){P.remove(this.listener),$.remove(this.themeListener),super.destroy(e)}},sL=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},cL=class extends J{constructor(e){super(),this.selection=new sL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new Z,this.mask_=new Z,this.scroll=0,this.themeListener=()=>this.restyle(),this.checked=new Set,this.ticks=[];let t=Q();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onToggle=e.onToggle??null,this.multiple=e.multiple??!1,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}restyle(){let e=Q();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof cI);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+this.checkAdvance()+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.checkAdvance()-this.rowHeight:e.spacing+this.checkAdvance())}),this.updateTicks(),this.refresh()}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=Q(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.checkAdvance()-this.rowHeight:t.spacing+this.checkAdvance(),i.addChild(e.icon));let a=new cI({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+this.checkAdvance()+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.selection.reset(e),this.checked.clear(),this.rebuildTicks(),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.multiple?this.toggleChecked(this.selection.selectedIndex):this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}get checkedIndexes(){return[...this.checked].sort((e,t)=>e-t)}isChecked(e){return this.checked.has(e)}setChecked(e,t){let n=this.selection.items[e];n&&!n.disabled&&this.checked.has(e)!==t&&(t?this.checked.add(e):this.checked.delete(e),this.updateTicks(),this.onToggle?.(n,e,t))}toggleChecked(e){let t=this.selection.items[e];return!t||t.disabled?!1:(this.setChecked(e,!this.checked.has(e)),!0)}clearChecked(){this.checked.size!==0&&(this.checked.clear(),this.updateTicks())}checkAdvance(){return this.multiple?this.checkBox()+Q().spacing:0}checkBox(){return Math.max(12,this.rowHeight-8)}rebuildTicks(){if(this.ticks=[],this.multiple){for(let e of this.rows){let t=new Z;e.addChildAt(t,0),this.ticks.push(t)}this.updateTicks()}}updateTicks(){let e=Q(),t=e.direction===`rtl`,n=this.checkBox(),r=Math.round((this.rowHeight-n)/2);this.ticks.forEach((i,a)=>{let o=this.selection.items[a]?.disabled??!0;if(i.clear().rect(0,0,n,n).fill({color:e.color.panelFill}).stroke({color:o?e.color.textDim:e.color.panelBorder,width:2}),this.checked.has(a)){let t=n*.25;i.moveTo(t,n*.55).lineTo(n*.45,n-t).lineTo(n-t,t).stroke({color:o?e.color.textDim:e.color.textHighlight,width:Math.max(2,n*.12),cap:`round`,join:`round`})}i.x=t?this.viewWidth-e.spacing-n:e.spacing,i.y=r})}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,n-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=Q();n===0?this.highlight.clear():this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},lL=class extends J{columnX(e){return(Q().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new sL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new Z,this.pickupHighlight=new Z,this.mask_=new Z,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=Q();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof cI)?.setColor(e.color.textHighlight))}),this.refresh()},this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=Q();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new cI({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(Q().direction===`rtl`?1:-1,0);case`right`:return this.move(Q().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-e+1),this.scrollRow=Math.max(0,Math.min(this.scrollRow,Math.max(0,this.rows-e))),this.cellsLayer.y=-this.scrollRow*this.cellSize;let r=Q();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},uL=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function dL(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1372
|
-
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=
|
|
1369
|
+
`}},oM=class extends nf{constructor(e){super({glProgram:Ym({name:`color-transform-batch`,bits:[Qm,iM,ih(e),ph]}),gpuProgram:Jm({name:`color-transform-batch`,bits:[Zm,aM,nh(e),fh]}),resources:{batchSamplers:jg(e)}}),this.maxTextures=e}},sM=7,cM=class extends If{constructor(){let e=new kf({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Df.VERTEX|Df.COPY_DST,shrinkToFit:!1}),t=new kf({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Df.INDEX|Df.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},lM=0,uM=e=>e.colorAdd??lM;function dM(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){e[n]=r*l+a*u+s,e[n+1]=o*u+i*l+c,e[n+2]=d,e[n+3]=f,t[n+4]=p,t[n+5]=m,t[n+6]=h}var fM=class e extends Tg{static{this.extension={type:[I.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new cM,this.name=e.extension.name,this.vertexSize=sM,this.shader=new oM(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=uM(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=uM(e),y=i<<16|e.roundPixels&65535;dM(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,m,h,f.x3,f.y3,_,y,v)}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new oM(e))}destroy(){this.shader.destroy(),super.destroy()}},pM=`mwg-tinted-sprite`;function mM(e){e.renderPipeId=pM}var hM=class{static{this.extension={type:[I.WebGLPipes,I.WebGPUPipes,I.CanvasPipes],name:pM}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new gM;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},gM=class{constructor(){this.batcherName=fM.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},_M=!1;function vM(){_M||(_M=!0,L.add(fM),L.add(hM))}function yM(e,t,n,r=0){return(xM(r)<<24|xM(n)<<16|xM(t)<<8|xM(e))>>>0}function bM(e,t){return yM((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function xM(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var SM=lM;vM();var CM=class extends wl{constructor(e){super(e),this._colorAdd=0,mM(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=yM(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=bM(e,t)}silhouette(e){this.tint=0,this.colorAdd=bM(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function wM(e){return[e>>16&255,e>>8&255,e&255]}function TM(e){let[t,n,r]=wM(e);return Math.floor((t+n+r)/3)}function EM(e,t,n){return Math.trunc(n*e+(1-n)*t)}function DM(e,t,n){let[r,i,a]=wM(e),[o,s,c]=wM(t);return EM(r,o,n)<<16|EM(i,s,n)<<8|EM(a,c,n)}function OM(e,t){let n=e.length>0?TM(e[0]):255;return{from:e,to:e.map(e=>{let r=TM(e);return n!==0&&r<=n?DM(t.mid,t.min,r/n):DM(t.mid,t.max,(255-r)/(255-n))})}}function kM(e,t,n=`exact`){let r=t.from.map(wM),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=wM(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=wM(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function AM(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),q.from(o)}function jM(e,t,n={},r=`exact`){return AM(e,n,(e,n,i)=>{let a=kM(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function MM(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function NM(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function PM(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function FM(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function IM(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function LM(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function RM(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function zM(e,t){let n=new Bk;n.matrix=t,e.filters=[n]}function BM(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function VM(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function HM(e,t,n=1){let r=NM(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=NM(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(NM(t,`GS`)){let t=new Bk;t.greyscale(1,!1),e.filters=[...e.filters??[],t]}let a=NM(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new Bk;n.matrix=FM(t[0],t[1],t[2]),e.filters=[...e.filters??[],n]}}let o=NM(t,`R`),s=NM(t,`G`),c=NM(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new Bk;i.matrix=IM({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),e.filters=[...e.filters??[],i]}let l=NM(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new Bk;n.matrix=RM(t),e.filters=[...e.filters??[],n]}let u=NM(t,`O`);if(u){let t=BM(u.args[0]);t!==void 0&&(e.alpha*=Math.min(1,Math.max(0,t)))}}function UM(e,t,n={},r=1){e.texture=JM(e.texture,t,n),HM(e,t,r)}function WM(e,t){let n=NM(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new q({source:e.source,frame:new G(i,a,o,s)}):e}function GM(e,t){let n=e.trim();return VM(n)??t?.(n)}function KM(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=GM(e,t),s=GM(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function qM(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>GM(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function JM(e,t,n={}){let r=e,i=NM(t,`RC`);if(i&&i.args.length>0){let e=KM(i.args,n.resolveColor);e.from.length>0&&(r=jM(r,e,n,`exact`))}let a=NM(t,`PAL`);if(a){let e=qM(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=jM(r,e,n,`exact`))}let o=NM(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=AM(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=NM(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=AM(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=YM(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=XM(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=NM(t,`BLEND`);if(c){let e=GM(c.args[0]??``,n.resolveColor),t=BM(c.args[1]);e!==void 0&&t!==void 0&&(r=AM(r,n,(n,r,i)=>{let a=ZM(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=NM(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=YM(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=QM(o.getImageData(0,0,t,i).data,t,i,e,PM(l.args[1])),s=YM(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=q.from(s))}}}}return r}function YM(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function XM(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function ZM(e,t,n){let r=Math.min(1,Math.max(0,n)),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];s[t+3]=n,n===0?(s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2]):(s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r)}return s}function QM(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(y)$M(e,t,n,l,u,m,d);else{let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3]}}return{data:m,width:f,height:p}}function $M(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=kn(s+i,0,t-1),h=(kn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var eN=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>tN(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function tN(e){return e.texture!==void 0}var nN=class extends CM{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new eN(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}};function rN(e,t,n,r){return t>=e.x-r&&t<=e.x+e.width+r&&n>=e.y-r&&n<=e.y+e.height+r}function iN(e,t,n,r=0){return rN(e.view,t,n,r)}var aN=class{constructor(){this.members=[]}get size(){return this.members.length}add(e){return this.members.includes(e)||this.members.push(e),this}remove(e){let t=this.members.indexOf(e);return t<0?!1:(this.members.splice(t,1),!0)}clear(){this.members.length=0}update(e,t,n=0){let r=e.view;for(let e of[...this.members])rN(r,e.x,e.y,n)&&e.update(t)}};function oN(e){for(let t of[`columns`,`rows`])if(!Number.isInteger(e[t])||e[t]<2)throw RangeError(`a pinned deform grid needs integer ${t} of at least 2, saw ${e[t]}`);for(let t of[`width`,`height`])if(!Number.isFinite(e[t])||e[t]<=0)throw RangeError(`a pinned deform grid needs ${t} above 0, saw ${e[t]}`)}function sN(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw Error(`a deform control point needs finite coordinates, saw (${e}, ${t})`)}var cN=class{constructor(e){oN(e),this.columns=e.columns,this.rows=e.rows,this.width=e.width,this.height=e.height,this.rest=new Float32Array(this.count*2),this.offsets=new Float32Array(this.count*2);for(let e=0;e<this.rows;e++)for(let t=0;t<this.columns;t++){let n=(e*this.columns+t)*2;this.rest[n]=t/(this.columns-1)*this.width,this.rest[n+1]=e/(this.rows-1)*this.height}}get count(){return this.columns*this.rows}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>=this.columns||t>=this.rows)throw RangeError(`control point (${e}, ${t}) is outside a ${this.columns}x${this.rows} grid`);return t*this.columns+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.count)throw RangeError(`control point ${e} is outside a grid of ${this.count} points`)}restAt(e){return this.checkIndex(e),{x:this.rest[e*2],y:this.rest[e*2+1]}}at(e){return this.checkIndex(e),{x:this.rest[e*2]+this.offsets[e*2],y:this.rest[e*2+1]+this.offsets[e*2+1]}}isMoved(e){return this.checkIndex(e),this.offsets[e*2]!==0||this.offsets[e*2+1]!==0}movedCount(){let e=0;for(let t=0;t<this.count;t++)(this.offsets[t*2]!==0||this.offsets[t*2+1]!==0)&&e++;return e}drag(e,t,n){this.checkIndex(e),sN(t,n),this.offsets[e*2]=t-this.rest[e*2],this.offsets[e*2+1]=n-this.rest[e*2+1]}dragMany(e){for(let t of e)this.checkIndex(t.index),sN(t.x,t.y);for(let t of e)this.drag(t.index,t.x,t.y)}nudge(e,t,n){this.checkIndex(e),sN(t,n),this.offsets[e*2]+=t,this.offsets[e*2+1]+=n}reset(e){e===void 0?this.offsets.fill(0):(this.checkIndex(e),this.offsets[e*2]=0,this.offsets[e*2+1]=0)}rebase(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`rebase needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t of e)if(!Number.isFinite(t))throw Error(`rebase needs finite rest positions`);this.rest.set(e),this.offsets.fill(0)}positions(){let e=new Float32Array(this.rest.length);return this.writePositions(e),e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`a deform target needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t=0;t<this.rest.length;t++)e[t]=this.rest[t]+this.offsets[t]}},lN=class extends _j{constructor(e,t){let n=t?.columns??4,r=t?.rows??4,i=new cN({columns:n,rows:r,width:e.width,height:e.height});super({texture:e,verticesX:n,verticesY:r}),this.deform=i,this.autoResize=!1,this.deform.rebase(Float32Array.from(this.positionArray())),this.sync()}positionArray(){return this.geometry.getAttribute(`aPosition`).buffer.data}sync(){let e=this.geometry.getAttribute(`aPosition`);this.deform.writePositions(e.buffer.data),e.buffer.update()}get columns(){return this.deform.columns}get rows(){return this.deform.rows}get count(){return this.deform.count}indexOf(e,t){return this.deform.indexOf(e,t)}restAt(e){return this.deform.restAt(e)}vertexAt(e){return this.deform.at(e)}isMoved(e){return this.deform.isMoved(e)}movedCount(){return this.deform.movedCount()}dragVertex(e,t,n){this.deform.drag(e,t,n),this.sync()}dragVertices(e){this.deform.dragMany(e),this.sync()}nudgeVertex(e,t,n){this.deform.nudge(e,t,n),this.sync()}resetVertices(e){this.deform.reset(e),this.sync()}},uN=l({advance:()=>bN,advancePlayback:()=>gN,advancePose:()=>xN,boneOrder:()=>dN,create:()=>fN,createMixer:()=>_N,crossfadeTo:()=>vN,mixPoses:()=>yN,resolve:()=>pN,samplePose:()=>mN,sampleTransformPose:()=>hN,solveTwoBoneIK:()=>wN,validatePose:()=>CN});function dN(e){let t=new Map(e.bones.map(e=>[e.name,e])),n=[],r=new Set,i=new Set,a=e=>{if(!r.has(e.name)){if(i.has(e.name))throw Error(`skeleton cycle involving ${e.name}`);if(e.parent&&!t.has(e.parent))throw Error(`skeleton bone ${e.name} names no parent ${e.parent}`);if(e.parent){i.add(e.name);let n=t.get(e.parent);n&&a(n),i.delete(e.name)}r.has(e.name)||(r.add(e.name),n.push(e.name))}};for(let t of e.bones)a(t);return n}function fN(e){let t=new Set;for(let n of e){if(t.has(n.name))throw Error(`duplicate skeleton bone ${n.name}`);if(t.add(n.name),n.limits&&!(n.limits.min<=n.limits.max))throw Error(`invalid joint limits for bone ${n.name}`)}let n=dN({bones:e});for(let t of e)if(t.parent&&n.indexOf(t.parent)>=n.indexOf(t.name))throw Error(`skeleton bone ${t.name} cannot precede its parent ${t.parent}`);return{bones:e}}function pN(e,t={}){let n=typeof t.rotations==`object`?t.rotations:t,r=t.translations??{},i=t.scales??{},a=new Map(e.bones.map(e=>[e.name,e])),o=new Map;for(let t of dN(e)){let e=a.get(t);if(!e)throw Error(`skeleton bone ${t} went missing`);let s=e.parent?o.get(e.parent):void 0,c=(e.rotation??0)+(n[t]??0),l=(s?s.angle:0)+c,u=i[t]??{x:1,y:1},d=(s?s.scaleX:1)*u.x,f=(s?s.scaleY:1)*u.y,p=l*Math.PI/180,m={a:Math.cos(p)*d,b:Math.sin(p)*d,c:-Math.sin(p)*f,d:Math.cos(p)*f},h=s?{a:s.matrix.a,b:s.matrix.b,c:s.matrix.c,d:s.matrix.d}:{a:1,b:0,c:0,d:1},g=e.origin?.x??0,_=e.origin?.y??0,v=g+(r[t]?.x??0),y=_+(r[t]?.y??0),b=(s?s.tipX:0)+h.a*v+h.c*y,x=(s?s.tipY:0)+h.b*v+h.d*y;for(let e of[m.a,m.b,m.c,m.d])if(!Number.isFinite(e))throw Error(`invalid transform for bone ${t}`);o.set(t,{name:t,x:b,y:x,angle:l,scaleX:d,scaleY:f,matrix:m,tipX:b+m.a*(e.length??0),tipY:x+m.b*(e.length??0)})}return[...o.values()]}function mN(e,t,n){return{...hN(e,t,n).rotations}}function hN(e,t,n){let r=e.frames;if(!r.length)return n&&CN(n,{}),{rotations:{}};let i=e.loop&&e.duration>0?(t%e.duration+e.duration)%e.duration:t,a=r[0];if(!e.loop&&i>=e.duration)a=r[r.length-1];else if(i>=r[0].time){a=r[r.length-1];for(let e=1;e<r.length;e++)if(i<r[e].time){let t=r[e].time-r[e-1].time;a=SN(r[e-1],r[e],t>0?(i-r[e-1].time)/t:0,!0);break}}let o=SN(a,a,0,!0);return n&&CN(n,o.rotations),o}function gN(e,t){let n=e.clip,r=e.time+t*e.rate;return n.loop&&n.duration>0?(r%=n.duration,r<0&&(r+=n.duration)):r=Math.max(0,Math.min(n.duration,r)),{clip:n,time:r,rate:e.rate}}function _N(e,t,n=1){return{skeleton:e,base:{clip:t,time:0,rate:n},layers:[]}}function vN(e,t,n=.25,r=e.base.rate){n<=0?(e.base={clip:t,time:0,rate:r},e.crossfade=void 0):(e.crossfade={from:e.base,remaining:n,duration:n},e.base={clip:t,time:0,rate:r})}function yN(e,t){let n={rotations:e};for(let e of[...t].sort((e,t)=>e.priority-t.priority)){let t=Math.max(0,Math.min(1,e.weight));t&&(n=SN(n,{rotations:e.pose},t,!1))}return{...n.rotations}}function bN(e,t){return{...xN(e,t).rotations}}function xN(e,t){e.base=gN(e.base,t);for(let n of e.layers)n.playback=gN(n.playback,t);let n=hN(e.base.clip,e.base.time,e.skeleton);if(e.crossfade){let r=e.crossfade;r.from=gN(r.from,t),r.remaining=Math.max(0,r.remaining-t);let i=hN(r.from.clip,r.from.time,e.skeleton),a=r.duration>0?1-r.remaining/r.duration:1;n=SN(i,n,a,!0),r.remaining===0&&(e.crossfade=void 0)}for(let t of[...e.layers].sort((e,t)=>e.priority-t.priority))n=SN(n,hN(t.playback.clip,t.playback.time,e.skeleton),Math.max(0,Math.min(1,t.weight)),!1);return n}function SN(e,t,n,r){let i={...e.rotations};for(let a of new Set([...Object.keys(t.rotations),...r?Object.keys(e.rotations):[]]))i[a]=(e.rotations[a]??0)*(1-n)+(t.rotations[a]??0)*n;let a={rotations:i};for(let i of[`translations`,`scales`]){let o=e[i]??{},s=t[i]??{},c=+(i===`scales`),l={...o};for(let e of new Set([...Object.keys(s),...r?Object.keys(o):[]]))l[e]={x:(o[e]?.x??c)*(1-n)+(s[e]?.x??c)*n,y:(o[e]?.y??c)*(1-n)+(s[e]?.y??c)*n};Object.keys(l).length&&(a[i]=l)}return a}function CN(e,t){for(let n of e.bones){let e=(n.rotation??0)+(t[n.name]??0);if(!Number.isFinite(e))throw Error(`invalid rotation for bone ${n.name}`);if(n.limits&&(e<n.limits.min||e>n.limits.max))throw Error(`joint limit for bone ${n.name}: ${e} outside [${n.limits.min}, ${n.limits.max}]`)}}function wN(e,t,n,r,i=1,a={}){let o=e.bones.find(e=>e.name===t),s=e.bones.find(e=>e.name===n);if(!o||!s||s.parent!==t)throw Error(`IK chain ${t}/${n} must be connected`);if((s.origin?.x??0)!==0||(s.origin?.y??0)!==0)throw Error(`IK bone ${n} needs a zero origin`);let c=o.length??0,l=s.length??0;if(!(c>0&&l>0)||!Number.isFinite(c+l))throw Error(`IK chain ${t}/${n} needs positive finite lengths`);if(!Number.isFinite(r.x)||!Number.isFinite(r.y)||i!==1&&i!==-1)throw Error(`invalid IK target or bend for ${t}/${n}`);let u=pN(e,a),d=u.find(e=>e.name===t);if(!d)throw Error(`IK chain ${t}/${n} resolves no base`);let f=r.x-d.x,p=r.y-d.y,m=Math.hypot(f,p);if(m>c+l+1e-9||m<Math.abs(c-l)-1e-9)throw Error(`unreachable IK target for ${t}/${n}`);let h=i*Math.acos(Math.max(-1,Math.min(1,(m*m-c*c-l*l)/(2*c*l)))),g=Math.atan2(p,f)-Math.atan2(l*Math.sin(h),c+l*Math.cos(h)),_=o.parent?u.find(e=>e.name===o.parent):void 0,v=_?_.angle:0,y={...a,[t]:g*180/Math.PI-v-(o.rotation??0),[n]:h*180/Math.PI-(s.rotation??0)};return CN(e,y),y}var TN=class extends J{constructor(e,t){super(),this.parts=new Map,this.skeleton=e,this.mixer=t}bind(e,t){let n=new CM(t);return this.parts.set(e,n),this.addChild(n),n}part(e){return this.parts.get(e)}apply(e){let t=new Map(pN(this.skeleton,e).map(e=>[e.name,e]));for(let[e,n]of this.parts){let r=t.get(e);if(!r)throw Error(`skeletal sprite binds no bone named ${e}`);let{a:i,b:a,c:o,d:s}=r.matrix;n.setFromMatrix(new z(i,a,o,s,r.x,r.y))}if(this.diagnostics){this.setChildIndex(this.diagnostics,this.children.length-1);let e=this.diagnostics.clear();for(let n of t.values())e.moveTo(n.x,n.y).lineTo(n.tipX,n.tipY).stroke({color:65535,width:2}),e.circle(n.x,n.y,4).fill(16768256),e.circle(n.tipX,n.tipY,2).fill(16729224),e.moveTo(n.x-7,n.y).lineTo(n.x+7,n.y).moveTo(n.x,n.y-7).lineTo(n.x,n.y+7).stroke({color:16768256,width:1})}}setDiagnostics(e){e&&!this.diagnostics&&(this.diagnostics=this.addChild(new Z)),!e&&this.diagnostics&&(this.diagnostics.destroy(),this.diagnostics=void 0)}update(e){if(!this.mixer)throw Error(`a skeletal sprite without a mixer needs apply(pose)`);this.apply(bN(this.mixer,e))}},EN=class{constructor(e){if(this.points=[],this.previous=[],e.segments<2)throw Error(`an articulated chain needs at least two segments`);if(e.length<=0)throw Error(`an articulated chain needs a positive length`);this.length=e.length,this.stiffness=Math.max(0,Math.min(1,e.stiffness??1)),this.bendLimit=(e.bendLimit??90)*(Math.PI/180);for(let t=0;t<e.segments;t++)this.points.push({x:-t*e.length,y:0}),this.previous.push({x:-t*e.length,y:0})}pull(e,t){this.points[0].x=e,this.points[0].y=t}update(e){for(let e=0;e<this.points.length;e++)this.previous[e]={x:this.points[e].x,y:this.points[e].y};for(let e=1;e<this.points.length;e++){let t=this.previous[e-1],n=this.points[e],r=t.x-n.x,i=t.y-n.y,a=Math.hypot(r,i);if(a>this.length){let e=a>0?(a-this.length)/a:0;n.x+=r*e*this.stiffness,n.y+=i*e*this.stiffness}}for(let e=2;e<this.points.length;e++){let t=this.points[e-2],n=this.points[e-1],r=this.points[e],i=Math.atan2(n.y-t.y,n.x-t.x),a=Math.atan2(r.y-n.y,r.x-n.x)-i;for(;a>Math.PI;)a-=2*Math.PI;for(;a<-Math.PI;)a+=2*Math.PI;if(Math.abs(a)<=this.bendLimit)continue;let o=i+Math.sign(a)*this.bendLimit;r.x=n.x+Math.cos(o)*this.length,r.y=n.y+Math.sin(o)*this.length}}},DN=class extends J{constructor(e,t){if(super(),t.length!==e.points.length)throw Error(`a chain rig needs one texture per segment`);this.chain=e,this.segments=t.map(e=>{let t=new CM(e);return t.anchor.set(0,.5),this.addChild(t),t})}update(e){this.chain.update(e);for(let e=0;e<this.segments.length;e++){let t=this.chain.points[e],n=this.chain.points[e+1]??t;this.segments[e].position.set(t.x,t.y),this.segments[e].rotation=Math.atan2(n.y-t.y,n.x-t.x)}}},ON=``;function kN(e){ON=e.endsWith(`/`)||e===``?e:e+`/`}var AN;function jN(e){AN=e}function MN(){return AN||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function NN(){return MN()!==void 0}function PN(){return Object.keys(MN()??{})}function FN(e){let t=MN();return!t||e in t}function IN(e){if(/^(data|blob):/.test(e))return e;let t=MN();if(!t)return ON+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}var LN={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`,"image/gif":`gif`,"image/svg+xml":`svg`};async function RN(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!Ik.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=IN(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let r=/^data:([^;,]+)/.exec(t)?.[1],i=(r&&LN[r])??/\.([a-z0-9]+)$/i.exec(e)?.[1];i&&(n.format=i)}Ik.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?Ik.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await Ik.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function zN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function BN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function VN(e){return Ik.cache.has(e)}async function HN(e){let t=e.filter(e=>Ik.cache.has(e));t.length!==0&&await Ik.unload(t)}var UN=new Map;async function WN(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!UN.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(IN(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);UN.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function GN(e){let t=UN.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function KN(e){return UN.has(e)}function qN(e){for(let t of e)UN.delete(t)}var JN=[{name:`<script>`,pattern:/<script[\s/>]/i},{name:`<foreignObject>`,pattern:/<foreignobject[\s/>]/i},{name:`<iframe>`,pattern:/<iframe[\s/>]/i},{name:`<embed>`,pattern:/<embed[\s/>]/i},{name:`<object>`,pattern:/<object[\s/>]/i},{name:`an event-handler attribute`,pattern:/\son[a-z]+\s*=/i},{name:`a javascript: URL`,pattern:/javascript\s*:/i},{name:`a data: URL of an active type`,pattern:/data:(?:text\/html|application\/xml|image\/svg\+xml)/i}];function YN(e){for(let{name:t,pattern:n}of JN)if(n.test(e))throw Error(`SVG refused: contains ${t}`);return e}function XN(e){return`data:image/svg\+xml,${encodeURIComponent(e)}`}function ZN(e,t){let n=YN(e);if(t.length===0)throw Error(`SVG scale variants need at least one named scale`);let r=new Set;for(let e of t){if(!e.name)throw Error(`an SVG scale variant needs a name`);if(!Number.isFinite(e.resolution)||e.resolution<=0)throw Error(`SVG scale variant ${e.name} needs a positive resolution`);if(r.has(e.name))throw Error(`duplicate SVG scale variant ${e.name}`);r.add(e.name)}let i=XN(n);return t.map(e=>({name:e.name,src:i,resolution:e.resolution}))}function QN(e){let t=YN(e),n=/^([\s\S]*?)<svg([^>]*)>/i.exec(t),r=t.lastIndexOf(`</svg>`);if(!n||r<0)throw Error(`SVG group split needs an <svg> root`);let i=t.slice(n[0].length,r),a=[...i.matchAll(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi)].map(e=>e[0]).join(``),o=i.replace(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,``),s=Object.create(null),c=0;for(;c<o.length;){let e=/<g\b([^>]*?)(\/?)>/i.exec(o.slice(c));if(!e)break;let t=e[1],r=/\bid\s*=\s*["']([^"']+)["']/i.exec(t)?.[1],i=c+e.index+e[0].length;if(e[2]===`/`){if(!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}</svg>`,c=i;continue}let l=1,u=i,d=``;for(;l>0&&u<o.length;){let e=o.slice(u).match(/<g\b[^>]*>|<\/g\s*>/i);if(!e)throw Error(`SVG group ${r??`<unnamed>`} never closes`);e[0].startsWith(`</`)?(l--,l===0&&(d=e[0])):/\/\s*>$/.test(e[0])||l++,u+=e.index+e[0].length}if(l!==0)throw Error(`SVG group ${r??`<unnamed>`} never closes`);let f=o.slice(i,u-d.length);if(c=u,!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}${f}</g></svg>`}if(Object.keys(s).length===0)throw Error(`SVG group split found no named groups`);return s}var $N=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??RN,this.releaseAssets=e.release??HN}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function eP(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}async function tP(e){if(e.trimStart().startsWith(`<`))return YN(e);let t=IN(e);if(t.startsWith(`data:`)){let n=t.indexOf(`,`);if(n<0)throw Error(`invalid SVG data URI for ${e}`);return YN(/;base64/i.test(t.slice(0,n))?new TextDecoder().decode(Uint8Array.from(atob(t.slice(n+1)),e=>e.charCodeAt(0))):decodeURIComponent(t.slice(n+1)))}let n=await fetch(t);if(!n.ok)throw Error(`SVG failed to load ${e}: ${n.status}`);return YN(await n.text())}var nP=new WeakMap;async function rP(e,t={}){let n=t.resolution??1;if(!Number.isFinite(n)||n<=0)throw Error(`SVG parts need a positive finite resolution`);let r=QN(await tP(e)),i=t.groups??Object.keys(r);for(let e of i)if(!Object.hasOwn(r,e))throw Error(`SVG parts unknown group ${e}`);let a=Object.create(null);for(let e of i){let t=XN(r[e].replace(`</svg>`,`<!-- mwg-resolution:${n} --></svg>`)),i=`mwg-svg-part:${n}:${t}`;a[e]=await Ik.load({alias:i,src:t,format:`svg`,data:{resolution:n}}),nP.set(a[e],i)}return Object.freeze(a)}async function iP(e){for(let t of new Set(Object.values(e))){let e=nP.get(t);e&&(await Ik.unload(e),nP.delete(t))}}var aP=l({AssetStream:()=>$N,fetchWithByteProgress:()=>eP,get:()=>BN,getBinary:()=>GN,has:()=>FN,isBinaryLoaded:()=>KN,isCompiled:()=>NN,isLoaded:()=>VN,load:()=>RN,loadBinary:()=>WN,loadSvgParts:()=>rP,paths:()=>PN,release:()=>HN,releaseBinary:()=>qN,releaseSvgParts:()=>iP,resolve:()=>IN,sanitizeSvg:()=>YN,setAssetMap:()=>jN,setBase:()=>kN,splitSvgGroups:()=>QN,svgDataUri:()=>XN,svgScaleVariants:()=>ZN,texture:()=>zN});function oP(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var sP=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0,t>0&&(e.width%t!==0||e.height%n!==0)&&console.warn(`sprite sheet ${e.width}x${e.height} is not a whole number of ${t}x${n} frames; the frames will be cut from the wrong places`)}static grid(t,n=0,r=n){return new e(zN(t),n,r)}static strip(t,n){if(!(n>0))throw Error(`a sprite strip needs at least one frame`);let r=zN(t);return new e(r,r.width/n,r.height)}static fromTexture(t,n=0,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new q({source:this.texture.source,frame:new G(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new q({source:this.texture.source,frame:new G(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:oP(t.frame)}}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},cP=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.requestedZoom=1,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this.resolution=e.resolution??(()=>1),this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this.pixelPerfectTileSize?uP(this.requestedZoom,this.pixelPerfectTileSize,this.resolution()):this.requestedZoom}set zoom(e){this.requestedZoom=Math.max(.01,e)}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}fit(e,t){this.zoom=Math.min(this.viewWidth/e,this.viewHeight/t),this.snapTo(e/2,t/2)}get view(){let e=this.viewWidth/this.zoom,t=this.viewHeight/this.zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){br()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this.zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this.zoom*this.deadzone/2,n=this.viewHeight/this.zoom*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=br()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=lP(this._angle,this.targetAngle),n=br()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this.zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this.zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this.zoom,s=(t-this.screenY-this.viewHeight/2)/this.zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}clampedCentre(e,t){if(!this.bounds)return{x:e,y:t};let n=this.viewWidth/this.zoom/2,r=this.viewHeight/this.zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;return{x:o-i<n*2?(i+o)/2:kn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:kn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);this.world.scale.set(this.zoom),this._angle===0?(this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2-e*this.zoom),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2-t*this.zoom)):(this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2))}snapToDevice(e){let t=this.resolution();return Math.round(e*t)/t}};function lP(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function uP(e,t,n=1){return Math.max(1,Math.round(e*t*n))/(t*n)}function dP(e={}){let t=nM.current,n=new cP({resolution:()=>t.app.renderer.resolution,...e});return n.setViewport(t.width,t.height),n}var fP=class{constructor(e){this.container=new J,this.clip=new Z,this.camera=new cP(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function pP(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var mP={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function hP(e){let t=new Bk;return t.matrix=mP[e],t}function gP(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function _P(e,t,n,r=`square`){return r===`hex`?$n(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var vP=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new Z,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=h_.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new wl(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=gP(e,this.drawn);if(n.length===0)return;let r=new Z;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=_P(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}nM.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=_P(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),nM.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},yP=24,bP=48,xP=[0,16,48,80];function SP(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function CP(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function wP(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function TP(e,t){let n=xP[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function EP(e,t,n,r){if(SP(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(CP(t),SP(`RPG Maker autotile shape`,n),wP(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=TP(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*bP,destinationY:Math.floor(e/16)*bP,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*yP,sourceY:(a*2+t)*yP,destinationX:n%2*yP,destinationY:Math.floor(n/2)*yP}))}}var DP=class{constructor(e){this.cache=new Map,this.table=e,wP(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=EP(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}},OP=[2048,2816,4352,5888],kP=[768,1536,1536,2304];function AP(e){if(!Number.isInteger(e))return null;for(let t=0;t<4;t++)if(e>=OP[t]&&e<OP[t]+kP[t])return t;return null}var jP=[[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]],MP=[[[2,2],[1,2],[2,1],[1,1]],[[0,2],[1,2],[0,1],[1,1]],[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,2],[3,2],[2,1],[3,1]],[[0,2],[3,2],[0,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[0,2],[1,2],[0,3],[1,3]],[[2,0],[1,0],[2,3],[1,3]],[[0,0],[1,0],[0,3],[1,3]],[[2,2],[3,2],[2,3],[3,3]],[[0,2],[3,2],[0,3],[3,3]],[[2,0],[3,0],[2,3],[3,3]],[[0,0],[3,0],[0,3],[3,3]]],NP=[[26,27,32,33],[4,27,32,33],[26,5,32,33],[4,5,32,33],[26,27,32,11],[4,27,32,11],[26,5,32,11],[4,5,32,11],[26,27,10,33],[4,27,10,33],[26,5,10,33],[4,5,10,33],[26,27,10,11],[4,27,10,11],[26,5,10,11],[4,5,10,11],[24,25,30,31],[24,5,30,31],[24,25,30,11],[24,5,30,11],[14,15,20,21],[14,15,20,11],[14,15,10,21],[14,15,10,11],[28,29,34,35],[28,29,10,35],[4,29,34,35],[4,29,10,35],[38,39,44,45],[4,39,44,45],[38,5,44,45],[4,5,44,45],[24,29,30,35],[14,15,44,45],[12,13,18,19],[12,13,18,11],[16,17,22,23],[16,17,10,23],[40,41,46,47],[4,41,46,47],[36,37,42,43],[36,5,42,43],[12,17,18,23],[12,13,42,43],[36,41,42,47],[16,17,46,47],[12,17,42,47],[0,1,6,7]],PP=[46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,37,27,37,27,23,15,23,13,37,27,37,27,22,11,22,9,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,36,26,36,26,21,7,21,5,36,26,36,26,20,3,20,1,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,37,25,37,25,23,14,23,12,37,25,37,25,22,10,22,8,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,36,24,36,24,21,6,21,4,36,24,36,24,20,2,20,0];function FP(e){return!Number.isInteger(e)||e<=0||e>=384?null:{index:Math.floor(e/48),pattern:e%48}}function IP(e){let t=0;return e(0,-1)&&(t|=1),e(1,-1)&&(t|=2),e(1,0)&&(t|=4),e(1,1)&&(t|=8),e(0,1)&&(t|=16),e(-1,1)&&(t|=32),e(-1,0)&&(t|=64),e(-1,-1)&&(t|=128),PP[t]}var LP=[16,32,32,48];function RP(e){if(e.format===`rpgm-mv`){if(CP(e.slot),wP(e.table),e.tableEdge&&e.slot!==1)throw Error(`a table-edge layout needs slot 1 (A2), got slot ${e.slot}`);let t=LP[e.slot],n=xP[e.slot];for(let r of e.cycles){if(r.length===0)throw Error(`an autotile animation cycle needs at least one kind`);for(let i of r)if(!Number.isInteger(i)||i<n||i>=n+t)throw Error(`animation cycle kind ${i} is outside slot ${e.slot}'s kinds ${n}-${n+t-1}`)}}else{if(!Number.isInteger(e.index)||e.index<0||e.index>7)throw Error(`an XP autotile index must be 0-7, got ${e.index}`);if(!Number.isInteger(e.frames)||e.frames<1)throw Error(`an XP autotile frame count must be at least 1, got ${e.frames}`)}}var zP=24,BP=16,VP=6,HP=96,UP=32;function WP(e,t,n){if(t<=0)return null;if(!Number.isInteger(n)||n<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${n}`);return e.format===`rpgm-mv`?KP(e,t,n):qP(e,t,n)}function GP(e,t){let n=xP[e.slot]+Math.floor(t/48),r=t%48%e.table.length,i=n%8*2,a=(Math.floor(n/8)-2)*3,o=zP/2;return[2,3].map((t,n)=>{let[s,c]=e.table[r][t];return{sourceX:(i*2+s)*zP,sourceY:(a*2+c)*zP+o,sourceWidth:zP,sourceHeight:o,destX:n/2,destY:0,destWidth:1/2,destHeight:1/4}})}function KP(e,t,n){let r=OP[e.slot],i=kP[e.slot];if(!Number.isInteger(t)||t<r||t>=r+i)throw Error(`tile ${t} is outside slot ${e.slot}'s ids ${r}-${r+i-1}`);let a=t-r;if(e.tableEdge)return GP(e,a);let o=xP[e.slot]+Math.floor(a/48),s=e.tableFor?e.tableFor(o):e.table,c=a%48%s.length;for(let t of e.cycles){let e=t.indexOf(o);if(e>=0){o=t[(e+n)%t.length];break}}return EP((o-xP[e.slot])*48+a%48,e.slot,c,s).quadrants.map((e,t)=>({sourceX:e.sourceX,sourceY:e.sourceY,sourceWidth:zP,sourceHeight:zP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}function qP(e,t,n){if(!Number.isInteger(t)||t<e.index*48||t>=e.index*48+48||t<=0)throw Error(`tile ${t} is outside XP autotile ${e.index}'s ids ${e.index*48}-${e.index*48+47}`);if(e.single)return[{sourceX:n%e.frames*UP,sourceY:0,sourceWidth:UP,sourceHeight:UP,destX:0,destY:0,destWidth:1,destHeight:1}];let r=NP[t%48],i=n%e.frames*HP;return r.map((e,t)=>({sourceX:e%VP*BP+i,sourceY:Math.floor(e/VP)*BP,sourceWidth:BP,sourceHeight:BP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}var JP=128;function YP(e){let t=new Int32Array(e.width*e.height),n=t=>AP(t)===1&&((e.flags[t]??0)&JP)!==0;for(let r=1;r<e.height;r++)for(let i=0;i<e.width;i++){let a=r*e.width+i,o=e.objects[a-e.width]??0;if(!n(o)||n(e.objects[a]??0))continue;let s=AP(e.ground[a]??0);s!==2&&s!==3&&(t[a]=o)}return t}var XP=-1,ZP=7237230,QP=10132122;function $P(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function eF(e){return e>>>20}function tF(e){return e&(1<<20)-1}var nF=class extends J{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){let{cells:n,container:r,chunks:i}=this.beginLayer(e,t?.length),a={kind:`tiles`,name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}beginLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t!==void 0&&t!==n)throw Error(`layer "${e}" has ${t} cells, but the map has ${n}`);let r=new J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;i.push(e),r.addChild(e)}return{cells:n,container:r,chunks:i}}addAutotileLayer(e,t,n){let r=Array.isArray(n)?n:[n];if(r.length===0)throw Error(`autotile layer "${e}" needs at least one set`);let{cells:i,container:a,chunks:o}=this.beginLayer(e,t.length),s=r.map((t,n)=>this.resolveAutotileSet(e,t,n)),c=new Set;for(let t of s){let n=t.layout.format===`rpgm-mv`?`slot ${t.layout.slot}`:`autotile ${t.layout.index}`;if(c.has(n))throw Error(`autotile layer "${e}" has two sets for ${n}`);c.add(n)}let l=0;r.forEach((t,n)=>{let r=t.animationFrame??0;if(!Number.isInteger(r)||r<0)throw Error(`autotile layer "${e}" set ${n} starts at an invalid animation frame, got ${t.animationFrame}`);if(n===0)l=r;else if(r!==l)throw Error(`autotile layer "${e}" sets disagree on their initial animation frame (${l} vs ${r})`)});let u=Int32Array.from(t);for(let t=0;t<i;t++)u[t]>0&&this.claimAutotileSets(s,e,u[t]);let d={kind:`autotile`,name:e,data:u,sprites:Array(i).fill(null),container:a,sets:s,frame:l};this.layers.push(d),this.layersByName.set(e,d),this.chunks.push(o),this.addChild(a);let f=this.layers.length===1;for(let t=0;t<this.heightInTiles;t++)for(let n=0;n<this.widthInTiles;n++){let r=this.index(n,t),i=u[r];i<=0||(d.sprites[r]=this.makeAutotileSprites(d,this.claimAutotileSets(s,e,i),n,t,i),f&&this.syncFaces(n,t))}return this}setAutotileFrame(e,t){let n=this.layerAt(e);if(n.kind!==`autotile`)throw Error(`layer "${n.name}" is not an autotile layer`);if(!Number.isInteger(t)||t<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${t}`);if(n.frame!==t){n.frame=t;for(let e=0;e<this.heightInTiles;e++)for(let r=0;r<this.widthInTiles;r++){let i=this.index(r,e),a=n.data[i];if(a<=0)continue;let o=this.claimAutotileSets(n.sets,n.name,a),s=this.autotilePieces(o,a,t),c=n.sprites[i];if(c)for(let e=0;e<c.length;e++)c[e].texture=s.textures[e]}}}addShadowLayer(e,t,n={}){let{cells:r,container:i,chunks:a}=this.beginLayer(e,t.length),o=n.color??0,s=n.alpha??.5;if(!Number.isFinite(s)||s<0||s>1)throw Error(`shadow layer "${e}" alpha must be between 0 and 1, got ${n.alpha}`);let c=Int32Array.from(t,e=>e>0?e&15:0),l={kind:`shadow`,name:e,data:c,sprites:Array(r).fill(null),container:i,color:o,alpha:s};this.layers.push(l),this.layersByName.set(e,l),this.chunks.push(a),this.addChild(i);for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)c[this.index(t,e)]>0&&this.buildShadowSprites(l,t,e);return this}buildShadowSprites(e,t,n){let r=this.index(t,n),i=this.cellOrigin(t,n),a=this.cellHeight[r]*this.heightStep,o=this.tileWidth/2,s=this.tileHeight/2,c=this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)],l=[];for(let t=0;t<4;t++){if(!(e.data[r]&1<<t))continue;let n=new CM(q.WHITE);n.x=i.x+t%2*o,n.y=i.y-a+Math.floor(t/2)*s,n.width=o,n.height=s,n.tint=e.color,n.alpha=e.alpha,c.addChild(n),l.push(n)}e.sprites[r]=l}setShadowCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r>0?r&15:0;for(let t of e.sprites[i]??[])t.destroy();e.sprites[i]=null,e.data[i]>0&&this.buildShadowSprites(e,t,n)}getAutotileFrame(e){let t=this.layerAt(e);if(t.kind!==`autotile`)throw Error(`layer "${t.name}" is not an autotile layer`);return t.frame}resolveAutotileSet(e,t,n){let r=`autotile layer "${e}" set ${n}`;if(!t||!t.sheet)throw Error(`${r} needs a source sheet`);let i=t.format??`rpgm-mv`;if(i!==`rpgm-mv`&&i!==`rpgm-xp`)throw Error(`${r} has an unknown format "${t.format}"`);return i===`rpgm-mv`?this.resolveRpgmSet(r,t):this.resolveXpSet(r,t)}resolveRpgmSet(e,t){if(t.slot===void 0)throw Error(`${e} needs a slot (0-3) for its MV sheet`);if(t.mode!==void 0&&t.mode!==`floor`&&t.mode!==`wall`&&t.mode!==`mixed`)throw Error(`${e} has an unknown mode "${t.mode}"`);if(t.animation!==void 0&&!Array.isArray(t.animation))throw Error(`${e} animation must list kind runs, got ${typeof t.animation}`);let n=t.mode??(t.slot<2?`floor`:`wall`),r=n===`mixed`&&t.slot===3&&t.table===void 0,i={format:`rpgm-mv`,slot:t.slot,table:t.table??(n===`floor`||t.tableEdge||n===`mixed`&&t.slot<2?jP:MP),...r?{tableFor:e=>Math.floor(e/8)%2==0?jP:MP}:{},...t.tableEdge?{tableEdge:!0}:{},cycles:t.animation??[]};return RP(i),{sheet:t.sheet,layout:i,cache:new Map,claims:e=>AP(e)===t.slot}}resolveXpSet(e,t){let n=t.index??0,r=t.sheet.texture,i=r.height===32;if(r.height!==32&&r.height!==128)throw Error(`${e} is ${r.height}px tall - XP autotile images are 128px templates or 32px single-tile strips`);let a=i?32:96,o=t.frames??Math.max(1,Math.floor(r.width/a)),s={format:`rpgm-xp`,index:n,frames:o,single:i};if(RP(s),o>Math.floor(r.width/a))throw Error(`${e} asks for ${o} frames but its sheet fits ${Math.floor(r.width/a)}`);return{sheet:t.sheet,layout:s,cache:new Map,claims:e=>{let t=FP(e);return t!==null&&t.index===n}}}claimAutotileSets(e,t,n){for(let t of e)if(t.claims(n))return t;throw Error(`tile ${n} in autotile layer "${t}" matches none of its sets`)}autotilePieces(e,t,n){let r=`${t}:${n}`,i=e.cache.get(r);if(i)return i;let a=WP(e.layout,t,n),o={parts:a,textures:a.map(t=>new q({source:e.sheet.texture.source,frame:new G(t.sourceX,t.sourceY,t.sourceWidth,t.sourceHeight)}))};return e.cache.set(r,o),o}makeAutotileSprites(e,t,n,r,i){let a=this.index(n,r),o=this.autotilePieces(t,i,e.frame),s=this.cellOrigin(n,r),c=this.cellHeight[a]*this.heightStep,l=o.textures.map((e,t)=>{let n=o.parts[t],r=new CM(e);return r.x=s.x+n.destX*this.tileWidth,r.y=s.y-c+n.destY*this.tileHeight,r.scale.set(n.destWidth*this.tileWidth/n.sourceWidth,n.destHeight*this.tileHeight/n.sourceHeight),r.tint=this.cellTint[a],r.colorAdd=this.cellAdd[a],r}),u=this.chunks[this.layers.indexOf(e)][this.chunkIndex(n,r)];for(let e of l)u.addChild(e);return l}setAutotileCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r;let a=e.sprites[i];if(r<=0){if(a)for(let e of a)e.destroy();e.sprites[i]=null;return}let o=this.claimAutotileSets(e.sets,e.name,r),s=this.autotilePieces(o,r,e.frame);if(a&&a.length===s.textures.length)for(let e=0;e<a.length;e++)a[e].texture=s.textures[e];else{if(a)for(let e of a)e.destroy();e.sprites[i]=this.makeAutotileSprites(e,o,t,n,r)}}eachCellSprite(e,t,n){let r=e.sprites[t];if(r){if(Array.isArray(r))for(let e of r)n(e);else n(r)}}firstCellSprite(e,t){let n=e.sprites[t];return n?Array.isArray(n)?n[0]:n:null}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return $n(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return er(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=eF(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(tF(e))}buildSprite(e,t,n,r){let i=new CM(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]!==r){if(i.kind===`autotile`)this.setAutotileCell(i,t,n,r);else if(i.kind===`shadow`)this.setShadowCell(i,t,n,r);else{i.data[a]=r;let e=i.sprites[a];r===-1?(e?.destroy(),i.sprites[a]=null):e?e.texture=this.textureFor(r):this.buildSprite(i,t,n,r)}this.layers[0]===i&&this.syncFaces(t,n)}}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}stampRect(e,t,n,r,i,a){if(this.layerAt(e),a.length!==r*i)throw Error(`a ${r}x${i} stamp needs ${r*i} frames, got ${a.length}`);if(t<0||n<0||t+r>this.widthInTiles||n+i>this.heightInTiles)throw Error(`a ${r}x${i} stamp at (${t},${n}) does not fit the ${this.widthInTiles}x${this.heightInTiles} map`);for(let o=0;o<i;o++)for(let i=0;i<r;i++)this.setTile(e,t+i,n+o,a[o*r+i])}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers)e.kind!==`shadow`&&this.eachCellSprite(e,i,e=>{e.tint=n,e.colorAdd=r});let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;let i=(n-this.cellHeight[r])*this.heightStep;this.cellHeight[r]=n;for(let e of this.layers)this.eachCellSprite(e,r,e=>{e.y-=i});this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new Z;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.firstCellSprite(this.layers[0],n);i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill(ZP),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(QP)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=this.projectedTile(t.x,t.y),r=this.projectedTile(t.x+t.width,t.y),i=this.projectedTile(t.x,t.y+t.height),a=this.projectedTile(t.x+t.width,t.y+t.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y),u=Math.floor(o/this.chunkSize)-1,d=Math.floor(s/this.chunkSize)+1,f=Math.floor(c/this.chunkSize)-1,p=Math.floor(l/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=f&&e<=p;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=u&&n<=d,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},rF=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new CM(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},iF=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y,this.animation=r.animation;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}};function aF(e){return e===!0||e===`progress`?`progress`:typeof e==`number`&&e>0?`seconds`:`none`}var oF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n,r={}){let i,a;e instanceof q?(a=new wl(e),this.addChild(a),i=a):i=e,r.tint!==void 0&&typeof i.tint==`number`&&(i.tint=r.tint);let o=aF(r.fadeIn),s=typeof r.fadeIn==`number`?r.fadeIn:0,c=typeof i.alpha==`number`?i.alpha:1;o!==`none`&&(i.alpha=0);let l={projectile:new iF(i,t,n,r),sprite:i,built:a,onArrive:r.onArrive,spin:r.spin??(r.spinDegrees===void 0?void 0:r.spinDegrees*Math.PI/180),fadeMode:o,fadeIn:s,baseAlpha:c,elapsed:0};return this.live.push(l),{projectile:l.projectile,get done(){return l.projectile.done},cancel:()=>{let e=this.live.indexOf(l);e!==-1&&(this.live.splice(e,1),this.release(l))}}}update(e){for(let t=this.live.length-1;t>=0;t--){let n=this.live[t];n.elapsed+=e,n.spin!==void 0&&(n.sprite.rotation=(n.sprite.rotation??0)+n.spin*e),n.fadeMode===`seconds`&&(n.sprite.alpha=n.baseAlpha*Math.min(1,n.elapsed/n.fadeIn));let r=n.projectile.update(e);n.fadeMode===`progress`&&(n.sprite.alpha=n.baseAlpha*n.projectile.progress),r&&(this.live.splice(t,1),this.release(n),n.onArrive?.())}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.release(e)}destroy(){this.clear(),super.destroy()}release(e){e.built&&(this.removeChild(e.built),e.built.destroy())}},sF=class extends J{constructor(e,t,n={}){super(),this.elapsed=0,this.expired=!1,this.lifeFraction=1,this.from={...e},this.to={...t},this.colour=n.colour??16777215,this.thin=n.thin??!1;let r=n.texture;if(r===void 0?(this.texture=void 0,this.stretch=!1,this.textureAnchor=0):r instanceof q?(this.texture=r,this.stretch=!1,this.textureAnchor=0):(this.texture=r.source,this.stretch=r.stretch??!1,this.textureAnchor=r.anchor??.5),this.thickness=n.width??2,this.duration=Math.max(1e-6,n.duration??.2),this.texture&&this.stretch)this.body=new wl(this.texture),this.body.anchor.set(0,this.textureAnchor);else if(this.texture){let e=new dA({texture:this.texture,width:1,height:this.thickness});e.anchor.set(0,this.textureAnchor),this.body=e}else this.body=new Z;(n.additive??!0)&&(this.body.blendMode=`add`),this.addChild(this.body),this.redraw()}get progress(){return Math.min(1,this.elapsed/this.duration)}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.redraw()}update(e){return!this.expired&&(this.elapsed+=e,this.alpha=1-this.progress,this.lifeFraction=this.thin?1-this.progress:1,this.thin&&this.redraw(),this.elapsed>=this.duration&&(this.expired=!0,!0))}destroy(){this.removeChild(this.body),this.body.destroy(),super.destroy()}redraw(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t);if(this.position.set(this.from.x,this.from.y),this.rotation=n>0?Math.atan2(t,e):0,this.body instanceof dA)this.body.width=n,this.body.height=this.thickness*this.lifeFraction;else if(this.body instanceof wl){let e=this.texture?.width||1,t=this.texture?.height||1;this.body.scale.x=n/e,this.body.scale.y=this.thickness/t*this.lifeFraction}else{let e=this.body;e.clear(),e.moveTo(0,0),e.lineTo(n,0),e.stroke({width:this.thickness*this.lifeFraction,color:this.colour})}}},cF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n){let r=new sF(e,t,n);return this.addChild(r),this.live.push(r),r}update(e){for(let t=this.live.length-1;t>=0;t--)if(this.live[t].update(e)){let[e]=this.live.splice(t,1);this.removeChild(e),e.destroy()}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.removeChild(e),e.destroy()}destroy(){this.clear(),super.destroy()}},lF=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},uF=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},dF=class extends J{constructor(e){super(),this.cells=new Map,this.ripples=[],this.offset=0,this.eventMode=`none`,this.columns=e.width,this.tileSize=e.tileSize??16,this.speed=e.speed??5,this.rippleTexture=e.rippleTexture,this.rippleDuration=e.rippleDuration??.5;for(let t=0;t<e.height;t++)for(let n=0;n<e.width;n++){if(!e.isLiquid(n,t))continue;let r=new dA({texture:e.texture,width:this.tileSize,height:this.tileSize});r.eventMode=`none`,r.position.set(n*this.tileSize,t*this.tileSize),r.tilePosition.set(-r.x,-r.y),r.visible=!1,this.cells.set(n+t*this.columns,r),this.addChild(r)}}setCellColor(e,t,n){let r=this.cells.get(e+t*this.columns);r&&(r.tint=n,r.visible=n!==0)}ripple(e,t){if(!this.rippleTexture||!this.cells.get(e+t*this.columns)?.visible)return;let n=new wl(this.rippleTexture);n.eventMode=`none`,n.anchor.set(.5),n.position.set((e+.5)*this.tileSize,(t+.5)*this.tileSize),n.scale.set(0),this.addChild(n),this.ripples.push({sprite:n,age:0})}get rippleCount(){return this.ripples.length}update(e){this.offset+=this.speed*e;for(let e of this.cells.values())e.visible&&(e.tilePosition.y=-e.y+this.offset);for(let t=this.ripples.length-1;t>=0;t--){let n=this.ripples[t];if(n.age+=e,n.age>=this.rippleDuration)n.sprite.destroy(),this.ripples.splice(t,1);else{let e=n.age/this.rippleDuration;n.sprite.scale.set(e),n.sprite.alpha=1-e}}}};function fF(e,t,n,r,i,a){let o=t*r;for(let s=0;s<n;s++)for(let n=0;n<t;n++){let t=i(n,s);for(let i=0;i<r;i++)for(let c=0;c<r;c++){let l=a[typeof t==`number`?t:t[i*r+c]??0]??[0,0,0,0];e.set(l,((s*r+i)*o+n*r+c)*4)}}}var pF=class extends wl{constructor(e){let t=e.resolution??2,n=document.createElement(`canvas`);n.width=e.width*t,n.height=e.height*t;let r=n.getContext(`2d`);if(!r)throw Error(`FogLayer needs a 2D canvas context`);super(q.from(n)),this.context=r,this.image=r.createImageData(n.width,n.height),this.columns=e.width,this.rows=e.height,this.cellResolution=t,this.palette=e.palette,this.texture.source.scaleMode=`linear`,this.scale.set((e.tileSize??16)/t),this.eventMode=`none`}setPalette(e){this.palette=e}refresh(e){fF(this.image.data,this.columns,this.rows,this.cellResolution,e,this.palette),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}},mF=`halo`,hF=class extends nN{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(mF,e.frames,e.animation),this.play(mF)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};_e();function gF(e){return typeof e==`number`?e:D(e[0],e[1])}function _F(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function vF(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var yF=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.tintOverridden=!1,this.emitting=!1,this.followTarget=null,this.followOffsetX=0,this.followOffsetY=0,this.followEnabled=null,this.followVisible=null,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=vF(e.scale??[1,1]),this.alphaOf=vF(e.alpha??[1,0]),this.flicker=Math.min(1,Math.max(0,e.flicker??0)),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new wl(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}attach(e,t={}){this.followTarget=e,this.followOffsetX=t.offsetX??0,this.followOffsetY=t.offsetY??0,this.followEnabled=t.enabled??null,this.followVisible=t.visible??null,this.syncFollow()}detach(){this.followTarget=null,this.followEnabled=null,this.followVisible!==null&&(this.visible=!0),this.followVisible=null,this.followOffsetX=0,this.followOffsetY=0}get attachedTo(){return this.followTarget}syncFollow(){let e=this.followTarget;if(!e)return;if(typeof e!=`function`&&e.destroyed){this.detach();return}let t=typeof e==`function`?e():e;this.x=t.x+this.followOffsetX,this.y=t.y+this.followOffsetY,this.followVisible!==null&&(this.visible=this.followVisible())}followEmissionAllowed(){return this.followEnabled?.()??!0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e,t={}){this.syncFollow(),t.tint!==void 0&&(this.tintOverridden=!0);let n=0;for(let r=0;r<e&&this.spawn(t);r++)n++;return n}spawn(e={}){let t=null;for(let e=0;e<this.pool.length;e++){let e=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!e.active){t=e;break}}if(!t)return!1;let n=gF(this.angleRange),r=gF(this.speed),i=+!br(),a=this.spawnOffset();return t.x=(e.x??this.x)+a.x,t.y=(e.y??this.y)+a.y,t.vx=Math.cos(n)*r*i,t.vy=Math.sin(n)*r*i,t.age=0,t.life=Math.max(1e-6,gF(this.life)),t.rotation=0,t.spin=gF(this.spin)*i,t.scale=this.scaleOf(0),t.alpha=this.alphaOf(0),t.tint=e.tint??_F(this.tintRange),t.frame=0,t.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.syncFollow(),this.emitting&&this.rate>0&&this.followEmissionAllowed()){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=br();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`||this.tintOverridden;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},bF=class extends J{constructor(e={}){super(),this.overlay=new Z,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){this.queue=e.slice(1),e.length===0?this.phase=`idle`:this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=Math.max(0,Math.min(1,t))}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return br()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(br())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?Er.easeOutQuad(t*2):1-Er.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=Er.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},xF=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){(!this.inAction||t)&&(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},SF=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=yM(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},CF={scaleX:1,scaleY:1,dy:0,rotation:0,skewX:0},wF={done:Promise.resolve(),cancel(){}},TF=class{constructor(e,t={}){this.contributions=new Map,this.loops=new Set,this.nextId=0,this.flipX=!1,this.flipY=!1,this.destroyed=!1,this.target=e,this.tweener=t.tweener??new Dr,this.ownsTweener=t.tweener===void 0,this.intent=t.intent??`decorative`,this.rest={y:e.y,rotation:e.rotation,scaleX:e.scale.x,scaleY:e.scale.y,skewX:e.skew.x}}squash(e){let{amount:t,duration:n}=e;return this.run(n,e=>{let n=Math.sin(Math.PI*e)*t;return{scaleX:1+n,scaleY:1-n}})}hop(e){let{height:t,duration:n}=e;return this.run(n,e=>({dy:-Math.sin(Math.PI*e)*t}))}bob(e){let{amplitude:t,period:n,cycles:r}=e;return r===void 0?this.loop(e=>({dy:Math.sin(2*Math.PI*e/n)*t})):this.run(n*r,e=>({dy:Math.sin(2*Math.PI*r*e)*t}))}wobble(e){let{angle:t,duration:n}=e;return this.run(n,e=>({rotation:Math.sin(4*Math.PI*e)*(1-e)*t}))}spin(e){let{turns:t,duration:n}=e;return this.run(n,e=>({rotation:Math.PI*2*t*e}),Er.easeInOutQuad)}shear(e){let{amount:t,duration:n}=e;return this.run(n,e=>({skewX:Math.sin(Math.PI*e)*t}))}flip(e,t){return e===`x`?this.flipX=t??!this.flipX:this.flipY=t??!this.flipY,this.write(),e===`x`?this.flipX:this.flipY}update(e){this.ownsTweener&&this.tweener.update(e);for(let t of[...this.loops])t(e)}get isBusy(){return this.contributions.size>0}destroy(){this.destroyed=!0,this.contributions.clear(),this.loops.clear(),this.flipX=this.flipY=!1,this.write()}run(e,t,n=Er.linear){if(this.destroyed)return wF;let r=this.nextId++,i=()=>{this.contributions.delete(r),this.write()};return this.contributions.set(r,CF),{done:this.tweener.tween(e,e=>{this.contributions.has(r)&&(this.contributions.set(r,{...CF,...t(e)}),this.write())},{ease:n,intent:this.intent}).then(i),cancel:i}}loop(e){if(this.destroyed)return wF;let t=this.nextId++,n=0,r,i=new Promise(e=>r=e),a=r=>{n+=r;let i=br()&&this.intent===`decorative`;this.contributions.set(t,i?CF:{...CF,...e(n)}),this.write()};return this.contributions.set(t,CF),this.loops.add(a),{done:i,cancel:()=>{this.loops.delete(a),this.contributions.delete(t),this.write(),r()}}}write(){let e=1,t=1,n=0,r=0,i=0;for(let a of this.contributions.values())e*=a.scaleX,t*=a.scaleY,n+=a.dy,r+=a.rotation,i+=a.skewX;let{rest:a,target:o}=this;o.y=a.y+n,o.rotation=a.rotation+r,o.scale.x=a.scaleX*e*(this.flipX?-1:1),o.scale.y=a.scaleY*t*(this.flipY?-1:1),o.skew.x=a.skewX+i}};function EF(e,t){let n=e??{x:0,y:0};if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw RangeError(`a cloth ${t} needs finite coordinates, saw (${n.x}, ${n.y})`);return{x:n.x,y:n.y}}var DF=class{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a cloth needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a cloth needs height above 0, saw ${e.height}`);for(let t of[`segmentsX`,`segmentsY`])if(!Number.isInteger(e[t])||e[t]<1)throw RangeError(`a cloth needs integer ${t} of at least 1, saw ${e[t]}`);let t=e.stiffness??.9;if(!Number.isFinite(t)||t<0||t>1)throw RangeError(`a cloth needs stiffness between 0 and 1, saw ${t}`);let n=e.damping??.02;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a cloth needs damping between 0 and 1, saw ${n}`);this.segmentsX=e.segmentsX,this.segmentsY=e.segmentsY,this.stiffness=t,this.damping=n,this.gravity=EF(e.gravity,`gravity`),this.wind=EF(e.wind,`wind`);let r=this.pointCount;this.rest=new Float32Array(r*2),this.positions=new Float32Array(r*2),this.previous=new Float32Array(r*2),this.pinned=new Uint8Array(r),this.links=[];let i=e.width/e.segmentsX,a=e.height/e.segmentsY;for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++){let e=this.indexOf(n,t);this.rest[e*2]=n*i,this.rest[e*2+1]=t*a,t===0&&(this.pinned[e]=1)}this.reset();let o=(e,t)=>this.indexOf(e,t);for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<e.segmentsX;n++)this.links.push([o(n,t),o(n+1,t),i]);for(let t=0;t<e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++)this.links.push([o(n,t),o(n,t+1),a])}get pointCount(){return(this.segmentsX+1)*(this.segmentsY+1)}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>this.segmentsX||t>this.segmentsY)throw RangeError(`cloth point (${e}, ${t}) is outside a ${this.segmentsX+1}x${this.segmentsY+1} grid`);return t*(this.segmentsX+1)+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.pointCount)throw RangeError(`cloth point ${e} does not exist`)}pointPosition(e){return this.checkIndex(e),{x:this.positions[e*2],y:this.positions[e*2+1]}}isPinned(e){return this.checkIndex(e),this.pinned[e]===1}pointLinks(){return this.links.map(([e,t])=>[e,t])}pinPoint(e){this.checkIndex(e),this.pinned[e]=1,this.previous[e*2]=this.positions[e*2],this.previous[e*2+1]=this.positions[e*2+1]}unpinPoint(e){this.checkIndex(e),this.pinned[e]=0}setWind(e,t){let n=EF({x:e,y:t},`wind`);this.wind=n}setGravity(e,t){let n=EF({x:e,y:t},`gravity`);this.gravity=n}reset(){this.positions.set(this.rest),this.previous.set(this.rest)}movedCount(){let e=0;for(let t=0;t<this.pointCount;t++)this.positions[t*2]===this.rest[t*2]?this.positions[t*2+1]!==this.rest[t*2+1]&&e++:e++;return e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.positions.length)throw RangeError(`a cloth target needs a Float32Array of ${this.positions.length} floats, saw length ${e?.length}`);e.set(this.positions)}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a cloth update needs dt of at least 0, saw ${e}`);if(e===0)return;let t=1-this.damping,n=(this.gravity.x+this.wind.x)*e*e,r=(this.gravity.y+this.wind.y)*e*e,{positions:i,previous:a,pinned:o}=this;for(let e=0;e<this.pointCount;e++){if(o[e]===1)continue;let s=i[e*2],c=i[e*2+1];i[e*2]=s+(s-a[e*2])*t+n,i[e*2+1]=c+(c-a[e*2+1])*t+r,a[e*2]=s,a[e*2+1]=c}for(let e=0;e<2;e++)this.relax()}relax(){let{positions:e,pinned:t,stiffness:n}=this;if(n!==0)for(let[r,i,a]of this.links){let o=e[i*2]-e[r*2],s=e[i*2+1]-e[r*2+1],c=Math.hypot(o,s);if(c===0)continue;let l=(c-a)/c*n,u=t[r]===1,d=t[i]===1;if(u&&d)continue;let f=u?0:d?1:.5,p=d?0:u?1:.5;e[r*2]+=o*l*f,e[r*2+1]+=s*l*f,e[i*2]-=o*l*p,e[i*2+1]-=s*l*p}}},OF=class extends _j{constructor(e,t={}){let n=t.segmentsX??8,r=t.segmentsY??8,i=new DF({width:e.width,height:e.height,segmentsX:n,segmentsY:r,stiffness:t.stiffness,damping:t.damping,gravity:t.gravity,wind:t.wind});super({texture:e,verticesX:n+1,verticesY:r+1}),this.cloth=i,this.intent=t.intent??`decorative`,this.autoResize=!1,this.sync()}get segmentsX(){return this.cloth.segmentsX}get segmentsY(){return this.cloth.segmentsY}get pointCount(){return this.cloth.pointCount}indexOf(e,t){return this.cloth.indexOf(e,t)}pointPosition(e){return this.cloth.pointPosition(e)}isPinned(e){return this.cloth.isPinned(e)}movedCount(){return this.cloth.movedCount()}pinPoint(e){this.cloth.pinPoint(e)}unpinPoint(e){this.cloth.unpinPoint(e)}setWind(e,t){this.cloth.setWind(e,t)}setGravity(e,t){this.cloth.setGravity(e,t)}update(e){br()&&this.intent===`decorative`||(this.cloth.update(e),this.sync())}sync(){let e=this.geometry.getAttribute(`aPosition`);this.cloth.writePositions(e.buffer.data),e.buffer.update()}},kF=class extends Z{constructor(e){super(),this.spring=e.spring,this.color=e.color??16777215,this.opacity=e.alpha??1,this.lineWidth=e.lineWidth??2,this.sync()}sync(){let e=this.spring.anchorPosition,t=this.spring.position;this.clear(),this.moveTo(e.x,e.y).lineTo(t.x,t.y).stroke({color:this.color,width:this.lineWidth,alpha:this.opacity})}},AF=.35,jF=.12;function MF(e,t,n){let r=Math.sin(e*127.1+t*311.7+n*74.7)*43758.5453;return r-Math.floor(r)}function NF(e,t,n){let r=Math.floor(e),i=Math.floor(t),a=e-r,o=t-i,s=a*a*(3-2*a),c=o*o*(3-2*o),l=MF(r,i,n)+(MF(r+1,i,n)-MF(r,i,n))*s,u=MF(r,i+1,n)+(MF(r+1,i+1,n)-MF(r,i+1,n))*s;return Math.min(1,Math.max(0,l+(u-l)*c))}function PF(e,t,n,r){if(![e,t,n,r].every(Number.isFinite))throw RangeError(`a haze sample needs finite x, y, time and seed, saw (${e}, ${t}, ${n}, ${r})`);let i=e+n*AF,a=t+n*jF;return NF(i/8,a/8,r)*.65+NF(i/3+11,a/3+7,r+1)*.35}function FF(e,t,n,r){if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*n*4)throw RangeError(`haze needs a pixel buffer of ${t*n*4} bytes`);if(!Number.isFinite(r.time)||!Number.isFinite(r.seed))throw RangeError(`haze needs a finite time and seed, saw (${r.time}, ${r.seed})`);if(!Number.isFinite(r.density)||r.density<0||r.density>1)throw RangeError(`haze needs density between 0 and 1, saw ${r.density}`);let i=r.drift??{x:0,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`haze needs a finite drift, saw (${i.x}, ${i.y})`);for(let a=0;a<n;a++)for(let n=0;n<t;n++){let o=Math.round(255*r.density*PF(n+i.x*r.time,a+i.y*r.time,r.time,r.seed));e.set([255,255,255,o],(a*t+n)*4)}}var IF=class extends wl{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a haze sheet needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a haze sheet needs height above 0, saw ${e.height}`);let t=e.cellsX??64,n=e.cellsY??36;if(!Number.isInteger(t)||t<1)throw RangeError(`a haze sheet needs integer cellsX of at least 1, saw ${t}`);if(!Number.isInteger(n)||n<1)throw RangeError(`a haze sheet needs integer cellsY of at least 1, saw ${n}`);let r=e.density??.5;if(!Number.isFinite(r)||r<0||r>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${r}`);let i=e.drift??{x:.25,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`a haze sheet needs a finite drift, saw (${i.x}, ${i.y})`);if(e.seed!==void 0&&!Number.isFinite(e.seed))throw RangeError(`a haze sheet needs a finite seed, saw ${e.seed}`);let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw Error(`HazeLayer needs a 2D canvas context`);super(q.from(a)),this.time=0,this.context=o,this.image=o.createImageData(t,n),this.cellsX=t,this.cellsY=n,this.density=r,this.drift={...i},this.seed=e.seed??1,this.intent=e.intent??`decorative`,this.tint=e.tint??16777215,this.alpha=e.opacity??1,this.scale.set(e.width/t,e.height/n),this.eventMode=`none`,this.refresh()}get elapsed(){return this.time}setDensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${e}`);this.density=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a haze update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.time+=e),this.refresh()}refresh(){FF(this.image.data,this.cellsX,this.cellsY,{time:this.time,density:this.density,seed:this.seed,drift:this.drift}),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}};function LF(e){if(!Number.isInteger(e)||e<0||e>16777215)throw RangeError(`a glow needs an integer color between 0x000000 and 0xffffff, saw ${e}`);return[e>>16&255,e>>8&255,e&255]}function RF(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||t<=0)throw RangeError(`a glow falloff needs a finite distance and a radius above 0, saw (${e}, ${t})`);if(e<=0)return 1;if(e>=t)return 0;let n=1-e/t*(e/t);return n*n}function zF(e,t,n){if(!Number.isInteger(t)||t<1)throw RangeError(`a glow needs an integer size of at least 1, saw ${t}`);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*t*4)throw RangeError(`a glow needs a pixel buffer of ${t*t*4} bytes`);if(!Number.isFinite(n.radius)||n.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${n.radius}`);if(!Number.isFinite(n.intensity)||n.intensity<0||n.intensity>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n.intensity}`);let[r,i,a]=LF(n.color),o=(t-1)/2;for(let s=0;s<t;s++)for(let c=0;c<t;c++){let l=RF(Math.hypot(c-o,s-o),n.radius)*n.intensity;e.set([Math.round(r*l),Math.round(i*l),Math.round(a*l),Math.round(255*l)],(s*t+c)*4)}}var BF=class e extends wl{constructor(t){if(!Number.isFinite(t.radius)||t.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${t.radius}`);let n=t.intensity??1;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n}`);let r=t.flicker??{amount:0,frequency:1};if(!Number.isFinite(r.amount)||r.amount<0||r.amount>1)throw RangeError(`a glow needs a flicker amount between 0 and 1, saw ${r.amount}`);if(!Number.isFinite(r.frequency)||r.frequency<=0)throw RangeError(`a glow needs a flicker frequency above 0, saw ${r.frequency}`);let i=e.paintCanvas(t.color,t.radius);super(q.from(i)),this.clock=0,this.canvas=i,this.color=t.color,this.radius=t.radius,this.peak=n,this.flickerAmount=r.amount,this.flickerFrequency=r.frequency,this.intent=t.intent??`decorative`,this.blendMode=`add`,this.anchor.set(.5),this.eventMode=`none`,this.alpha=this.peak}get elapsed(){return this.clock}setColor(e){LF(e),this.color=e,this.repaint()}setRadius(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`a glow needs a radius above 0, saw ${e}`);this.radius=e,this.repaint()}setIntensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${e}`);this.peak=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a glow update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.clock+=e);let t=1+this.flickerAmount*Math.sin(2*Math.PI*this.flickerFrequency*this.clock);this.alpha=Math.min(1,Math.max(0,this.peak*t))}static paintCanvas(e,t){let n=Math.ceil(t)*2+1,r=document.createElement(`canvas`);r.width=n,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`NeonGlow needs a 2D canvas context`);let a=i.createImageData(n,n);return zF(a.data,n,{color:e,radius:t,intensity:1}),i.putImageData(a,0,0),r}repaint(){let t=this.texture;this.canvas=e.paintCanvas(this.color,this.radius),this.texture=q.from(this.canvas),t.destroy(!0)}destroy(){super.destroy({texture:!0,textureSource:!0})}},VF=WF(),HF=new Map(VF.map((e,t)=>[UF(e),t]));function UF(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function WF(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=UF(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function GF(e){return HF.get(UF(e))}function KF(e,t,n,r){if(r.length!==VF.length)throw Error(`autotileFrames needs exactly ${VF.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;i[o]=n(t,a)?r[GF({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]:-1}return i}_e();function qF(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function JF(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function YF(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function XF(e,t,n,r,i=qF,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return YF(e,r(t+s.dx,n+s.dy))})}function ZF(e,t,n,r,i={}){let a=i.rotate??qF,o=i.random??new j,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!XF(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[QF(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function QF(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var $F=class extends J{};function eI(e,t){let n={};for(let r of t){let t=new $F;t.label=r,e.addChild(t),n[r]=t}return n}var tI=class extends Z{dashedLine(e,t,n,r,i=6,a=4){let o=Math.hypot(n-e,r-t);if(o===0||i<=0)return this;let s=(n-e)/o,c=(r-t)/o;for(let n=0;n<o;n+=i+Math.max(0,a)){let r=Math.min(n+i,o);this.moveTo(e+s*n,t+c*n).lineTo(e+s*r,t+c*r)}return this}},nI=class extends jA{},rI=class extends wl{},iI=class extends dA{},aI=wC,oI=class extends $F{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>zN(e,q.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new rI(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},sI=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function cI(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function lI(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var uI=536870911,dI={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function fI(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function pI(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function mI(e,t){let n=e.orientation??`orthogonal`,r=dI[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof sP){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);fI(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return fI(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new nF({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&uI;if(n===0)return-1;let r=pI(n,o,t.name);return o.length===1?n-o[0]:$P(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}async function hI(e,t){if(t.mixer&&t.mixer.skeleton!==t.skeleton)throw Error(`SVG skeleton mixer must use the supplied skeleton`);let n=await tP(e),r=new DOMParser().parseFromString(n,`image/svg+xml`),i=r.documentElement;if(r.querySelector(`parsererror`)||i.localName!==`svg`)throw Error(`SVG skeleton needs a valid svg root`);let a=i.getAttribute(`viewBox`)?.trim().split(/[\s,]+/).map(Number)??[0,0,Number(i.getAttribute(`width`)),Number(i.getAttribute(`height`))];if(a.length!==4||!a.every(Number.isFinite)||a[2]<=0||a[3]<=0)throw Error(`SVG skeleton needs a finite viewBox or positive numeric width and height`);let o=new Map;for(let e of i.querySelectorAll(`g[id]`)){if(o.has(e.id))throw Error(`duplicate SVG skeleton group ${e.id}`);o.set(e.id,e)}let s=new Map(pN(t.skeleton).map(e=>[e.name,e])),c=t.bindings??[...o.keys()].filter(e=>s.has(e)).map(e=>({bone:e}));if(!c.length)throw Error(`SVG skeleton found no matching bone groups`);let l=new Set(c.map(e=>e.group??e.bone)),u=new Set,d=[],f=new XMLSerializer;for(let e of c){let n=e.group??e.bone;if(u.has(e.bone))throw Error(`duplicate SVG binding for bone ${e.bone}`);u.add(e.bone);let c=s.get(e.bone);if(!c)throw Error(`SVG binding names no bone ${e.bone}`);let p=o.get(n);if(!p)throw Error(`SVG skeleton missing group ${n}`);let m=e.pivot??t.pivots?.[n]??{x:p.hasAttribute(`data-pivot-x`)?Number(p.getAttribute(`data-pivot-x`)):NaN,y:p.hasAttribute(`data-pivot-y`)?Number(p.getAttribute(`data-pivot-y`)):NaN},h=e.rotation??c.angle;if(![m.x,m.y,h].every(Number.isFinite))throw Error(`SVG skeleton group ${n} needs a finite pivot and rest angle`);let g=Math.max(Math.abs(a[0]-m.x),Math.abs(a[0]+a[2]-m.x)),_=Math.max(Math.abs(a[1]-m.y),Math.abs(a[1]+a[3]-m.y)),v=Math.ceil(Math.hypot(g,_))+1,y=i.cloneNode(!1);y.setAttribute(`viewBox`,`${-v} ${-v} ${v*2} ${v*2}`),y.setAttribute(`width`,String(v*2)),y.setAttribute(`height`,String(v*2));for(let e of i.querySelectorAll(`defs, style`))y.appendChild(e.cloneNode(!0));let b=p.cloneNode(!0);for(let e of b.querySelectorAll(`g[id]`))l.has(e.id)&&e.remove();let x=b;for(let e=p.parentElement;e&&e!==i;e=e.parentElement){let t=e.cloneNode(!1);t.appendChild(x),x=t}let S=r.createElementNS(i.namespaceURI,`g`);S.setAttribute(`id`,`mwg-part`),S.setAttribute(`transform`,`rotate(${-h}) translate(${-m.x} ${-m.y})`),S.appendChild(x),y.appendChild(S),d.push({bone:e.bone,svg:f.serializeToString(y)})}let p=Object.create(null);for(let e of d)p[e.bone]=(await rP(e.svg,{resolution:t.resolution}))[`mwg-part`];let m=new TN(t.skeleton,t.mixer);for(let e of d){let t=m.bind(e.bone,p[e.bone]);t.anchor.set(.5),t.label=e.bone}return m.apply({}),{sprite:m,textures:Object.freeze(p)}}var gI={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},_I={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:gI.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},vI=gI;function Q(){return vI}var $=new p;function yI(e){vI={...gI,...e,font:{...gI.font,...e.font},color:{...gI.color,...e.color}},$.dispatch(vI)}function bI(e){return typeof e==`string`?{text:e}:e}function xI(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function SI(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function CI(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),TI(e)}function wI(e){e.revealed=e.total}function TI(e){return e.revealed>=e.total}var EI=class extends jA{constructor(e={}){let t=bI(e),n=Q();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new aO({fontFamily:n.font.family,stroke:t.stroke,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:xI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,$.add(this.themeListener)}setColor(e){this.destroyed||(this.style.fill=e)}setWrapWidth(e){this.destroyed||(this.style.wordWrap=e!==void 0,this.style.wordWrapWidth=e??0)}setText(e){this.destroyed||(this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e))}showProgressive(e,t){this.destroyed||(this.revealSource=e,this.reveal=SI(e.length,t),this.renderRevealed())}updateReveal(e){if(this.destroyed||!this.reveal)return!0;let t=CI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){!this.destroyed&&this.reveal&&(wI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.destroyed||(this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=xI(this.opts,e)))}destroy(e){$.remove(this.themeListener),super.destroy(e)}},DI={positive:5627255,negative:16733525,warning:16757575};function OI(e,t){return t>0?e.slice(Math.max(0,e.length-Math.floor(t))):[]}function kI(e,t){let n=0;for(let t of e)n+=t;let r=0;for(;n>t&&r<e.length-1;)n-=e[r++];return r}var AI=class extends J{constructor(e){super(),this.blocks=[],this.options=e,this.maxLines=e.maxLines??3}get entryCount(){return this.blocks.length}get contentHeight(){return this.blocks.reduce((e,t)=>e+t.label.height,0)}lastEntries(e){return OI(this.blocks.map(e=>({text:e.text,level:e.level})),e)}add(e,t=`info`){let n=new EI({text:e,size:this.options.size,color:this.colorOf(t),wrapWidth:this.options.wrapWidth,resolution:this.options.resolution});this.addChild(n),this.blocks.push({label:n,level:t,text:e}),this.trim(),this.layout()}setMaxLines(e){this.maxLines=Math.max(1,Math.floor(e)),this.trim(),this.layout()}setWrapWidth(e){this.options.wrapWidth=e;for(let t of this.blocks)t.label.style.wordWrapWidth=e;this.trim(),this.layout()}clear(){for(let e of this.blocks.splice(0))e.label.destroy()}colorOf(e){let t=this.options.colors?.[e];return t===void 0?e===`info`?Q().color.text:e===`highlight`?Q().color.textHighlight:DI[e]:t}linesOf(e){let t=Number(e.style.lineHeight)||Number(e.style.fontSize)||1;return Math.max(1,Math.round(e.height/t))}trim(){let e=kI(this.blocks.map(e=>this.linesOf(e.label)),this.maxLines);for(let t of this.blocks.splice(0,e))t.label.destroy()}layout(){let e=0;for(let t of this.blocks)t.label.position.set(0,e),e+=t.label.height}};function jI(e,t,n){let r=Math.max(1,Math.floor(e));for(;r>1&&t*r>n;)r--;return r}function MI(e){let t=1;for(let n=e;n;n=n.parent)t*=Math.abs(n.scale.x);return t}function NI(e,t){let n=(e,r)=>{if(e instanceof jA){let n=t*Math.max(1,Math.round(r));e.resolution!==n&&(e.resolution=n)}for(let t of e.children)n(t,r*Math.abs(t.scale.x))};n(e,MI(e))}var PI=``,FI=``,II=``;function LI(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?PI:r===`_`?FI:II,n++}else t+=e[n];return t}function RI(e){return e.replaceAll(PI,`*`).replaceAll(FI,`_`).replaceAll(II,`\\`)}function zI(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function BI(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&zI(e[i-1])&&zI(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function VI(e,t,n,r,i,a){let o=BI(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function HI(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function UI(e){let t=LI(e),n=[],r=[];VI(t,`*`,!0,`bold`,n,r),VI(t,`_`,!0,`bold`,n,r),VI(t,`*`,!1,`italic`,n,r),VI(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return HI(o).map(e=>({...e,text:RI(e.text)}))}function WI(e){return UI(e).map(e=>e.text).join(``)}function GI(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var KI=class extends mj{constructor(e={}){let t=bI(e),n=Q(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:qI(t.text??``,r),resolution:t.resolution,style:new ZA({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:xI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,$.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=qI(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=UI(e),this.reveal=SI(WI(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=CI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(wI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=JI(GI(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=xI(this.opts,e))}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function qI(e,t){return JI(UI(e),t)}function JI(e,t){return e.map(e=>{let n=YI(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function YI(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var XI=new Set([`b`,`i`,`span`,`br`,`img`]);function ZI(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=lL(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=uL(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=sL(e,t);if(n&&(XI.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=cL(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1370
|
+
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=aL(o,n.name,n.body),t=n.end;continue}}}s+=l}return c(),i}function QI(e,t={}){return ZI(e,t).map(e=>e.image??e.text).join(``)}function $I(e){return e.map(e=>{if(e.image!==void 0)return``;let t=iL(e.text);e.italic&&(t=`<i>${t}</i>`),e.bold&&(t=`<b>${t}</b>`);let n=[e.color===void 0?void 0:`color:${e.color}`,e.size===void 0?void 0:`font-size:${e.size}px`].filter(e=>e!==void 0);return n.length>0&&(t=`<span style="${n.join(`;`)}">${t}</span>`),e.tag!==void 0&&(t=`<${e.tag}>${t}</${e.tag}>`),t}).join(``)}function eL(e,t={}){let n=t.describeImage??(()=>`[image]`);return e.map(e=>e.image===void 0?e.text:n(e.image)).join(``)}function tL(e,t,n){let r=[];for(let t of e)t.image===void 0?t.text.split(`
|
|
1371
|
+
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})}):r.push({...t});let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:nL(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function nL(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function rL(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function iL(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function aL(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=oL(n,`color`),i=Number(oL(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function oL(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function sL(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function cL(e,t){if(t.selfClosing){let e=oL(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function lL(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function uL(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var dL=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild(Q()),$.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild(Q())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>zN(e,q.EMPTY)),o=pL(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=rL(tL(ZI(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return gL(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:mL(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:hL(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new nI({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=gL(r,t),a=new rI(r);return a.width=i.width,a.height=i.height,a}destroy(e){$.remove(this.themeListener),super.destroy(e)}},fL=null;function pL(){return typeof document>`u`?null:(fL??=document.createElement(`canvas`).getContext(`2d`),fL)}function mL(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function hL(e){return e===`italic`||e===`oblique`}function gL(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var _L=class extends WA{constructor(e={}){let t=bI(e),n=Q();super({text:t.text??``,style:vL(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,$.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=vL(this.opts,e)}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function vL(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:xI(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var yL=class extends J{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new kj({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},bL=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,xL=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,bL),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},SL=new xL,CL=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.closeMark=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.motion=null,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=Q();this.colors={...e.colors},this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new yL(t.panel,{border:t.panelBorder}):new Z,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new EI({text:e.title,color:this.colors.title??t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),SL.announce(e.title)),e.closeButton===!0&&this.closable&&(this.closeMark=new EI({text:`✕`,color:this.colors.title??t.color.textHighlight,bold:!0}),this.closeMark.eventMode=`static`,this.closeMark.cursor=`pointer`,this.closeMark.on(`pointertap`,()=>this.close()),this.addChild(this.closeMark)),this.addChild(this.content),this.resize(e.width,e.height),$.add(this.themeListener)}restyle(){this.titleLabel?.setColor(this.colors.title??Q().color.textHighlight),this.closeMark?.setColor(this.colors.title??Q().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=Q(),r=(this.background instanceof yL?this.background.border.left:2)+n.padding;this.background instanceof yL?(this.background.resize(e,t),this.background.tint=this.colors.background??16777215):this.background.clear().roundRect(0,0,e,t,4).fill({color:this.colors.background??n.color.panelFill}).stroke({color:this.colors.border??n.color.panelBorder,width:1}),this.closeMark&&(this.closeMark.x=n.direction===`rtl`?r:e-r-this.closeMark.width,this.closeMark.y=r);let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}setColors(e){this.colors={...e},this.restyle()}handleAction(e){return this.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){let t=this.motion;if(!t)return;t.elapsed+=e;let n=t.options.duration??.25,r=Math.min(1,t.elapsed/n);this.applyMotion(t.closing?1-r:r,t),!(r<1)&&(this.motion=null,t.closing?this.close():this.applyMotion(1,t))}applyMotion(e,t){let n=Xj(t.options.animation,e,t.closing),r=t.options.from??{x:t.base.x+this.currentWidth/2,y:t.base.y+this.currentHeight/2};this.scale.set(n.scale),this.alpha=n.alpha,this.position.set(r.x+(t.base.x-r.x)*n.scale,r.y+(t.base.y-r.y)*n.scale+n.offset)}open(e){!e||br()||this.isClosed||(this.motion={options:e,elapsed:0,closing:!1,base:{x:this.x,y:this.y}},this.applyMotion(0,this.motion))}close(e){if(!this.isClosed){if(e&&!br()){let t=this.motion?.base??{x:this.x,y:this.y};this.motion={options:e,elapsed:0,closing:!0,base:t}}else this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0})}}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=Q().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new G(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,$.remove(this.themeListener),super.destroy(e)}},wL=class extends J{constructor(){super(),this.windows=[],this.overlay=new Z,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),P.add(this.listener),$.add(this.themeListener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){if(e.closed)throw Error(`cannot open a window that was already closed`);return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);e===-1?this.overlay.visible=!1:(this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1)))}drawOverlay(){let e=Q();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){P.remove(this.listener),$.remove(this.themeListener),super.destroy(e)}},TL=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},EL=class extends J{constructor(e){super(),this.selection=new TL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new Z,this.mask_=new Z,this.scroll=0,this.themeListener=()=>this.restyle(),this.checked=new Set,this.ticks=[];let t=Q();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onToggle=e.onToggle??null,this.multiple=e.multiple??!1,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}restyle(){let e=Q();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof EI);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+this.checkAdvance()+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.checkAdvance()-this.rowHeight:e.spacing+this.checkAdvance())}),this.updateTicks(),this.refresh()}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=Q(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.checkAdvance()-this.rowHeight:t.spacing+this.checkAdvance(),i.addChild(e.icon));let a=new EI({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+this.checkAdvance()+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.selection.reset(e),this.checked.clear(),this.rebuildTicks(),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.multiple?this.toggleChecked(this.selection.selectedIndex):this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}get checkedIndexes(){return[...this.checked].sort((e,t)=>e-t)}isChecked(e){return this.checked.has(e)}setChecked(e,t){let n=this.selection.items[e];n&&!n.disabled&&this.checked.has(e)!==t&&(t?this.checked.add(e):this.checked.delete(e),this.updateTicks(),this.onToggle?.(n,e,t))}toggleChecked(e){let t=this.selection.items[e];return!t||t.disabled?!1:(this.setChecked(e,!this.checked.has(e)),!0)}clearChecked(){this.checked.size!==0&&(this.checked.clear(),this.updateTicks())}checkAdvance(){return this.multiple?this.checkBox()+Q().spacing:0}checkBox(){return Math.max(12,this.rowHeight-8)}rebuildTicks(){if(this.ticks=[],this.multiple){for(let e of this.rows){let t=new Z;e.addChildAt(t,0),this.ticks.push(t)}this.updateTicks()}}updateTicks(){let e=Q(),t=e.direction===`rtl`,n=this.checkBox(),r=Math.round((this.rowHeight-n)/2);this.ticks.forEach((i,a)=>{let o=this.selection.items[a]?.disabled??!0;if(i.clear().rect(0,0,n,n).fill({color:e.color.panelFill}).stroke({color:o?e.color.textDim:e.color.panelBorder,width:2}),this.checked.has(a)){let t=n*.25;i.moveTo(t,n*.55).lineTo(n*.45,n-t).lineTo(n-t,t).stroke({color:o?e.color.textDim:e.color.textHighlight,width:Math.max(2,n*.12),cap:`round`,join:`round`})}i.x=t?this.viewWidth-e.spacing-n:e.spacing,i.y=r})}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,n-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=Q();n===0?this.highlight.clear():this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},DL=class extends J{columnX(e){return(Q().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new TL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new Z,this.pickupHighlight=new Z,this.mask_=new Z,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=Q();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof EI)?.setColor(e.color.textHighlight))}),this.refresh()},this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=Q();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new EI({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(Q().direction===`rtl`?1:-1,0);case`right`:return this.move(Q().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-e+1),this.scrollRow=Math.max(0,Math.min(this.scrollRow,Math.max(0,this.rows-e))),this.cellsLayer.y=-this.scrollRow*this.cellSize;let r=Q();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},OL=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function kL(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1372
|
+
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=jL(e,t,s)}else r[a]=AL(o);a=null,o=``,s=[],c=!1}};for(let e of i){if(!e.trim()||e.trimStart().startsWith(`#`))continue;let t=e.match(/^([\w-]+)\s*=\s*(.*)$/);if(t){l(),a=t[1],o=t[2];continue}if(!a)throw Error(`FTL continuation has no message: ${e}`);if(e.trim()===`}`){if(!s.length||c)throw Error(`Unexpected FTL select terminator: ${e}`);c=!0;continue}if(c)throw Error(`FTL content follows a closed select expression: ${e}`);let n=e.match(/^\s*(\*)?\[([^\]]+)\]\s*(.*)$/);if(n)s.push({key:n[2],value:n[3],default:!!n[1]});else if(/^\s+/.test(e))s.length?s[s.length-1].value+=` ${e.trim()}`:o+=` ${e.trim()}`;else throw Error(`Invalid FTL line: ${e}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:r}}function AL(e){return e.replace(/\{\s*\$([\w-]+)\s*(?:!([sra]))?\s*(?::\s*([^{}]*?))?\s*\}/g,(e,t,n,r)=>`{${t}${n?`!${n}`:``}${r===void 0?``:`:${r.trim()}`}}`).trim()}function jL(e,t,n){let r=n.filter(e=>e.default);if(r.length!==1)throw Error(`FTL select expressions need exactly one default variant`);let i=r[0],a=new Intl.PluralRules(e);return{format(e={}){let r=e[t],o=n.find(e=>e.key===String(r)),s=typeof r==`number`?a.select(r):``;return AL((o??n.find(e=>e.key===s)??i).value)}}}function ML(e,t,n={}){let r=n.domain??`messages`,i=r===`messages`?``:`${r}:`,a={},o=t.replace(/\r\n?/g,`
|
|
1373
1373
|
`).split(`
|
|
1374
|
-
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``}else u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o}else t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=
|
|
1375
|
-
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var vL=/\{sound:([^{}\r\n]+)\}/g;function yL(e){let t=[],n=``,r=0,i;for(vL.lastIndex=0;(i=vL.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function bL(e){return yL(e).text}function xL(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return IR(t)?wR(t,n):``}let r=`${e.type}.${t}`;return IR(r)?TR(r,n):TR(e.type,n)}}}function SL(e,t){return new Intl.NumberFormat(SR(),t).format(e)}function CL(e,t){return new Intl.DateTimeFormat(SR(),t).format(e)}function wL(e,t){return new Intl.ListFormat(SR(),t).format(e)}var TL=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function EL(e){let t=[];TL.lastIndex=0;let n=0,r;for(;(r=TL.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function DL(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function OL(e,t){let n=new Map,r=new Map;for(let t of EL(e))typeof t!=`string`&&n.set(t.token,DL(t));for(let e of EL(t))typeof e!=`string`&&r.set(e.token,DL(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var kL=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,AL={b:2,o:8,x:16,X:16},jL={b:`0b`,o:`0o`,x:`0x`,X:`0X`},ML=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function NL(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function PL(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function FL(e,t){let n=/^(\d+)/.exec(e);return n?PL(n[1],t)+e.slice(n[1].length):e}function IL(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function LL(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function RL(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=LL(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function zL(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function BL(e,t,n,r,i,a){return IL(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function VL(e,t,n=`en`){if(t===``)return typeof e==`number`?NL(e):e;let r=kL.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:BL(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:IL(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!ML.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),IL((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=RL(_,m,!1,!!c,m-1)}else y=NL(_);v&&(y=FL(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=PL(y,v))}else if(p in AL){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString(AL[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=PL(y,v,4,`[0-9a-fA-F]`)),c&&(y=jL[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=zL(n),r=RL(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=FL(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=FL(y,v));else if(p===`e`||p===`E`)y=LL(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=FL(y,v));else if(p===`g`||p===`G`)y=RL(_,m??6,p===`G`,!!c),v&&(y=FL(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=FL(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+IL(y,h-b.length,x,`>`):IL(b+y,h,x,S)}function HL(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function UL(e){let t=[];for(let[n,r]of Object.entries(e.messages))typeof r==`string`?r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`}):WL(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`});return t}function WL(e){return typeof e==`object`&&!!e&&!(`format`in e)}function GL(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function KL(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function qL(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function JL(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,KL(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=qL(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function YL(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function XL(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=HL(e,t);return(n.length-r.length)/n.length}function ZL(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function QL(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function $L(e,t){return{base:e,target:t}}var eR=`.audio`;function tR(e){return e.endsWith(eR)}function nR(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!tR(e)).sort()}function rR(e){if(e===void 0)return;let t=KL(e);return t===``?void 0:t}var iR=[`log`,`compact`,`accessibility`,`debug`];function aR(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!iR.includes(e.slice(t+1))))return`${e.slice(0,t)}${eR}`}function oR(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${eR}`],o=aR(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=rR(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=rR(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:KL(n),targetText:r===void 0?``:KL(r),status:i,sound:s,soundKey:c,soundInherited:l}}function sR(e,t){let n=`${t}${eR}`;return n in e.target.messages||n in e.base.messages?n:aR(t)??n}function cR(e,t={}){let n=t.query?.toLowerCase()??``;return nR(e).map(t=>oR(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function lR(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function uR(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function dR(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function fR(e,t,n){let r={...e.target.messages},i=sR(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function pR(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!tR(e)))});return XL(t(e.base),t(e.target))}function mR(e){return{base:e.target,target:e.base}}var hR=l({AUDIO_SUFFIX:()=>eR,catalogCompleteness:()=>XL,catalogUsage:()=>YL,copyFromBase:()=>uR,createCatalogFormatter:()=>xL,createEditSession:()=>$L,cueKeyFor:()=>sR,deleteTargetKey:()=>dR,diffCatalogKeys:()=>HL,diffPlaceholders:()=>OL,direction:()=>CR,findSimilarMessages:()=>JL,formatDate:()=>CL,formatList:()=>wL,formatNumber:()=>SL,formatSpec:()=>VL,has:()=>IR,isAudioKey:()=>tR,levenshteinDistance:()=>qL,locale:()=>SR,mergeCatalogKeys:()=>QL,messageText:()=>KL,nonBreakingUnit:()=>MR,parseFTL:()=>dL,parsePo:()=>mL,parseSoundMarkers:()=>yL,pluralFormCoverage:()=>ZL,reset:()=>WR,sessionCompleteness:()=>pR,sessionKeys:()=>nR,sessionRow:()=>oR,sessionRows:()=>cR,setActive:()=>xR,setBase:()=>bR,setTargetSound:()=>fR,setTargetText:()=>lR,stripSoundMarkers:()=>bL,swapSession:()=>mR,t:()=>TR,tRaw:()=>wR,tokenizeMessage:()=>EL,typographic:()=>jR,validateCatalog:()=>UL,validateMessageAudio:()=>GL}),gR=null,_R=null,vR=null,yR=null;function bR(e){gR=e}function xR(e){_R=e,vR=e?new Intl.PluralRules(e.locale):null}function SR(){return(_R??gR)?.locale??`en`}function CR(){return(_R??gR)?.direction??`ltr`}function wR(e,t){let n=_R?.messages[e]??gR?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:RR(n)?n.format(t):LR(n,t?.count);return t?zR(r,t):r}function TR(e,t){if(!IR(e))return e;let n=wR(e,t),r=(_R??gR)?.typography===!1?n:jR(n,SR());return CR()===`rtl`?`${r}`:r}var ER=` `,DR=`\xA0`,OR=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],kR=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],AR=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function jR(e,t=SR()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=NR(r)),n===`de`&&(r=PR(r)),r}function MR(e,t,n=SR()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?ER:r===`de`?DR:` `}${t}`}function NR(e){let t=e.replace(/\s?([;!?])/g,`${ER}$1`).replace(/«\s?/g,`«${ER}`).replace(/\s?»/g,`${ER}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${ER}:`);let n=RegExp(`\\b(${OR.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${DR}`)}function PR(e){let t=RegExp(`(\\d)\\s+(?=(?:${AR.map(FR).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${kR.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${DR}`).replace(n,`$1.${DR}`)}function FR(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function IR(e){return _R?.messages[e]!==void 0||gR?.messages[e]!==void 0}function LR(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(vR??(yR??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function RR(e){return`format`in e}function zR(e,t){return EL(e).map(e=>typeof e==`string`?e:VR(e,t)).join(``)}function BR(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function VR(e,t){let n=BR(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:HR(n,e.conv),r=e.spec===void 0?String(t):VL(t,e.spec,SR());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function HR(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=VL(e,``,`en`)??String(e);return t===`a`?UR(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?UR(n):n}function UR(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function WR(){gR=null,_R=null,vR=null}var GR=class extends aL{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=iI(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=Q();this.content.addChild(this.portraitLayer),this.speakerLabel=new cI({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new cI({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new cI({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),$.add(this.messageThemeListener)}restyleMessage(){let e=Q();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){$.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=Q(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new wl(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=yL(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&iL.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=iI(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,yL(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1374
|
+
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``}else u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o}else t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=NL(o,e,r[3]);if(e=u.next-1,s?(i===`msgctxt`||i===`msgid`)&&s.id!==void 0&&(l(),s={plurals:new Map}):s={plurals:new Map},i===`msgctxt`)s.context=u.text;else if(i===`msgid`)s.id=u.text;else if(i===`msgid_plural`)s.plural=u.text;else if(i===`msgstr`)s.str=u.text;else if(a!==void 0)s.plurals.set(a,u.text);else throw Error(`Invalid PO keyword on line ${e+1}: ${i}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:a}}function NL(e,t,n){if(!n.trim().startsWith(`"`))throw Error(`PO string must start with a quote on line ${t+1}: ${n}`);let r=PL(n.trim(),t),i=t+1;for(;i<e.length&&e[i].trim().startsWith(`"`);)r+=PL(e[i].trim(),i),i++;return{text:r,next:i}}function PL(e,t){let n=e.match(/^"((?:[^"\\]|\\.)*)"/);if(!n)throw Error(`Invalid PO string on line ${t+1}: ${e}`);return FL(n[1])}function FL(e){return e.replace(/\\(.)/g,(e,t)=>{switch(t){case`n`:return`
|
|
1375
|
+
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var IL=/\{sound:([^{}\r\n]+)\}/g;function LL(e){let t=[],n=``,r=0,i;for(IL.lastIndex=0;(i=IL.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function RL(e){return LL(e).text}function zL(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return ez(t)?HR(t,n):``}let r=`${e.type}.${t}`;return ez(r)?UR(r,n):UR(e.type,n)}}}function BL(e,t){return new Intl.NumberFormat(BR(),t).format(e)}function VL(e,t){return new Intl.DateTimeFormat(BR(),t).format(e)}function HL(e,t){return new Intl.ListFormat(BR(),t).format(e)}var UL=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function WL(e){let t=[];UL.lastIndex=0;let n=0,r;for(;(r=UL.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function GL(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function KL(e,t){let n=new Map,r=new Map;for(let t of WL(e))typeof t!=`string`&&n.set(t.token,GL(t));for(let e of WL(t))typeof e!=`string`&&r.set(e.token,GL(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var qL=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,JL={b:2,o:8,x:16,X:16},YL={b:`0b`,o:`0o`,x:`0x`,X:`0X`},XL=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function ZL(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function QL(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function $L(e,t){let n=/^(\d+)/.exec(e);return n?QL(n[1],t)+e.slice(n[1].length):e}function eR(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function tR(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function nR(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=tR(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function rR(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function iR(e,t,n,r,i,a){return eR(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function aR(e,t,n=`en`){if(t===``)return typeof e==`number`?ZL(e):e;let r=qL.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:iR(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:eR(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!XL.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),eR((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=nR(_,m,!1,!!c,m-1)}else y=ZL(_);v&&(y=$L(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=QL(y,v))}else if(p in JL){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString(JL[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=QL(y,v,4,`[0-9a-fA-F]`)),c&&(y=YL[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=rR(n),r=nR(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=$L(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=$L(y,v));else if(p===`e`||p===`E`)y=tR(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=$L(y,v));else if(p===`g`||p===`G`)y=nR(_,m??6,p===`G`,!!c),v&&(y=$L(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=$L(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+eR(y,h-b.length,x,`>`):eR(b+y,h,x,S)}function oR(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function sR(e){let t=[];for(let[n,r]of Object.entries(e.messages))typeof r==`string`?r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`}):cR(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`});return t}function cR(e){return typeof e==`object`&&!!e&&!(`format`in e)}function lR(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function uR(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function dR(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function fR(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,uR(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=dR(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function pR(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function mR(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=oR(e,t);return(n.length-r.length)/n.length}function hR(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function gR(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function _R(e,t){return{base:e,target:t}}var vR=`.audio`;function yR(e){return e.endsWith(vR)}function bR(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!yR(e)).sort()}function xR(e){if(e===void 0)return;let t=uR(e);return t===``?void 0:t}var SR=[`log`,`compact`,`accessibility`,`debug`];function CR(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!SR.includes(e.slice(t+1))))return`${e.slice(0,t)}${vR}`}function wR(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${vR}`],o=CR(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=xR(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=xR(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:uR(n),targetText:r===void 0?``:uR(r),status:i,sound:s,soundKey:c,soundInherited:l}}function TR(e,t){let n=`${t}${vR}`;return n in e.target.messages||n in e.base.messages?n:CR(t)??n}function ER(e,t={}){let n=t.query?.toLowerCase()??``;return bR(e).map(t=>wR(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function DR(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function OR(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function kR(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function AR(e,t,n){let r={...e.target.messages},i=TR(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function jR(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!yR(e)))});return mR(t(e.base),t(e.target))}function MR(e){return{base:e.target,target:e.base}}var NR=l({AUDIO_SUFFIX:()=>vR,catalogCompleteness:()=>mR,catalogUsage:()=>pR,copyFromBase:()=>OR,createCatalogFormatter:()=>zL,createEditSession:()=>_R,cueKeyFor:()=>TR,deleteTargetKey:()=>kR,diffCatalogKeys:()=>oR,diffPlaceholders:()=>KL,direction:()=>VR,findSimilarMessages:()=>fR,formatDate:()=>VL,formatList:()=>HL,formatNumber:()=>BL,formatSpec:()=>aR,has:()=>ez,isAudioKey:()=>yR,levenshteinDistance:()=>dR,locale:()=>BR,mergeCatalogKeys:()=>gR,messageText:()=>uR,nonBreakingUnit:()=>XR,parseFTL:()=>kL,parsePo:()=>ML,parseSoundMarkers:()=>LL,pluralFormCoverage:()=>hR,reset:()=>cz,sessionCompleteness:()=>jR,sessionKeys:()=>bR,sessionRow:()=>wR,sessionRows:()=>ER,setActive:()=>zR,setBase:()=>RR,setTargetSound:()=>AR,setTargetText:()=>DR,stripSoundMarkers:()=>RL,swapSession:()=>MR,t:()=>UR,tRaw:()=>HR,tokenizeMessage:()=>WL,typographic:()=>YR,validateCatalog:()=>sR,validateMessageAudio:()=>lR}),PR=null,FR=null,IR=null,LR=null;function RR(e){PR=e}function zR(e){FR=e,IR=e?new Intl.PluralRules(e.locale):null}function BR(){return(FR??PR)?.locale??`en`}function VR(){return(FR??PR)?.direction??`ltr`}function HR(e,t){let n=FR?.messages[e]??PR?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:nz(n)?n.format(t):tz(n,t?.count);return t?rz(r,t):r}function UR(e,t){if(!ez(e))return e;let n=HR(e,t),r=(FR??PR)?.typography===!1?n:YR(n,BR());return VR()===`rtl`?`${r}`:r}var WR=` `,GR=`\xA0`,KR=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],qR=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],JR=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function YR(e,t=BR()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=ZR(r)),n===`de`&&(r=QR(r)),r}function XR(e,t,n=BR()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?WR:r===`de`?GR:` `}${t}`}function ZR(e){let t=e.replace(/\s?([;!?])/g,`${WR}$1`).replace(/«\s?/g,`«${WR}`).replace(/\s?»/g,`${WR}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${WR}:`);let n=RegExp(`\\b(${KR.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${GR}`)}function QR(e){let t=RegExp(`(\\d)\\s+(?=(?:${JR.map($R).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${qR.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${GR}`).replace(n,`$1.${GR}`)}function $R(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ez(e){return FR?.messages[e]!==void 0||PR?.messages[e]!==void 0}function tz(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(IR??(LR??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function nz(e){return`format`in e}function rz(e,t){return WL(e).map(e=>typeof e==`string`?e:az(e,t)).join(``)}function iz(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function az(e,t){let n=iz(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:oz(n,e.conv),r=e.spec===void 0?String(t):aR(t,e.spec,BR());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function oz(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=aR(e,``,`en`)??String(e);return t===`a`?sz(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?sz(n):n}function sz(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function cz(){PR=null,FR=null,IR=null}var lz=class extends CL{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=SI(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=Q();this.content.addChild(this.portraitLayer),this.speakerLabel=new EI({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new EI({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new EI({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),$.add(this.messageThemeListener)}restyleMessage(){let e=Q();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){$.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=Q(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new wl(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=LL(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&SL.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=SI(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,LL(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1376
1376
|
|
|
1377
|
-
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return
|
|
1377
|
+
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return TI(this.reveal)}update(e){this.finished||(this.pageComplete?(this.prompt.visible=!this.choiceList,!(this.autoAdvance===void 0||this.choiceList)&&(this.autoAdvanceElapsed+=e,this.autoAdvanceElapsed>=this.autoAdvance&&(this.autoAdvanceElapsed=0,this.advance()))):(CI(this.reveal,e),this.playRevealedSounds(),this.renderBody()))}handleAction(e){return this.delegate?super.handleAction(e):e===`confirm`?this.pageComplete?(this.advance(),!0):(wI(this.reveal),this.playRevealedSounds(),this.renderBody(),!0):!1}advance(){this.pageIndex<this.pages.length-1?(this.pageIndex++,this.showPage(this.pageIndex)):this.choices.length>0?this.showChoices():this.finish(void 0)}showChoices(){let e=Q(),t=this.choices.map(e=>({text:e.text,disabled:e.disabled,value:e.value??e.text}));this.announce&&SL.announce(this.choices.map(e=>e.text).join(`, `));let n=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing,r=t.length*n,i=this.body.y+this.body.height+e.padding,a=i+r-this.contentHeight;a>0&&this.grow(a),this.choiceList=new EL({width:this.contentWidth,height:r,items:t,onSelect:e=>this.finish(e.value)}),this.choiceList.y=i,this.content.addChild(this.choiceList),this.delegate=this.choiceList,this.prompt.visible=!1}grow(e){let t=this.getLocalBounds();this.resize(t.width,t.height+e),this.y=Math.max(0,this.y-e)}finish(e){this.finished||(this.finished=!0,this.onDone?.(e),this.close())}},uz=class{constructor(e={}){this.goalColumn=null,this.multiline=e.multiline??!1,this.text=this.limit(this.shape(e.value??``)),this.maxLength=e.maxLength,this.mask=e.mask??!1,this.maskCharacter=e.maskCharacter??`•`,this.caretIndex=this.text.length,this.anchor=this.caretIndex}get value(){return this.text}get maskedValue(){return this.mask?this.text.split(``).map(e=>e===`
|
|
1378
1378
|
`?`
|
|
1379
1379
|
`:this.maskCharacter).join(``):this.text}get length(){return this.text.length}get caret(){return this.caretIndex}get selectionStart(){return Math.min(this.caretIndex,this.anchor)}get selectionEnd(){return Math.max(this.caretIndex,this.anchor)}get hasSelection(){return this.caretIndex!==this.anchor}get selectedText(){return this.text.slice(this.selectionStart,this.selectionEnd)}setValue(e){this.text=this.limit(this.shape(e)),this.caretIndex=this.text.length,this.anchor=this.caretIndex,this.goalColumn=null}setCaret(e,t=!1){this.caretIndex=Math.max(0,Math.min(this.text.length,e)),this.goalColumn=null,t||(this.anchor=this.caretIndex)}insert(e){e.length!==0&&this.replaceSelection(e)}backspace(){this.hasSelection?this.replaceSelection(``):this.caretIndex!==0&&(this.text=this.text.slice(0,this.caretIndex-1)+this.text.slice(this.caretIndex),this.setCaret(this.caretIndex-1))}deleteForward(){this.hasSelection?this.replaceSelection(``):this.caretIndex>=this.text.length||(this.text=this.text.slice(0,this.caretIndex)+this.text.slice(this.caretIndex+1),this.setCaret(this.caretIndex))}moveCaret(e,t=!1){this.setCaret(this.caretIndex+e,t)}moveToStart(e=!1){this.setCaret(0,e)}moveToEnd(e=!1){this.setCaret(this.text.length,e)}selectAll(){this.anchor=0,this.caretIndex=this.text.length,this.goalColumn=null}clearSelection(){this.anchor=this.caretIndex}replaceSelection(e){let t=this.selectionStart,n=this.selectionEnd,r=this.text.slice(0,t)+this.text.slice(n),i=this.shape(e),a=this.maxLength!==void 0&&r.length+i.length>this.maxLength?i.slice(0,Math.max(0,this.maxLength-r.length)):i;this.text=this.text.slice(0,t)+a+this.text.slice(n),this.setCaret(t+a.length)}shape(e){return e.replace(/\r\n|\r|\n/g,this.multiline?`
|
|
1380
1380
|
`:``)}get lineCount(){return this.multiline?this.text.split(`
|
|
1381
1381
|
`).length:1}get caretLine(){return this.text.slice(0,this.caretIndex).split(`
|
|
1382
1382
|
`).length-1}lineRange(e){let t=Math.max(0,Math.min(this.lineCount-1,e)),n=0;for(let e=0;e<t;e++)n=this.text.indexOf(`
|
|
1383
1383
|
`,n)+1;let r=this.text.indexOf(`
|
|
1384
|
-
`,n);return[n,r===-1?this.text.length:r]}moveCaretLine(e,t=!1){let[n]=this.lineRange(this.caretLine),r=this.goalColumn??this.caretIndex-n,[i,a]=this.lineRange(this.caretLine+e);this.setCaret(i+Math.min(r,a-i),t),this.goalColumn=r}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},
|
|
1385
|
-
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var rz=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build(Q()),$.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=nz(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new jA({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function iz(e,t=0,n=1){return n>t?Math.max(0,Math.min(1,(e-t)/(n-t))):0}function az(e,t=0,n=1,r=0){let i=t+Math.max(0,Math.min(1,e))*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var oz=class extends J{constructor(e){super(),this.onChange=new p,this.track=new Z,this.fill=new Z,this.knob=new Z,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),$.add(this.themeListener)}get value(){return this.value_}get fraction(){return iz(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);t===this.value_?this.draw():(this.value_=t,this.draw(),this.onChange.dispatch(t))}setFraction(e){this.setValue(az(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return az(iz(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?Math.max(0,Math.min(1,(e-this.knobSize/2)/this.trackLength)):0}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},sz=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new Z,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){e===this.checked_?this.draw():(this.checked_=e,this.draw(),this.onChange.dispatch(e))}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}},cz=class extends J{constructor(e={}){super(),this.onChange=new p,this.options_=[],this.rows=[],this.circles=[],this.selected_=-1,this.themeListener=()=>this.draw(),this.size_=e.size??20,this.gap_=e.gap??8,this.buildRows(e.options??[]),this.selected_=this.defaultSelection(e.selected),this.draw(),$.add(this.themeListener)}get selected(){return this.selected_}get selectedOption(){return this.options_[this.selected_]??null}get length(){return this.options_.length}get rowHeight(){return this.size_+this.gap_}setOptions(e,t){this.buildRows(e),this.selected_=this.defaultSelection(t),this.draw()}select(e){let t=this.options_[e];t&&!t.disabled&&(e===this.selected_?this.draw():(this.selected_=e,this.draw(),this.onChange.dispatch(e)))}move(e){let t=this.options_.length;if(t===0)return!1;let n=this.selected_;for(let r=0;r<t;r++){n=(n+e+t)%t;let r=this.options_[n];if(r&&!r.disabled)return this.select(n),!0}return!1}handleAction(e){switch(e){case`up`:case`left`:return this.move(-1);case`down`:case`right`:return this.move(1);default:return!1}}tapRow(e){this.select(e)}defaultSelection(e){if(e!==void 0){let t=this.options_[e];if(t&&!t.disabled)return e}let t=this.options_.findIndex(e=>!e.disabled);return t===-1?-1:t}buildRows(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.circles=[],this.options_=[...e],this.removeChildren(),e.forEach((e,t)=>{let n=new J;n.y=t*this.rowHeight,n.eventMode=`static`,n.cursor=e.disabled?`default`:`pointer`,n.on(`pointertap`,()=>this.tapRow(t));let r=new Z;n.addChild(r),this.circles.push(r);let i=new cI({text:e.text});n.addChild(i),this.rows.push(n),this.addChild(n)})}draw(){let e=Q(),t=e.direction===`rtl`;this.rows.forEach((n,r)=>{let i=this.options_[r].disabled,a=this.circles[r];a.clear().circle(this.size_/2,this.size_/2,this.size_/2-1).fill({color:e.color.panelFill}).stroke({color:i?e.color.textDim:e.color.panelBorder,width:2}),r===this.selected_&&a.circle(this.size_/2,this.size_/2,Math.max(2,this.size_*.28)).fill({color:i?e.color.textDim:e.color.textHighlight});let o=this.size_+e.spacing,s=n.children.find(e=>e instanceof cI),c=s?.width??0;s&&(s.setColor(i?e.color.textDim:e.color.text),s.y=Math.round((this.size_-s.height)/2)),t?(s&&(s.x=0),a.x=c+e.spacing):(a.x=0,s&&(s.x=o))})}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function lz(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var uz=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new Z,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=lz(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(lz(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(lz(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(lz(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){e===this.value_?this.draw():(this.value_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},dz=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.highlight_=e)}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}},fz=class extends J{constructor(e){super(),this.list=new J,this.model=new dz(e),this.width_=e.width,this.rowHeight=e.rowHeight??28,this.head=new qR({width:this.width_,height:this.rowHeight,text:``,disabled:this.model.disabled,onClick:()=>{this.model.toggleOpen(),this.refresh()}}),this.list.y=this.rowHeight,this.addChild(this.head,this.list),this.refresh()}refresh(){let e=this.model;this.head.setText(`${e.selected?.label??``} ▾`),this.head.setDisabled(e.disabled);for(let e of this.list.removeChildren())e.destroy({children:!0});this.list.visible=e.isOpen,e.isOpen&&e.options.forEach((t,n)=>{let r=new qR({width:this.width_,height:this.rowHeight,text:t.label,disabled:t.disabled,onClick:()=>{e.setHighlight(n),e.confirm(),this.refresh()}});r.y=n*this.rowHeight,r.setSelected(n===e.selectedIndex),this.list.addChild(r)})}},pz=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>hz(mz(t,e),mz(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function mz(e,t){return e&&typeof e==`object`?e[t]:void 0}function hz(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var gz=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function _z(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var vz=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.maskShape=new Z,this.track=new Z,this.thumb=new Z,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.height_=e.height,this.contentHeight_=Math.max(0,e.contentHeight??0),this.offset_=_z(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.draw(),$.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportHeight(){return this.height_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.setOffset(_z(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.height_=t,this.setOffset(_z(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(_z(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(_z(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}setOffset(e){e===this.offset_?this.draw():(this.offset_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let n=Math.max(6,this.height_/this.contentHeight_*this.height_),r=this.offset_/this.maxOffset*(this.height_-n);this.thumb.roundRect(t,r,6,n,3).fill({color:e.color.textHighlight})}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function yz(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function bz(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=yz(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var xz=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return Sz(this.spec.columns,e,this.gap)}rowSizes(e){return Sz(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+wz(i,t,this.gap),y:n.y+wz(a,e,this.gap),width:Tz(i,t,o,this.gap),height:Tz(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function Sz(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===Cz(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function Cz(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function wz(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function Tz(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}function Ez(e,t,n={}){let r=n.gap??0,i=n.align??`start`,a=Array(e.length),o=0,s=[],c=0,l=0,u=()=>{if(s.length===0)return;let n=Math.max(0,t-c),u=i===`center`?n/2:i===`end`?n:0;for(let t of s)a[t]={x:u,y:o},u+=e[t].width+r;o+=l+r,s=[],c=0,l=0};return e.forEach((e,n)=>{let i=s.length===0?e.width:c+r+e.width;s.length>0&&i>t&&u(),c=s.length===0?e.width:c+r+e.width,l=Math.max(l,e.height),s.push(n)}),u(),{positions:a,height:Math.max(0,o-r)}}var Dz=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],Oz=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?Dz.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(kz(r))for(let t of Dz){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function kz(e){return Dz.some(t=>e[t]!==void 0)}var Az=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new cL({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&xe.add(this.onKeyCaptured)})}cancelCapture(){xe.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){xe.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n))this.refresh();else{for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){xe.remove(this.onKeyCaptured),super.destroy(e)}},jz=class extends J{constructor(e){super(),this.highlight=new Z,this.main=new J,this.rebindLayer=new J,this.rows=[],this.selected=0,this.rebind=null,this.themeListener=()=>this.drawHighlight(),this.settings=e.settings,this.width_=e.width??320,this.rowHeight=e.rowHeight??36,this.labels={music:`Music`,sfx:`Sound effects`,muted:`Mute`,zoom:`Zoom`,controls:`Controls...`,reset:`Reset to defaults`,rebindHint:`Keys (cancel: back)`,...e.labels},this.zoomMin=e.zoomMin??.5,this.zoomMax=e.zoomMax??4,this.zoomStep=e.zoomStep??.25,this.customRows=e.custom??[],this.actionsOption=e.actions,this.onConflict=e.onConflict,this.addChild(this.highlight),this.addChild(this.main),this.addChild(this.rebindLayer),this.rebindLayer.visible=!1,this.buildMain(),this.refresh(),this.drawHighlight(),$.add(this.themeListener)}get selectedRow(){return this.rows[this.selected]?.id??``}get isRebinding(){return this.rebind!==null}handleAction(e){if(this.rebind)return e===`cancel`&&!this.rebind.isCapturing?(this.closeRebind(),!0):this.rebind.handleAction(e);let t=this.rows[this.selected];if(!t)return!1;switch(e){case`up`:return this.select((this.selected+this.rows.length-1)%this.rows.length),!0;case`down`:return this.select((this.selected+1)%this.rows.length),!0;case`left`:return t.adjust(-1),!0;case`right`:return t.adjust(1),!0;case`confirm`:return t.activate(),!0;default:return!1}}refresh(){for(let e of this.rows)e.refresh()}select(e){this.selected=e,this.drawHighlight()}drawHighlight(){this.rows.length===0?this.highlight.clear():this.highlight.clear().rect(0,this.selected*this.rowHeight,this.width_,this.rowHeight).fill({color:Q().color.selection})}buildMain(){let e=this.settings.current;this.addSliderRow(`music`,this.labels.music,0,100,1,10,Math.round(e.musicVolume*100),e=>this.settings.setMusicVolume(e/100)),this.addSliderRow(`sfx`,this.labels.sfx,0,100,1,10,Math.round(e.sfxVolume*100),e=>this.settings.setSfxVolume(e/100)),this.addToggleRow(`muted`,this.labels.muted,e.muted,e=>this.settings.setMuted(e)),this.addSliderRow(`zoom`,this.labels.zoom,this.zoomMin,this.zoomMax,this.zoomStep,this.zoomStep,e.zoom,e=>this.settings.setZoom(e));for(let e of this.customRows)this.addCustomRow(e);this.addActionRow(`controls`,this.labels.controls,()=>this.openRebind()),this.addActionRow(`reset`,this.labels.reset,()=>{this.settings.reset(),this.refresh()}),this.main.children.forEach((e,t)=>{e.y=t*this.rowHeight})}addSliderRow(e,t,n,r,i,a,o,s){let c=new J,l=new cI({text:t});l.y=10;let u=new oz({width:140,min:n,max:r,step:i,value:o});u.x=this.width_-148,u.y=10,c.addChild(l,u),this.main.addChild(c);let d=()=>{l.setText(`${t}: ${u.value}`)};d(),u.onChange.add(e=>{s(e),d()}),this.rows.push({id:e,root:c,adjust:e=>u.setValue(u.value+e*a),activate:()=>{},refresh:()=>{u.setValue(this.readSlider(e)),d()}})}readSlider(e){let t=this.settings.current;switch(e){case`music`:return Math.round(t.musicVolume*100);case`sfx`:return Math.round(t.sfxVolume*100);case`zoom`:return t.zoom;default:return 0}}addToggleRow(e,t,n,r){let i=new J,a=new cI({text:t});a.y=10;let o=new sz({checked:n});o.x=this.width_-28,o.y=8,i.addChild(a,o),this.main.addChild(i),o.onChange.add(r),this.rows.push({id:e,root:i,adjust:()=>o.toggle(),activate:()=>o.toggle(),refresh:()=>o.setChecked(this.readToggle(e))})}readToggle(e){return e===`muted`?this.settings.current.muted:this.settings.getCustom(e.slice(7),!1)===!0}addCustomRow(e){let t=`custom:${e.key}`;if(e.kind===`boolean`){let n=this.settings.getCustom(e.key,!1);this.addToggleRow(t,e.label,n===!0,t=>this.settings.setCustom(e.key,t))}else if(e.kind===`number`){let n=this.settings.getCustom(e.key,e.min),r=typeof n==`number`?n:e.min,i=e.step??0,a=i>0?i:(e.max-e.min)/20,o=new J,s=new cI({text:e.label});s.y=10;let c=new oz({width:140,min:e.min,max:e.max,step:e.step??0,value:r});c.x=this.width_-148,c.y=10,o.addChild(s,c),this.main.addChild(o);let l=()=>{s.setText(`${e.label}: ${c.value}`)};l(),c.onChange.add(t=>{this.settings.setCustom(e.key,t),l()}),this.rows.push({id:t,root:o,adjust:e=>c.setValue(c.value+e*a),activate:()=>{},refresh:()=>{let t=this.settings.getCustom(e.key,e.min);c.setValue(typeof t==`number`?t:e.min),l()}})}else{let n=e.options,r=new J,i=new cI({text:e.label});i.y=10;let a=new uz({min:0,max:n.length-1,step:1,value:0,wrap:!0});a.x=this.width_-32,a.y=2,r.addChild(i,a),this.main.addChild(r);let o=e=>{let t=typeof e==`string`?n.indexOf(e):-1;return t>=0?t:0},s=()=>{i.setText(`${e.label}: ${n[a.value]}`)};a.setValue(o(this.settings.getCustom(e.key,n[0]))),s(),a.onChange.add(t=>{this.settings.setCustom(e.key,n[t]),s()}),this.rows.push({id:t,root:r,adjust:e=>e>0?a.increment():a.decrement(),activate:()=>a.increment(),refresh:()=>{a.setValue(o(this.settings.getCustom(e.key,n[0]))),s()}})}}addActionRow(e,t,n){let r=new J,i=new qR({width:this.width_-16,height:28,text:t,onClick:n});i.x=8,i.y=4,r.addChild(i),this.main.addChild(r),this.rows.push({id:e,root:r,adjust:()=>{},activate:n,refresh:()=>{}})}openRebind(){let e=this.actionsOption??Object.keys(this.settings.current.bindings),t=new cI({text:this.labels.rebindHint}),n=new Az({width:this.width_,height:Math.max(1,e.length)*this.rowHeight,actions:e,onConflict:this.onConflict});t.y=0,n.y=this.rowHeight,this.rebindLayer.addChild(t,n),this.rebindLayer.visible=!0,this.main.visible=!1,this.highlight.visible=!1,this.rebind=n}closeRebind(){this.settings.setBindings(Le()),this.rebindLayer.removeChildren(),this.rebind?.destroy(),this.rebind=null,this.rebindLayer.visible=!1,this.main.visible=!0,this.highlight.visible=!0}destroy(e){$.remove(this.themeListener),this.rebind?.destroy(),this.rebind=null,super.destroy(e)}},Mz=class extends J{constructor(e){if(super(),this.emptyLayer=new J,this.filledLayer=new J,this.maskShape=new Z,this.themeListener=()=>this.draw(),e.filledTexture===void 0!=(e.emptyTexture===void 0))throw Error(`a Meter takes filledTexture and emptyTexture together, or neither`);this.count_=Pz(e.count),this.size_=e.size??16,this.gap_=e.gap??4,this.value_=Nz(e.value??this.count_,this.count_),this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.emptyColor_=e.emptyColor,this.filledTexture=e.filledTexture,this.emptyTexture=e.emptyTexture,this.addChild(this.emptyLayer),this.addChild(this.filledLayer),this.addChild(this.maskShape),this.filledLayer.mask=this.maskShape,this.draw(),$.add(this.themeListener)}get value(){return this.value_}get count(){return this.count_}get color(){return this.fillColor}setValue(e,t=this.count_){this.count_=Pz(t),this.value_=Nz(e,this.count_),this.draw()}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}resize(e,t=this.gap_){this.size_=e,this.gap_=t,this.draw()}get totalWidth(){return this.count_*this.size_+(this.count_-1)*this.gap_}iconX(e){let t=e*(this.size_+this.gap_);return Q().direction===`rtl`?this.totalWidth-t-this.size_:t}draw(){let e=Q();this.explicitColor||(this.fillColor=e.color.textHighlight);let t=this.emptyColor_??e.color.panelFill;this.emptyLayer.removeChildren(),this.filledLayer.removeChildren();for(let e=0;e<this.count_;e++){let n=this.iconX(e);this.emptyLayer.addChild(this.icon(n,t,this.emptyTexture,!1)),this.filledLayer.addChild(this.icon(n,this.fillColor,this.filledTexture,!0))}let n=this.totalWidth*(this.count_>0?this.value_/this.count_:0),r=e.direction===`rtl`?this.totalWidth-n:0;this.maskShape.clear().rect(r,0,n,this.size_).fill({color:16777215})}icon(e,t,n,r){if(n){let i=new wl(n);return i.x=e,i.width=this.size_,i.height=this.size_,r&&this.explicitColor&&(i.tint=t),i}let i=new Z,a=this.size_/2;return i.circle(e+a,a,a).fill({color:t}),i}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Nz(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,e)):t}function Pz(e){return Number.isFinite(e)?Math.max(1,Math.floor(e)):1}var Fz=class extends J{constructor(e){super(),this.track=new Z,this.fill=new Z,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.fraction=Iz((e.value??1)/(e.max??1)),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),$.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=Iz(t>0?e/t:0),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??Q().color.panelFill}setBackground(e){this.background_=e,this.draw()}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=Q();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Iz(e){return Math.max(0,Math.min(1,e))}function Lz(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function Rz(e,t,n=!1){return n||e<=0?0:-t*e}function zz(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var Bz=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=Math.min(1,Math.max(0,e.hold??0));let t=new cI({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=zz(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=Rz(t,this.rise,br()),this.alpha=Lz(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},Vz=4;function Hz(e){return Math.max(0,e)/5}function Uz(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function Wz(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=Uz(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:Hz(r.length+1)}),i={...o,y:s}}return r}var Gz=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new Bz({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of Wz(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},Kz=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=Er.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},qz=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new aL({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new cI({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n){this.pending&&this.pending.text===e?(this.pending.x=t,this.pending.y=n,this.visible&&this.place()):(this.pending={text:e,x:t,y:n},this.waited=0,this.visible=!1)}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.delay))return!1;this.body.setText(this.pending.text);let t=Q(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},Jz=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-Q().spacing,r=Q().direction===`rtl`;this.list=new cL({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new cI({wrapWidth:n}),this.body.x=r?0:t+Q().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},Yz=class e extends J{constructor(t){super(),this.text=new cI({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1386
|
-
`)}},Xz=class extends J{constructor(e){super(),this.backdrop=new Z,this.progress=new Fz({width:240,height:10,value:0}),this.width_=e.width,this.height_=e.height,this.onRetry=e.onRetry,this.onCancel=e.onCancel,this.title=new cI({text:e.title??`Loading`,size:18,bold:!0,align:`center`}),this.status=new cI({text:`Preparing...`,align:`center`}),this.addChild(this.backdrop,this.title,this.status,this.progress),this.layout()}setSnapshot(e){let t=e.total>0?e.completed/e.total:0;this.progress.setValue(t),e.status===`failed`?this.status.setText(`Loading failed. Retry or cancel.`):e.status===`cancelled`?this.status.setText(`Loading cancelled.`):e.status===`ready`?this.status.setText(`Ready`):this.status.setText(e.current?`Loading ${e.current}...`:`Preparing...`)}bind(e){this.setSnapshot(e.snapshot);let t=e=>this.setSnapshot(e);return e.changed.add(t),()=>e.changed.remove(t)}retry(){this.onRetry?.()}cancel(){this.onCancel?.()}resize(e,t){this.width_=e,this.height_=t,this.layout()}layout(){let e=Q().color;this.backdrop.clear().rect(0,0,this.width_,this.height_).fill({color:e.overlay,alpha:.92});let t=this.width_/2,n=this.height_/2;this.title.anchor.set(.5),this.status.anchor.set(.5),this.title.position.set(t,n-36),this.status.position.set(t,n-8),this.progress.position.set(t-120,n+16)}};function Zz(e,t={}){return n=>new Promise(r=>{e.push(new GR({width:t.width??480,height:t.height??120,speed:t.speed??45,pages:[{text:n.text,speaker:n.speaker,portrait:n.portrait}],choices:n.choices,anchor:t.anchor??`bottom`,onDone:e=>r(e)}))})}function Qz(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function $z(e){return .2126*Qz(e>>16&255)+.7152*Qz(e>>8&255)+.0722*Qz(e&255)}function eB(e,t){let[n,r]=[$z(e),$z(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function tB(e,t,n=`AA`,r=!1){let i=n===`AAA`?r?4.5:7:r?3:4.5;return eB(e,t)>=i}var nB={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},rB=class extends J{constructor(e,t){super(),this.backdropLayer=new J,this.actorLayer=new J,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweener=new Dr,this.dimAmount=.45,this.stageWidth=e,this.stageHeight=t,this.addChild(this.backdropLayer),this.addChild(this.actorLayer)}defineCharacter(e,t){this.definitions.set(e,t)}resize(e,t){this.stageWidth=e,this.stageHeight=t;for(let e of[this.backdrop,this.outgoingBackdrop])e&&this.fitBackdrop(e);for(let e of this.actors.values())this.placeActor(e)}setBackdrop(e,t=.4){this.outgoingBackdrop?.destroy();let n=this.backdrop;this.outgoingBackdrop=n;let r=new wl(e);this.fitBackdrop(r),this.backdrop=r,this.backdropLayer.addChild(r);let i=()=>{this.outgoingBackdrop===n&&(n?.destroy(),this.outgoingBackdrop=null)};return t<=0?(i(),Promise.resolve()):(r.alpha=0,this.tweener.tween(t,e=>{r.alpha=e}).then(i))}fitBackdrop(e){let t=e.texture,n=Math.max(this.stageWidth/t.width,this.stageHeight/t.height);e.scale.set(n),e.x=Math.round((this.stageWidth-t.width*n)/2),e.y=Math.round((this.stageHeight-t.height*n)/2)}show(e,t={}){let n=this.definitions.get(e);if(!n)throw Error(`no character defined as "${e}"`);let r=t.expression??Object.keys(n.expressions)[0],i=this.actors.get(e);if(i)return t.at!==void 0&&(i.slot=this.slotOf(t.at)),this.setExpression(e,r),this.placeActor(i),Promise.resolve();let a=new aM(n.sheet.get(n.expressions[r])),o={id:e,sprite:a,definition:n,slot:this.slotOf(t.at??`center`),expression:r};this.actors.set(e,o),this.actorLayer.addChild(a),this.placeActor(o),this.applyFocus();let s=t.fade??.25;return s<=0?Promise.resolve():(a.alpha=0,this.tweener.tween(s,e=>{a.alpha=e}))}hide(e,t=.25){let n=this.actors.get(e);return n?(this.actors.delete(e),this.focused===e&&(this.focused=null),this.applyFocus(),t<=0?(n.sprite.destroy(),Promise.resolve()):this.tweener.tween(t,e=>{n.sprite.alpha=1-e}).then(()=>n.sprite.destroy())):Promise.resolve()}hideAll(e=.25){return Promise.all([...this.actors.keys()].map(t=>this.hide(t,e))).then(()=>void 0)}setExpression(e,t){let n=this.actors.get(e);if(!n)return;let r=n.definition.expressions[t];if(r===void 0)throw Error(`character "${e}" has no expression "${t}"`);n.expression=t,n.sprite.texture=n.definition.sheet.get(r)}focus(e){this.focused=e,this.applyFocus()}applyFocus(){let e=Math.round(255*(1-this.dimAmount)),t=e<<16|e<<8|e;for(let e of this.actors.values()){let n=this.focused!==null&&e.id!==this.focused;e.sprite.tint=n?t:16777215}}slotOf(e){return typeof e==`number`?e:nB[e]}placeActor(e){let t=e.definition,n=(t.height??.7)*this.stageHeight,r=n/t.sheet.frameHeight;e.sprite.scale.set(r),e.sprite.x=Math.round(e.slot*this.stageWidth-t.sheet.frameWidth*r/2),e.sprite.y=Math.round((t.baseline??.92)*this.stageHeight-n)}update(e){this.tweener.update(e)}get isBusy(){return this.tweener.isBusy}},iB=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.historyLog=[],this.seenLines=new Set,this.skipSeen=!1,this.options=e}cancel(){this.cancelled=!0}get history(){return this.historyLog}async showLast(){let e=this.historyLog.at(-1);if(!e)return!1;let{windows:t}=this.options;return await new Promise(n=>{t.push(new GR({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:0,pages:[{text:e.text,speaker:e.speaker}],dims:!1,anchor:`bottom`,onDone:()=>n()}))}),!0}async run(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)throw Error(`a "goto ${e}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async step(e){let{stage:t}=this.options;if(`backdrop`in e)await t.setBackdrop(this.options.backdrop(e.backdrop),e.fade);else if(`show`in e)await t.show(e.show,{at:e.at,expression:e.expression,fade:e.fade});else if(`hide`in e)await t.hide(e.hide,e.fade);else if(`hideAll`in e)await t.hideAll(e.fade);else if(`expression`in e)t.setExpression(e.of,e.expression);else if(`say`in e)await this.speak(e.say,e.as,e.speaker),this.recordHistory(e.say,e.as,e.speaker);else{if(`ask`in e){let t=await this.speak(e.ask,e.as,e.speaker,e.choices);return this.recordHistory(e.ask,e.as,e.speaker,t),e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`goto`in e)return e.goto;`wait`in e?await new Promise(t=>setTimeout(t,e.wait*1e3)):`call`in e&&await e.call(this.state)}}recordHistory(e,t,n,r){let i=n??(t?this.options.displayName?.(t)??t:void 0);this.seenLines.add(aB(t,e)),this.historyLog.push({text:e,speaker:i,chosen:r})}speak(e,t,n,r){let{stage:i,windows:a}=this.options;i.focus(t??null);let o=n??(t?this.options.displayName?.(t)??t:void 0),s=this.skipSeen&&!r&&this.seenLines.has(aB(t,e));return new Promise(t=>{a.push(new GR({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:s?0:this.options.speed??45,autoAdvance:s?0:void 0,mode:this.options.mode,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function aB(e,t){return`${e??``}\u0000${t}`}function oB(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}function sB(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,as:e.speaker})}function cB(e,t={}){let n={},r=e=>{for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask)};if(Array.isArray(e))r(e);else for(let t of Object.values(e))r(t);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}var lB=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},uB=class extends J{constructor(e){super(),this.backdrop=new wl(q.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new cI({text:``,color:Q().color.textHighlight}),this.textLabel=new cI({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},dB=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],fB=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function pB(e){return e===4?sr:lr}var mB={passable:!1,transparent:!1},hB={passable:!0,transparent:!0},gB=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return nr(this.width,e,t)}xOf(e){return rr(this.width,e)}yOf(e){return ir(this.width,e)}inside(e,t){return tr(this.width,this.height,e,t)}neighbors(e,t,n=8){return this.shape===`hex`?Jn(e,t):pB(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?fB:dB:pB(n);for(let[n,a]of i)r(e+n,t+a)}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??mB}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function _B(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function vB(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}_e();var yB={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function bB(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function xB(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function SB(e,t){let n=bB(t),r=xB(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function CB(e,t){let n=SB(e,t);if(n.length===0)return null;let r=ie(n.map(e=>e.weight??1));return r===null?null:n[r]}_e();var wB=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function TB(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[],hooks:u,builders:d}=e,f=new gB(t,n,[...wB,...l],s,e.shape),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ne(i,a),r=ne(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1||p.some(e=>vB(l,e,2))){g++;continue}p.push(l);let m=(d?.length?CB(d,l):null)??yB;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){DB(f,_B(p[e-1]),_B(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){DB(f,_B(p[e]),_B(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function EB(e){return TB(e).level}function DB(e,t,n,r){let i=A(.5);if(e.shape===`hex`){let a=i?{x:n.x,y:t.y}:{x:t.x,y:n.y};for(let i of[...Zn(t,a),...Zn(a,n)])e.insideWithBorder(i.x,i.y)&&e.set(i.x,i.y,r)}else i?(OB(e,t.x,n.x,t.y,!0,r),OB(e,t.y,n.y,n.x,!1,r)):(OB(e,t.y,n.y,t.x,!1,r),OB(e,t.x,n.x,n.y,!0,r))}function OB(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function kB(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function AB(e,t){let n=null,r=-1;for(let i of e.rooms){let a=_B(i),o=e.shape===`hex`?Yn(a,t):(a.x-t.x)**2+(a.y-t.y)**2;o>r&&(r=o,n=i)}return n}_e();function jB(e,t){return[[e,t-1],[e,t+1],[e-1,t],[e+1,t]]}function MB(e,t){return Jn(e,t).map(e=>[e.x,e.y])}var NB=2/Math.sqrt(3);function PB(e,t,n,r){let i=$n(e,t,NB,1),a=$n(n,r,NB,1);return(i.x-a.x)**2+(i.y-a.y)**2}function FB(e){let{width:t,height:n}=e;if(t<5||n<5)throw Error(`a cave needs at least 5x5 cells`);if(e.chambers.length<1)throw Error(`a cave needs at least one chamber`);let r=e.wall??0,i=e.floor??1,a=e.kinds??[],o=e.shape??`square`,s=o===`hex`,c=s?MB:jB,l=(e,t,n,r)=>s?Yn({x:e,y:t},{x:n,y:r}):Math.abs(e-n)+Math.abs(t-r),u=(e,t,n,r)=>s?PB(e,t,n,r):(e-n)**2+(t-r)**2;if(e.random===void 0&&e.seed===void 0)throw Error(`a cave needs a seed or a random source`);let d=e.random,f=e=>O(e,void 0,d),p=new gB(t,n,[...wB,...a],r,o),m=(e,n)=>n*t+e,h=(e,t)=>p.insideWithBorder(e,t),g=new Uint8Array(t*n),_=(e,t)=>{h(e,t)&&(g[m(e,t)]=1)};d===void 0&&w(e.seed);try{let r=new Map,a=new Map;for(let i of e.chambers){if(i.size<1)throw Error(`cave chamber ${i.id} needs at least one cell`);let e=ne(Math.max(1,i.xRange[0]),Math.min(t-2,i.xRange[1]),d),o=ne(Math.max(1,i.yRange[0]),Math.min(n-2,i.yRange[1]),d);r.set(i.id,{x:e,y:o});let s=[{x:e,y:o}],u=new Set([m(e,o)]),p=[],g=(e,t)=>{for(let[n,r]of c(e,t))h(n,r)&&!u.has(m(n,r))&&(u.add(m(n,r)),p.push([n,r]))};for(g(e,o);s.length<i.size&&p.length;){let t=0;if(f(100)<(i.jagged??0))t=f(p.length);else{let n=1/0;for(let r=0;r<p.length;r++){let i=l(p[r][0],p[r][1],e,o);i<n&&(n=i,t=r)}}let[n,r]=p.splice(t,1)[0];s.push({x:n,y:r}),g(n,r)}for(let e of s)_(e.x,e.y);a.set(i.id,s)}let o=(e,r,i,a)=>{let o=e.x,s=e.y;for(let e=0;e<t*n&&(o!==r.x||s!==r.y);e++){if(_(o,s),i>1)for(let[e,t]of c(o,s).slice(0,i-1))_(e,t);let e=c(o,s).filter(([e,t])=>h(e,t)),t=e[0];if(f(100)<a)t=e[f(e.length)];else{let n=1/0;for(let i of e){let e=u(i[0],i[1],r.x,r.y);e<n&&(n=e,t=i)}}[o,s]=t}_(r.x,r.y)};for(let t of e.chambers)for(let e of t.passages){let n=r.get(t.id),i=r.get(e.to);if(!n||!i)throw Error(`cave passage ${t.id} -> ${e.to} names no chamber`);f(100)>=(e.chance??100)||o(n,i,Math.max(1,e.width??1),e.windiness??0)}let s=e.mustBeClear??[];for(let e of s){_(e.x,e.y);for(let[t,n]of c(e.x,e.y))_(t,n)}let v=r.get(e.chambers[0].id);if(v){let e=()=>{let e=new Set([m(v.x,v.y)]),t=[[v.x,v.y]];for(;t.length;){let[n,r]=t.pop();for(let[i,a]of c(n,r))h(i,a)&&g[m(i,a)]&&!e.has(m(i,a))&&(e.add(m(i,a)),t.push([i,a]))}return e};for(let t of[...r.values(),...s])h(t.x,t.y)&&!e().has(m(t.x,t.y))&&o(t,v,1,15)}let y=new Set,b=[];for(let t of e.starts??[]){let e=r.get(t.chamber);if(!e)throw Error(`cave start ${t.side} names no chamber`);if(_(e.x,e.y),y.add(m(e.x,e.y)),t.ring)for(let[t,n]of c(e.x,e.y))h(t,n)&&(_(t,n),y.add(m(t,n)));b.push({side:t.side,x:e.x,y:e.y})}let x=[],S=e.villageDensity??0;if(S>0){let e=[];for(let t=0;t<g.length;t++)g[t]&&!y.has(t)&&e.push(t);let n=Math.floor(e.length*S/1e3);for(let r=0;r<n&&e.length;r++){let n=f(e.length),r=e.splice(n,1)[0];x.push({x:r%t,y:Math.floor(r/t)})}}for(let e=0;e<g.length;e++)g[e]&&p.set(e%t,Math.floor(e/t),i);return{level:p,chambers:[...a.entries()].map(([e,t])=>({id:e,centre:r.get(e),cells:t})),starts:b,villages:x}}finally{d===void 0&&T()}}_e();function IB(e,t,n,r,i){let a=e=>Math.max(2,Math.ceil(e/r)+2),o=a(t),s=a(n),c=new Float64Array(o*s);for(let t=0;t<c.length;t++)c[t]=e();let l=e=>e*e*(3-2*e),u=Array(t*n).fill(0);for(let e=0;e<3;e++){let a=1<<e,d=1/(a*a);for(let e=0;e<n;e++)for(let n=0;n<t;n++){let f=(i?n*LB:n)/r*a,p=(i?e+(n&1)/2:e)/r*a,m=Math.floor(f)%(o-1),h=Math.floor(p)%(s-1),g=l(f-Math.floor(f)),_=l(p-Math.floor(p)),v=(e,t)=>c[(h+t)%s*o+(m+e)%o],y=v(0,0)*(1-g)+v(1,0)*g,b=v(0,1)*(1-g)+v(1,1)*g;u[e*t+n]+=(y*(1-_)+b*_)*d}}for(let e=0;e<u.length;e++)u[e]/=1.3125;return u}var LB=Math.sqrt(3)/2,RB=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]];function zB(e,t,n,r){if(e)for(let e of Jn(t,n))r(e.x,e.y,!1);else for(let[e,i]of RB)r(t+e,n+i,e!==0&&i!==0)}var BB={plains:1,forest:3,hills:5,desert:2,swamp:6,water:24,mountains:40};function VB(e){let{width:t,height:n}=e;if(t<16||n<16)throw Error(`an overworld needs at least 16x16 tiles`);let r=e.seaLevel??.4;if(!(r>0&&r<1))throw Error(`seaLevel must be between 0 and 1`);let i=e.noiseScale??6,a=e.shape===`hex`,o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n;w(e.seed);try{let c=IB(()=>D(),t,n,i,a),l=IB(()=>D(),t,n,i*1.5,a),u=Array(t*n),d=(e,t)=>{let n=o(e,t),i=c[n],a=l[n];return i<r?`water`:i>.78?`mountains`:i>.62?`hills`:a<.3?`desert`:a>.72?i<r+.08?`swamp`:`forest`:`plains`};for(let e=0;e<n;e++)for(let n=0;n<t;n++)u[o(n,e)]=d(n,e);let f=new Set,p=[],m=e.rivers??Math.max(1,Math.floor(t*n/600)),h=[];for(let e=0;e<u.length;e++)c[e]>.7&&u[e]!==`water`&&h.push(e);for(let e=0;e<m*4&&p.length<m&&h.length!==0;e++){let e=h[O(h.length)],r=[],i=e%t,l=Math.floor(e/t),d=new Set;for(let e=0;e<t+n;e++){let e=o(i,l);if(f.has(e)||u[e]===`water`){r.length>0&&r.push({x:i,y:l});break}r.push({x:i,y:l}),d.add(e);let t;if(zB(a,i,l,(e,n)=>{if(!s(e,n))return;let r={x:e,y:n,up:c[o(e,n)]};(!t||r.up<t.up)&&(t=r)}),!t||t.up>=c[o(i,l)]){u[o(i,l)]=`water`;break}[i,l]=[t.x,t.y]}if(r.length>=2){for(let e of r)f.add(o(e.x,e.y));p.push(r)}}let g=[],_=(e,t)=>{if(a)return Qn({x:e,y:t},3).some(e=>s(e.x,e.y)&&u[o(e.x,e.y)]===`water`);for(let n=-3;n<=3;n++)for(let r=-3;r<=3;r++){let i=e+r,a=t+n;if(s(i,a)&&u[o(i,a)]===`water`)return!0}return!1},v=(e,t,n)=>g.every(r=>(a?Yn(r,{x:e,y:t}):Math.abs(r.x-e)+Math.abs(r.y-t))>=n),y=e.settlements??Math.max(2,Math.floor(t*n/500));for(let e=0;e<y*60&&g.length<y;e++){let e=O(t),r=O(n),i=u[o(e,r)];i!==`plains`&&i!==`hills`&&i!==`forest`||!_(e,r)||v(e,r,8)&&g.push({x:e,y:r,kind:i===`hills`?`castle`:`town`})}for(let e of g)e.kind===`town`&&O(2)===0&&(e.kind=`village`);let b=[],x=g[0];if(x){let e=[x],r=g.slice(1);for(;r.length;){let i;for(let o of r)for(let r of e){let e=HB(u,t,n,r,o,a);e&&(!i||e.length<i.path.length)&&(i={path:e,to:o})}if(!i)break;b.push(i.path),e.push(i.to),r.splice(r.indexOf(i.to),1)}}let S=[],C=e.pointsOfInterest??Math.max(1,Math.floor(t*n/900));for(let e=0;e<C*40&&S.length<C;e++){let e=O(t),r=O(n),i=u[o(e,r)];if(i===`water`||i===`mountains`||!v(e,r,6))continue;let a=[`ruin`,`shrine`,`dungeon`],s=a[O(a.length)];S.push({x:e,y:r,kind:s,leadsTo:`overworld-${s}-${S.length}`})}let ee=Math.max(2,e.regionSize??12),w=Math.ceil(t/ee),T=Array(t*n);for(let e=0;e<n;e++)for(let n=0;n<t;n++)T[o(n,e)]=Math.floor(e/ee)*w+Math.floor(n/ee);return{terrain:u,elevation:c,moisture:l,rivers:p,roads:b,settlements:g,pointsOfInterest:S,regions:T,regionColumns:w}}finally{T()}}function HB(e,t,n,r,i,a){let o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n,c=t*n,l=new Float64Array(c).fill(1/0),u=new Int32Array(c).fill(-1),d=o(r.x,r.y),f=o(i.x,i.y);l[d]=0;let p=[d],m=new Uint8Array(c),h=e=>{for(;;){let t=e*2+1,n=t+1,r=e;if(t<p.length&&l[p[t]]<l[p[r]]&&(r=t),n<p.length&&l[p[n]]<l[p[r]]&&(r=n),r===e)return;[p[e],p[r]]=[p[r],p[e]],e=r}},g=()=>{let e=p[0],t=p.pop();return p.length&&(p[0]=t,h(0)),m[e]=0,e},_=e=>{p.push(e),m[e]=1;let t=p.length-1;for(;t>0;){let e=t-1>>1;if(l[p[e]]<=l[p[t]])break;[p[t],p[e]]=[p[e],p[t]],t=e}};for(;p.length;){let n=g();if(n===f){let e=[];for(let n=f;n!==-1;n=u[n])e.push({x:n%t,y:Math.floor(n/t)});return e.reverse()}zB(a,n%t,Math.floor(n/t),(t,r,i)=>{if(!s(t,r))return;let a=o(t,r);if(l[n]===1/0)return;let c=BB[e[a]]*(i?1.5:1);l[n]+c<l[a]&&(l[a]=l[n]+c,u[a]=n,m[a]||_(a))})}}var UB=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};_e();function WB(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=A(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=A(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(oe(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function GB(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function KB(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function qB(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function JB(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),GB(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!KB(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),qB(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function YB(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...JB(n,e()));return r}var XB=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*XB,e=e*69069+1>>>0,this._s1=e*XB,e=e*69069+1>>>0,this._s2=e*XB,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*XB;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var ZB=class{getContainer(){return null}setOptions(e){this._options=e}},QB=class extends ZB{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function $B(e){return e.charAt(0).toUpperCase()+e.substring(1)}function eV(e,...t){let n=eV.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=$B(d)),d})}eV.map={s:`toString`};var tV=class e extends QB{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};tV.cache=!1;var nV={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},rV=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[nV[8][7],nV[8][1],nV[8][3],nV[8][5]];break;case 6:i=nV[6],a=1,o=[-1,1];break;case 8:i=nV[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},iV=class extends rV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},aV=class extends rV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},oV=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],sV={DiscreteShadowcasting:iV,PreciseShadowcasting:aV,RecursiveShadowcasting:class extends rV{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<oV.length;i++)this._renderOctant(e,t,oV[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,oV[o],n,i),this._renderOctant(e,t,oV[a],n,i),this._renderOctant(e,t,oV[r],n,i),this._renderOctant(e,t,oV[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,oV[r],n,i),this._renderOctant(e,t,oV[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var cV=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=nV[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},lV={Dijkstra:class extends cV{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends cV{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function uV(e,t){return dr(e,t)}function dV(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function fV(e,t,n,r={}){let i=e.shape===`hex`?Zn(t,n):dV(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function pV(e,t,n){let r=e.shape===`hex`?Zn(t,n):dV(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function mV(e,t,n,r){return!((e.shape===`hex`?Yn(t,n):uV(t,n))>r.range||(r.requireLineOfSight??!0)&&!pV(e,t,n))}function hV(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return dV(e,t);case`cone`:return vV(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function gV(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?Zn(t,n):r.kind===`burst`?Qn(n,r.radius):_V(t,n,r.width):hV(t,n,r)}function _V(e,t,n){let r=Yn(e,t);if(r===0)return[{...e}];let i=Zn(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of Qn(o,s))Yn(e,n)===t&&a.push(n)}return a}function vV(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}var yV=.5;function bV(e){return e<0?-Math.round(-e):Math.round(e)}function xV(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/yV)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+bV(Math.cos(i)*r.range),y:t.y+bV(Math.sin(i)*r.range)};for(let n of fV(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function SV(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=uV(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function CV(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function wV(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function TV(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var EV=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?Yn(this.origin,this.cursor):uV(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return pV(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n)}else this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?gV(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},DV=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new sV.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of Qn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`)for(let e of Qn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}else for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||uV(a,{x:t,y:o})>n)continue;let e=dV(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},OV=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},kV=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new lV.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},AV=class e{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};_e();function jV(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:MV(e,n,a)};let c=new DV(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:NV(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:MV(e,n,a)}}function MV(e,t,n){return re(PV(e,t,n))}function NV(e,t,n,r){let i=PV(e,t,r),a=null,o=FV(t,n);for(let e of i){let t=FV(e,n);t>o&&(o=t,a=e)}return a}function PV(e,t,n){let r=n.blocked,i=[];for(let[a,o]of pB(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function FV(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var IV=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},LV=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},RV=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}check(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},zV=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},BV=class extends S{modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},VV=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>uV(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},HV=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},UV=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},WV=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=gV(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};_e();function GV(e,t={}){return(t.within?[...t.within]:JV(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function KV(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function qV(e,t){let n=[...new Set(e)];oe(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function JV(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var YV=l({AbilityCycle:()=>zV,BossPhases:()=>RV,CombatHooks:()=>BV,DUNGEON_KINDS:()=>wB,Doors:()=>LV,Elevation:()=>OV,FLOOR:()=>hB,FeatureLayer:()=>UB,FieldOfView:()=>DV,Level:()=>gB,MultiStageAbility:()=>UV,MultiTurnBeam:()=>WV,Pathfinder:()=>kV,Scheduler:()=>AV,Secrets:()=>IV,Stealth:()=>VV,TargetingController:()=>EV,TriggerTracker:()=>HV,WALL:()=>mB,areaFalloffMultiplier:()=>wV,ballistica:()=>fV,canTarget:()=>mV,candidateCells:()=>GV,cellsNear:()=>KV,chainTargets:()=>SV,chebyshevDistance:()=>uV,checkDeterminism:()=>YB,compareDungeonArtifacts:()=>JB,coneCells:()=>vV,coneSector:()=>xV,decideMonsterAI:()=>jV,eligibleBuilders:()=>SB,findFreeCell:()=>kB,furthestRoom:()=>AB,generateCave:()=>FB,generateDungeon:()=>EB,generateDungeonGraph:()=>TB,generateOverworld:()=>VB,hallBuilder:()=>yB,hasLineOfSight:()=>pV,hexConeCells:()=>_V,knockbackPath:()=>TV,neighbourOffsets:()=>pB,pickBuilder:()=>CB,rangeMultiplier:()=>CV,rectCenter:()=>_B,rectsOverlap:()=>vB,resolveArea:()=>hV,resolveAreaOnLevel:()=>gV,rollRoster:()=>WB,selectDistinctCells:()=>qV,traceLine:()=>dV});function XV(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var ZV=class e{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=XV(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=XV(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function QV(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var $V=class e{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};_e();function eH(e,t,n=()=>ne(1,20)){return e+n()>=t}var tH=class e{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},nH=class e{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},rH=class e{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...iH(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function iH(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function aH(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function oH(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function sH(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!oH(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!aH(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function cH(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function lH(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return cH(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}_e();function uH(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=ie(n.map(e=>e.weight));return r===null?null:n[r]}function dH(e){return e.affix}function fH(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function pH(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function mH(e,t){e.affix===void 0?pH(t):(t.affix=e.affix,t.cursed=e.cursed??!1)}function hH(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function gH(e){e.identified=!0}function _H(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&pH(e),e.level):e.level??0}function vH(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function yH(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function bH(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return cH(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var xH=class e{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};_e();function SH(e){if(e.entries.length===0||!A(e.chance??1))return null;let t=ie(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var CH=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function wH(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}_e();function TH(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=O(0,e+1);[t[e],t[n]]=[t[n],t[e]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var EH=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=TH(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function DH(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function OH(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0):(n.add({...s,quantity:i}),!1))}function kH(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function AH(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function jH(e,t){return[...AH(kH(t))].every(([t,n])=>e.base(t)>=n)}function MH(e,t){let n=AH(kH(t));if(![...n].every(([t,n])=>e.base(t)>=n))return!1;for(let[t,r]of n)e.setBase(t,e.base(t)-r);return!0}function NH(e,t,n=1){for(let[r,i]of AH(kH(t)))e.setBase(r,e.base(r)+i*n)}function PH(e,t,n,r){return MH(e,t)?n.refund(Math.floor(t.amount/r)):0}var FH=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};_e();function IH(e,t,n){return oe([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var LH=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},RH=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(zH(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=zH(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=zH(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function zH(e,t){return[e,t].sort().join(`\0`)}var BH=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function VH(e,t={},n){let r=new ZV({base:KH(e)}),i;e.growth!==void 0&&(i=new $V(GH(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);fH(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new Dn,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function HH(e,t={},n){return e.map(e=>VH(e,t,n))}function UH(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function WH(e,t,n,r){let i=VH(e,t,r);if(i.stats=ZV.fromJSON({base:KH(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=$V.fromJSON(GH(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function GH(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function KH(e){let t={};for(let[n,r]of Object.entries(e))if(!BH.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var qH=l({Advancement:()=>CH,Appearances:()=>EH,AuraField:()=>LH,Barrier:()=>FH,Charges:()=>xH,EquipmentSlots:()=>nH,Inventory:()=>rH,Progression:()=>$V,SkillPoints:()=>tH,StatBlock:()=>ZV,SupportLedger:()=>RH,affixOf:()=>dH,applyAffix:()=>fH,applyItemStatusEffect:()=>bH,applyStatusEffect:()=>lH,assignAppearances:()=>TH,assignTraits:()=>IH,buildEntities:()=>HH,buildEntity:()=>VH,buy:()=>DH,canAfford:()=>jH,composeModifiers:()=>XV,convertToCharges:()=>PH,copyAffix:()=>mH,craft:()=>sH,damageItem:()=>vH,enchant:()=>_H,fromEntitySaveState:()=>WH,identify:()=>gH,matchesContext:()=>hH,powerCurve:()=>QV,refund:()=>NH,removeAffix:()=>pH,repairItem:()=>yH,rollAffix:()=>uH,rollLoot:()=>SH,scaledModifiers:()=>wH,sell:()=>OH,skillCheck:()=>eH,spend:()=>MH,toEntitySaveState:()=>UH}),JH=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},YH=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},XH=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};_e();function ZH(e){if(e.entries.length===0||!A(e.rate))return null;let t=ie(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var QH=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},$H=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return eU(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function eU(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var tU=l({EnvironmentClock:()=>QH,Overworld:()=>YH,SideTurns:()=>$H,TurnClock:()=>XH,World:()=>JH,alignmentBonus:()=>eU,rollEncounter:()=>ZH});_e();function nU(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{rU(t,t.name??`#${n+1}`,e.shape);let a=iU(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function rU(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function iU(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)aU(e,t,i,r)&&n.push([i,r]);return n}function aU(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var oU=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function sU(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function cU(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>sU(e,t))&&(n=r);return n}var lU=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){let t=await this.runList(e);if(t!==void 0){if(this.options.onUnknownCommand)return this.options.onUnknownCommand({goto:t}),this.state;throw Error(`a "goto ${t}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async runList(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)return e}}async step(e){if(`say`in e)await this.speak(e.say,e.speaker,e.portrait);else{if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.portrait,e.choices);return e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`wait`in e)await new Promise(t=>setTimeout(t,e.wait*1e3));else if(`setSwitch`in e)this.state.game.setSwitch(e.setSwitch,e.value);else if(`setVariable`in e)this.state.game.setVariable(e.setVariable,e.value);else if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount)}else{if(`if`in e){let t=sU(e.if,this.state.game);return this.runList(t?e.then:e.else??[])}if(`move`in e)await this.options.move?.(e.move.target,e.move.steps);else{if(`goto`in e)return e.goto;`call`in e?await e.call(this.state):this.options.onUnknownCommand?.(e)}}}}speak(e,t,n,r){return this.options.present({text:e,speaker:t,portrait:n,choices:r})}};function uU(e,t){t&&e.has?.(t)&&e.play?.(t)}var dU=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=fU(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=fU(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}jumpBy(e,t){return!this.target&&(this.facing=fU(e,t),this.x+=e,this.y+=t,this.fromX=this.x,this.fromY=this.y,this.place(),this.playIdle(),!0)}update(e){this.sprite.update?.(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=pU(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=pU(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){uU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){uU(this.sprite,this.options.idleAnimation?.(this.facing))}};function fU(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function pU(e,t,n){return e+(t-e)*n}var mU=[`up`,`down`,`left`,`right`],hU={up:{dx:0,dy:-1},down:{dx:0,dy:1},left:{dx:-1,dy:0},right:{dx:1,dy:0}},gU={up:{around:`down`,left90:`left`,right90:`right`},down:{around:`up`,left90:`right`,right90:`left`},left:{around:`right`,left90:`down`,right90:`up`},right:{around:`left`,left90:`up`,right90:`down`}},_U=class{constructor(e,t,n={}){this.index=0,this.waiting=0,this.mover=e,this.route=t,this.options=n}get done(){return!this.route.repeat&&this.index>=this.route.steps.length}update(e){if(this.mover.isMoving||this.done||this.waiting>0&&(this.waiting=Math.max(0,this.waiting-e),this.waiting>0))return;this.index>=this.route.steps.length&&(this.index=0);let t=this.route.steps[this.index];(this.runStep(t)||this.route.skippable)&&this.index++}runStep(e){if(`turn`in e){let{dx:t,dy:n}=this.resolveTurn(e);return this.mover.turnTo(t,n),!0}if(`wait`in e)return this.waiting=e.wait,!0;if(`jump`in e)return this.attempt(e.jump.dx,e.jump.dy,(e,t)=>this.mover.jumpBy(e,t));if(`step`in e)return this.attempt(e.step.dx,e.step.dy,(e,t)=>this.mover.moveBy(e,t));let{dx:t,dy:n}=this.resolveDirection(e);return this.attempt(t,n,(e,t)=>this.mover.moveBy(e,t))}resolveDirection(e){return e.dir===`random`?hU[this.pickDirection()]:e.dir===`forward`?hU[this.mover.facing]:e.dir===`backward`?hU[gU[this.mover.facing].around]:e.dir===`toward`||e.dir===`away`?this.resolveAim(e.dir,e):hU[e.dir]}resolveTurn(e){if(e.turn===`random`)return hU[this.pickDirection()];if(e.turn===`around`||e.turn===`left90`||e.turn===`right90`)return hU[gU[this.mover.facing][e.turn]];if(e.turn===`toward`||e.turn===`away`){let t=this.resolveAim(e.turn,e);return t.dx===0&&t.dy===0?hU[this.mover.facing]:t}return hU[e.turn]}resolveAim(e,t){let n=`target`in t?t.target():t,r=e===`toward`?1:-1,i=n.x-this.mover.x,a=n.y-this.mover.y;return Math.abs(i)>=Math.abs(a)?{dx:r*Math.sign(i)||0,dy:0}:{dx:0,dy:r*Math.sign(a)||0}}attempt(e,t,n){return e===0&&t===0?!0:this.options.canMove&&!this.options.canMove(e,t)?!1:n(e,t)}pickDirection(){let e=this.options.random??Math.random;return mU[Math.floor(e()*mU.length)]}},vU=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){uU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){uU(this.sprite,this.options.idleAnimation?.(this.facing))}};function yU(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 bU(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function xU(e,t){let n=kn(e.x,t.x,t.x+t.width),r=kn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function SU(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=CU(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:CU(o,e.y,e.width,e.height,n,i,a,!1)}}function CU(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var wU=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?sU(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return n.tracked&&(r.tracked=n.tracked),r}};function TU(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(EU(e.id,r))}return t.map(e=>n.get(e))}function EU(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var DU=class{constructor(e){this.name=e}},OU=4,kU=8,AU=new WeakMap;function jU(e){return AU.get(e)}function MU(e,t){return AU.set(e,t),e}var NU=1e3,PU=class{constructor(e){this.pos=0,this.depth=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&AU.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){if(++this.depth>NU)throw Error(`Marshal: values nested more than ${NU} deep`);try{return this.readTagged()}finally{this.depth--}}readTagged(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==OU||t>kU)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${OU}.${kU} or lower)`);return this.readValue()}};function FU(e){return new PU(e).readDocument()}function IU(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function LU(e){let t=[OU,kU];return RU(t,e),new Uint8Array(t)}function RU(e,t){if(t==null)e.push(zU(`0`));else if(t===!0)e.push(zU(`T`));else if(t===!1)e.push(zU(`F`));else if(t instanceof DU)e.push(zU(`:`)),BU(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(zU(`i`)),VU(e,t)):(e.push(zU(`f`)),BU(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(zU(`"`)),BU(e,t);else if(Array.isArray(t)){e.push(zU(`[`)),VU(e,t.length);for(let n of t)RU(e,n)}else if(t instanceof Map){let n=AU.has(t);e.push(zU(n?`}`:`{`)),VU(e,t.size);for(let[n,r]of t)RU(e,n),RU(e,r);n&&RU(e,AU.get(t))}else if(IU(t)){e.push(zU(`o`)),e.push(zU(`:`)),BU(e,t.class);let n=Object.entries(t.ivars);VU(e,n.length);for(let[t,r]of n)e.push(zU(`:`)),BU(e,t),RU(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function zU(e){return e.charCodeAt(0)}function BU(e,t){let n=new TextEncoder().encode(t);VU(e,n.length);for(let t of n)e.push(t)}function VU(e,t){if(t===0)e.push(0);else if(t>0&&t<=122)e.push(t+5);else if(t<0&&t>=-123)e.push(t-5&255);else{if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}}function HU(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,speaker:e.speaker})}function UU(e,t={}){let n={};for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function WU(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}var GU=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>lU,FreeMover:()=>vU,GameState:()=>oU,GridMover:()=>dU,MoveRouteRunner:()=>_U,QuestLog:()=>wU,RubySymbol:()=>DU,aabbOverlap:()=>yU,activePage:()=>cU,automap:()=>nU,circleAabbOverlap:()=>xU,circleOverlap:()=>bU,conditionHolds:()=>sU,decodeMarshal:()=>FU,encodeMarshal:()=>LU,extractDialogueCatalog:()=>UU,hashDefaultOf:()=>jU,importTwee:()=>WU,parseDialogueText:()=>HU,questsFromRows:()=>TU,resolveAabbAgainstTiles:()=>SU,withHashDefault:()=>MU}),KU=QV(20,2,100),qU=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new $V(e.species.growth??KU,{level:e.level??1}),this.stats=new ZV({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},JU=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},YU=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){if(t<0||t>=this.active.length)return;let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function XU(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function ZU(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var QU=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=Math.max(-this.max,Math.min(this.max,n+t)),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function $U(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function eW(e,t,n,r){let i=null,a=tW(e,n,r);return t.forEach((e,t)=>{let o=tW(e.types,n,r);o<a&&(a=o,i=t)}),i}function tW(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var nW=class extends S{},rW=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},iW=class{constructor(e){this.chanceToHit=aW(e.chanceToHit??1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=Math.max(0,e.damage)*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let t=[],n=e.defender.hp;for(let r=0;r<=e.strikes;r++)r>0&&(e.hits?.[r-1]??!0)&&(n-=Math.max(0,e.damage)),t.push({strike:r,time:r*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:Math.max(0,n),defenderDamage:this.defenderHp0-Math.max(0,n)});this.frames=t}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}};function aW(e){return Math.max(0,Math.min(1,e))}var oW=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},sW=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new iW({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new oW({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},cW=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},lW=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},uW=l({AttackDialog:()=>sW,AttackPreview:()=>iW,BattleHooks:()=>nW,BattleStats:()=>lW,Creature:()=>qU,Field:()=>rW,Party:()=>YU,StatStages:()=>QU,TypeMatrix:()=>JU,UnitSelector:()=>oW,Whiteboard:()=>cW,battleOrder:()=>XU,checkEvolution:()=>ZU,chooseMove:()=>$U,chooseSwitch:()=>eW});function dW(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function fW(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function pW(e){let t=[];for(let n=7;n>=0;n--){let r=``,i=0;for(let t=0;t<8;t++){let a=e.board[n*8+t];if(!a){i++;continue}i>0&&(r+=String(i),i=0);let o={pawn:`p`,knight:`n`,bishop:`b`,rook:`r`,queen:`q`,king:`k`}[a.kind];r+=a.side===`white`?o.toUpperCase():o}i>0&&(r+=String(i)),t.push(r)}let n=(e.castling.whiteKingside?`K`:``)+(e.castling.whiteQueenside?`Q`:``)+(e.castling.blackKingside?`k`:``)+(e.castling.blackQueenside?`q`:``);return`${t.join(`/`)} ${e.turn===`white`?`w`:`b`} ${n||`-`} ${e.enPassant===null?`-`:fW(e.enPassant)}`}function mW(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:dW(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(_W(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return EW(n,`white`),EW(n,`black`),o}function hW(e){return e===`white`?`black`:`white`}function gW(e){return e&7}function _W(e){return e>>3}function vW(e,t){return e>=0&&e<8&&t>=0&&t<8}function yW(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function bW(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var xW=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],SW=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],CW=[[1,1],[-1,1],[-1,-1],[1,-1]],wW=[[1,0],[0,1],[-1,0],[0,-1]];function TW(e,t,n){let r=gW(t),i=_W(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!vW(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of xW){if(!vW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of SW){if(!vW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:CW,kinds:[`bishop`,`queen`]},{steps:wW,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;vW(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function EW(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function DW(e,t){return TW(e.board,EW(e.board,t),hW(t))}function OW(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=gW(t),a=_W(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;vW(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(vW(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!vW(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of xW){if(!vW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(CW);break;case`rook`:o(wW);break;case`queen`:o(CW),o(wW);break;case`king`:{for(let[o,s]of SW){if(!vW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!DW(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!TW(e.board,o+5,hW(n.side))&&!TW(e.board,o+6,hW(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!TW(e.board,o+3,hW(n.side))&&!TW(e.board,o+2,hW(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function kW(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${fW(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[AW(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[AW(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=hW(n.side)}function AW(e,t){let n=gW(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function jW(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of OW(e,n)){let n=bW(e);kW(n,r),!DW(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function MW(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${fW(t.from)} to move`);let r=OW(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${fW(t.from)}-${fW(t.to)} is not a legal move here`);let i=bW(e);if(kW(i,r),DW(i,e.turn))throw Error(`${fW(t.from)}-${fW(t.to)} leaves the king in check`);kW(e,r)}function NW(e){return jW(e).length>0?`ongoing`:DW(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var PW=1e5;function FW(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??PW;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}function IW(e,t){return e.moves(t).map(n=>({move:n,child:e.apply(t,n)}))}function LW(e,t){let n=null,r=t?-1/0:1/0;for(let{move:i,score:a}of e)(n===null||(t?a>r:a<r))&&(n=i,r=a);return n}function RW(){return globalThis.process?.getBuiltinModule?.(`node:worker_threads`)}function zW(){let e=globalThis.process?.getBuiltinModule?.(`node:worker_threads`)?.parentPort??null,t=globalThis,n=e=>{let t=[],n=new Set,r=e=>{if(typeof e!=`object`||!e||n.has(e))return;if(n.add(e),ArrayBuffer.isView(e)){let n=e.buffer;n instanceof ArrayBuffer&&!t.includes(n)&&t.push(n);return}if(e instanceof ArrayBuffer){t.includes(e)||t.push(e);return}if(Array.isArray(e)){for(let t of e)r(t);return}let i=Object.getPrototypeOf(e);if(i===Object.prototype||i===null)for(let t of Object.values(e))r(t)};return r(e),t},r=(n,r=[])=>{e?e.postMessage(n,r):t.postMessage(n,r)},i=async e=>{try{let t=await Function(`return (${e.code});`)()(...e.args);r({ok:!0,value:t},n(t))}catch(e){let t=e;r({ok:!1,message:String(t?.message??e),stack:typeof t?.stack==`string`?t.stack:void 0})}};e?e.on(`message`,e=>void i(e)):t.onmessage=e=>void i(e.data)}var BW=e=>{if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return null;let t=URL.createObjectURL(new Blob([`(${zW.toString()})()`],{type:`text/javascript`})),n;try{n=new Worker(t)}catch(e){throw URL.revokeObjectURL(t),e}return n.onmessage=t=>e.reply(t.data),n.onerror=t=>e.fail(Error(t.message||`the worker failed to run`)),n.onmessageerror=()=>e.fail(Error(`the worker sent a reply that could not be deserialized`)),{post:(e,t)=>n.postMessage(e,t),terminate:()=>{n.terminate(),URL.revokeObjectURL(t)}}},VW=e=>{let t=RW();if(!t)return null;let n=new t.Worker(`(${zW.toString()})()`,{eval:!0});return n.on(`message`,t=>e.reply(t)),n.on(`error`,t=>e.fail(t instanceof Error?t:Error(String(t)))),n.on(`messageerror`,()=>e.fail(Error(`the worker sent a reply that could not be deserialized`))),n.on(`exit`,t=>e.fail(Error(`the worker exited with code ${t} before answering`))),{post:(e,t)=>n.postMessage(e,t),terminate:()=>void n.terminate()}};function HW(e){let t=Error(e.message);return e.stack&&(t.stack=e.stack),t}function UW(e,t,n={}){return new Promise((r,i)=>{if(n.signal?.aborted){i(n.signal.reason);return}let a=!1,o,s,c=e=>{a||(a=!0,o!==void 0&&clearTimeout(o),n.signal?.removeEventListener(`abort`,l),s?.terminate(),e())};function l(){c(()=>i(n.signal.reason))}let u={reply:e=>c(()=>{e.ok?r(e.value):i(HW(e))}),fail:e=>c(()=>i(e))};try{s=BW(u)??VW(u)}catch(e){i(e);return}if(!s)i(Error(`spawn() needs Web Workers or node:worker_threads, and this environment offers neither`));else{n.timeout!==void 0&&n.timeout>0&&(o=setTimeout(()=>c(()=>i(Error(`the task did not answer within ${n.timeout} ms`))),n.timeout)),n.signal?.addEventListener(`abort`,l,{once:!0});try{s.post({code:e.toString(),args:t??[]},n.transfer??[])}catch(e){c(()=>i(e))}}})}var WW=1e5,GW={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function KW(e,t={}){return qW(e,t).move}function qW(e,t={}){let n=FW(ZW,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}async function JW(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??YW();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=ZW.currentPlayer(e),o=IW(ZW,e);if(ZW.isTerminal(e)||!o.length)return{move:null,score:ZW.evaluate(e,a),nodes:0};let s=Math.max(1,Math.min(i,o.length)),c=Array(o.length),l=0,u=!1,d=0,f=t.signal?{signal:t.signal}:{};if(await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let t=await UW(XW,[o[e].child,a,n-1,r],f);l+=t.nodes,t.budgetExceeded?u=!0:c[e]={move:o[e].move,score:t.score}}})),u)return{move:null,score:ZW.evaluate(e,a),nodes:l};let p=c.filter(e=>e!==void 0),m=LW(p,!0);return{move:m,score:p.find(e=>e.move===m)?.score??ZW.evaluate(e,a),nodes:l}}function YW(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}function XW(e,t,n,r){let i={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0},a=e=>e===`white`?`black`:`white`,o=e=>e&7,s=e=>e>>3,c=(e,t)=>e>=0&&e<8&&t>=0&&t<8,l=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],u=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],d=[[1,1],[-1,1],[-1,-1],[1,-1]],f=[[1,0],[0,1],[-1,0],[0,-1]],p=(e,t,n)=>{let r=o(t),i=s(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!c(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of l){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of u){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let p=[{steps:d,kinds:[`bishop`,`queen`]},{steps:f,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of p)for(let[o,s]of t){let t=r+o,l=i+s;for(;c(t,l);){let r=e[l*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,l+=s}}return!1},m=(e,t)=>{let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n},h=(e,t)=>p(e.board,m(e.board,t),a(t)),g=(e,t)=>{let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=o(t),m=s(t),g=a=>{for(let[o,s]of a){let a=i+o,l=m+s;for(;c(a,l);){let i=l*8+a,c=e.board[i];if(!c)r.push({from:t,to:i});else{c.side!==n.side&&r.push({from:t,to:i});break}a+=o,l+=s}}};switch(n.kind){case`pawn`:{let a=n.side===`white`?1:-1,o=n.side===`white`?1:6,s=n.side===`white`?7:0;if(c(i,m+a)&&!e.board[(m+a)*8+i]){let n=(m+a)*8+i;if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),m===o&&!e.board[(m+2*a)*8+i]&&r.push({from:t,to:(m+2*a)*8+i})}for(let o of[-1,1]){if(!c(i+o,m+a))continue;let l=(m+a)*8+i+o,u=e.board[l];if(u&&u.side!==n.side){if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:m*8+i+o})}break}case`knight`:for(let[a,o]of l){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];(!l||l.side!==n.side)&&r.push({from:t,to:s})}break;case`bishop`:g(d);break;case`rook`:g(f);break;case`queen`:g(d),g(f);break;case`king`:{for(let[a,o]of u){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:s})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!h(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!p(e.board,o+5,a(n.side))&&!p(e.board,o+6,a(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!p(e.board,o+3,a(n.side))&&!p(e.board,o+2,a(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r},_=(e,t)=>{let n=e.board[t.from];if(!n)throw Error(`no piece on ${t.from} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7},i=(e,t)=>{let n=o(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[i(n.side,t.from)]=!1);let s=e.board[t.to];if(s&&s.kind===`rook`&&r(s.side,t.to)&&(e.castling[i(s.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=a(n.side)},v=e=>({board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}),y=e=>{let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of g(e,n)){let n=v(e);_(n,r),!h(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t},b=e=>y(e).length>0?`ongoing`:h(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`,x=(e,t)=>{let n=e.board[t.to];return(t.promotion?i[t.promotion]:0)*10+(n?i[n.kind]:0)},S=(e,t)=>t.slice().sort((t,n)=>x(e,n)-x(e,t)),C=(e,t)=>{let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*i[t.kind]);return t===1?n:-n},ee=(e,t)=>{let n=b(e);return n===`stalemate`||!h(e,e.turn)?0:(n===`white-wins`?1:-1)===t?1e5:-1e5},w=e=>b(e)===`ongoing`?C(e,t):ee(e,t),T=0,E=!1,te=(e,n,i,a)=>{if(++T>r)return E=!0,0;let o=(e.turn===`white`?1:-1)===t;if(n===0||b(e)!==`ongoing`)return w(e);let s=S(e,y(e));if(!s.length)return w(e);let c=o?-1/0:1/0;for(let t of s){let r=v(e),s=g(r,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!s)throw Error(`a legal move stopped being legal: ${t.from}-${t.to}`);_(r,s);let l=te(r,n-1,i,a);if(E)return l;if(o?(c=Math.max(c,l),i=Math.max(i,c)):(c=Math.min(c,l),a=Math.min(a,c)),a<=i)break}return c};return{score:te(e,n,-1/0,1/0),nodes:T,budgetExceeded:E}}var ZW={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>eG(e,jW(e)),apply:(e,t)=>{let n=bW(e);return MW(n,t),n},isTerminal:e=>NW(e)!==`ongoing`,evaluate:(e,t)=>NW(e)===`ongoing`?QW(e,t):$W(e,t)};function QW(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*GW[t.kind]);return t===1?n:-n}function $W(e,t){let n=NW(e);return n===`stalemate`||!DW(e,e.turn)?0:(n===`white-wins`?1:-1)===t?WW:-1e5}function eG(e,t){return t.slice().sort((t,n)=>tG(e,n)-tG(e,t))}function tG(e,t){let n=e.board[t.to];return(t.promotion?GW[t.promotion]:0)*10+(n?GW[n.kind]:0)}function nG(e,t){return e.positions[pW(t)]??null}var rG={q:`queen`,r:`rook`,b:`bishop`,n:`knight`};function iG(e){let t=/^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(e);if(!t)throw Error(`not a UCI move: "${e}"`);let n=t[3]?rG[t[3]]:void 0;return n?{from:dW(t[1]),to:dW(t[2]),promotion:n}:{from:dW(t[1]),to:dW(t[2])}}var aG={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5},oG=[`queen`,`rook`,`bishop`,`knight`],sG=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],cG=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],lG=[[1,1],[-1,1],[-1,-1],[1,-1]],uG=[[1,0],[0,1],[-1,0],[0,-1]];function dG(e){return 1n<<BigInt(e)}function fG(e){return Math.log2(Number(e))}function pG(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=dG(o*8+e))}return a})}var mG=pG(sG),hG=pG(cG);function gG(e,t){return e.pieces[t]|e.pieces[t+1]|e.pieces[t+2]|e.pieces[t+3]|e.pieces[t+4]|e.pieces[t+5]}function _G(e,t){let n=dG(t);for(let t=0;t<12;t++)if(e.pieces[t]&n)return t;return-1}function vG(e,t,n){let r=n?0:6,i=t&7,a=t>>3,o=n?a-1:a+1;for(let t of[-1,1]){let n=i+t;if(o>=0&&o<8&&n>=0&&n<8&&e.pieces[r]&dG(o*8+n))return!0}if(mG[t]&e.pieces[r+1]||hG[t]&e.pieces[r+5])return!0;let s=[{steps:lG,kinds:[2,4]},{steps:uG,kinds:[3,4]}];for(let{steps:t,kinds:n}of s)for(let[o,s]of t){let t=i+o,c=a+s;for(;t>=0&&t<8&&c>=0&&c<8;){let i=_G(e,c*8+t);if(i!==-1){if(i>=r&&i<r+6&&n.includes(i-r))return!0;break}t+=o,c+=s}}return!1}function yG(e,t){return e===`white`?t?1:2:t?4:8}function bG(e){let t=Array(12).fill(0n),n=[-1,-1];if(e.board.forEach((e,r)=>{if(!e)return;let i=(e.side===`white`?0:6)+aG[e.kind];t[i]|=dG(r),e.kind===`king`&&(n[e.side===`white`?0:1]=r)}),n[0]===-1||n[1]===-1)throw Error(`a position without both kings cannot go on bitboards`);return{pieces:t,turn:e.turn,castling:+!!e.castling.whiteKingside|(e.castling.whiteQueenside?2:0)|(e.castling.blackKingside?4:0)|(e.castling.blackQueenside?8:0),enPassant:e.enPassant,halfmove:0,kings:n}}function xG(){return bG(yW())}function SG(e){let t=e.turn===`white`,n=t?0:6,r=gG(e,n),i=gG(e,n===0?6:0),a=r|i,o=[],s=[];for(let c=0;c<64;c++){if(!(r&dG(c)))continue;let l=-1;for(let t=0;t<6;t++)if(e.pieces[n+t]&dG(c)){l=t;break}s.length=0,CG(e,c,l,a,i,s);for(let n of s){let r=wG(e,n);vG(e,e.kings[+!t],!t)||o.push({...n}),TG(e,n,r)}}return o}function CG(e,t,n,r,i,a){let o=e.turn===`white`,s=t&7,c=t>>3,l=(e,n)=>{a.push(n?{from:t,to:e,promotion:n}:{from:t,to:e})},u=e=>{for(let[t,n]of e){let e=s+t,a=c+n;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=dG(o);if(!(r&s))l(o);else{i&s&&l(o);break}e+=t,a+=n}}};switch(n){case 0:{let n=o?8:-8,a=o?1:6,u=o?7:0,d=t+n;if(d>=0&&d<64&&!(r&dG(d))){if(d>>3===u)for(let e of oG)l(d,e);else{l(d);let e=t+2*n;c===a&&!(r&dG(e))&&l(e)}}for(let r of[-1,1]){let a=s+r;if(a<0||a>7)continue;let o=t+n+r;if(!(o<0||o>=64)){if(i&dG(o)){if(o>>3===u)for(let e of oG)l(o,e);else l(o)}else o===e.enPassant&&l(o)}}break}case 1:{let n=mG[t]&~gG(e,o?0:6);for(;n;){let e=n&-n;l(fG(e)),n^=e}break}case 2:u(lG);break;case 3:u(uG);break;case 4:u(lG),u(uG);break;case 5:{let n=hG[t]&~gG(e,o?0:6);for(n&=~e.pieces[o?11:5];n;){let e=n&-n;l(fG(e)),n^=e}let i=o?0:56,a=e.castling,s=o?a&1:a&4,c=o?a&2:a&8;t===i+4&&!vG(e,t,!o)&&(s&&!(r&dG(i+5))&&!(r&dG(i+6))&&!vG(e,i+5,!o)&&!vG(e,i+6,!o)&&l(i+6),c&&!(r&dG(i+3))&&!(r&dG(i+2))&&!(r&dG(i+1))&&!vG(e,i+3,!o)&&!vG(e,i+2,!o)&&l(i+2));break}}}function wG(e,t){let n=e.turn===`white`,r=+!n,i=r*6,a=dG(t.from),o=dG(t.to),s=-1;for(let t=0;t<6;t++)if(e.pieces[i+t]&a){s=t;break}if(s===-1)throw Error(`no piece on ${t.from} to move`);let c={captured:null,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kingSquare:e.kings[r]},l=(1-r)*6,u=n?8:-8,d=t.to;s===0&&t.to===e.enPassant&&(d=t.to-u);let f=dG(d);for(let t=0;t<6;t++)if(e.pieces[l+t]&f){c.captured={color:1-r,kind:t},e.pieces[l+t]^=f;break}let p=n?0:56,m=n?56:0;if(s===5&&(e.castling&=~(yG(e.turn,!0)|yG(e.turn,!1))),s===3&&(t.from===p||t.from===p+7)&&(e.castling&=~yG(e.turn,t.from===p+7)),c.captured?.kind===3&&(d===m||d===m+7)&&(e.castling&=~yG(n?`black`:`white`,d===m+7)),e.pieces[i+s]^=a,t.promotion?e.pieces[i+aG[t.promotion]]|=o:e.pieces[i+s]|=o,s===5&&Math.abs(t.to-t.from)===2){let n=i+3;t.to>t.from?e.pieces[n]^=dG(p+7)|dG(p+5):e.pieces[n]^=dG(p)|dG(p+3)}return e.enPassant=s===0&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.halfmove=s===0||c.captured?0:e.halfmove+1,s===5&&(e.kings[r]=t.to),e.turn=n?`black`:`white`,c}function TG(e,t,n){e.turn=e.turn===`white`?`black`:`white`;let r=e.turn===`white`,i=+!r,a=i*6,o=dG(t.to),s=t.promotion?0:(()=>{for(let t=0;t<6;t++)if(e.pieces[a+t]&o)return t;throw Error(`nothing on ${t.to} to take back`)})();if(t.promotion?e.pieces[a+aG[t.promotion]]^=o:e.pieces[a+s]^=o,e.pieces[a+s]|=dG(t.from),s===5&&Math.abs(t.to-t.from)===2){let n=r?0:56,i=a+3;t.to>t.from?e.pieces[i]^=dG(n+7)|dG(n+5):e.pieces[i]^=dG(n)|dG(n+3)}if(n.captured){let a=r?8:-8,o=s===0&&t.to===n.enPassant?t.to-a:t.to;e.pieces[(1-i)*6+n.captured.kind]|=dG(o)}e.castling=n.castling,e.enPassant=n.enPassant,e.halfmove=n.halfmove,e.kings[i]=n.kingSquare}function EG(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`perft depth must be a non-negative integer`);if(t===0)return 1;let n=0;for(let r of SG(e)){let i=wG(e,r);n+=EG(e,t-1),TG(e,r,i)}return n}function DG(e,t={}){let n=1e6,r=[100,320,330,500,900,0],i=Math.max(1,Math.floor(t.depth??3)),a=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),o=t.timeMs===void 0?-1:Date.now()+Math.max(1,t.timeMs),s={pieces:e.pieces.slice(),turn:e.turn,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kings:[e.kings[0],e.kings[1]]};function c(e){return 1n<<BigInt(e)}function l(e){return Math.log2(Number(e))}let u=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],d=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[[1,1],[-1,1],[-1,-1],[1,-1]],p=[[1,0],[0,1],[-1,0],[0,-1]];function m(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=c(o*8+e))}return a})}let h=m(u),g=m(d);function _(e){return s.pieces[e]|s.pieces[e+1]|s.pieces[e+2]|s.pieces[e+3]|s.pieces[e+4]|s.pieces[e+5]}function v(e){let t=c(e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e%6;return-1}function y(e,t){let n=t?0:6,r=e&7,i=e>>3,a=t?i-1:i+1;for(let e of[-1,1]){let t=r+e;if(a>=0&&a<8&&t>=0&&t<8&&s.pieces[n]&c(a*8+t))return!0}if(h[e]&s.pieces[n+1]||g[e]&s.pieces[n+5])return!0;let o=[{steps:f,kinds:[2,4]},{steps:p,kinds:[3,4]}];for(let{steps:e,kinds:n}of o)for(let[a,o]of e){let e=r+a,l=i+o;for(;e>=0&&e<8&&l>=0&&l<8;){let r=v(l*8+e);if(r!==-1){if((()=>{let t=c(l*8+e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e<6?0:1;return-1})()===+!t&&n.includes(r))return!0;break}e+=a,l+=o}}return!1}let b=0n,x=11400714819323198485n;function S(){x=x+11400714819323198485n&18446744073709551615n;let e=x;return e=(e^e>>30n)*13787848793156543929n&18446744073709551615n,e=(e^e>>27n)*10723151780598845931n&18446744073709551615n,e^e>>31n}let C=Array.from({length:12},()=>Array.from({length:64},()=>S())),ee=S(),w=Array.from({length:16},()=>S()),T=Array.from({length:8},()=>S());function E(){let e=0n;for(let t=0;t<12;t++){let n=s.pieces[t];for(;n;){let r=n&-n;e^=C[t][l(r)],n^=r}}return s.turn===`black`&&(e^=ee),e^=w[s.castling],s.enPassant!==null&&(e^=T[s.enPassant&7]),e}b=E();function te(e,t){return e===`white`?t?1:2:t?4:8}function D(e){let t=s.turn===`white`,n=+!t,r=n*6,i=c(e.from),a=c(e.to),o=-1;for(let e=0;e<6;e++)if(s.pieces[r+e]&i){o=e;break}let l={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:s.kings[n],key:b,nullMove:!1},u=(1-n)*6,d=t?8:-8,f=e.to;o===0&&e.to===s.enPassant&&(f=e.to-d);let p=c(f);for(let e=0;e<6;e++)if(s.pieces[u+e]&p){l.captured={color:1-n,kind:e},s.pieces[u+e]^=p;break}let m=t?0:56,h=t?56:0;o===5&&(s.castling&=~(te(s.turn,!0)|te(s.turn,!1))),o===3&&(e.from===m||e.from===m+7)&&(s.castling&=~te(s.turn,e.from===m+7)),l.captured&&l.captured.kind===3&&(f===h||f===h+7)&&(s.castling&=~te(t?`black`:`white`,f===h+7));let g={queen:4,rook:3,bishop:2,knight:1};if(s.pieces[r+o]^=i,e.promotion?s.pieces[r+g[e.promotion]]|=a:s.pieces[r+o]|=a,o===5&&Math.abs(e.to-e.from)===2){let t=r+3;e.to>e.from?s.pieces[t]^=c(m+7)|c(m+5):s.pieces[t]^=c(m)|c(m+3)}return s.enPassant=o===0&&Math.abs(e.to-e.from)===16?(e.from+e.to)/2:null,s.halfmove=o===0||l.captured?0:s.halfmove+1,o===5&&(s.kings[n]=e.to),s.turn=t?`black`:`white`,b=E(),l}function O(e,t){s.turn=s.turn===`white`?`black`:`white`;let n=s.turn===`white`,r=+!n,i=r*6,a=c(e.to),o=e.promotion?0:(()=>{for(let e=0;e<6;e++)if(s.pieces[i+e]&a)return e;return-1})(),l={queen:4,rook:3,bishop:2,knight:1};if(e.promotion?s.pieces[i+l[e.promotion]]^=a:s.pieces[i+o]^=a,s.pieces[i+o]|=c(e.from),o===5&&Math.abs(e.to-e.from)===2){let t=n?0:56,r=i+3;e.to>e.from?s.pieces[r]^=c(t+7)|c(t+5):s.pieces[r]^=c(t)|c(t+3)}if(t.captured){let i=n?8:-8,a=o===0&&e.to===t.enPassant?e.to-i:e.to;s.pieces[(1-r)*6+t.captured.kind]|=c(a)}s.castling=t.castling,s.enPassant=t.enPassant,s.halfmove=t.halfmove,s.kings[r]=t.kingSquare,b=t.key}function ne(){let e={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:-1,key:b,nullMove:!0};return s.enPassant=null,s.halfmove+=1,s.turn=s.turn===`white`?`black`:`white`,b=E(),e}function k(e){s.turn=s.turn===`white`?`black`:`white`,s.enPassant=e.enPassant,s.halfmove=e.halfmove,b=e.key}function A(e,t,n,r,i){let a=s.turn===`white`,o=e&7,u=e>>3,d=(t,n)=>{i.push(n?{from:e,to:t,promotion:n}:{from:e,to:t})},m=e=>{for(let[t,i]of e){let e=o+t,a=u+i;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=c(o);if(!(n&s))d(o);else{r&s&&d(o);break}e+=t,a+=i}}},v=[`queen`,`rook`,`bishop`,`knight`];if(t===0){let t=a?8:-8,i=a?1:6,l=a?7:0,f=e+t;if(f>=0&&f<64&&!(n&c(f))){if(f>>3===l)for(let e of v)d(f,e);else{d(f);let r=e+2*t;u===i&&!(n&c(r))&&d(r)}}for(let n of[-1,1]){let i=o+n;if(i<0||i>7)continue;let a=e+t+n;if(!(a<0||a>=64)){if(r&c(a)){if(a>>3===l)for(let e of v)d(a,e);else d(a)}else a===s.enPassant&&d(a)}}}else if(t===1){let t=h[e]&~_(a?0:6);for(;t;){let e=t&-t;d(l(e)),t^=e}}else if(t===2)m(f);else if(t===3)m(p);else if(t===4)m(f),m(p);else{let t=g[e]&~_(a?0:6);for(t&=~s.pieces[a?11:5];t;){let e=t&-t;d(l(e)),t^=e}let r=a?0:56,i=s.castling,o=a?i&1:i&4,u=a?i&2:i&8;e===r+4&&!y(e,!a)&&(o&&!(n&c(r+5))&&!(n&c(r+6))&&!y(r+5,!a)&&!y(r+6,!a)&&d(r+6),u&&!(n&c(r+3))&&!(n&c(r+2))&&!(n&c(r+1))&&!y(r+3,!a)&&!y(r+2,!a)&&d(r+2))}}function re(){let e=s.turn===`white`,t=e?0:6,n=_(t),r=_(t===0?6:0),i=n|r,a=[],o=[];for(let l=0;l<64;l++){if(!(n&c(l)))continue;let u=-1;for(let e=0;e<6;e++)if(s.pieces[t+e]&c(l)){u=e;break}o.length=0,A(l,u,i,r,o);for(let t of o){let n=D(t);y(s.kings[+!e],!e)||a.push({...t}),O(t,n)}}return a}function ie(e){let t=e?0:6;return s.pieces[t+1]!==0n||s.pieces[t+2]!==0n||s.pieces[t+3]!==0n||s.pieces[t+4]!==0n}function ae(){let e=0,t=0;for(let n=0;n<12;n++){if(n%6==5)continue;let r=s.pieces[n];for(;r;)r&=r-1n,e++,(n%6==1||n%6==2)&&t++}return e===0||e===1&&t===1}function oe(){let e=0,t=0;for(let n=0;n<12;n++){let r=s.pieces[n];for(;r;)r&=r-1n,n%6==4?e++:n%6!=5&&n%6!=0&&t++}return e===0||e===2&&t<=2}function se(e,t,n,r){let i=t&7,a=n?t>>3:7-(t>>3),o=3.5-Math.abs(i-3.5),s=3.5-Math.abs(a-3.5);return e===0?(a-1)*12+Math.max(0,o)*4:e===1?(o+s)*6-12:e===2?(o+s)*4:e===3?(o+s)*2+(a===6?12:0):e===4?(o+s)*2:r?(o+s)*10:-a*10+o*2}function j(){let e=oe(),t=0;for(let n=0;n<12;n++){let i=n<6,a=n%6,o=s.pieces[n];for(;o;){let n=o&-o,s=l(n),c=r[a]+se(a,s,i,e);t+=i?c:-c,o^=n}}return s.turn===`white`?t:-t}let ce=65536,le=Array(ce).fill(-1n),ue=Array(ce).fill(-1),de=Array(ce).fill(0),fe=Array(ce).fill(0),pe=Array(ce).fill(0);function me(e){let t=e.promotion===`queen`?1:e.promotion===`rook`?2:e.promotion===`bishop`?3:e.promotion===`knight`?4:0;return e.from|e.to<<6|t<<12}function he(e,t,n,r){let i=Number(b&BigInt(65535));if(le[i]!==b)return{score:null,move:0};let a=pe[i];if(ue[i]<e)return{score:null,move:a};let o=de[i];o>99e3?o-=r:o<-99e3&&(o+=r);let s=fe[i];return s===0||s===1&&o>=n||s===2&&o<=t?{score:o,move:a}:{score:null,move:a}}function ge(e,t,n,r,i){let a=Number(b&BigInt(65535));if(le[a]===b&&ue[a]>e)return;let o=t;t>99e3?o+=i:t<-99e3&&(o-=i),le[a]=b,ue[a]=e,de[a]=o,fe[a]=n,pe[a]=r}let _e=Array.from({length:64},()=>[0,0]),ve=Array.from({length:2},()=>Array.from({length:64},()=>Array(64).fill(0)));function M(e){let t=s.turn===`white`?6:0,n=c(e);for(let e=4;e>=0;e--)if(s.pieces[t+e]&n)return e;return-1}function N(e,t,n){let i=s.turn===`white`?0:1,a=e.map(e=>{let a=me(e);if(a===t)return 3e6;let o=M(e.to),c=v(e.from),l=e.to===s.enPassant&&c===0;if(o!==-1||l){let t=2e6+(l?r[0]:r[o])*8-c;return e.promotion&&(t+=900),t}return e.promotion?15e5:n<64?_e[n][0]===a?1e6:_e[n][1]===a?9e5:ve[i][e.from][e.to]:0}),o=e.map((e,t)=>t);for(let e=0;e<o.length;e++){let t=e;for(let n=e+1;n<o.length;n++)a[o[n]]>a[o[t]]&&(t=n);[o[e],o[t]]=[o[t],o[e]]}return o}let ye=0,be=!1,P=[];function xe(){return be?!0:ye>a||t.signal?.aborted||o!==-1&&!(ye&2047)&&Date.now()>=o?(be=!0,!0):!1}function Se(e,t,n){if(ye++,xe())return 0;let i=s.turn===`white`;if(s.halfmove>=100||ae())return 0;if(y(s.kings[+!i],!i))return F(1,e,t,n,!1);let a=j();if(a>=t)return t;a>e&&(e=a);let o=re().filter(e=>{if(e.promotion||e.to===s.enPassant&&v(e.from)===0)return!0;let t=i?6:0,n=c(e.to);for(let e=0;e<5;e++)if(s.pieces[t+e]&n)return!0;return!1}),l=N(o,0,Math.min(n,63));for(let i of l){let s=o[i],c=M(s.to);if(a+(c===-1?900:r[c])+200<e)continue;let l=D(s);P.push(b);let u=-Se(-t,-e,n+1);if(P.pop(),O(s,l),be)return 0;if(u>=t)return t;u>e&&(e=u)}return e}function F(e,t,n,r,i){if(ye++,xe())return 0;let a=s.turn===`white`;if(s.halfmove>=100||ae())return 0;let o=0;for(let e of P)if(e===b&&++o>=2)return 0;if(r>=64)return j();if(e<=0)return Se(t,n,r);let c=y(s.kings[+!a],!a),l=he(e,t,n,r);if(l.score!==null)return l.score;if(c)i=!1;else if(i&&e>=3&&ie(a)&&n<99e3){let t=e>4?3:2,i=ne();P.push(b);let a=-F(e-1-t,-n,-n+1,r+1,!1);if(P.pop(),k(i),be)return 0;if(a>=n)return n}let u=re();if(u.length===0)return c?-(1e5-r):0;let d=N(u,l.move,Math.min(r,63)),f=+!a,p=-1e6,m=0,h=2;for(let i=0;i<d.length;i++){let a=u[d[i]],o=me(a),l=M(a.to)!==-1||a.to===s.enPassant&&v(a.from)===0,g=D(a);P.push(b);let _;if(i===0)_=-F(e-1,-n,-t,r+1,!0);else{let o=0;e>=3&&i>=4&&!l&&!a.promotion&&!c&&(o=1),o>0?(_=-F(e-1-o,-t-1,-t,r+1,!0),!be&&_>t&&(_=-F(e-1,-n,-t,r+1,!0))):(_=-F(e-1,-t-1,-t,r+1,!0),!be&&_>t&&_<n&&(_=-F(e-1,-n,-t,r+1,!0)))}if(P.pop(),O(a,g),be)return 0;if(_>p&&(p=_,m=o),_>t&&(t=_,h=+(_>=n),!l&&!a.promotion&&r<64&&(ve[f][a.from][a.to]+=e*e,_e[r][0]!==o&&(_e[r][1]=_e[r][0],_e[r][0]=o))),t>=n)break}return ge(e,p,h,m,r),p}let Ce=re();if(Ce.length===0){let e=s.turn===`white`;return{move:null,score:y(s.kings[+!e],!e)?-1e5:0,nodes:ye,depth:0}}P.push(b);let we={from:Ce[0].from,to:Ce[0].to,...Ce[0].promotion?{promotion:Ce[0].promotion}:{}},Te=-1e6,Ee=0,De=Ce.map(e=>({...e}));for(let e=1;e<=i;e++){let t=-1e6,r=n,i=!1,a=we,o=Te;e>=4&&Ee>0&&(i=!0,t=Te-24,r=Te+24);for(let s=0;s<3;s++){let s=t,c=r,l=a,u=-1e6,d=N(De,me({from:a.from,to:a.to,promotion:a.promotion}),0),f=[];for(let n=0;n<d.length;n++){let i=De[d[n]],a=D(i);P.push(b);let o;if(n===0?o=-F(e-1,-r,-t,1,!0):(o=-F(e-1,-t-1,-t,1,!0),!be&&o>t&&o<r&&(o=-F(e-1,-r,-t,1,!0))),P.pop(),O(i,a),be)break;f.push(i),o>u&&(u=o,l=i),o>t&&(t=o)}if(be)break;for(let e of De)f.includes(e)||f.push(e);if(De=f,a=l,o=u,!i)break;if(u<=s||u>=c)t=-1e6,r=n,i=!1;else break}if(be||(we=a,Te=o,De=[we,...De.filter(e=>e!==we)],Ee=e,Te>99e3||Te<-99e3)||xe())break}return P.pop(),Ee===0?{move:null,score:j(),nodes:ye,depth:0}:{move:we,score:Te,nodes:ye,depth:Ee}}function OG(e){let t=`pieces`in e?e:bG(e);return{pieces:t.pieces.slice(),turn:t.turn,castling:t.castling,enPassant:t.enPassant,halfmove:t.halfmove,kings:[t.kings[0],t.kings[1]]}}function kG(e,t={}){return DG(OG(e),{depth:t.depth,maxNodes:t.maxNodes,timeMs:t.timeMs,signal:t.signal})}function AG(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}async function jG(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??AG();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=OG(e),o=SG(a);if(!o.length)return{...DG(a,{depth:n,maxNodes:r}),rootScores:[]};let s=Math.max(1,Math.min(i,o.length)),c=o.map(e=>{let t=OG(a);return wG(t,e),t}),l=Array(o.length),u=0,d=0,f=t.signal?{signal:t.signal}:{};await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let i=await UW(DG,[c[e],{depth:Math.max(1,n-1),maxNodes:r,timeMs:t.timeMs}],f);u+=i.nodes,l[e]=-i.score}}));let p=0;for(let e=1;e<o.length;e++)(l[e]??-1/0)>(l[p]??-1/0)&&(p=e);let m=o[p];return{move:{from:m.from,to:m.to,...m.promotion?{promotion:m.promotion}:{}},score:l[p]??0,nodes:u,depth:n,rootScores:o.map((e,t)=>({move:{from:e.from,to:e.to,...e.promotion?{promotion:e.promotion}:{}},score:l[t]??0}))}}var MG={queen:`Q`,rook:`R`,bishop:`B`,knight:`N`},NG={Q:`queen`,R:`rook`,B:`bishop`,N:`knight`},PG={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5};function FG(e){let t={queen:0,rook:1,bishop:2,knight:3};return`K${e.slice().sort((e,n)=>t[e]-t[n]).map(e=>MG[e]).join(``)}K`}var IG=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;function LG(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=n+1<e.length?e[n+1]:0,a=n+2<e.length?e[n+2]:0;t+=IG[r>>2]+IG[(r&3)<<4|i>>4],t+=n+1<e.length?IG[(i&15)<<2|a>>6]:`=`,t+=n+2<e.length?IG[a&63]:`=`}return t}function RG(e){if(e.length%4!=0)throw Error(`tablebase data is not base64: length is not a multiple of 4`);let t=Array(e.length);for(let n=0;n<e.length;n++){if(e[n]===`=`){t[n]=-1;continue}let r=IG.indexOf(e[n]);if(r===-1)throw Error(`tablebase data is not base64: ${e[n]}`);t[n]=r}let n=[];for(let e=0;e<t.length;e+=4){let[r,i,a,o]=[t[e],t[e+1],t[e+2],t[e+3]];if(r===-1||i===-1)throw Error(`tablebase data is not base64: padding inside a quantum`);n.push(r<<2|i>>4),a!==-1&&n.push((i&15)<<4|a>>2),o!==-1&&n.push((a&3)<<6|o)}return new Uint8Array(n)}function zG(e){let t=Array(256).fill(0);for(let n of e)t[n]++;let n=t.map((e,t)=>({count:e,symbol:t})).filter(e=>e.count>0),r=[1,n.length];if(n.length===0)return LG(new Uint8Array([1,0,0,0,0,0]));if(n.length===1){r.push(n[0].symbol,0);let t=new Uint8Array(r.length+4);return t.set(r,0),t[r.length]=e.length&255,t[r.length+1]=e.length>>8&255,t[r.length+2]=e.length>>16&255,t[r.length+3]=e.length>>24&255,LG(t)}let i=BG(n.map(e=>e.count)),a=n.map((e,t)=>({symbol:e.symbol,length:i[t]})).sort((e,t)=>e.symbol-t.symbol);for(let e of a)r.push(e.symbol);for(let e of a)r.push(e.length);let o=VG(a),s=new Map;for(let e=0;e<a.length;e++)s.set(a[e].symbol,o[e]);let c=0;for(let e of n)c+=e.count*s.get(e.symbol).length;let l=new Uint8Array(r.length+4+Math.ceil(c/8));l.set(r,0),l[r.length]=e.length&255,l[r.length+1]=e.length>>8&255,l[r.length+2]=e.length>>16&255,l[r.length+3]=e.length>>24&255;let u=0,d=r.length+4;for(let t of e){let e=s.get(t);for(let t=e.length-1;t>=0;t--)e.code>>t&1&&(l[d+(u>>3)]|=1<<7-(u&7)),u++}return LG(l)}function BG(e){let t=e.length;if(t===0)return[];let n=e.slice(),r=Array(t).fill(0),i=e.map((e,t)=>t),a=[];for(;i.length>1;){i.sort((e,t)=>n[e]-n[t]);let e=i.shift(),t=i.shift();a.push([e,t]),n[e]+=n[t],n[t]=-1,i.push(e)}for(let e=a.length-1;e>=0;e--){let[t,n]=a[e];r[n]=r[t]+1,r[t]++}if(r.some(e=>e>32))throw Error(`tablebase Huffman code too deep`);return r}function VG(e){let t=e.slice().sort((e,t)=>e.length-t.length||e.symbol-t.symbol),n=0,r=t[0].length,i=new Map;for(let e of t)n<<=e.length-r,i.set(e.symbol,{code:n,length:e.length}),n++,r=e.length;return e.map(e=>i.get(e.symbol))}function HG(e){let t=RG(e);if(t.length<2)throw Error(`tablebase data holds no header`);if(t[0]!==1)throw Error(`tablebase data version ${t[0]} is not 1`);let n=t[1];if(2+2*n>t.length)throw Error(`tablebase data ends inside its header`);let r=[],i=[];for(let e=0;e<n;e++)r.push(t[2+e]);for(let e=0;e<n;e++)i.push(t[2+n+e]);let a=2+2*n;if(n===0){if(a+4!==t.length)throw Error(`tablebase data trails its empty header`);return new Uint8Array}if(n===1){if(a+4!==t.length)throw Error(`tablebase data trails its single-symbol header`);let e=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24;return new Uint8Array(e).fill(r[0])}if(a+4>t.length)throw Error(`tablebase data ends before its count`);let o=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24,s=r.map((e,t)=>({symbol:e,length:i[t]})),c=VG(s),l={};for(let e=0;e<s.length;e++){let t=l;for(let n=c[e].length-1;n>=0;n--){let r=c[e].code>>n&1;n===0?r?t.one={symbol:s[e].symbol}:t.zero={symbol:s[e].symbol}:(r?t.one=t.one??{}:t.zero=t.zero??{},t=r?t.one:t.zero)}}let u=new Uint8Array(o),d=0,f=0,p=a+4,m=(t.length-p)*8;for(;d<o;){if(f>=m)throw Error(`tablebase data ends before its count`);let e=l;for(;;){let n=t[p+(f>>3)]>>7-(f&7)&1;if(f++,e=n?e.one:e.zero,!e)throw Error(`tablebase data walks off its Huffman tree`);if(e.symbol!==void 0)break}u[d++]=e.symbol}for(;f<m;f++)if(t[p+(f>>3)]>>7-(f&7)&1)throw Error(`tablebase data does not end in zero padding`);return u}function UG(e){let t=HG(e);if(t.length%2!=0)throw Error(`tablebase distances are not byte pairs`);let n=new Uint16Array(t.length/2);for(let e=0;e<n.length;e++)n[e]=t[2*e]|t[2*e+1]<<8;return n}function WG(e){if(e.version!==1)throw Error(`${e.id}: unknown tablebase version ${String(e.version)}`);if(e.id!==FG(e.white))throw Error(`${e.id}: id does not match its extras`);for(let t of e.white)if(!NG[MG[t]])throw Error(`${e.id}: not a tablebase piece: ${String(t)}`);let t=2+e.white.length,n=1;for(let e=0;e<t;e++)n*=64;if(n*=2,e.positions!==n)throw Error(`${e.id}: claims ${e.positions} positions, holds ${n}`);let r=HG(e.wdl);if(r.length!==n)throw Error(`${e.id}: WDL decodes to ${r.length} positions, needs ${n}`);let i=UG(e.dtm);if(i.length!==n)throw Error(`${e.id}: distances decode to ${i.length} positions, need ${n}`);let a={queen:0,rook:1,bishop:2,knight:3};return{id:e.id,extras:e.white.slice().sort((e,t)=>a[e]-a[t]).map(e=>PG[e]),positions:n,wdl:r,dtm:i}}function GG(e){if(`pieces`in e){let t=[];for(let n=0;n<12;n++){let r=e.pieces[n];for(;r;){let e=r&-r;t.push({kind:n%6,side:n<6?`white`:`black`,square:Math.log2(Number(e))}),r^=e}}return t}let t=[];return e.board.forEach((e,n)=>{e&&t.push({kind:PG[e.kind],side:e.side,square:n})}),t}function KG(e){if(`pieces`in e)return e.castling!==0;let t=e.castling;return t.whiteKingside||t.whiteQueenside||t.blackKingside||t.blackQueenside}function qG(e,t,n=0){if(!Number.isInteger(n)||n<0)throw RangeError(`halfmove must be a non-negative integer`);let r=GG(t),i=r.filter(e=>e.kind===5&&e.side===`white`),a=r.filter(e=>e.kind===5&&e.side===`black`);if(i.length!==1||a.length!==1||r.some(e=>e.kind===0)||r.some(e=>e.kind!==5&&e.side===`black`)||KG(t))return null;let o=r.filter(e=>e.kind!==5).sort((e,t)=>t.kind-e.kind).map(e=>e.kind);if(!o.length)return null;let s={4:`Q`,3:`R`,2:`B`,1:`N`},c=e[`K${o.map(e=>s[e]).join(``)}K`];if(!c)return null;let l=r.find(e=>e.kind===5&&e.side===`white`).square,u=r.find(e=>e.kind===5&&e.side===`black`).square,d=o.map((e,t)=>r.filter(t=>t.kind===e&&t.side===`white`).map(e=>e.square).sort((e,t)=>e-t)[JG(o,e,t)]),f=l;for(let e of d)f=f*64+e;f=f*64+u,f=f*2+ +(t.turn===`black`);let p=c.wdl[f];if(p===0)return null;let m=c.dtm[f],h=p===3?`win`:p===1?`loss`:`draw`;return h!==`draw`&&m>100-n&&(h=`draw`),{outcome:h,dtm:m}}function JG(e,t,n){let r=0;for(let i=0;i<n;i++)e[i]===t&&r++;return r}_e();var YG=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return nr(this.width,e,t)}inside(e,t){return tr(this.width,this.height,e,t)}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function XG(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function ZG(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>$G(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>$G(e,t,!1)):[]}function QG(e,t){if(!ZG(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||$G(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function $G(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function eK(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function tK(e,t,n){let r=aK(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0,s=null;for(let t of oK(e.size,r)){if(i[t]!==a||cK(i,e.size,t)!==0)continue;let n=sK(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(cK(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&cK(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function nK(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function rK(e){return e.passes>=2?`finished`:`ongoing`}function iK(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=sK(e.board,e.size,r),a=new Set;for(let t of i)for(let n of oK(e.size,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function aK(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function oK(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function sK(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of oK(t,n))a.push(e)}}return i}function cK(e,t,n){let r=sK(e,t,n),i=new Set;for(let n of r)for(let r of oK(t,n))e[r]===null&&i.add(r);return i.size}function lK(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function uK(){let e=wK(2,6);return e[0]===e[1]?[...e,...e]:e}function dK(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t)if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;pK(e,t,n)&&c.push({from:`bar`,to:t,die:r})}else for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):pK(e,i,n)&&c.push({from:t,to:i,die:r})}return c}function fK(e,t){if(!dK(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function pK(e,t,n){return e.points[t]*n>=-1}function mK(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function hK(e){return oe(e)}function gK(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function _K(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function vK(e){let t=mK();return e===void 0?hK(t):E(e,()=>hK(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function yK(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function bK(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!CK(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function xK(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function SK(e){return e.foundations.every(e=>e.length===13)}function CK(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function wK(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>ne(1,t))}function TK(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return wK(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var EK=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=wK(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ne(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function DK(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function OK(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function kK(e,t,n){return zK(e,t,n)&&!RK(e,t,n)}function AK(e,t){if(!kK(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function jK(e,t){let n=LK(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=UK(e,n,HK(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||RK(e,o,a))continue;let s=WK(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function MK(e,t){let n=jK(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=LK(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function NK(e,t){let n=LK(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function PK(e,t,n){let r=LK(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||VK(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function FK(e,t,n,r){let i=LK(e,t),a=LK(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(VK(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function IK(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=t.maxActions??t.actions,t.overwatch=!1)}function LK(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function RK(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function zK(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function BK(e,t,n){return e.shape===`hex`?Jn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function VK(e,t,n){return e.shape===`hex`?Yn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function HK(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&BK(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function UK(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of BK(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function WK(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of BK(e,t.x,t.y)){let a=`${i.x},${i.y}`;zK(e,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!RK(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var GK=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return tr(this.width,this.height,e,t)}index(e,t){return this.inside(e,t)?nr(this.width,e,t):-1}};function KK(e){return{currency:e,pool:[]}}function qK(e,t,n,r){return e.currency<r||!kK(t,n.x,n.y)?!1:(AK(t,n),e.currency-=r,!0)}function JK(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!kK(t,r,i)?!1:(AK(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function YK(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function XK(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function ZK(e,t,n,r){return e.currency+=XK(t,n,r),e.currency}_e();function QK(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function $K(e,t,n,r,i=!1){if(!lq(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function eq(e,t,n){return lq(e,t,n)&&fq(e,t,n)<1/0&&!uq(e,t,n)}function tq(e,t){if(!eq(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function nq(e,t){let n=cq(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=pq(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||fq(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function rq(e,t){let n=nq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=cq(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function iq(e,t,n){let r=cq(e,t),i=cq(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(Yn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[aq(e,r,i)];return i.hp>0&&a.push(aq(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function aq(e,t,n){let r=dq(e,n.x,n.y).defense,i=A(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function oq(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function sq(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function cq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function lq(e,t,n){return tr(e.width,e.height,t,n)}function uq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function dq(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function fq(e,t,n){return dq(e,t,n).moveCost}function pq(e,t,n,r){let i=[],a=(e,t)=>{[i[e],i[t]]=[i[t],i[e]]},o=e=>{i.push(e);let t=i.length-1;for(;t>0;){let e=t-1>>1;if(i[e].cost<=i[t].cost)break;a(t,e),t=e}},s=()=>{if(i.length===0)return;let e=i[0],t=i.pop();if(i.length>0){i[0]=t;let e=0;for(;;){let t=e*2+1,n=t+1,r=e;if(t<i.length&&i[t].cost<i[r].cost&&(r=t),n<i.length&&i[n].cost<i[r].cost&&(r=n),r===e)break;a(e,r),e=r}}return e},c=new Map([[`${t.x},${t.y}`,0]]);for(o({x:t.x,y:t.y,cost:0});;){let t=s();if(t===void 0)break;let i=`${t.x},${t.y}`;if(!(t.cost>(c.get(i)??1/0)))for(let i of Jn(t.x,t.y)){if(!lq(e,i.x,i.y))continue;let a=fq(e,i.x,i.y);if(a===1/0||r.has(`${i.x},${i.y}`))continue;let s=t.cost+a;if(s>n)continue;let l=`${i.x},${i.y}`;s<(c.get(l)??1/0)&&(c.set(l,s),o({x:i.x,y:i.y,cost:s}))}}return c}var mq=l({BoardGrid:()=>YG,DiceCup:()=>EK,FactionFog:()=>GK,addSkirmishUnit:()=>tq,addTacticalUnit:()=>AK,applyBackgammonMove:()=>fK,applyCheckersMove:()=>QG,applyMove:()=>MW,applyUpkeep:()=>ZK,armyIncome:()=>XK,backgammonMoves:()=>dK,bankUnit:()=>YK,bitboardFromChess:()=>bG,bitboardMoves:()=>SG,canPlaceSkirmishUnit:()=>eq,canPlaceTacticalUnit:()=>kK,checkersMoves:()=>ZG,chessGame:()=>ZW,chooseMove:()=>KW,cloneChess:()=>bW,createDeck:()=>mK,deal:()=>gK,dealSolitaire:()=>vK,drawSolitaire:()=>yK,endSkirmishTurn:()=>sq,endTacticalTurn:()=>IK,gameResult:()=>NW,goResult:()=>rK,goScore:()=>iK,huffDecode:()=>HG,huffEncode:()=>zG,inCheck:()=>DW,legalMoves:()=>jW,loadTablebaseEnding:()=>WG,makeMove:()=>wG,moveSkirmishUnit:()=>rq,moveSolitaireTableau:()=>bK,moveSolitaireToFoundation:()=>xK,moveTacticalUnit:()=>MK,parseFen:()=>mW,parseUciMove:()=>iG,passGo:()=>nK,perft:()=>EG,playGo:()=>tK,positionKey:()=>pW,probeBook:()=>nG,probeTablebase:()=>qG,recall:()=>JK,recruit:()=>qK,rollBackgammonDice:()=>uK,rollDice:()=>wK,rollExpression:()=>TK,scoreDice:()=>DK,search:()=>qW,searchAsync:()=>JW,searchTourney:()=>kG,searchTourneyAsync:()=>jG,setSkirmishTerrain:()=>$K,setTacticalOverwatch:()=>NK,shuffleDeck:()=>hK,skirmishAttack:()=>iq,skirmishIncome:()=>oq,skirmishMoves:()=>nq,solitaireWon:()=>SK,sq:()=>dW,squareName:()=>fW,startingArmy:()=>KK,startingBackgammon:()=>lK,startingBitboard:()=>xG,startingCheckers:()=>XG,startingChess:()=>yW,startingGo:()=>eK,startingSkirmish:()=>QK,startingTactics:()=>OK,tablebaseId:()=>FG,tacticalAttack:()=>FK,tacticalMoves:()=>jK,tourneyThink:()=>DG,trickWinner:()=>_K,triggerTacticalOverwatch:()=>PK,unmakeMove:()=>TG});function hq(e){let t;try{t=vN(e)}catch(t){return console.warn(`${t.message} - "${e}" will be silent`),gq()}return new Audio(t)}function gq(){return{play(){},pause(){},currentTime:0,volume:1,loop:!1}}var _q=new p,vq=class{constructor(e,t={}){this.next=0,this.suspended_=!1;let n=Math.max(1,t.poolSize??4),r=t.create??hq;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1,t=1){if(this.suspended_)return;let n=this.pool[this.next];this.next=(this.next+1)%this.pool.length,n.volume=this.volume*e,n.playbackRate=t,n.currentTime=0,Promise.resolve(n.play()).catch(()=>{}),this.caption&&_q.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}suspend(){this.suspended_=!0,this.stopAll()}resume(){this.suspended_=!1}get isSuspended(){return this.suspended_}},yq=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.suspended_=!1,this.duckLevel_=1,this.volume=e.volume??1,this.create=e.create??hq}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){e.length===0?this.stop(t):(this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack())}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;this.current=r,t<=0?(r.volume=this.volume*this.duckLevel_,Promise.resolve(r.play()).catch(()=>{}),i?.pause()):(r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume*this.duckLevel_,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0}))}stop(e=1){this.trackQueue=null;let t=this.current;t&&(this.current=null,e<=0?t.pause():this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0}))}suspend(){this.suspended_=!0,this.current?.pause();for(let e of this.fades)e.audio.pause()}resume(){this.suspended_&&(this.suspended_=!1,this.current&&Promise.resolve(this.current.play()).catch(()=>{}))}duck(e=.5,t=.5){let n=Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,r=this.duckLevel_;this.duckLevel_=n;for(let e of this.fades)e.to=r>0?e.to/r*n:this.volume*n;if(this.current){let e=this.volume*n;t<=0?this.current.volume=e:this.fades.push({audio:this.current,elapsed:0,duration:t,from:this.current.volume,to:e,stopAtEnd:!1})}}unduck(e=.5){this.duck(1,e)}get duckLevel(){return this.duckLevel_}get isSuspended(){return this.suspended_}update(e){if(!this.suspended_)for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},bq=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}suspend(){this.music.suspend();for(let e of this.cues.values())e.suspend()}resume(){this.music.resume();for(let e of this.cues.values())e.resume()}};function xq(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*wq(t,d,s,e)}return Eq(l,o)}function Sq(e={},t=e=>new Audio(e)){let n=t(xq(e));return Promise.resolve(n.play()).catch(()=>{}),n}function Cq(e={},t={}){return new vq(xq(e),t)}function wq(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return Tq(n,r)}}function Tq(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function Eq(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);Dq(i,0,`RIFF`),i.setUint32(4,36+n,!0),Dq(i,8,`WAVE`),Dq(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),Dq(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function Dq(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function Oq(e,t){let[n,r]=e,i=n*4*jq[t]/r;if(!Number.isInteger(i)||i<1)throw Error(`a ${t} grid does not cut a ${n}/${r} bar into whole slots (it needs ${i})`);return i}function kq(e,t){return e/jq[t]}function Aq(e){if(typeof e!=`object`||!e)throw Error(`a groove template must be an object`);let{name:t,timeSignature:n,ppq:r,tempoBpm:i,subdivision:a,offsets:o}=e;if(typeof t!=`string`||t.length===0)throw Error(`a groove template needs a non-empty name`);if(!Array.isArray(n)||n.length!==2)throw Error(`groove template "${t}": timeSignature must be [beats, beatValue]`);let[s,c]=n;if(!Number.isInteger(s)||s<1)throw Error(`groove template "${t}": time signature numerator must be a positive integer, got ${String(s)}`);if(!Number.isInteger(c)||c<1||c&c-1)throw Error(`groove template "${t}": time signature denominator must be a power of two, got ${String(c)}`);if(!Number.isInteger(r)||r<1)throw Error(`groove template "${t}": ppq must be a positive integer, got ${String(r)}`);if(!Number.isFinite(i)||i<=0)throw Error(`groove template "${t}": tempoBpm must be greater than 0, got ${String(i)}`);if(a!==`8n`&&a!==`16n`&&a!==`32n`)throw Error(`groove template "${t}": subdivision must be 8n, 16n or 32n, got ${String(a)}`);let l=kq(r,a);if(!Number.isInteger(l)||l<1)throw Error(`groove template "${t}": ${r} ppq does not cut into whole ${a} ticks (it needs ${String(l)})`);let u=Oq(n,a);if(!Array.isArray(o)||o.length!==u)throw Error(`groove template "${t}": a ${a} grid in ${s}/${c} has ${u} slots, this carries ${Array.isArray(o)?o.length:String(o)}`);o.forEach((e,n)=>{if(typeof e!=`object`||!e)throw Error(`groove template "${t}": slot ${n} must be an object`);if(e.subdivisionIndex!==n)throw Error(`groove template "${t}": slots must run in order, slot ${n} carries ${String(e.subdivisionIndex)}`);if(!Number.isInteger(e.timeOffsetTicks))throw Error(`groove template "${t}": slot ${n} has a fractional timeOffsetTicks (${String(e.timeOffsetTicks)}); ticks are whole numbers`);if(!Number.isFinite(e.velocityFactor)||e.velocityFactor<0)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${String(e.velocityFactor)}, which must be a finite number of at least 0`)})}var jq,Mq=s((()=>{jq={"8n":2,"16n":4,"32n":8}}));function Nq(e){let t=e.intensity;if(!Number.isFinite(t)||t<0||t>1)throw Error(`humanization intensity must be between 0 and 1, got ${String(e.intensity)}`);let n=e.timingVarianceMs??Qq;if(!Number.isFinite(n)||n<0)throw Error(`timingVarianceMs must be a finite number of at least 0, got ${String(e.timingVarianceMs)}`);let r=e.velocityVariance??$q;if(!Number.isFinite(r)||r<0)throw Error(`velocityVariance must be a finite number of at least 0, got ${String(e.velocityVariance)}`);let i=e.style?eJ[e.style]:tJ,a=e.grooveTemplate??null;return a&&Aq(a),{intensity:t,timingMs:n,velocityVariance:r,timingScale:i.timing,velocityScale:i.velocity,template:a,warn:e.onWarn??(e=>console.warn(e))}}function Pq(e){let t=[];for(let n of e)n.type===`tempo`&&t.push({tick:n.tick,microsecondsPerQuarter:n.microsecondsPerQuarter});t.sort((e,t)=>e.tick-t.tick);let n=[{tick:0,microsecondsPerQuarter:5e5}];for(let e of t)e.tick===n[n.length-1].tick?n[n.length-1]=e:n.push(e);return n}function Fq(e,t){let n=0,r=e.length-1,i=0;for(;n<=r;){let a=n+r>>1;e[a].tick<=t?(i=a,n=a+1):r=a-1}return 6e7/e[i].microsecondsPerQuarter}function Iq(e,t,n){return e*t*n/6e4}function Lq(e,t,n){return e*6e4/(t*n)}function Rq(e){let t=null;return()=>{if(t!==null){let e=t;return t=null,e}let n=Math.sqrt(-2*Math.log(1-e.float())),r=2*Math.PI*e.float();return t=n*Math.sin(r),n*Math.cos(r)}}function zq(e){let t=new Uint8Array(256);for(let e=0;e<256;e++)t[e]=e;for(let n=255;n>0;n--){let r=e.int(n+1),i=t[n];t[n]=t[r],t[r]=i}let n=(e,t)=>e&1?t:-t;return e=>{let r=Math.floor(e),i=e-r,a=i*i*i*(i*(i*6-15)+10),o=n(t[r&255],i);return o+a*(n(t[r+1&255],i-1)-o)}}function Bq(e){let t=new Map;for(let n of e.offsets)t.set(n.subdivisionIndex,{ms:Lq(n.timeOffsetTicks,e.ppq,e.tempoBpm),factor:n.velocityFactor});return t}function Vq(e){let t=new Uint8Array(e.length),n=new Map;for(let t=0;t<e.length;t++){let r=e[t];if(r.type!==`noteOn`||r.channel===Yq)continue;let i=n.get(r.channel);i?i.push({index:t,note:r.note}):n.set(r.channel,[{index:t,note:r.note}])}for(let e of n.values())for(let n=1;n<e.length-1;n++)e[n].note>e[n-1].note&&e[n].note>e[n+1].note&&(t[e[n].index]=1);return t}function Hq(e){return e.channel===Yq?Xq.includes(e.note):e.note<Zq}function Uq(e,t,n){let r=Nq(t),i=new j(t.seed),a=Rq(i),o=zq(i),s=e.ticksPerQuarter,c=Pq(e.events),l=r.template?Bq(r.template):null,u=r.template?kq(s,r.template.subdivision):0,d=r.template?Oq(r.template.timeSignature,r.template.subdivision):0,f=n===`groove`?Vq(e.events):null,p=[],m=new Map,h=!1;for(let t=0;t<e.events.length;t++){let i=e.events[t];if(i.type===`noteOff`){let e=m.get(nJ(i)),t=e&&e.length>0?e.shift():0;p.push(t===0?{...i}:{...i,tick:i.tick+t});continue}if(i.type!==`noteOn`){p.push({...i});continue}let g=Fq(c,i.tick);r.template&&!h&&Math.abs(g-r.template.tempoBpm)>qq&&(h=!0,r.warn(`groove template "${r.template.name}" is written at ${r.template.tempoBpm} BPM but this file is at ${g.toFixed(1)} BPM by tick ${i.tick}: its offsets are rescaled to keep the same timing in milliseconds`));let _=Iq(r.timingMs*r.timingScale,s,g),v=a()*_+o(i.tick/s*Wq)*_*Gq;if(n===`groove`&&Hq(i)){let e=Iq(Jq,s,g);v=Math.min(e,Math.max(-e,v))}let y;l&&(y=l.get(Math.floor(i.tick/u)%d));let b=Math.round(r.intensity*((y?Iq(y.ms,s,g):0)+v));i.tick+b<0&&(b=-i.tick);let x=Math.round(i.velocity*(1+r.intensity*((y?y.factor:1)-1))+r.intensity*a()*r.velocityVariance*r.velocityScale);f&&f[t]===1&&(x=Math.round(x*(1+r.intensity*Kq))),x=Math.min(127,Math.max(1,x));let S=nJ(i),C=m.get(S);C?C.push(b):m.set(S,[b]),p.push({...i,tick:i.tick+b,velocity:x})}return p.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:s,events:p,loopStartTick:e.loopStartTick}}var Wq,Gq,Kq,qq,Jq,Yq,Xq,Zq,Qq,$q,eJ,tJ,nJ,rJ=s((()=>{_e(),Mq(),Wq=.25,Gq=.5,Kq=.15,qq=1,Jq=5,Yq=9,Xq=[35,36],Zq=48,Qq=8,$q=10,eJ={jazz:{timing:1.3,velocity:1.1},rock:{timing:.8,velocity:1.2},classical:{timing:.6,velocity:1.4},funk:{timing:1,velocity:1.3}},tJ={timing:1,velocity:1},nJ=e=>`${e.channel}:${e.note}`})),iJ=l({LiteHumanizer:()=>aJ}),aJ,oJ=s((()=>{rJ(),aJ=class{constructor(){this.tierName=`lite`,this.approximateSizeMb=.05}async initialize(){}async process(e,t){if(t.grooveTemplate)throw Error(`the lite tier applies no groove grid: ask HumanizerFactory for "groove" when a template is in play`);return Uq(e,t,`lite`)}}})),sJ=l({GrooveHumanizer:()=>cJ}),cJ,lJ=s((()=>{rJ(),cJ=class{constructor(){this.tierName=`groove`,this.approximateSizeMb=.5}async initialize(){}async process(e,t){return Uq(e,t,`groove`)}}})),uJ=class e{static async create(t){let n=await e.load(t);return await n.initialize(),n}static async load(e){switch(e){case`lite`:return new(await(Promise.resolve().then(()=>(oJ(),iJ)))).LiteHumanizer;case`groove`:return new(await(Promise.resolve().then(()=>(lJ(),sJ)))).GrooveHumanizer;case`magenta`:throw Error(`the 'magenta' tier is not shipped: it needs @magenta/music and a PerformanceRNN checkpoint, and neither can be fetched from a file:// build`);default:throw Error(`unknown humanizer tier: ${String(e)}`)}}};async function dJ(e,t){let{tier:n,...r}=t,i=n??(r.grooveTemplate?`groove`:`lite`);return(await uJ.create(i)).process(e,r)}var fJ=5e5,pJ=111;function mJ(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[],p=null;for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===176){let e=t[r++],n=t[r++];f.push({tick:c,type:`control`,channel:i,controller:e,value:n}),e===pJ&&p===null&&(p=c)}else if(n===192){let e=t[r++];f.push({tick:c,type:`program`,channel:i,program:e})}else if(n===224){let e=t[r++],n=t[r++];f.push({tick:c,type:`pitchBend`,channel:i,value:(n<<7|e)-8192})}else if(n===160||n===208)r+=n===160?2:1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f,loopStartTick:p}}var hJ=2;function gJ(e){let t=[{tick:0,time:0,microsecondsPerQuarter:fJ}];for(let n of e.events){if(n.type!==`tempo`)continue;let r=t[t.length-1];t.push({tick:n.tick,time:r.time+(n.tick-r.tick)*r.microsecondsPerQuarter/e.ticksPerQuarter/1e6,microsecondsPerQuarter:n.microsecondsPerQuarter})}return t}function _J(e,t,n){let r=e[0];for(let t of e)if(t.tick<=n)r=t;else break;return r.time+(n-r.tick)*r.microsecondsPerQuarter/t/1e6}function vJ(e){return e.loopStartTick===null?null:_J(gJ(e),e.ticksPerQuarter,e.loopStartTick)}function yJ(e){let t=gJ(e),n=Array.from({length:16},()=>({program:0,bank:0,volume:100,expression:127,pan:64,bend:0})),r=e=>{let t=n[e]??n[0];return{program:t.program,bank:t.bank,gain:t.volume/127*(t.expression/127),pan:(t.pan-64)/64,...t.bend?{bend:t.bend}:{}}},i=[],a=new Map;for(let o of e.events){if(o.type===`tempo`)continue;if(o.type===`pitchBend`){(n[o.channel]??n[0]).bend=o.value/8192*hJ;continue}if(o.type===`program`){(n[o.channel]??n[0]).program=o.program;continue}if(o.type===`control`){let e=n[o.channel]??n[0];o.controller===0?e.bank=o.value:o.controller===7?e.volume=o.value:o.controller===10?e.pan=o.value:o.controller===11&&(e.expression=o.value);continue}let s=_J(t,e.ticksPerQuarter,o.tick),c=`${o.channel}:${o.note}`;if(o.type===`noteOn`)a.set(c,{time:s,velocity:o.velocity,voice:r(o.channel)});else{let e=a.get(c);e&&(i.push({time:e.time,duration:Math.max(.01,s-e.time),note:o.note,velocity:e.velocity,channel:o.channel,...e.voice}),a.delete(c))}}for(let[e,t]of a){let[n,r]=e.split(`:`).map(Number);i.push({time:t.time,duration:.3,note:r,velocity:t.velocity,channel:n,...t.voice})}return i.sort((e,t)=>e.time-t.time)}function bJ(e){return 440*2**((e-69)/12)}var xJ=class e{constructor(e,t={}){this.elapsed=0,this.index=0,this.playing=!1,this.notes=yJ(e),this.playFn=t.play??Sq,this.waveform=t.waveform??`square`,this.volume=t.volume??.2}static async create(t,n={}){return new e(n.humanize?await dJ(t,n.humanize):t,n)}play(){this.playing=this.index<this.notes.length}pause(){this.playing=!1}stop(){this.playing=!1,this.elapsed=0,this.index=0}update(e){if(this.playing){for(this.elapsed+=e;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:bJ(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}get isPlaying(){return this.playing}get duration(){let e=this.notes.at(-1);return e?e.time+e.duration:0}},SJ=8e3,CJ=96e3;function wJ(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++)t[n]=Math.round(Math.max(-1,Math.min(1,e[n]))*32767);return t}function TJ(e,t,n){let r=Math.max(1,Math.round(e.length*n/t));if(r>16777216)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let i=new Float32Array(r);for(let r=0;r<i.length;r++){let a=r*t/n,o=Math.floor(a),s=Math.min(o+1,e.length-1);i[r]=e[o]+(e[s]-e[o])*(a-o)}return i}function EJ(e){if(typeof OfflineAudioContext>`u`)throw Error(`no OfflineAudioContext here: pass a decoder of your own to decode a SoundFont 3`);return new OfflineAudioContext(1,1,e)}function DJ(e=EJ){return async(t,n)=>{if(!(n>=400&&n<=2e5))throw Error(`a sample rate of ${n} Hz is not one a SoundFont can state`);let r=Math.max(SJ,Math.min(CJ,n)),i=t.slice().buffer,a=await e(r).decodeAudioData(i);if(a.length>16777216)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let o=a.getChannelData(0);return wJ(a.sampleRate===n?o:TJ(o,a.sampleRate,n))}}var OJ={keyRange:43,velRange:44,instrument:41,sampleId:53,rootKey:58,coarseTune:51,fineTune:52,sampleModes:54,attenuation:48,pan:17,attack:34,hold:35,decay:36,sustain:37,release:38};function kJ(e){return 2**(e/1200)}function AJ(e){return e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function jJ(e,t){let n=``;for(let r=0;r<20;r++){let i=e[t+r];if(i===0)break;n+=String.fromCharCode(i)}return n}function MJ(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t=>String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3]);if(n(0)!==`RIFF`||n(8)!==`sfbk`)throw Error(`not a SoundFont 2 file`);let r=new Map,i=new Map,a=(e,o)=>{let s=e;for(;s+8<=o;){let e=n(s),o=t.getUint32(s+4,!0);e===`LIST`?(i.set(n(s+8),{at:s,size:o}),a(s+12,s+8+o)):r.set(e,{at:s+8,size:o}),s+=8+o+(o&1)}};a(12,e.length);for(let e of[`phdr`,`pbag`,`pgen`,`inst`,`ibag`,`igen`,`shdr`,`smpl`])if(!r.has(e))throw Error(`SoundFont is missing "${e}"`);let o=(e,t,n)=>{let i=r.get(e),a=[];for(let e=i.at;e+t<=i.at+i.size;e+=t)a.push(n(e));return a},s=n=>o(n,4,n=>({oper:t.getUint16(n,!0),lo:e[n+2],hi:e[n+3],amount:t.getInt16(n+2,!0)})),c=e=>o(e,4,e=>t.getUint16(e,!0)),l=o(`phdr`,38,n=>({name:jJ(e,n),preset:t.getUint16(n+20,!0),bank:t.getUint16(n+22,!0),bag:t.getUint16(n+24,!0)})),u=o(`inst`,22,n=>({name:jJ(e,n),bag:t.getUint16(n+20,!0)})),d=o(`shdr`,46,n=>({name:jJ(e,n),start:t.getUint32(n+20,!0),end:t.getUint32(n+24,!0),loopStart:t.getUint32(n+28,!0),loopEnd:t.getUint32(n+32,!0),rate:t.getUint32(n+36,!0),rootKey:e[n+40],correction:t.getInt8(n+41),link:t.getUint16(n+42,!0),type:t.getUint16(n+44,!0)})),f=r.get(`smpl`),p=e.slice(f.at,f.at+f.size),m=d.filter(e=>e.end>e.start&&!(e.type&32768)),h=m.some(e=>e.type&16);if(h&&!m.every(e=>e.type&16))throw Error(`SoundFont mixes compressed and plain samples, which it cannot address consistently`);let g=h?p.length:p.length>>1;if(m.some(e=>e.end>g))throw Error(`a sample points outside the sample data: the SoundFont is damaged`);let _=h?new Int16Array:new Int16Array(p.buffer,0,p.length>>1),v=i.get(`INFO`)??null;return{bytes:e,presets:l,presetBags:c(`pbag`),presetGens:s(`pgen`),instruments:u,instBags:c(`ibag`),instGens:s(`igen`),samples:d,smplBytes:p,smpl:_,compressed:h,info:v?e.slice(v.at,v.at+8+v.size+(v.size&1)):null}}function NJ(e,t,n){return t.slice(e[n],e[n+1]??t.length)}function PJ(e,t,n,r,i){let a=e[r].bag,o=e[r+1]?.bag??t.length-1,s=[],c=null;for(let e=a;e<o;e++){let r=NJ(t,n,e),o=new Map;for(let e of r)o.set(e.oper,e);o.has(i)?s.push({gens:o,global:c}):e===a&&(c=o)}return s}function FJ(e,t){return e.gens.get(t)??e.global?.get(t)??null}function IJ(e,t,n){return e.get(`${t}:${n}`)??e.get(`0:${n}`)??(t===128?e.get(`128:0`):void 0)??e.get(`0:0`)}function LJ(e){let t=MJ(AJ(e));if(t.compressed)throw Error(`SoundFont 3 (Ogg Vorbis samples) needs decoding first: use loadSoundFont() or decodeSoundFont(), or convert it with "mwg-soundfonts convert <in.sf3> <out.sf2>"`);let n=new Map,r=new Map,i=e=>{if(n.has(e))return n.get(e);let i=t.samples[e];if(!i||i.end<=i.start||i.type&32768)return n.set(e,null),null;let a=new Float32Array(i.end-i.start);for(let e=0;e<a.length;e++)a[e]=t.smpl[i.start+e]/32768;let o={data:a,rate:i.rate||22050,loopStart:i.loopStart-i.start,loopEnd:i.loopEnd-i.start};return n.set(e,o),r.set(e,{rootKey:i.rootKey===255?60:i.rootKey,correction:i.correction}),o},a=new Map;for(let e=0;e<t.presets.length-1;e++)a.set(`${t.presets[e].bank}:${t.presets[e].preset}`,e);function o(e,n,o,s){let c=IJ(a,e,n);if(c===void 0)return[];let l=[],u=(e,t,n)=>{let r=FJ(e,t);return!r||n>=r.lo&&n<=r.hi};for(let e of PJ(t.presets,t.presetBags,t.presetGens,c,OJ.instrument)){if(!u(e,OJ.keyRange,o)||!u(e,OJ.velRange,s))continue;let n=FJ(e,OJ.instrument).amount;if(t.instruments[n+1])for(let a of PJ(t.instruments,t.instBags,t.instGens,n,OJ.sampleId)){if(!u(a,OJ.keyRange,o)||!u(a,OJ.velRange,s))continue;let t=FJ(a,OJ.sampleId).amount,n=i(t);if(!n)continue;let c=(t,n=0)=>(FJ(a,t)?.amount??n)+(FJ(e,t)?.amount??0),d=FJ(a,OJ.rootKey)?.amount,f=FJ(a,OJ.sampleModes)?.amount??0,p=r.get(t);l.push({sample:n,rootKey:d!==void 0&&d>=0?d:p.rootKey,cents:c(OJ.coarseTune)*100+c(OJ.fineTune)+p.correction,loop:(f&3)==1||(f&3)==3,gain:10**(-Math.max(0,c(OJ.attenuation))/200),pan:Math.max(-1,Math.min(1,c(OJ.pan)/500)),attack:kJ(c(OJ.attack,-12e3)),hold:kJ(c(OJ.hold,-12e3)),decay:kJ(c(OJ.decay,-12e3)),sustain:10**(-Math.max(0,c(OJ.sustain))/200),release:kJ(c(OJ.release,-12e3))})}}return l}return{voices:o,hasPreset:(e,t)=>a.has(`${e}:${t}`)||a.has(`0:${t}`),presetCount:a.size}}function RJ(e){let t=new Set,n=[];for(let r of e)for(let e of yJ(r)){let r=e.channel===9?128:e.bank,i=`${r}:${e.program}`;t.has(i)||(t.add(i),n.push({bank:r,program:e.program}))}return n}function zJ(e){return[e&255,e>>8&255]}function BJ(e){return[e&255,e>>8&255,e>>16&255,e>>24&255]}function VJ(e){let t=[...e].map(e=>e.charCodeAt(0)&255).slice(0,20);return[...t,...Array(20-t.length).fill(0)]}function HJ(e){return[...e].map(e=>e.charCodeAt(0))}function UJ(e,t){let n=new Uint8Array(8+t.length+(t.length&1));return n.set(HJ(e),0),new DataView(n.buffer).setUint32(4,t.length,!0),n.set(t,8),n}function WJ(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function GJ(e,t){let n=WJ([new Uint8Array(HJ(e)),...t]);return WJ([new Uint8Array(HJ(`LIST`)),new Uint8Array(BJ(n.length)),n])}function KJ(e){if(e.length===0)throw Error(`mergeSoundFonts needs at least one SoundFont`);let t=e.map(e=>MJ(AJ(e))),n=t[0].compressed;if(t.some(e=>e.compressed!==n))throw Error(`cannot merge a SoundFont 3 with a SoundFont 2: decode it first with decodeSoundFont()`);let r={bytes:new Uint8Array,presets:[],presetBags:[],presetGens:[],instruments:[],instBags:[],instGens:[],samples:[],smplBytes:new Uint8Array,smpl:new Int16Array,compressed:n,info:t[0].info},i=[],a=0;for(let e of t){let t=r.instruments.length,o=r.samples.length,s=r.presetBags.length,c=r.presetGens.length,l=r.instBags.length,u=r.instGens.length,d=n?a:a>>1;r.presets.push(...e.presets.slice(0,-1).map(e=>({...e,bag:e.bag+s}))),r.presetBags.push(...e.presetBags.slice(0,-1).map(e=>e+c)),r.presetGens.push(...e.presetGens.slice(0,e.presetBags[e.presetBags.length-1]).map(e=>e.oper===OJ.instrument?{...e,amount:e.amount+t}:e)),r.instruments.push(...e.instruments.slice(0,-1).map(e=>({...e,bag:e.bag+l}))),r.instBags.push(...e.instBags.slice(0,-1).map(e=>e+u)),r.instGens.push(...e.instGens.slice(0,e.instBags[e.instBags.length-1]).map(e=>e.oper===OJ.sampleId?{...e,amount:e.amount+o}:e)),r.samples.push(...e.samples.slice(0,-1).map(e=>({...e,start:e.start+d,end:e.end+d,loopStart:n?e.loopStart:e.loopStart+d,loopEnd:n?e.loopEnd:e.loopEnd+d,link:e.link+o})));let f=n?e.smplBytes:e.smplBytes.subarray(0,e.smplBytes.length&-2);i.push(f),a+=f.length}return r.presetBags.push(r.presetGens.length),r.instBags.push(r.instGens.length),r.presets.push({name:`EOS`,preset:0,bank:0,bag:r.presetBags.length-1}),r.instruments.push({name:`EOS`,bag:r.instBags.length-1}),r.samples.push({name:`EOS`,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0}),r.smplBytes=WJ(i),n||(r.smpl=new Int16Array(r.smplBytes.slice().buffer)),QJ(r,qJ(r))}function qJ(e){let t=new Set,n=[];for(let r=0;r<e.presets.length-1;r++){let i=`${e.presets[r].bank}:${e.presets[r].preset}`;t.has(i)||(t.add(i),n.push(r))}return n}var JJ=1<<27;async function YJ(e,t){let n=AJ(e),r=MJ(n);if(!r.compressed)return n.slice().buffer;let i=MJ(new Uint8Array(QJ(r,qJ(r)))),a=[],o=new Map,s=0,c=[];for(let e of i.samples){if(!(e.end>e.start)||e.type&32768){c.push(e);continue}let n=`${e.start}:${e.end}`,r=o.get(n);if(!r){if(!(e.rate>=400&&e.rate<=2e5))throw Error(`a sample states ${e.rate} Hz, which no SoundFont does: the font is damaged`);let c=await t(i.smplBytes.subarray(e.start,e.end),e.rate);if(c.length>16777216||s+c.length>JJ)throw Error(`the decoded sample data is larger than a SoundFont may hold: subset the font before shipping it`);r={start:s,length:c.length},o.set(n,r),a.push(c),s+=c.length}c.push({...e,start:r.start,end:r.start+r.length,loopStart:r.start+Math.min(e.loopStart,r.length),loopEnd:r.start+Math.min(e.loopEnd,r.length),type:e.type&-17})}let l=new Int16Array(s),u=0;for(let e of a)l.set(e,u),u+=e.length;let d={...i,samples:c,smpl:l,smplBytes:new Uint8Array(l.buffer),compressed:!1};return QJ(d,qJ(d))}async function XJ(e,t={}){return LJ(await YJ(e,t.decode??DJ()))}function ZJ(e,t){let n=MJ(AJ(e)),r=new Map;for(let e=0;e<n.presets.length-1;e++)r.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);let i=new Set,a=[];for(let{bank:e,program:n}of t){let t=IJ(r,e,n);t!==void 0&&!i.has(t)&&(i.add(t),a.push(t))}return a.sort((e,t)=>e-t),QJ(n,a)}function QJ(e,t){let n=t=>{let n=e.samples[t];return!!n&&n.end>n.start&&!(n.type&32768)},r=(e,t,n)=>e.map(e=>e.oper===t?{oper:t,lo:n.get(e.amount)&255,hi:n.get(e.amount)>>8&255,amount:n.get(e.amount)}:e),i=[],a=new Map;{let n=new Set;for(let r of t){let t=e.presets[r].bag,a=e.presets[r+1]?.bag??e.presetBags.length-1;for(let r=t;r<a;r++){let t=NJ(e.presetBags,e.presetGens,r);if(!t.some(e=>e.oper===OJ.instrument))continue;let a=t.find(e=>e.oper===OJ.instrument).amount;e.instruments[a+1]&&(n.has(a)||(n.add(a),i.push(a)))}}}let o=new Map(i.map((e,t)=>[e,t]));for(let t of i){let r=e.instruments[t].bag,i=e.instruments[t+1]?.bag??e.instBags.length-1,o=[];for(let t=r;t<i;t++){let r=NJ(e.instBags,e.instGens,t);if(!r.some(e=>e.oper===OJ.sampleId))continue;let i=r.find(e=>e.oper===OJ.sampleId).amount;n(i)&&o.push(r)}a.set(t,o)}let s=[];{let t=new Set,r=i=>{if(t.has(i)||!n(i))return;t.add(i),s.push(i);let a=e.samples[i].link;a!==i&&r(a)};for(let e of i)for(let t of a.get(e))r(t.find(e=>e.oper===OJ.sampleId).amount)}let c=new Map(s.map((e,t)=>[e,t])),l=e=>[...zJ(e.oper),e.lo,e.hi],u=e=>[...zJ(e),...zJ(0)],d=[],f=[],p=[];for(let n of t){let t=e.presets[n],i=d.length,a=t.bag,s=e.presets[n+1]?.bag??e.presetBags.length-1;for(let t=a;t<s;t++){let n=NJ(e.presetBags,e.presetGens,t);(t===a&&!n.some(e=>e.oper===OJ.instrument)||n.some(e=>e.oper===OJ.instrument))&&(d.push(f.length),f.push(...r(n,OJ.instrument,o)))}p.push({name:t.name,preset:t.preset,bank:t.bank,bag:i})}d.push(f.length);let m=[],h=[],g=[];for(let t of i){let n=m.length,i=a.get(t),o=e.instruments[t].bag,s=e.instruments[t+1]?.bag??e.instBags.length-1;for(let t=o;t<s;t++){let n=NJ(e.instBags,e.instGens,t);t===o&&!n.some(e=>e.oper===OJ.sampleId)&&(m.push(h.length),h.push(...n))}for(let e of i)m.push(h.length),h.push(...r(e,OJ.sampleId,c));g.push({name:e.instruments[t].name,bag:n})}m.push(h.length);let _=[],v=[];for(let t of s){let n=e.samples[t],r=c.get(t);if(e.compressed){let t=v.length;for(let t=n.start;t<n.end;t++)v.push(e.smplBytes[t]);_.push({...n,start:t,end:t+(n.end-n.start),link:c.get(n.link)??r});continue}let i=v.length/2;for(let t=n.start;t<n.end;t++){let n=e.smpl[t];v.push(n&255,n>>8&255)}_.push({...n,start:i,end:i+(n.end-n.start),loopStart:i+(n.loopStart-n.start),loopEnd:i+(n.loopEnd-n.start),link:c.get(n.link)??r})}let y=e=>[...VJ(e.name),...zJ(e.preset),...zJ(e.bank),...zJ(e.bag),...Array(12).fill(0)],b=e.presets[e.presets.length-1],x=UJ(`phdr`,[...p.flatMap(y),...y({name:b?.name??`EOS`,preset:0,bank:0,bag:d.length-1})]),S=UJ(`pbag`,d.flatMap(u)),C=UJ(`pgen`,f.flatMap(l)),ee=UJ(`pmod`,Array(10).fill(0)),w=e=>[...VJ(e.name),...zJ(e.bag)],T=e.instruments[e.instruments.length-1],E=UJ(`inst`,[...g.flatMap(w),...w({name:T?.name??`EOS`,bag:m.length-1})]),te=UJ(`ibag`,m.flatMap(u)),D=UJ(`igen`,h.flatMap(l)),O=UJ(`imod`,Array(10).fill(0)),ne=e=>[...VJ(e.name),...BJ(e.start),...BJ(e.end),...BJ(e.loopStart),...BJ(e.loopEnd),...BJ(e.rate),e.rootKey,e.correction&255,...zJ(e.link),...zJ(e.type)],k={name:``,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0},A=UJ(`shdr`,[..._.flatMap(ne),...ne(k)]),re=GJ(`sdta`,[UJ(`smpl`,v)]),ie=GJ(`pdta`,[x,S,ee,C,E,te,O,D,A]),ae=WJ([new Uint8Array(HJ(`sfbk`)),...e.info?[e.info]:[],re,ie]);return WJ([new Uint8Array(HJ(`RIFF`)),new Uint8Array(BJ(ae.length)),ae]).buffer}var $J=22050,eY=.35,tY=480;function nY(e,t={}){return oY(iY(e,t))}async function rY(e,t={}){return UW(oY,[iY(mJ(e),{soundfont:t.soundFontBytes?LJ(t.soundFontBytes):null,sampleRate:t.sampleRate,gain:t.gain,maxDuration:t.maxDuration})])}function iY(e,t){let n=t.sampleRate??$J,r=t.gain??eY,i=t.maxDuration??tY;if(!(n>0))throw Error(`render sample rate must be positive`);if(!(r>=0))throw Error(`render gain must not be negative`);if(!(i>0))throw Error(`render max duration must be positive`);let a=yJ(e).filter(e=>e.time<i);if(a.length===0)throw Error(`MIDI file has no notes`);let o=t.soundfont??null,s=new Map;return{notes:a.map(e=>({...e,frequency:bJ(e.note),voices:o?aY(o,s,e):void 0})),loopStart:vJ(e),sampleRate:n,gain:r,maxDuration:i}}function aY(e,t,n){let r=n.channel===9?128:n.bank,i=`${r}:${n.program}:${n.note}:${n.velocity>>3}`,a=t.get(i);return a||(a=e.voices(r,n.program,n.note,n.velocity),t.set(i,a)),a}function oY(e){let{sampleRate:t,gain:n,maxDuration:r}=e,i=e.notes,a=i.reduce((e,t)=>Math.max(e,t.time+t.duration),0),o=Math.min(r,a+1.5),s=Math.max(1,Math.ceil(o*t)),c=new Float32Array(s),l=new Float32Array(s),u=Math.min(e.loopStart??0,Math.max(0,o-.1));function d(e){let t=(Math.max(-1,Math.min(1,e))+1)*Math.PI/4;return[Math.cos(t),Math.sin(t)]}function f(e,t,n,r,i,a,o,s){let c=i.sample.data;if(c.length===0)return;let l=2**(((r.note-i.rootKey)*100+i.cents+(r.bend??0)*100)/1200)*i.sample.rate/n;if(!(l>0))return;let u=r.time+r.duration,f=Math.max(.002,i.attack),p=f+i.hold+Math.min(i.decay,30),m=Math.max(.03,Math.min(i.release,4)),h=c.length/i.sample.rate,g=r.channel===9?Math.max(u,r.time+Math.min(2,h)):Math.max(u,r.time+f),_=g-r.time,v=a*i.gain,y=v*i.sustain,[b,x]=d(r.pan+i.pan),S=i.loop&&i.sample.loopEnd>i.sample.loopStart,C=i.sample.loopEnd-i.sample.loopStart,ee=Math.min(s,o+Math.ceil((g+m+.02-r.time)*n)),w=0;for(let a=o;a<ee;a++){let o=a/n-r.time,s;s=o<f?o/f*v:o<f+i.hold?v:o<p?v+(y-v)*((o-f-i.hold)/Math.max(1e-6,p-f-i.hold)):o<_?y:o<_+m?y*(1-(o-_)/m):0,S&&w>=i.sample.loopEnd&&(w=i.sample.loopStart+(w-i.sample.loopStart)%C);let u=Math.floor(w),d=Math.min(1,Math.max(0,w-u)),h;if(!S&&w>=c.length||u<0)h=0;else{let e=c[Math.min(u,c.length-1)];h=e+(c[Math.min(u+1,c.length-1)]-e)*d}e[a]+=h*s*b,t[a]+=h*s*x,w+=l}}function p(e){return e<8?{wave:`triangle`,attack:.005,decay:1.2,sustain:.25,release:.2,detune:0}:e<16?{wave:`sine`,attack:.003,decay:.8,sustain:.1,release:.5,detune:0}:e<24?{wave:`square`,attack:.01,decay:.1,sustain:.7,release:.08,detune:0,cutoff:2500}:e<32?{wave:`sawtooth`,attack:.004,decay:.6,sustain:.15,release:.15,detune:0,cutoff:3e3}:e<40?{wave:`triangle`,attack:.005,decay:.4,sustain:.5,release:.1,detune:0}:e<56?{wave:`sawtooth`,attack:.12,decay:.2,sustain:.8,release:.3,detune:6,cutoff:3500}:e<80?{wave:`sawtooth`,attack:.04,decay:.15,sustain:.75,release:.12,detune:0,cutoff:4500}:e<88?{wave:`square`,attack:.01,decay:.1,sustain:.8,release:.1,detune:0,cutoff:3800}:e<104?{wave:`sawtooth`,attack:.25,decay:.3,sustain:.7,release:.5,detune:8,cutoff:2200}:{wave:`triangle`,attack:.005,decay:.5,sustain:.2,release:.2,detune:0}}function m(e,t){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI);return 4*Math.abs(e-Math.floor(e)-.5)-1}}}function h(e,t,n,r,i,a){return e<t?e/t:e<t+n?1-(1-r)*((e-t)/Math.max(1e-6,n)):e<i?r:e<i+a?r*(1-(e-i)/a):0}function g(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function _(e,t,n,r,i,a,o){if(r.channel===9){v(e,t,n,r,i,a,o);return}let s=p(r.program),c=r.frequency*2**((s.detune+(r.bend??0)*100)/1200),l=Math.max(r.duration,s.attack+.01),u=Math.max(.02,s.release),f=Math.min(o,a+Math.ceil((l+u+.02)*n)),[g,_]=d(r.pan),y=s.cutoff!==void 0,b=y?1-Math.exp(-2*Math.PI*Math.min(s.cutoff,c*8+800)/n):0,x=0,S=0,C=2*Math.PI*c/n;for(let o=a;o<f;o++){let a=o/n-r.time,c=m(s.wave,S);S+=C,x=y?x+b*(c-x):c;let d=i*h(a,s.attack,s.decay,s.sustain,l,u);e[o]+=x*d*g,t[o]+=x*d*_}}function v(e,t,n,r,i,a,o){let[s,c]=d(r.pan),l=r.note*7919+a;if(r.note===35||r.note===36||r.note<45){let l=i*1.4,u=Math.min(o,a+Math.ceil(.27*n)),d=0;for(let i=a;i<u;i++){let a=i/n-r.time,o=a<.12?150*(45/150)**(a/.12):45;d+=2*Math.PI*o/n;let u=l*(.001/l)**Math.min(1,a/.22);e[i]+=Math.sin(d)*u*s,t[i]+=Math.sin(d)*u*c}return}let u=r.note===38||r.note===40,f=u?.16:r.note>=49?.5:.06,p=i*(u?.9:.5),m=Math.min(o,a+Math.ceil((f+.02)*n));for(let i=a;i<m;i++){let o=i/n-r.time,u=p*(.001/p)**Math.min(1,o/f),d=g(l,i-a)*u;e[i]+=d*s,t[i]+=d*c}}for(let e of i){let r=Math.floor(e.time*t);if(r>=s)continue;let i=n*Math.max(.02,e.velocity/127*e.gain),a=e.voices??[];if(a.length>0)for(let n of a)f(c,l,t,e,n,i,r,s);else _(c,l,t,e,i,r,s)}return{sampleRate:t,left:c,right:l,loopStart:u,loopEnd:o,duration:o}}function sY(e,t,n,r,i,a){let o=e.createBufferSource();o.buffer=n,o.playbackRate.value=i;let s=e.createGain();s.gain.value=r;let c=null;return typeof e.createStereoPanner==`function`?(c=e.createStereoPanner(),c.pan.value=a,o.connect(s),s.connect(c),c.connect(t)):(o.connect(s),s.connect(t)),{source:o,gain:s,panner:c}}var cY=class{constructor(e,t){this.source=null,this.gainNode=null,this.pannerNode=null,this.buffer=null,this.params={volume:1,pitch:1,pan:0},this.loopRegion=null,this.repeat=!0,this.startedAt=0,this.offset=0,this.context=e,this.destination=t??e.destination}get isPlaying(){return this.source!==null}get duration(){return this.buffer?.duration??0}play(e,t={}){this.stop();let n=t.volume??1,r=t.pitch??1,i=t.pan??0,{source:a,gain:o,panner:s}=sY(this.context,this.destination,e,n,r,i),c=t.loop??null,l=t.repeat??!0;if(a.loop=l,c&&(a.loopStart=c.start,a.loopEnd=c.end),!l){let e=a;a.onended=()=>{this.source===e&&this.clearNodes()}}this.source=a,this.gainNode=o,this.pannerNode=s,this.buffer=e,this.params={volume:n,pitch:r,pan:i},this.loopRegion=c,this.repeat=l,this.offset=Math.min(Math.max(0,t.pos??0),Math.max(0,e.duration-.001)),this.startedAt=this.context.currentTime,a.start(0,this.offset)}update(e){if(e.volume!==void 0&&(this.params.volume=e.volume),e.pitch!==void 0&&(this.params.pitch=e.pitch),e.pan!==void 0&&(this.params.pan=e.pan),!this.source||!this.gainNode)return;let t=this.context.currentTime;this.gainNode.gain.setTargetAtTime(this.params.volume,t,.02),this.source.playbackRate.value=this.params.pitch,this.pannerNode&&(this.pannerNode.pan.value=this.params.pan)}stop(e=0){let t=this.position(),n=this.source,r=this.gainNode;if(this.clearNodes(),this.offset=t,n)try{if(e>0&&r){let t=this.context.currentTime;r.gain.cancelScheduledValues(t),r.gain.setValueAtTime(r.gain.value,t),r.gain.linearRampToValueAtTime(0,t+e),n.stop(t+e+.02)}else n.stop()}catch{}}position(){if(!this.source||!this.buffer)return this.offset;let e=Math.max(0,this.context.currentTime-this.startedAt)*this.params.pitch,t=this.offset+e;if(this.repeat&&this.duration>0){let e=this.loopRegion?.start??0,n=this.loopRegion?.end??this.buffer.duration;n>e&&t>=n&&(t=e+(t-e)%(n-e))}return t}seek(e){this.restore({...this.state(),pos:e})}state(){return{...this.params,pos:this.position()}}restore(e){let t=this.buffer;this.update({volume:e.volume,pitch:e.pitch,pan:e.pan}),t&&this.source?this.play(t,{volume:e.volume,pitch:e.pitch,pan:e.pan,pos:e.pos,loop:this.loopRegion,repeat:this.repeat}):this.offset=Math.max(0,e.pos)}clearNodes(){this.source&&(this.source.onended=null),this.source=null,this.gainNode=null,this.pannerNode=null}};function lY(e,t,n,r){let i=Number(e);return Math.min(n,Math.max(t,Number.isFinite(i)?i:r))}var uY=class e{constructor(e,t={}){this.tracks={bgm:null,bgs:null},this.saved={bgm:null,bgs:null},this.requests={bgm:0,bgs:0},this.me=null,this.meToken=0,this.suspendedBgm=null,this.seNodes=new Set,this.mixerLevels={bgm:{volume:1,muted:!1},bgs:{volume:1,muted:!1},me:{volume:1,muted:!1},se:{volume:1,muted:!1}},this.context=e,this.destination=t.destination??e.destination,this.load=t.load??(async()=>null);let n=()=>{let t=e.createGain();return t.connect(this.destination),t};this.kindGains={bgm:n(),bgs:n(),me:n(),se:n()},this.bgmChannel=new cY(e,this.kindGains.bgm),this.bgsChannel=new cY(e,this.kindGains.bgs)}setMixer(e,t){let n=this.mixerLevels[e];t.volume!==void 0&&(n.volume=lY(t.volume,0,1,1)),t.muted!==void 0&&(n.muted=t.muted),this.kindGains[e].gain.value=n.muted?0:n.volume}mixer(e){return{...this.mixerLevels[e]}}playBgm(e){return this.playLoop(`bgm`,e)}playBgs(e){return this.playLoop(`bgs`,e)}stopBgm(){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop()}stopBgs(){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop()}fadeOutBgm(e=1){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop(Math.max(0,e))}fadeOutBgs(e=1){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop(Math.max(0,e))}currentTrack(e){let t=this.tracks[e];if(t){let n=e===`bgm`?this.bgmChannel:this.bgsChannel;return{...t,pos:n.isPlaying?n.position():t.pos}}return e===`bgm`?this.suspendedBgm:null}saveBgm(){return this.saved.bgm=this.currentTrack(`bgm`),this.saved.bgm}saveBgs(){return this.saved.bgs=this.currentTrack(`bgs`),this.saved.bgs}replayBgm(){return this.saved.bgm?this.playBgm(this.saved.bgm):Promise.resolve()}replayBgs(){return this.saved.bgs?this.playBgs(this.saved.bgs):Promise.resolve()}async playMe(t){let n=e.normalize(t),r=++this.meToken;if(this.stopMeNodes(),!n.name)return;let i=await this.load(`me`,n.name);if(r!==this.meToken||!i)return;let a=this.currentTrack(`bgm`);a&&(this.suspendedBgm=a,this.requests.bgm++,this.bgmChannel.stop(),this.tracks.bgm=null);let{source:o}=sY(this.context,this.kindGains.me,i.buffer,n.volume/100,n.pitch/100,n.pan/100);this.me={source:o,token:r},o.onended=()=>{this.me?.token===r&&this.finishMe()},o.start(0)}stopMe(e=!0){this.stopMeNodes(),e&&this.finishMe()}async playSe(t){let n=e.normalize(t);if(!n.name)return;let r=await this.load(`se`,n.name);if(!r)return;let{source:i}=sY(this.context,this.kindGains.se,r.buffer,n.volume/100,n.pitch/100,n.pan/100),a={source:i};this.seNodes.add(a),i.onended=()=>{this.seNodes.delete(a)},i.start(0)}stopSe(){for(let e of this.seNodes){e.source.onended=null;try{e.source.stop()}catch{}}this.seNodes.clear()}stopAll(){this.requests.bgm++,this.requests.bgs++,this.tracks.bgm=null,this.tracks.bgs=null,this.suspendedBgm=null,this.bgmChannel.stop(),this.bgsChannel.stop(),this.stopMeNodes(),this.stopSe()}snapshot(){return{bgm:this.currentTrack(`bgm`),bgs:this.currentTrack(`bgs`),savedBgm:this.saved.bgm,savedBgs:this.saved.bgs}}restore(e){e&&typeof e==`object`&&(this.saved.bgm=e.savedBgm??null,this.saved.bgs=e.savedBgs??null,e.bgm&&this.playBgm(e.bgm),e.bgs&&this.playBgs(e.bgs))}static normalize(e){return{name:String(e?.name||``),volume:lY(e?.volume,0,100,90),pitch:lY(e?.pitch,10,400,100),pan:lY(e?.pan,-100,100,0),pos:Math.max(0,Number(e?.pos)||0)}}async playLoop(t,n){let r=t===`bgm`?this.bgmChannel:this.bgsChannel,i=e.normalize(n);if(!i.name){this.requests[t]++,this.tracks[t]=null,t===`bgm`&&(this.suspendedBgm=null),r.stop();return}let a=this.tracks[t];if(a&&a.name===i.name&&!(i.pos>0)){this.tracks[t]={...i,pos:0},r.update({volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100});return}if(t===`bgm`&&this.me){this.requests.bgm++,this.suspendedBgm=i,this.tracks.bgm=null,r.stop();return}let o=++this.requests[t];r.stop(),this.tracks[t]={...i,pos:0};let s=await this.load(t,i.name);o===this.requests[t]&&(s?r.play(s.buffer,{volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100,pos:i.pos,loop:s.loop??null}):this.tracks[t]=null)}stopMeNodes(){let e=this.me;if(this.me=null,e){e.source.onended=null;try{e.source.stop()}catch{}}}finishMe(){this.me=null;let e=this.suspendedBgm;this.suspendedBgm=null,e&&!this.tracks.bgm&&this.playBgm(e)}},dY=65536;function fY(e){let t=mY(e.subarray(0,dY));if(!t)return null;let n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=new TextDecoder(`utf-8`),i=7,a=()=>{if(i+4>t.length)return null;let e=n.getUint32(i,!0);return i+=4,i+e<=t.length?e:null},o=a();if(o===null||(i+=o,i+4>t.length))return null;let s=n.getUint32(i,!0);i+=4;let c=null,l=null;for(let e=0;e<s;e++){let e=a();if(e===null)break;let n=r.decode(t.subarray(i,i+e));i+=e;let o=n.indexOf(`=`);if(o<0)continue;let s=n.slice(0,o).toUpperCase(),u=/^\d+$/.test(n.slice(o+1))?Number(n.slice(o+1)):null;u!==null&&(s===`LOOPSTART`?c=u:s===`LOOPLENGTH`&&(l=u))}return c===null?null:{loopStart:c,loopLength:l}}function pY(e,t,n){if(!e||!(t>0))return null;let r=e.loopStart/t,i=e.loopLength?(e.loopStart+e.loopLength)/t:n;return r>=0&&i>r&&r<n?{start:r,end:Math.min(i,n)}:null}function mY(e){let t=[3,118,111,114,98,105,115],n=[],r=0;for(;r+27<=e.length;){if(e[r]!==79||e[r+1]!==103||e[r+2]!==103||e[r+3]!==83)return null;let i=e[r+26],a=r+27+i;if(a>e.length)return null;let o=a;for(let a=0;a<i;a++){let i=e[r+27+a];if(o+i>e.length)return null;for(let t=0;t<i;t++)n.push(e[o+t]);if(o+=i,i<255){if(t.every((e,t)=>n[t]===e))return Uint8Array.from(n);n=[]}}r=o}return null}function hY(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function gY(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var _Y=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},vY=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return hY(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return gY(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t),t)}};oJ(),lJ();var yY=256,bY=64,xY=10,SY=2,CY=.05,wY=4,TY=96;function EY(e,t){let n=e.length,r=0;for(let i=1;i<n;i++){let a=n>>1;for(;r&a;)r^=a,a>>=1;if(r^=a,i<r){let n=e[i];e[i]=e[r],e[r]=n,n=t[i],t[i]=t[r],t[r]=n}}for(let r=2;r<=n;r<<=1){let i=-2*Math.PI/r,a=Math.cos(i),o=Math.sin(i),s=r>>1;for(let i=0;i<n;i+=r){let n=1,r=0;for(let c=0;c<s;c++){let l=i+c,u=l+s,d=e[u]*n-t[u]*r,f=e[u]*r+t[u]*n;e[u]=e[l]-d,t[u]=t[l]-f,e[l]+=d,t[l]+=f;let p=n*a-r*o;r=n*o+r*a,n=p}}}}function DY(e,t){if(e.length===0||t<=0)return[];let n=yY/2,r=new Float32Array(e.length+256);r.set(e,n);let i=new Float64Array(yY);for(let e=0;e<yY;e++)i[e]=.5-.5*Math.cos(2*Math.PI*e/255);let a=new Float64Array(yY),o=new Float64Array(yY),s=new Float64Array(yY/2),c=[],l=[],u=0;for(let e=0;e+yY<=r.length;e+=bY){let t=0;for(let n=0;n<yY;n++)a[n]=r[e+n]*i[n],o[n]=0,t+=a[n]*a[n];l.push(u===0?t===0?0:1/0:t/u-1),u=t,EY(a,o);let n=0;for(let e=0;e<yY/2;e++){let t=Math.hypot(a[e],o[e]),r=t-s[e];r>0&&(n+=r),s[e]=t}c.push(n)}let d=[],f=-1/0;for(let e=0;e<c.length;e++){let r=Math.max(0,e-xY),i=Math.min(c.length-1,e+xY),a=i-r+1,o=0;for(let e=r;e<=i;e++)o+=c[e];o/=a;let s=0;for(let e=r;e<=i;e++)s+=(c[e]-o)**2;let u=o+SY*Math.sqrt(s/a);if(c[e]<=0||c[e]<u||l[e]<CY&&(e===0||l[e-1]<CY)||e>0&&c[e-1]>c[e]||e+1<c.length&&c[e+1]>=c[e]||e-f<wY)continue;let p=(e*bY+n-TY)/t;d.push(Math.max(0,p)),f=e}return d}Mq();var OY=`extracted`,kY=[4,4],AY=120,jY=120,MY=480;function NY(e){let t=[...e].sort((e,t)=>e-t),n=t.length>>1;return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function PY(e){return Math.round(NY(e))}function FY(e){for(let t of e.events)if(t.type===`tempo`)return Math.round(6e7/t.microsecondsPerQuarter*100)/100;return AY}function IY(e){return e.events.filter(e=>e.type===`noteOn`)}function LY(e){return IY(e).map(e=>e.velocity)}function RY(e,t,n,r,i){let a=e.map((e,t)=>({subdivisionIndex:t,timeOffsetTicks:e.time.length>0?PY(e.time):0,velocityFactor:e.velocity.length>0?i(e):1}));return{name:OY,timeSignature:[...kY],ppq:n,tempoBpm:r,subdivision:t,offsets:a}}var zY=class{async extractFromMidiPair(e,t,n=`16n`){let r=t.ticksPerQuarter,i=kq(r,n),a=Oq(kY,n),o=r/e.ticksPerQuarter,s=IY(e).map(e=>({channel:e.channel,note:e.note,tick:e.tick*o,velocity:e.velocity})),c=new Set,l=[];for(let e of IY(t)){let t=-1,n=1/0;for(let r=0;r<s.length;r++){let i=s[r];if(c.has(r)||i.channel!==e.channel||i.note!==e.note)continue;let a=Math.abs(i.tick-e.tick);a<n&&(n=a,t=r)}t<0||n>i/2||(c.add(t),l.push({slotTick:s[t].tick,delta:e.tick-s[t].tick,factor:s[t].velocity>0?e.velocity/s[t].velocity:null}))}let u=Array.from({length:a},()=>({time:[],velocity:[]}));for(let e of l){let t=(Math.round(e.slotTick/i)%a+a)%a;u[t].time.push(e.delta),e.factor!==null&&u[t].velocity.push(e.factor)}return RY(u,n,r,FY(t),e=>NY(e.velocity))}async extractFromSingleMidi(e,t=`16n`){let n=e.ticksPerQuarter,r=kq(n,t),i=Oq(kY,t),a=Array.from({length:i},()=>({time:[],velocity:[]}));for(let t of IY(e)){let e=Math.round(t.tick/r)*r,n=(Math.round(e/r)%i+i)%i;a[n].time.push(t.tick-e),a[n].velocity.push(t.velocity)}let o=NY(LY(e));return RY(a,t,n,FY(e),e=>o<=0?1:NY(e.velocity)/o)}async extractFromAudioBuffer(e,t=`16n`,n=jY){if(!Number.isFinite(n)||n<=0)throw Error(`tempoBpm must be greater than 0, got ${String(n)}`);let r=[];for(let t=0;t<e.numberOfChannels;t++)r.push(e.getChannelData(t));let i=new Float32Array(e.length);for(let e of r)for(let t=0;t<e.length;t++)i[t]+=e[t]/r.length;let a=DY(i,e.sampleRate);if(a.length===0)throw Error(`no onsets detected in the buffer - a groove needs audible attacks, and this audio has none`);let o=MY,s=kq(o,t),c=Oq(kY,t),l=n*o/60,u=Array.from({length:c},()=>({time:[],velocity:[]}));for(let e of a){let t=e*l,n=Math.round(t/s)*s;u[(Math.round(n/s)%c+c)%c].time.push(t-n)}return RY(u,t,o,n,()=>1)}};Mq();var BY=`mwg-groove:`,VY=36,HY=64,UY=[`8n`,`16n`,`32n`],WY=new TextEncoder;function GY(e){throw Error(`the ${e} format is not shipped: it is an undocumented proprietary container, and a guessed reader could load a different groove than the file holds`)}function KY(e){return[...e].map(e=>e.charCodeAt(0)&127)}function qY(e){let t=[e&127],n=e>>>7;for(;n>0;)t.unshift(n&127|128),n>>>=7;return t}function JY(e,t){return[255,e,...qY(t.length),...t]}function YY(e){Aq(e);let{name:t,timeSignature:n,ppq:r,subdivision:i,offsets:a}=e,o=Oq(n,i),s=kq(r,i);if(r>32767)throw Error(`groove template "${t}": ppq ${r} does not fit MIDI's 15-bit division`);if(VY+o-1>127)throw Error(`groove template "${t}": ${o} slots need pitches up to ${VY+o-1}, past MIDI's top note of 127`);let c=Math.round(6e7/e.tempoBpm);if(c<1||c>16777215)throw Error(`groove template "${t}": tempoBpm ${e.tempoBpm} does not fit MIDI's three-byte tempo (${c} microseconds)`);a.forEach((e,n)=>{if(Math.abs(e.timeOffsetTicks)>=s)throw Error(`groove template "${t}": slot ${n} is offset by ${e.timeOffsetTicks} ticks, outside the +/-${s} the MIDI encoding's one-slot anchor can tell from a slot shift`);let r=Math.round(HY*e.velocityFactor);if(r<1||r>127)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${e.velocityFactor}, outside the ${1/HY} to ${127/HY} the MIDI encoding can store at ${1/HY} per velocity unit`)});let l=[{tick:0,bytes:JY(81,[c>>16&255,c>>8&255,c&255])},{tick:0,bytes:JY(88,[n[0],Math.log2(n[1]),24,8])},{tick:0,bytes:JY(1,[...WY.encode(BY+t)])}];a.forEach((e,t)=>{let n=s*(t+1)+e.timeOffsetTicks,r=n+Math.max(1,Math.floor(s/4));l.push({tick:n,bytes:[144,VY+t,Math.round(HY*e.velocityFactor)]}),l.push({tick:r,bytes:[128,VY+t,0]})}),l.sort((e,t)=>e.tick-t.tick);let u=[],d=0;for(let e of l)u.push(...qY(e.tick-d),...e.bytes),d=e.tick;return u.push(0,255,47,0),new Uint8Array([...KY(`MThd`),0,0,0,6,0,0,0,1,r>>8&255,r&255,...KY(`MTrk`),u.length>>>24&255,u.length>>>16&255,u.length>>>8&255,u.length&255,...u])}function XY(e,t){for(let n of UY)try{if(Oq(e,n)===t)return n}catch{}throw Error(`a ${t}-slot groove in ${e[0]}/${e[1]} is not one of the 8n, 16n or 32n grids`)}function ZY(e){let t=typeof e==`string`?WY.encode(e):e,n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=(e,n)=>{if(r+e>t.length)throw Error(`truncated MIDI file while reading ${n}`)},a=(e,n)=>{i(e,n);let a=``;for(let n=0;n<e;n++)a+=String.fromCharCode(t[r+n]);return r+=e,a},o=e=>(i(1,e),t[r++]),s=e=>{i(2,e);let t=n.getUint16(r);return r+=2,t},c=e=>{i(4,e);let t=n.getUint32(r);return r+=4,t},l=e=>{let t=0;for(let n=0;n<4;n++){let n=o(e);if(t=t<<7|n&127,!(n&128))return t}throw Error(`a variable-length quantity in ${e} runs past four bytes`)};if(a(4,`the file header`)!==`MThd`)throw Error(`not a Standard MIDI File: the MThd header is missing`);let u=c(`the header length`);if(u<6)throw Error(`MThd is ${u} bytes, expected at least 6`);let d=s(`the format`),f=s(`the track count`),p=s(`the division`);if(r+=u-6,d>1)throw Error(`MIDI format ${d} is not a file this reader understands`);if(p&32768)throw Error(`SMPTE time in the division carries no tick grid to read a groove from`);if(f!==1)throw Error(`an mwg groove file holds one track, this one has ${f}`);if(a(4,`the track header`)!==`MTrk`)throw Error(`the MTrk track header is missing`);let m=c(`the track length`),h=r+m;if(h>t.length)throw Error(`truncated MIDI file: the track runs past the end of the data`);let g=0,_=0,v=null,y=null,b=null,x=!1,S=new Map;for(;r<h;){g+=l(`a delta time`);let e=t[r];if(e<128){if(_===0)throw Error(`data at tick ${g} follows a delta time with no running status to read it under`);e=_}else r++,e<240&&(_=e);if(e===255){let e=o(`a meta type`),n=l(`a meta length`);i(n,`a meta event`);let a=r;if(e===81&&n===3)v=t[a]<<16|t[a+1]<<8|t[a+2];else if(e===88&&n>=2)y=[t[a],2**t[a+1]];else if((e===1||e===3)&&n>0){let e=``;for(let r=0;r<n;r++)e+=String.fromCharCode(t[a+r]);e.startsWith(BY)&&(b=e.slice(11))}r+=n,e===47&&(x=!0),_=0;continue}if(e===240||e===247){r+=l(`a sysex length`),_=0;continue}let n=e&240;if(n===144||n===128){let e=o(`a note number`),t=o(`a note velocity`);if(n===144&&t>0){if(S.has(e))throw Error(`pitch ${e} carries more than one note-on, which no groove encodes`);S.set(e,{tick:g,velocity:t})}}else if(n===176||n===224)i(2,`a controller or bend event`),r+=2;else if(n===192||n===208)i(1,`a program or channel-aftertouch event`),r+=1;else throw Error(`unexpected status byte 0x${e.toString(16)} at tick ${g}`)}if(!x)throw Error(`the track has no end-of-track meta, so the file is incomplete`);if(b===null)throw Error(`no ${BY} text meta: this file was not written as a groove`);if(y===null)throw Error(`no time-signature meta: an mwg groove file always carries one`);let C=p,ee=S.size,w=XY(y,ee),T=kq(C,w),E=[];for(let e=0;e<ee;e++){let t=S.get(VY+e);if(!t)throw Error(`slot ${e} is missing: expected a note on pitch ${VY+e}`);E.push({subdivisionIndex:e,timeOffsetTicks:t.tick-T*(e+1),velocityFactor:t.velocity/HY})}let te={name:b,timeSignature:y,ppq:C,tempoBpm:v===null?120:Math.round(6e7/v*100)/100,subdivision:w,offsets:E};return Aq(te),te}function QY(e){let t=typeof e==`string`?e:new TextDecoder().decode(e),n;try{n=JSON.parse(t)}catch(e){throw Error(`not valid JSON: ${e instanceof Error?e.message:String(e)}`)}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a groove JSON export must be an object`);return Aq(n),n}var $Y=class{async exportFormat(e,t){switch(t){case`json`:return Aq(e),JSON.stringify(e,null,2);case`midi`:return YY(e);case`ableton-agr`:case`reaper-groove`:return GY(t);default:throw Error(`unknown groove format: ${String(t)}`)}}async importFormat(e,t){switch(t){case`json`:return QY(e);case`midi`:return ZY(e);case`ableton-agr`:case`reaper-groove`:return GY(t);default:throw Error(`unknown groove format: ${String(t)}`)}}},eX=l({AudioBus:()=>uY,AudioListener:()=>_Y,Channel:()=>cY,GrooveConverter:()=>$Y,GrooveExtractor:()=>zY,GrooveHumanizer:()=>cJ,HumanizerFactory:()=>uJ,LiteHumanizer:()=>aJ,MidiPlayer:()=>xJ,Music:()=>yq,Orchestrator:()=>bq,Sound:()=>vq,SoundSource:()=>vY,assertGrooveTemplate:()=>Aq,audioGain:()=>hY,audioPan:()=>gY,collectSoundFontUsage:()=>RJ,createAudio:()=>hq,decodeSoundFont:()=>YJ,humanizeMidi:()=>dJ,loadSoundFont:()=>XJ,loopRegionFromTags:()=>pY,mergeSoundFonts:()=>KJ,midiLoopStart:()=>vJ,noteToFrequency:()=>bJ,onCaption:()=>_q,parseMidi:()=>mJ,parseSoundFont:()=>LJ,parseVorbisLoopTags:()=>fY,playTone:()=>Sq,renderMidiToBuffer:()=>nY,renderMidiToBufferAsync:()=>rY,scheduleMidi:()=>yJ,subdivisionCount:()=>Oq,subsetSoundFont:()=>ZJ,synthesizeSound:()=>Cq,synthesizeTone:()=>xq,webAudioSampleDecoder:()=>DJ});Mq();function tX(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function nX(e){if(e?.version!==1||typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`unsupported neural model or observation version`);if(!Array.isArray(e.layers)||!e.layers.length||e.layers.length>32)throw RangeError(`a neural model needs 1..32 layers`);let t=0;for(let n=0;n<e.layers.length;n++){let r=e.layers[n];if(!r||!Number.isInteger(r.inputSize)||!Number.isInteger(r.outputSize)||r.inputSize<1||r.outputSize<1||r.inputSize>4096||r.outputSize>4096)throw RangeError(`neural layer dimensions must be integers in 1..4096`);if(t+=r.inputSize*r.outputSize+r.outputSize,t>1e6)throw RangeError(`neural model exceeds one million parameters`);if(n&&e.layers[n-1].outputSize!==r.inputSize)throw RangeError(`neural layer dimensions do not connect`);if(!Array.isArray(r.weights)||!Array.isArray(r.biases)||r.weights.length!==r.inputSize*r.outputSize||r.biases.length!==r.outputSize||!Array.from(r.weights).every(Number.isFinite)||!Array.from(r.biases).every(Number.isFinite))throw TypeError(`neural weights and biases must be finite and match layer dimensions`)}let n=e.layers.map(e=>({...e,weights:Float64Array.from(e.weights),biases:Float64Array.from(e.biases),buffer:new Float64Array(e.outputSize)})),r=(e,t)=>{if(e.length!==n[0].inputSize)throw TypeError(`neural input must be finite and match the model`);for(let t=0;t<e.length;t++)if(!Number.isFinite(e[t]))throw TypeError(`neural input must be finite`);let r=n[n.length-1];if(t&&t.length!==r.outputSize)throw RangeError(`neural output buffer has the wrong size`);let i=e;for(let e=0;e<n.length;e++){let t=n[e];for(let r=0;r<t.outputSize;r++){let a=t.biases[r];for(let e=0;e<t.inputSize;e++)a+=t.weights[r*t.inputSize+e]*i[e];if(!Number.isFinite(a))throw RangeError(`neural activation overflow`);t.buffer[r]=e===n.length-1?a:Math.max(0,a)}i=t.buffer}let a=t??new Float64Array(r.outputSize);return a.set(r.buffer),a},i=new Float64Array(n[n.length-1].outputSize);return{predict:r,select(e,t){let n=e.mask;if(n&&(n.length!==i.length||!Array.from(n).every(e=>typeof e==`boolean`)))throw TypeError(`neural action mask must contain one boolean per output`);r(e.input,i);let a=null;for(let e=0;e<i.length;e++)(!n||n[e])&&(a===null||i[e]>i[a])&&(a=e);if(a===null||!t)return a;let o=t();if(!Number.isFinite(o)||o<0||o>=1)throw RangeError(`sampling random must return a value in [0, 1)`);let s=0;for(let e=0;e<i.length;e++)(!n||n[e])&&(s+=Math.exp(i[e]-i[a]));let c=o*s;for(let e=0;e<i.length;e++)if((!n||n[e])&&(c-=Math.exp(i[e]-i[a]),c<0))return e;return a}}}function rX(e,t,n){let r=Function(`return (${e});`)()(t);return n.map(e=>r.predict(e))}var iX=class{constructor(e){this.evaluator=nX(e),this.model=structuredClone(e)}predict(e,t){return this.evaluator.predict(e,t)}selectAction(e,t){return this.evaluator.select(e,t)}exportModel(){return structuredClone(this.model)}behavior(e,t,n,r=!1){if(t.length!==this.model.layers[this.model.layers.length-1].outputSize)throw RangeError(`neural action mapping must match output size`);let i=structuredClone(t);return{id:e,decide:e=>{e.checkpoint();let t=this.selectAction(n(e.perception),r?e.random:void 0);return t===null?null:structuredClone(i[t])}}}predictBatchAsync(e,t={}){let n=this.model.layers[0].inputSize,r=this.model.layers[this.model.layers.length-1].outputSize;if(e.length>65536||e.length*Math.max(n,r)>1e6)return Promise.reject(RangeError(`neural batch exceeds its observation or value limit`));for(let t of e)if(!t||t.length!==n)return Promise.reject(TypeError(`neural batch inputs must match the model`));return UW(rX,[nX.toString(),this.model,e],t)}};_e();var aX=class{get truncated(){return!this.terminated&&this.steps>=this.maxSteps}constructor(e,t,n=j){if(this.steps=0,this.terminated=!1,this.ready=!1,this.agentCount=0,this.rules=e,this.Random=n,this.random=new this.Random(0),!Number.isInteger(t.maxSteps)||t.maxSteps<1||t.maxSteps>1e6)throw RangeError(`training maxSteps must be in 1..1000000`);if(typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`training requires an observation version`);this.maxSteps=t.maxSteps,this.observationVersion=e.observationVersion}reset(e){if(!Number.isInteger(e)||e<0||e>4294967295)throw RangeError(`training seed must be uint32`);this.random=new this.Random(e),this.state=this.rules.initial(this.random),this.steps=0,this.terminated=this.rules.finished?.(this.state)??!1,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:!1}}step(e){if(!this.ready||this.terminated||this.truncated)throw Error(`training episode needs reset before step`);let t=this.observations();if(e.length!==this.agentCount)throw RangeError(`training action count must match the agent roster`);for(let n=0;n<e.length;n++){let r=e[n],i=t[n].mask;if(r===null?!i||i.some(Boolean):!Number.isInteger(r)||r<0||i&&(r>=i.length||!i[r]))throw RangeError(`training action is not legal`)}let n=structuredClone(this.state),r=this.rules.command(this.state,e),i=this.rules.rule(this.state,r,this.random),a=Array.from(this.rules.rewards(n,r,i));if(a.length!==this.agentCount||!a.every(Number.isFinite))throw TypeError(`training rewards must be finite and match the agent roster`);this.state=i.state,this.steps++,this.terminated=i.status===`finished`;let o=this.observations();if(o.length!==this.agentCount)throw RangeError(`training agent roster changed during an episode`);return{observations:o,rewards:a,terminated:this.terminated,truncated:this.truncated}}snapshot(){if(!this.ready)throw Error(`training environment needs reset before snapshot`);return structuredClone({version:1,observationVersion:this.observationVersion,state:this.state,seed:this.random.seed,random:this.random.getState().map(e=>e>>>0),steps:this.steps,maxSteps:this.maxSteps,terminated:this.terminated,truncated:this.truncated})}restore(e){if(e.version!==1||e.observationVersion!==this.observationVersion||e.maxSteps!==this.maxSteps)throw TypeError(`training snapshot version, schema or step limit does not match`);if(!Number.isInteger(e.steps)||e.steps<0||e.steps>this.maxSteps||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295||!Array.isArray(e.random)||e.random.length!==4||!e.random.every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!e.random.some(e=>e!==0)||typeof e.terminated!=`boolean`||typeof e.truncated!=`boolean`||e.terminated&&e.truncated||e.truncated!==(!e.terminated&&e.steps===this.maxSteps))throw TypeError(`invalid training snapshot`);this.state=structuredClone(e.state),this.random=new this.Random(e.seed),this.random.setState(e.random),this.steps=e.steps,this.terminated=e.terminated,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:this.truncated}}observations(){let e=structuredClone(Array.from(this.rules.observe(this.state)));if(!e.length||e.length>4096)throw RangeError(`training requires 1..4096 agents`);for(let t of e)if(!t.input.length||t.input.length>4096||!Array.from(t.input).every(Number.isFinite)||t.mask&&(!t.mask.length||t.mask.length>4096||!Array.from(t.mask).every(e=>typeof e==`boolean`)))throw TypeError(`invalid training observation`);return e}};function oX(e,t,n){return sX(n),cX(e,t,n,{Generator:j,createNeuralEvaluator:nX})}function sX(e){let t=e.trajectoryLimit??0;if(!e.seeds.length||e.seeds.length>1e4||!Array.from(e.seeds).every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!Number.isInteger(t)||t<0||t*e.seeds.length>1e4)throw RangeError(`rollouts require 1..10000 uint32 seeds and at most 10000 stored transitions`)}function cX(e,t,n,r){if(t.observationVersion!==e.observationVersion)throw TypeError(`model observation schema does not match environment`);let i=n.trajectoryLimit??0,a=r.createNeuralEvaluator(t);return Array.from(n.seeds,t=>{if(n.signal?.aborted)throw n.signal.reason;let o=new r.Generator((t^2654435769)>>>0),s=e.reset(t),c=s.rewards.map(()=>0),l=[],u=0;for(;!s.terminated&&!s.truncated;){if(n.signal?.aborted)throw n.signal.reason;let t=s.observations.map(e=>a.select(e,n.sample?()=>o.float():void 0)),r=e.step(t);for(let e=0;e<c.length;e++)if(c[e]+=r.rewards[e],!Number.isFinite(c[e]))throw RangeError(`training cumulative reward overflow`);l.length<i&&l.push({before:s,actions:t,after:r}),s=r,u++}return{seed:t,steps:u,rewards:c,terminated:s.terminated,truncated:s.truncated,trajectory:l}})}function lX(e,t,n,r){let i=Function(`return (${e[0]});`)(),a=Function(`return (${e[1]});`)(),o=Function(`return (${e[2]});`)(),s=class extends o{constructor(e,t){super(e,t,i)}};return Function(`return (${e[3]});`)()(Function(`return (${e[4]});`)()({TrainingEnvironment:s},t),n,r,{Generator:i,createNeuralEvaluator:a})}async function uX(e,t,n,r){let i=r.jobs??4;if(!Number.isInteger(i)||i<1||i>64)throw RangeError(`rollout jobs must be in 1..64`);if(r.signal?.aborted)throw r.signal.reason;let a=r.trajectoryLimit??0;sX(r),nX(n);let o=new AbortController,s=()=>o.abort(r.signal?.reason);r.signal?.addEventListener(`abort`,s,{once:!0});let c=[j.toString(),nX.toString(),aX.toString(),cX.toString(),e.toString()],l=Math.min(i,r.seeds.length);try{return(await Promise.all(Array.from({length:l},(e,i)=>{let s=Math.floor(i*r.seeds.length/l),u=Math.floor((i+1)*r.seeds.length/l),d=r.seeds.slice(s,u);return UW(lX,[c,t,n,{seeds:d,sample:r.sample,trajectoryLimit:a}],{signal:o.signal,timeout:r.timeout})}))).flat()}finally{o.abort(),r.signal?.removeEventListener(`abort`,s)}}function dX(e,t){let n=[...t.actions];if(!n.length||n.some(e=>typeof e!=`string`))throw TypeError(`imitation needs the recorded action names in policy order`);let r=pn(t.events),i=e.reset(t.seed);if(i.observations.length!==1)throw Error(`imitation trains the recorded player alone: the environment must expose one agent`);let a=[],o=i,s=0;for(let t of r){if(o.terminated||o.truncated)break;let r=n.indexOf(t.action);if(r<0)throw Error(`a recorded action ${JSON.stringify(t.action)} is not in the action list`);a.push({observation:o.observations[0],action:r,frame:t.frame}),o=e.step([r]),s++}return{samples:a,steps:s,terminated:o.terminated,truncated:o.truncated}}function fX(e,t,n){let r=e.reset(n.seed),i=r.rewards.map(()=>0),a=[],o=0;for(;!r.terminated&&!r.truncated;){let n=t(r.observations);if(!Array.isArray(n)||n.length!==r.observations.length)throw RangeError(`the seeded-run chooser must return one action per agent`);a.push([...n]);let s=e.step(n);for(let e=0;e<i.length;e++)if(i[e]+=s.rewards[e],!Number.isFinite(i[e]))throw RangeError(`seeded-run cumulative reward overflow`);r=s,o++}return{seed:n.seed,steps:o,actions:a,rewards:i,terminated:r.terminated,truncated:r.truncated}}function pX(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var mX=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=Wt(e.state,`campaign state`)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel,n=Wt(e.state,`level result state`),r=e.result===void 0?void 0:Wt(e.result,`level result`);if(this._state=n,r!==void 0&&(this._results[t]=r),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=Wt(t.results,`snapshot.results`),i}};_e();function hX(e){let t=new j(e.seed);return{...pX({state:Wt(e.initialState,`initialState`),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}_e();function gX(e,t,n){let r=_X.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rr(a.events)!==Rr(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rr(r.state)!==Rr(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var _X=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.recordJournal=e.journal!==null,this.journal=e.journal??new wn,this.actorOf=e.history?.actorOf??null,this.history=e.history?new Or(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.random.getState(),n=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler}),r;try{r=this.history?Wt(n.state,`state`):null,this.recordJournal&&this.journal.append(e,n.events)}catch(e){throw this.random.setState(t),e}return this._state=n.state,n.cost!=null&&this._scheduler.spend(n.cost),this.history&&this.history.push(this.historySnapshot(r)),n}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=n.random??new j;r.setState(t.random);let i=AV.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:wn.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(e=Wt(this._state,`state`)){return{...this.snapshot(),state:e}}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=AV.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},vX=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pr({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=_X.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},yX=class{constructor(e){this.saves=new zt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},bX=l({Campaign:()=>mX,CampaignSave:()=>yX,EventPresentation:()=>vX,Scheduler:()=>AV,SimulationRuntime:()=>_X,TrainingEnvironment:()=>aX,advanceToInput:()=>tX,imitationFromReplay:()=>dX,runHeadlessScenario:()=>hX,runRollouts:()=>oX,runRolloutsAsync:()=>uX,runScenario:()=>pX,runSeededEpisode:()=>fX,validateSimulationReplay:()=>gX}),xX=d(c(((e,t,n)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(n,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},ee=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},w=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[w],d=o?n:n[r]||(n[r]={}),f=d[w]||(d[w]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?ee(g,t):c&&typeof g==`function`?ee(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,D=Math.floor,O=function(e){return isNaN(e=+e)?0:(e>0?D:te)(e)},ne=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},k=function(e){return function(e,t){var n=String(ne(e)),r=O(t),i=n.length,a,o;return r<0||r>=i?void 0:(a=n.charCodeAt(r),a<55296||a>56319||r+1===i||(o=n.charCodeAt(r+1))<56320||o>57343?a:(a-55296<<10)+(o-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return k(this,e)}}),n.String.codePointAt;var A=Math.max,re=Math.min,ie=function(e,t){return e=O(e),e<0?A(e+t,0):re(e,t)},ae=String.fromCharCode,oe=String.fromCodePoint;E(E.S+E.F*(!!oe&&oe.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],ie(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?ae(a):ae(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var se={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},j={isSpaceSeparator:function(e){return typeof e==`string`&&se.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||se.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||se.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ce,le,ue,de,fe,pe,me,he,ge,_e=function(e,t){ce=String(e),le=`start`,ue=[],de=0,fe=1,pe=0,me=void 0,he=void 0,ge=void 0;do me=xe(),ke[le]();while(me.type!==`eof`);return typeof t==`function`?ve({"":ge},``,t):ge};function ve(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=ve(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=ve(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var M,N,ye,be,P;function xe(){for(M=`default`,N=``,ye=!1,be=1;;){P=Se();var e=Ce[M]();if(e)return e}}function Se(){if(ce[de])return String.fromCodePoint(ce.codePointAt(de))}function F(){var e=Se();return e===`
|
|
1384
|
+
`,n);return[n,r===-1?this.text.length:r]}moveCaretLine(e,t=!1){let[n]=this.lineRange(this.caretLine),r=this.goalColumn??this.caretIndex-n,[i,a]=this.lineRange(this.caretLine+e);this.setCaret(i+Math.min(r,a-i),t),this.goalColumn=r}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},dz=class e extends J{constructor(t){super(),this.onClick=new p,this.onPress=new p,this.onRelease=new p,this.state=`idle`,this.selected_=!1,this.themeListener=()=>this.draw(),this.width_=t.width,this.height_=t.height,this.disabled_=t.disabled??!1,this.colors={...t.colors},this.skin=t.skin,this.labelOptions=t.label??{};let n=Q();this.background=e.createBackground(this.skin,n),this.addChild(this.background),this.icon=t.icon??null,this.iconPlain=this.icon,this.iconSelected=t.iconSelected??null,this.tooltip_=t.tooltip,this.icon&&this.addChild(this.icon),this.labelText=t.text===void 0?null:new EI({align:`center`,...this.labelOptions,text:t.text}),this.labelText&&this.addChild(this.labelText),t.onClick&&this.onClick.add(t.onClick),t.onPress&&this.onPress.add(t.onPress),t.onRelease&&this.onRelease.add(t.onRelease),this.eventMode=`static`,this.on(`pointerover`,()=>this.setState(`hover`)),this.on(`pointerout`,()=>this.setState(`idle`)),this.on(`pointerdown`,()=>{this.setState(`pressed`),this.onPress.dispatch()}),this.on(`pointerup`,()=>{let e=this.state===`pressed`;this.setState(`hover`),e&&(this.onRelease.dispatch(),this.onClick.dispatch())}),this.on(`pointerupoutside`,()=>{let e=this.state===`pressed`;this.setState(`idle`),e&&this.onRelease.dispatch()}),this.setState(this.disabled_?`disabled`:`idle`),$.add(this.themeListener)}static createBackground(e,t){return e?new yL(e.texture,{border:e.border}):t.panel?new yL(t.panel,{border:t.panelBorder}):new Z}resize(e,t){this.width_=e,this.height_=t,this.draw()}setText(e){e===void 0?(this.labelText?.destroy(),this.labelText=null):this.labelText?this.labelText.setText(e):(this.labelText=new EI({align:`center`,...this.labelOptions,text:e}),this.addChild(this.labelText)),this.layoutContent()}setIcon(e){this.iconPlain=e,this.showIcon(this.selected_&&this.iconSelected?this.iconSelected:e)}setSelectedIcon(e){this.iconSelected=e,this.showIcon(this.selected_&&e?e:this.iconPlain)}showIcon(e){e!==this.icon&&(this.icon&&this.removeChild(this.icon),this.icon=e,e&&this.addChild(e),this.draw())}get tooltip(){return typeof this.tooltip_==`function`?this.tooltip_():this.tooltip_}setTooltip(e){this.tooltip_=e}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.setState(e?`disabled`:`idle`)}get selected(){return this.selected_}setSelected(e){this.selected_!==e&&(this.selected_=e,this.iconSelected&&this.showIcon(e?this.iconSelected:this.iconPlain),this.draw())}setColors(e){this.colors={...e},this.draw()}setState(e){this.disabled_&&e!==`disabled`||(this.state=e,this.cursor=this.disabled_?`default`:`pointer`,this.eventMode=this.disabled_?`none`:`static`,this.draw())}layoutContent(){let e=Q().direction===`rtl`;if(this.icon&&!this.labelText)this.icon.x=Math.round((this.width_-this.icon.width)/2),this.icon.y=Math.round((this.height_-this.icon.height)/2);else if(this.icon&&this.labelText){let t=Q().spacing,n=this.icon.width+t+this.labelText.width,r=Math.round((this.width_-n)/2);this.icon.x=e?r+this.labelText.width+t:r,this.icon.y=Math.round((this.height_-this.icon.height)/2),this.labelText.x=e?r:r+this.icon.width+t,this.labelText.y=Math.round((this.height_-this.labelText.height)/2)}else this.labelText&&(this.labelText.x=Math.round((this.width_-this.labelText.width)/2),this.labelText.y=Math.round((this.height_-this.labelText.height)/2))}draw(){let e=Q(),t=this.state===`pressed`?10066329:this.state===`hover`?14540253:this.state===`disabled`?7829367:16777215;if(this.background instanceof yL)this.background.resize(this.width_,this.height_),this.background.tint=this.selected_?this.colors.selection??e.color.selection:this.colors.background??this.skin?.tints?.[this.state]??t;else{let t=this.state===`pressed`||this.selected_?this.colors.selection??e.color.selection:this.colors.background??e.color.panelFill;this.background.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:t,alpha:this.state===`disabled`?.5:1}).stroke({color:this.colors.border??e.color.panelBorder,width:1})}this.labelText?.setColor(this.disabled_?this.colors.disabledText??e.color.textDim:this.colors.text??this.labelOptions.color??e.color.text),this.icon&&(this.icon.alpha=this.disabled_?.4:1),this.layoutContent()}destroy(e){$.remove(this.themeListener),super.destroy(e)}},fz=e=>e.split(``).map(e=>({label:e})),pz={rows:[fz(`QWERTYUIOP`),fz(`ASDFGHJKL`),fz(`ZXCVBNM`),fz(`1234567890`),[{label:`Bksp`,action:`backspace`},{label:`Left`,action:`left`},{label:`Right`,action:`right`},{label:`Space`,text:` `,span:3},{label:`OK`,action:`confirm`},{label:`Esc`,action:`cancel`}]]};function mz(e){e.action===void 0?we(e.text??e.label):Te(e.action)}function hz(e,t){let n=[],r=0;for(let i of e.rows){let e=i.reduce((e,t)=>e+(t.span??1),0),a=(t.width-t.gap*(e-1))/e,o=0;for(let e of i){let i=e.span??1,s=a*i+t.gap*(i-1);n.push({key:e,x:o,y:r,width:s,height:t.keyHeight}),o+=s+t.gap}r+=t.keyHeight+t.gap}return n}var gz=class extends J{constructor(e,t){super();let n=Q().spacing,r=Math.max(Q().font.size*2,18),i=0;for(let a of hz(e,{width:t.width,keyHeight:r,gap:n})){let e=new dz({width:a.width,height:a.height,text:a.key.label,onClick:()=>mz(a.key)});e.position.set(a.x,a.y),this.addChild(e),i=Math.max(i,a.y+a.height)}this.laidOutHeight=i}get contentHeight(){return this.laidOutHeight}},_z=.5,vz=class extends CL{constructor(e){super({width:e.width,height:e.height,title:e.title,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`center`}),this.preview=``,this.promptError=null,this.keyboard=null,this.messageLabel=null,this.caretBar=new Z,this.measurer=new EI,this.canMeasureCaret=typeof document<`u`,this.blinkOn=!0,this.blinkElapsed=0,this.promptThemeListener=()=>this.restylePrompt(),this.textListener=e=>!this.closed&&(this.edit(()=>this.model.insert(e)),!0),this.compositionListener=e=>!this.closed&&(e.phase===`end`?this.edit(()=>{this.preview=``,this.model.insert(e.text)}):(this.preview=e.phase===`start`?``:e.text,this.render()),!0),this.model=new uz({value:e.initialValue??``,maxLength:e.maxLength}),this.validate=e.validate,this.onConfirm=e.onConfirm,this.onCancel=e.onCancel,this.announce=e.announce??!0,this.announcer=e.announcer??SL;let t=Q();this.lineHeight=t.font.size*t.font.lineHeight;let n=t.spacing;e.message!==void 0&&(this.messageLabel=new EI({text:e.message}),this.content.addChild(this.messageLabel)),this.valueY=this.messageLabel?this.lineHeight+n:0,this.valueLabel=new EI,this.valueLabel.y=this.valueY,this.content.addChild(this.valueLabel),this.previewLabel=new EI({color:t.color.textDim}),this.previewLabel.y=this.valueY+this.lineHeight+n,this.content.addChild(this.previewLabel),this.errorLabel=new EI({color:t.color.textHighlight}),this.errorLabel.y=this.previewLabel.y+this.lineHeight+n,this.content.addChild(this.errorLabel),this.content.addChild(this.caretBar),e.keyboard&&(this.keyboard=new gz(e.keyboard,{width:this.contentWidth}),this.keyboard.y=this.errorLabel.y+this.lineHeight+n,this.content.addChild(this.keyboard),this.resize(e.width,e.height+this.keyboard.contentHeight+n)),Se.add(this.textListener),F.add(this.compositionListener),$.add(this.promptThemeListener),this.render(),this.announce&&e.message!==void 0&&this.announcer.announce(e.message)}get value(){return this.model.value}get caretIndex(){return this.model.caret}get error(){return this.promptError}handleAction(e){if(this.delegate)return super.handleAction(e);if(this.closed)return!1;switch(e){case`left`:return this.model.moveCaret(-1),this.render(),!0;case`right`:return this.model.moveCaret(1),this.render(),!0;case`backspace`:return this.edit(()=>this.model.backspace()),!0;case`delete`:return this.edit(()=>this.model.deleteForward()),!0;case`confirm`:return this.confirm(),!0;case`cancel`:return this.onCancel?.(),this.close(),!0;default:return!1}}update(e){this.blinkElapsed+=e,!(this.blinkElapsed<_z)&&(this.blinkElapsed=0,this.blinkOn=!this.blinkOn,this.caretBar.visible=this.blinkOn&&this.canMeasureCaret)}destroy(e){Se.remove(this.textListener),F.remove(this.compositionListener),$.remove(this.promptThemeListener),this.measurer.destroy(),super.destroy(e)}edit(e){let t=this.model.value;e(),this.model.value!==t&&(this.promptError=null),this.render()}confirm(){let e=this.validate?.(this.model.value)??null;e?(this.promptError=e,this.render(),this.announce&&this.announcer.announce(e,{assertive:!0})):(this.onConfirm(this.model.value),this.close())}restylePrompt(){let e=Q();this.previewLabel.setColor(e.color.textDim),this.errorLabel.setColor(e.color.textHighlight),this.render()}render(){this.valueLabel.setText(this.model.value),this.measurer.setText(this.model.value.slice(0,this.model.caret));let e=0;if(this.canMeasureCaret)try{e=this.measurer.width}catch{this.canMeasureCaret=!1}this.caretBar.clear().rect(this.valueLabel.x+e,this.valueY,2,this.lineHeight).fill({color:Q().color.text}),this.caretBar.visible=this.blinkOn&&this.canMeasureCaret,this.previewLabel.setText(this.preview),this.previewLabel.visible=this.preview.length>0,this.errorLabel.setText(this.promptError??``),this.errorLabel.visible=this.promptError!==null}},yz=/[A-Za-z0-9]/;function bz(e,t){let{lineHeight:n,columnHeight:r}=t,i=t.rotate??yz,a=[],o=0,s=0;for(let t of e){if(t===`
|
|
1385
|
+
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var xz=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build(Q()),$.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=bz(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new jA({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Sz(e,t=0,n=1){return n>t?Math.max(0,Math.min(1,(e-t)/(n-t))):0}function Cz(e,t=0,n=1,r=0){let i=t+Math.max(0,Math.min(1,e))*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var wz=class extends J{constructor(e){super(),this.onChange=new p,this.track=new Z,this.fill=new Z,this.knob=new Z,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),$.add(this.themeListener)}get value(){return this.value_}get fraction(){return Sz(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);t===this.value_?this.draw():(this.value_=t,this.draw(),this.onChange.dispatch(t))}setFraction(e){this.setValue(Cz(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return Cz(Sz(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?Math.max(0,Math.min(1,(e-this.knobSize/2)/this.trackLength)):0}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Tz=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new Z,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){e===this.checked_?this.draw():(this.checked_=e,this.draw(),this.onChange.dispatch(e))}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Ez=class extends J{constructor(e={}){super(),this.onChange=new p,this.options_=[],this.rows=[],this.circles=[],this.selected_=-1,this.themeListener=()=>this.draw(),this.size_=e.size??20,this.gap_=e.gap??8,this.buildRows(e.options??[]),this.selected_=this.defaultSelection(e.selected),this.draw(),$.add(this.themeListener)}get selected(){return this.selected_}get selectedOption(){return this.options_[this.selected_]??null}get length(){return this.options_.length}get rowHeight(){return this.size_+this.gap_}setOptions(e,t){this.buildRows(e),this.selected_=this.defaultSelection(t),this.draw()}select(e){let t=this.options_[e];t&&!t.disabled&&(e===this.selected_?this.draw():(this.selected_=e,this.draw(),this.onChange.dispatch(e)))}move(e){let t=this.options_.length;if(t===0)return!1;let n=this.selected_;for(let r=0;r<t;r++){n=(n+e+t)%t;let r=this.options_[n];if(r&&!r.disabled)return this.select(n),!0}return!1}handleAction(e){switch(e){case`up`:case`left`:return this.move(-1);case`down`:case`right`:return this.move(1);default:return!1}}tapRow(e){this.select(e)}defaultSelection(e){if(e!==void 0){let t=this.options_[e];if(t&&!t.disabled)return e}let t=this.options_.findIndex(e=>!e.disabled);return t===-1?-1:t}buildRows(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.circles=[],this.options_=[...e],this.removeChildren(),e.forEach((e,t)=>{let n=new J;n.y=t*this.rowHeight,n.eventMode=`static`,n.cursor=e.disabled?`default`:`pointer`,n.on(`pointertap`,()=>this.tapRow(t));let r=new Z;n.addChild(r),this.circles.push(r);let i=new EI({text:e.text});n.addChild(i),this.rows.push(n),this.addChild(n)})}draw(){let e=Q(),t=e.direction===`rtl`;this.rows.forEach((n,r)=>{let i=this.options_[r].disabled,a=this.circles[r];a.clear().circle(this.size_/2,this.size_/2,this.size_/2-1).fill({color:e.color.panelFill}).stroke({color:i?e.color.textDim:e.color.panelBorder,width:2}),r===this.selected_&&a.circle(this.size_/2,this.size_/2,Math.max(2,this.size_*.28)).fill({color:i?e.color.textDim:e.color.textHighlight});let o=this.size_+e.spacing,s=n.children.find(e=>e instanceof EI),c=s?.width??0;s&&(s.setColor(i?e.color.textDim:e.color.text),s.y=Math.round((this.size_-s.height)/2)),t?(s&&(s.x=0),a.x=c+e.spacing):(a.x=0,s&&(s.x=o))})}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Dz(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var Oz=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new Z,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=Dz(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(Dz(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(Dz(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(Dz(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){e===this.value_?this.draw():(this.value_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},kz=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.highlight_=e)}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}};function Az(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var jz=class{constructor(e=.92,t=8){this.velocity=0,this.dragging=!1,this.travelled=0,this.lastY=0,this.lastTime=0,this.friction=e,this.minSpeed=t}start(e,t){this.dragging=!0,this.velocity=0,this.travelled=0,this.lastY=e,this.lastTime=t}move(e,t){if(!this.dragging)return 0;let n=this.lastY-e,r=t-this.lastTime;return r>0&&(this.velocity=this.velocity*.4+n/r*.6),this.travelled+=Math.abs(n),this.lastY=e,this.lastTime=t,n}end(){this.dragging=!1,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0)}step(e){if(this.dragging||this.velocity===0)return 0;let t=this.velocity*e;return this.velocity*=(1-this.friction)**e,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0),t}stop(){this.velocity=0}},Mz=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.maskShape=new Z,this.track=new Z,this.thumb=new Z,this.dragMoved=!1,this.thumbGrab=null,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.maxHeight_=e.height,this.auto=e.autoHeight??!1,this.lineHeight=e.lineHeight??24,this.drag=e.touch?new jz:null,this.contentHeight_=Math.max(0,e.contentHeight??0),this.height_=this.fit(),this.offset_=Az(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.drag&&(this.on(`pointerdown`,e=>this.dragStart(e.global.y,performance.now()/1e3)),this.on(`globalpointermove`,e=>this.dragMove(e.global.y,performance.now()/1e3)),this.on(`pointerup`,()=>this.dragEnd()),this.on(`pointerupoutside`,()=>this.dragEnd()),this.on(`pointerupcapture`,e=>{this.dragMoved&&e.stopPropagation()})),this.track.eventMode=`static`,this.thumb.eventMode=`static`,this.thumb.on(`pointerdown`,e=>{e.stopPropagation(),this.thumbDragStart(e.global.y)}),this.thumb.on(`globalpointermove`,e=>this.thumbDragMove(e.global.y)),this.thumb.on(`pointerup`,()=>this.thumbGrab=null),this.thumb.on(`pointerupoutside`,()=>this.thumbGrab=null),this.track.on(`pointerdown`,e=>{e.stopPropagation(),this.scrollToThumbCentre(this.toLocal(e.global).y)}),this.draw(),$.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportHeight(){return this.height_}fit(){return this.auto?Math.min(this.maxHeight_,this.contentHeight_):this.maxHeight_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.height_=this.fit(),this.setOffset(Az(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.maxHeight_=t,this.height_=this.fit(),this.setOffset(Az(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(Az(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(Az(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}handleKey(e){let t=Math.max(this.lineHeight,this.height_-this.lineHeight);switch(e){case`ArrowUp`:return this.scrollBy(-this.lineHeight),!0;case`ArrowDown`:return this.scrollBy(this.lineHeight),!0;case`PageUp`:return this.scrollBy(-t),!0;case`PageDown`:return this.scrollBy(t),!0;case`Home`:return this.scrollTo(0),!0;case`End`:return this.scrollTo(this.maxOffset),!0;default:return!1}}dragStart(e,t){this.drag?.start(e,t),this.dragMoved=!1}dragMove(e,t){let n=this.drag;if(!n?.dragging)return;let r=n.move(e,t);!this.dragMoved&&n.travelled<6||(this.dragMoved=!0,this.scrollBy(r))}dragEnd(){this.drag?.end()}get dragged(){return this.dragMoved}update(e){let t=this.drag;if(!t)return;let n=this.offset_;this.scrollBy(t.step(e)),this.offset_===n&&t.velocity!==0&&t.stop()}get thumbMetrics(){let e=Math.max(6,this.height_/Math.max(1,this.contentHeight_)*this.height_);return{y:this.maxOffset===0?0:this.offset_/this.maxOffset*(this.height_-e),height:e}}thumbDragStart(e){this.thumbGrab={y:e,offset:this.offset_}}thumbDragMove(e){if(!this.thumbGrab)return;let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo(this.thumbGrab.offset+(e-this.thumbGrab.y)/t*this.maxOffset)}scrollToThumbCentre(e){let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo((e-this.thumbMetrics.height/2)/t*this.maxOffset)}setOffset(e){e===this.offset_?this.draw():(this.offset_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let{y:n,height:r}=this.thumbMetrics;this.thumb.roundRect(t,n,6,r,3).fill({color:e.color.textHighlight})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Nz=class extends J{constructor(e){super(),this.list=new J,this.backdrop=new Z,this.box=null,this.listHeight=0,this.themeListener=()=>this.refresh(),this.model=new kz(e),this.rowHeight=e.rowHeight??28,this.maxRows=Math.max(1,e.maxVisibleRows??8),this.width_=e.autoWidth?Math.max(e.width,...this.model.options.map(e=>this.labelWidth(e.label))):e.width,this.head=new dz({width:this.width_,height:this.rowHeight,text:``,disabled:this.model.disabled,onClick:()=>{this.model.toggleOpen(),this.refresh()}}),this.list.y=this.rowHeight,this.list.addChild(this.backdrop),this.addChild(this.head,this.list),this.refresh(),$.add(this.themeListener)}measureLabel(e){try{let t=new aO({fontFamily:Q().font.family,fontSize:Q().font.size});return QD.measureText(e,t).width}catch{return e.length*Q().font.size*.6}}labelWidth(e){return Math.ceil(this.measureLabel(e))+2*Q().padding+16}get viewWidth(){return this.width_}get visibleRows(){return Math.min(this.maxRows,this.model.options.length)}get scroller(){return this.box}fitBelow(e,t){let n=Math.floor((t-e-this.rowHeight)/this.rowHeight);return Math.max(1,Math.min(this.maxRows,n))}refresh(){let e=this.model;if(this.head.setText(`${e.selected?.label??``} ▾`),this.head.setDisabled(e.disabled),this.box?.destroy({children:!0}),this.box=null,this.list.visible=e.isOpen,this.backdrop.clear(),!e.isOpen)return;let t=this.visibleRows;this.listHeight=t*this.rowHeight;let n=Q();this.backdrop.rect(0,0,this.width_,this.listHeight).fill({color:n.color.panelFill,alpha:1}).stroke({color:n.color.panelBorder,width:1});let r=new Mz({width:this.width_,height:this.listHeight,contentHeight:e.options.length*this.rowHeight,touch:!0,lineHeight:this.rowHeight}),i=this.width_-(r.scrollable?8:0);e.options.forEach((t,n)=>{let a=new dz({width:i,height:this.rowHeight,text:t.label,disabled:t.disabled,onClick:()=>{e.setHighlight(n),e.confirm(),this.refresh()}});a.y=n*this.rowHeight,a.setSelected(n===e.highlight),r.content.addChild(a)}),r.scrollIntoView(e.highlight*this.rowHeight,this.rowHeight),this.box=r,this.list.addChild(r)}handleKey(e){let t=this.model;if(t.disabled)return!1;if(!t.isOpen)return e!==`Enter`&&e!==` `&&e!==`ArrowDown`?!1:(t.open(),this.refresh(),!0);let n=t.options.length;switch(e){case`Escape`:t.cancel();break;case`Enter`:case` `:t.confirm();break;case`ArrowUp`:t.move(-1);break;case`ArrowDown`:t.move(1);break;case`PageUp`:t.setHighlight(Math.max(0,t.highlight-this.maxRows));break;case`PageDown`:t.setHighlight(Math.min(n-1,t.highlight+this.maxRows));break;case`Home`:t.setHighlight(0);break;case`End`:t.setHighlight(n-1);break;default:return!1}return this.refresh(),!0}handleOutsideClick(e,t){if(!this.model.isOpen)return!1;let n=this.toLocal(new Gi(e,t));return n.x>=0&&n.x<=this.width_&&n.y>=0&&n.y<=this.rowHeight+this.listHeight?!1:(this.model.cancel(),this.refresh(),!0)}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Pz=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>Iz(Fz(t,e),Fz(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function Fz(e,t){return e&&typeof e==`object`?e[t]:void 0}function Iz(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var Lz=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function Rz(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function zz(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=Rz(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var Bz=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return Vz(this.spec.columns,e,this.gap)}rowSizes(e){return Vz(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+Uz(i,t,this.gap),y:n.y+Uz(a,e,this.gap),width:Wz(i,t,o,this.gap),height:Wz(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function Vz(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===Hz(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function Hz(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function Uz(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function Wz(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}function Gz(e,t,n={}){let r=n.gap??0,i=n.align??`start`,a=Array(e.length),o=0,s=[],c=0,l=0,u=()=>{if(s.length===0)return;let n=Math.max(0,t-c),u=i===`center`?n/2:i===`end`?n:0;for(let t of s)a[t]={x:u,y:o},u+=e[t].width+r;o+=l+r,s=[],c=0,l=0};return e.forEach((e,n)=>{let i=s.length===0?e.width:c+r+e.width;s.length>0&&i>t&&u(),c=s.length===0?e.width:c+r+e.width,l=Math.max(l,e.height),s.push(n)}),u(),{positions:a,height:Math.max(0,o-r)}}var Kz=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],qz=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?Kz.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(Jz(r))for(let t of Kz){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function Jz(e){return Kz.some(t=>e[t]!==void 0)}var Yz=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new EL({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&xe.add(this.onKeyCaptured)})}cancelCapture(){xe.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){xe.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n))this.refresh();else{for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){xe.remove(this.onKeyCaptured),super.destroy(e)}},Xz=class extends J{constructor(e){super(),this.highlight=new Z,this.main=new J,this.rebindLayer=new J,this.rows=[],this.selected=0,this.rebind=null,this.themeListener=()=>this.drawHighlight(),this.settings=e.settings,this.width_=e.width??320,this.rowHeight=e.rowHeight??36,this.labels={music:`Music`,sfx:`Sound effects`,muted:`Mute`,zoom:`Zoom`,controls:`Controls...`,reset:`Reset to defaults`,rebindHint:`Keys (cancel: back)`,...e.labels},this.zoomMin=e.zoomMin??.5,this.zoomMax=e.zoomMax??4,this.zoomStep=e.zoomStep??.25,this.customRows=e.custom??[],this.actionsOption=e.actions,this.onConflict=e.onConflict,this.addChild(this.highlight),this.addChild(this.main),this.addChild(this.rebindLayer),this.rebindLayer.visible=!1,this.buildMain(),this.refresh(),this.drawHighlight(),$.add(this.themeListener)}get selectedRow(){return this.rows[this.selected]?.id??``}get isRebinding(){return this.rebind!==null}handleAction(e){if(this.rebind)return e===`cancel`&&!this.rebind.isCapturing?(this.closeRebind(),!0):this.rebind.handleAction(e);let t=this.rows[this.selected];if(!t)return!1;switch(e){case`up`:return this.select((this.selected+this.rows.length-1)%this.rows.length),!0;case`down`:return this.select((this.selected+1)%this.rows.length),!0;case`left`:return t.adjust(-1),!0;case`right`:return t.adjust(1),!0;case`confirm`:return t.activate(),!0;default:return!1}}refresh(){for(let e of this.rows)e.refresh()}select(e){this.selected=e,this.drawHighlight()}drawHighlight(){this.rows.length===0?this.highlight.clear():this.highlight.clear().rect(0,this.selected*this.rowHeight,this.width_,this.rowHeight).fill({color:Q().color.selection})}buildMain(){let e=this.settings.current;this.addSliderRow(`music`,this.labels.music,0,100,1,10,Math.round(e.musicVolume*100),e=>this.settings.setMusicVolume(e/100)),this.addSliderRow(`sfx`,this.labels.sfx,0,100,1,10,Math.round(e.sfxVolume*100),e=>this.settings.setSfxVolume(e/100)),this.addToggleRow(`muted`,this.labels.muted,e.muted,e=>this.settings.setMuted(e)),this.addSliderRow(`zoom`,this.labels.zoom,this.zoomMin,this.zoomMax,this.zoomStep,this.zoomStep,e.zoom,e=>this.settings.setZoom(e));for(let e of this.customRows)this.addCustomRow(e);this.addActionRow(`controls`,this.labels.controls,()=>this.openRebind()),this.addActionRow(`reset`,this.labels.reset,()=>{this.settings.reset(),this.refresh()}),this.main.children.forEach((e,t)=>{e.y=t*this.rowHeight})}addSliderRow(e,t,n,r,i,a,o,s){let c=new J,l=new EI({text:t});l.y=10;let u=new wz({width:140,min:n,max:r,step:i,value:o});u.x=this.width_-148,u.y=10,c.addChild(l,u),this.main.addChild(c);let d=()=>{l.setText(`${t}: ${u.value}`)};d(),u.onChange.add(e=>{s(e),d()}),this.rows.push({id:e,root:c,adjust:e=>u.setValue(u.value+e*a),activate:()=>{},refresh:()=>{u.setValue(this.readSlider(e)),d()}})}readSlider(e){let t=this.settings.current;switch(e){case`music`:return Math.round(t.musicVolume*100);case`sfx`:return Math.round(t.sfxVolume*100);case`zoom`:return t.zoom;default:return 0}}addToggleRow(e,t,n,r){let i=new J,a=new EI({text:t});a.y=10;let o=new Tz({checked:n});o.x=this.width_-28,o.y=8,i.addChild(a,o),this.main.addChild(i),o.onChange.add(r),this.rows.push({id:e,root:i,adjust:()=>o.toggle(),activate:()=>o.toggle(),refresh:()=>o.setChecked(this.readToggle(e))})}readToggle(e){return e===`muted`?this.settings.current.muted:this.settings.getCustom(e.slice(7),!1)===!0}addCustomRow(e){let t=`custom:${e.key}`;if(e.kind===`boolean`){let n=this.settings.getCustom(e.key,!1);this.addToggleRow(t,e.label,n===!0,t=>this.settings.setCustom(e.key,t))}else if(e.kind===`number`){let n=this.settings.getCustom(e.key,e.min),r=typeof n==`number`?n:e.min,i=e.step??0,a=i>0?i:(e.max-e.min)/20,o=new J,s=new EI({text:e.label});s.y=10;let c=new wz({width:140,min:e.min,max:e.max,step:e.step??0,value:r});c.x=this.width_-148,c.y=10,o.addChild(s,c),this.main.addChild(o);let l=()=>{s.setText(`${e.label}: ${c.value}`)};l(),c.onChange.add(t=>{this.settings.setCustom(e.key,t),l()}),this.rows.push({id:t,root:o,adjust:e=>c.setValue(c.value+e*a),activate:()=>{},refresh:()=>{let t=this.settings.getCustom(e.key,e.min);c.setValue(typeof t==`number`?t:e.min),l()}})}else{let n=e.options,r=new J,i=new EI({text:e.label});i.y=10;let a=new Oz({min:0,max:n.length-1,step:1,value:0,wrap:!0});a.x=this.width_-32,a.y=2,r.addChild(i,a),this.main.addChild(r);let o=e=>{let t=typeof e==`string`?n.indexOf(e):-1;return t>=0?t:0},s=()=>{i.setText(`${e.label}: ${n[a.value]}`)};a.setValue(o(this.settings.getCustom(e.key,n[0]))),s(),a.onChange.add(t=>{this.settings.setCustom(e.key,n[t]),s()}),this.rows.push({id:t,root:r,adjust:e=>e>0?a.increment():a.decrement(),activate:()=>a.increment(),refresh:()=>{a.setValue(o(this.settings.getCustom(e.key,n[0]))),s()}})}}addActionRow(e,t,n){let r=new J,i=new dz({width:this.width_-16,height:28,text:t,onClick:n});i.x=8,i.y=4,r.addChild(i),this.main.addChild(r),this.rows.push({id:e,root:r,adjust:()=>{},activate:n,refresh:()=>{}})}openRebind(){let e=this.actionsOption??Object.keys(this.settings.current.bindings),t=new EI({text:this.labels.rebindHint}),n=new Yz({width:this.width_,height:Math.max(1,e.length)*this.rowHeight,actions:e,onConflict:this.onConflict});t.y=0,n.y=this.rowHeight,this.rebindLayer.addChild(t,n),this.rebindLayer.visible=!0,this.main.visible=!1,this.highlight.visible=!1,this.rebind=n}closeRebind(){this.settings.setBindings(Le()),this.rebindLayer.removeChildren(),this.rebind?.destroy(),this.rebind=null,this.rebindLayer.visible=!1,this.main.visible=!0,this.highlight.visible=!0}destroy(e){$.remove(this.themeListener),this.rebind?.destroy(),this.rebind=null,super.destroy(e)}},Zz=class extends J{constructor(e){if(super(),this.emptyLayer=new J,this.filledLayer=new J,this.maskShape=new Z,this.themeListener=()=>this.draw(),e.filledTexture===void 0!=(e.emptyTexture===void 0))throw Error(`a Meter takes filledTexture and emptyTexture together, or neither`);this.count_=$z(e.count),this.size_=e.size??16,this.gap_=e.gap??4,this.value_=Qz(e.value??this.count_,this.count_),this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.emptyColor_=e.emptyColor,this.filledTexture=e.filledTexture,this.emptyTexture=e.emptyTexture,this.addChild(this.emptyLayer),this.addChild(this.filledLayer),this.addChild(this.maskShape),this.filledLayer.mask=this.maskShape,this.draw(),$.add(this.themeListener)}get value(){return this.value_}get count(){return this.count_}get color(){return this.fillColor}setValue(e,t=this.count_){this.count_=$z(t),this.value_=Qz(e,this.count_),this.draw()}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}resize(e,t=this.gap_){this.size_=e,this.gap_=t,this.draw()}get totalWidth(){return this.count_*this.size_+(this.count_-1)*this.gap_}iconX(e){let t=e*(this.size_+this.gap_);return Q().direction===`rtl`?this.totalWidth-t-this.size_:t}draw(){let e=Q();this.explicitColor||(this.fillColor=e.color.textHighlight);let t=this.emptyColor_??e.color.panelFill;this.emptyLayer.removeChildren(),this.filledLayer.removeChildren();for(let e=0;e<this.count_;e++){let n=this.iconX(e);this.emptyLayer.addChild(this.icon(n,t,this.emptyTexture,!1)),this.filledLayer.addChild(this.icon(n,this.fillColor,this.filledTexture,!0))}let n=this.totalWidth*(this.count_>0?this.value_/this.count_:0),r=e.direction===`rtl`?this.totalWidth-n:0;this.maskShape.clear().rect(r,0,n,this.size_).fill({color:16777215})}icon(e,t,n,r){if(n){let i=new wl(n);return i.x=e,i.width=this.size_,i.height=this.size_,r&&this.explicitColor&&(i.tint=t),i}let i=new Z,a=this.size_/2;return i.circle(e+a,a,a).fill({color:t}),i}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Qz(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,e)):t}function $z(e){return Number.isFinite(e)?Math.max(1,Math.floor(e)):1}var eB=class extends J{constructor(e){super(),this.track=new Z,this.fill=new Z,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.fraction=tB((e.value??1)/(e.max??1)),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),$.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=tB(t>0?e/t:0),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??Q().color.panelFill}setBackground(e){this.background_=e,this.draw()}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=Q();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function tB(e){return Math.max(0,Math.min(1,e))}function nB(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function rB(e,t,n=!1){return n||e<=0?0:-t*e}function iB(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var aB=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=Math.min(1,Math.max(0,e.hold??0));let t=new EI({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=iB(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=rB(t,this.rise,br()),this.alpha=nB(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},oB=4;function sB(e){return Math.max(0,e)/5}function cB(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function lB(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=cB(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:sB(r.length+1)}),i={...o,y:s}}return r}var uB=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new aB({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of lB(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},dB=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=Er.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},fB=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new CL({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new EI({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n,r=this.delay){this.pending&&this.pending.text===e?(this.pending.x=t,this.pending.y=n,this.visible&&this.place()):(this.pending={text:e,x:t,y:n,delay:r},this.waited=0,this.visible=!1)}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.pending.delay))return!1;this.body.setText(this.pending.text);let t=Q(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},pB=class extends J{constructor(e={}){super(),this.targets=[],this.tooltip=e.tooltip??new fB,this.longPress=e.longPress??.5,this.addChild(this.tooltip)}add(e){return this.targets.push(e),()=>{let t=this.targets.indexOf(e);t>=0&&this.targets.splice(t,1)}}addButton(e){return this.add({bounds:()=>{let t=e.getBounds();return{x:t.x,y:t.y,width:t.width,height:t.height}},text:()=>e.tooltip,active:()=>{for(let t=e;t;t=t.parent)if(!t.visible)return!1;return!0}})}targetAt(e,t){for(let n=this.targets.length-1;n>=0;n--){let r=this.targets[n];if(r.active&&!r.active())continue;let i=r.bounds();if(e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height)return r.text()===void 0?null:r}return null}pointerMove(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t):this.tooltip.leave()}pointerDown(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t,this.longPress):this.tooltip.leave()}pointerUp(){this.tooltip.leave()}attach(e){let t=e=>this.pointerMove(e.x,e.y),n=e=>this.pointerDown(e.x,e.y),r=()=>this.pointerUp();return e.move.add(t),e.down.add(n),e.up.add(r),()=>{e.move.remove(t),e.down.remove(n),e.up.remove(r)}}update(e){return this.tooltip.update(e)}},mB=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-Q().spacing,r=Q().direction===`rtl`;this.list=new EL({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new EI({wrapWidth:n}),this.body.x=r?0:t+Q().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},hB=class e extends J{constructor(t){super(),this.text=new EI({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1386
|
+
`)}},gB=class extends J{constructor(e){super(),this.backdrop=new Z,this.progress=new eB({width:240,height:10,value:0}),this.width_=e.width,this.height_=e.height,this.onRetry=e.onRetry,this.onCancel=e.onCancel,this.title=new EI({text:e.title??`Loading`,size:18,bold:!0,align:`center`}),this.status=new EI({text:`Preparing...`,align:`center`}),this.addChild(this.backdrop,this.title,this.status,this.progress),this.layout()}setSnapshot(e){let t=e.total>0?e.completed/e.total:0;this.progress.setValue(t),e.status===`failed`?this.status.setText(`Loading failed. Retry or cancel.`):e.status===`cancelled`?this.status.setText(`Loading cancelled.`):e.status===`ready`?this.status.setText(`Ready`):this.status.setText(e.current?`Loading ${e.current}...`:`Preparing...`)}bind(e){this.setSnapshot(e.snapshot);let t=e=>this.setSnapshot(e);return e.changed.add(t),()=>e.changed.remove(t)}retry(){this.onRetry?.()}cancel(){this.onCancel?.()}resize(e,t){this.width_=e,this.height_=t,this.layout()}layout(){let e=Q().color;this.backdrop.clear().rect(0,0,this.width_,this.height_).fill({color:e.overlay,alpha:.92});let t=this.width_/2,n=this.height_/2;this.title.anchor.set(.5),this.status.anchor.set(.5),this.title.position.set(t,n-36),this.status.position.set(t,n-8),this.progress.position.set(t-120,n+16)}};function _B(e,t={}){return n=>new Promise(r=>{e.push(new lz({width:t.width??480,height:t.height??120,speed:t.speed??45,pages:[{text:n.text,speaker:n.speaker,portrait:n.portrait}],choices:n.choices,anchor:t.anchor??`bottom`,onDone:e=>r(e)}))})}function vB(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function yB(e){return .2126*vB(e>>16&255)+.7152*vB(e>>8&255)+.0722*vB(e&255)}function bB(e,t){let[n,r]=[yB(e),yB(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function xB(e,t,n=`AA`,r=!1){let i=n===`AAA`?r?4.5:7:r?3:4.5;return bB(e,t)>=i}function SB(e,t,n,r=`…`){if(n(e)<=t)return e;let i=0,a=e.length;for(;i<a;){let o=Math.ceil((i+a)/2);n(e.slice(0,o).trimEnd()+r)<=t?i=o:a=o-1}return i===0?r:e.slice(0,i).trimEnd()+r}function CB(e,t,n,r,i=`…`){let a=[],o=``;for(let n of e.split(/\s+/).filter(Boolean)){let e=o?`${o} ${n}`:n;r(e)<=t||!o?o=e:(a.push(o),o=n)}if(o&&a.push(o),a.length<=n)return a.map(e=>SB(e,t,r,i));let s=a.slice(0,n),c=a.slice(n-1).join(` `);return s[n-1]=SB(c+i,t,r,i),s}function wB(e,t,n,r=40,i=1){let a=e-t;if(a<=0)return 0;let o=a/r,s=2*(i+o),c=(n%s+s)%s;return c<i?0:c<i+o?(c-i)*r:c<2*i+o?a:a-(c-2*i-o)*r}var TB=class extends J{constructor(e){super(),this.body=new EI({...e.label,text:e.text??``,wrapWidth:e.width-10}),this.box=new Mz({width:e.width,height:e.maxHeight,autoHeight:!0,touch:e.touch??!0,keyboard:!0}),this.box.content.addChild(this.body),this.addChild(this.box),this.measure()}measureHeight(){return this.body.height}measure(){this.box.setContentHeight(this.measureHeight())}setText(e){this.body.setText(e),this.measure(),this.box.scrollTo(0)}update(e){this.box.update(e)}},EB=class extends J{constructor(e){super(),this.clip=new Z,this.source=``,this.fullWidth=0,this.time=0,this.width_=e.width,this.speed=e.speed??40,this.pause=e.pause??1,this.labelOptions=e.label??{},this.body=new EI({...this.labelOptions,text:``}),this.clip.rect(0,0,e.width,4096).fill({color:16777215}),this.addChild(this.body,this.clip),this.body.mask=this.clip,this.setText(e.text??``)}measureWidth(e){let t=new EI({...this.labelOptions,text:e}),n=t.width;return t.destroy(),n}setText(e){this.source=e,this.fullWidth=this.measureWidth(e),this.time=0,this.apply()}apply(){br()?(this.body.setText(SB(this.source,this.width_,e=>this.measureWidth(e))),this.body.x=0):(this.body.setText(this.source),this.body.x=-wB(this.fullWidth,this.width_,this.time,this.speed,this.pause))}get shift(){return 0-this.body.x}update(e){this.time+=e,this.apply()}},DB={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},OB=class extends J{constructor(e,t){super(),this.backdropLayer=new J,this.actorLayer=new J,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweener=new Dr,this.dimAmount=.45,this.stageWidth=e,this.stageHeight=t,this.addChild(this.backdropLayer),this.addChild(this.actorLayer)}defineCharacter(e,t){this.definitions.set(e,t)}resize(e,t){this.stageWidth=e,this.stageHeight=t;for(let e of[this.backdrop,this.outgoingBackdrop])e&&this.fitBackdrop(e);for(let e of this.actors.values())this.placeActor(e)}setBackdrop(e,t=.4){this.outgoingBackdrop?.destroy();let n=this.backdrop;this.outgoingBackdrop=n;let r=new wl(e);this.fitBackdrop(r),this.backdrop=r,this.backdropLayer.addChild(r);let i=()=>{this.outgoingBackdrop===n&&(n?.destroy(),this.outgoingBackdrop=null)};return t<=0?(i(),Promise.resolve()):(r.alpha=0,this.tweener.tween(t,e=>{r.alpha=e}).then(i))}fitBackdrop(e){let t=e.texture,n=Math.max(this.stageWidth/t.width,this.stageHeight/t.height);e.scale.set(n),e.x=Math.round((this.stageWidth-t.width*n)/2),e.y=Math.round((this.stageHeight-t.height*n)/2)}show(e,t={}){let n=this.definitions.get(e);if(!n)throw Error(`no character defined as "${e}"`);let r=t.expression??Object.keys(n.expressions)[0],i=this.actors.get(e);if(i)return t.at!==void 0&&(i.slot=this.slotOf(t.at)),this.setExpression(e,r),this.placeActor(i),Promise.resolve();let a=new CM(n.sheet.get(n.expressions[r])),o={id:e,sprite:a,definition:n,slot:this.slotOf(t.at??`center`),expression:r};this.actors.set(e,o),this.actorLayer.addChild(a),this.placeActor(o),this.applyFocus();let s=t.fade??.25;return s<=0?Promise.resolve():(a.alpha=0,this.tweener.tween(s,e=>{a.alpha=e}))}hide(e,t=.25){let n=this.actors.get(e);return n?(this.actors.delete(e),this.focused===e&&(this.focused=null),this.applyFocus(),t<=0?(n.sprite.destroy(),Promise.resolve()):this.tweener.tween(t,e=>{n.sprite.alpha=1-e}).then(()=>n.sprite.destroy())):Promise.resolve()}hideAll(e=.25){return Promise.all([...this.actors.keys()].map(t=>this.hide(t,e))).then(()=>void 0)}setExpression(e,t){let n=this.actors.get(e);if(!n)return;let r=n.definition.expressions[t];if(r===void 0)throw Error(`character "${e}" has no expression "${t}"`);n.expression=t,n.sprite.texture=n.definition.sheet.get(r)}focus(e){this.focused=e,this.applyFocus()}applyFocus(){let e=Math.round(255*(1-this.dimAmount)),t=e<<16|e<<8|e;for(let e of this.actors.values()){let n=this.focused!==null&&e.id!==this.focused;e.sprite.tint=n?t:16777215}}slotOf(e){return typeof e==`number`?e:DB[e]}placeActor(e){let t=e.definition,n=(t.height??.7)*this.stageHeight,r=n/t.sheet.frameHeight;e.sprite.scale.set(r),e.sprite.x=Math.round(e.slot*this.stageWidth-t.sheet.frameWidth*r/2),e.sprite.y=Math.round((t.baseline??.92)*this.stageHeight-n)}update(e){this.tweener.update(e)}get isBusy(){return this.tweener.isBusy}},kB=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.historyLog=[],this.seenLines=new Set,this.skipSeen=!1,this.options=e}cancel(){this.cancelled=!0}get history(){return this.historyLog}async showLast(){let e=this.historyLog.at(-1);if(!e)return!1;let{windows:t}=this.options;return await new Promise(n=>{t.push(new lz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:0,pages:[{text:e.text,speaker:e.speaker}],dims:!1,anchor:`bottom`,onDone:()=>n()}))}),!0}async run(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)throw Error(`a "goto ${e}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async step(e){let{stage:t}=this.options;if(`backdrop`in e)await t.setBackdrop(this.options.backdrop(e.backdrop),e.fade);else if(`show`in e)await t.show(e.show,{at:e.at,expression:e.expression,fade:e.fade});else if(`hide`in e)await t.hide(e.hide,e.fade);else if(`hideAll`in e)await t.hideAll(e.fade);else if(`expression`in e)t.setExpression(e.of,e.expression);else if(`say`in e)await this.speak(e.say,e.as,e.speaker),this.recordHistory(e.say,e.as,e.speaker);else{if(`ask`in e){let t=await this.speak(e.ask,e.as,e.speaker,e.choices);return this.recordHistory(e.ask,e.as,e.speaker,t),e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`goto`in e)return e.goto;`wait`in e?await new Promise(t=>setTimeout(t,e.wait*1e3)):`call`in e&&await e.call(this.state)}}recordHistory(e,t,n,r){let i=n??(t?this.options.displayName?.(t)??t:void 0);this.seenLines.add(AB(t,e)),this.historyLog.push({text:e,speaker:i,chosen:r})}speak(e,t,n,r){let{stage:i,windows:a}=this.options;i.focus(t??null);let o=n??(t?this.options.displayName?.(t)??t:void 0),s=this.skipSeen&&!r&&this.seenLines.has(AB(t,e));return new Promise(t=>{a.push(new lz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:s?0:this.options.speed??45,autoAdvance:s?0:void 0,mode:this.options.mode,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function AB(e,t){return`${e??``}\u0000${t}`}function jB(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}function MB(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,as:e.speaker})}function NB(e,t={}){let n={},r=e=>{for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask)};if(Array.isArray(e))r(e);else for(let t of Object.values(e))r(t);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}var PB=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},FB=class extends J{constructor(e){super(),this.backdrop=new wl(q.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new EI({text:``,color:Q().color.textHighlight}),this.textLabel=new EI({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},IB=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],LB=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function RB(e){return e===4?sr:lr}var zB={passable:!1,transparent:!1},BB={passable:!0,transparent:!0},VB=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return nr(this.width,e,t)}xOf(e){return rr(this.width,e)}yOf(e){return ir(this.width,e)}inside(e,t){return tr(this.width,this.height,e,t)}neighbors(e,t,n=8){return this.shape===`hex`?Jn(e,t):RB(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?LB:IB:RB(n);for(let[n,a]of i)r(e+n,t+a)}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??zB}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function HB(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function UB(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}_e();var WB={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function GB(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function KB(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function qB(e,t){let n=GB(t),r=KB(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function JB(e,t){let n=qB(e,t);if(n.length===0)return null;let r=ie(n.map(e=>e.weight??1));return r===null?null:n[r]}_e();var YB=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function XB(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[],hooks:u,builders:d}=e,f=new VB(t,n,[...YB,...l],s,e.shape),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ne(i,a),r=ne(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1||p.some(e=>UB(l,e,2))){g++;continue}p.push(l);let m=(d?.length?JB(d,l):null)??WB;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){QB(f,HB(p[e-1]),HB(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){QB(f,HB(p[e]),HB(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function ZB(e){return XB(e).level}function QB(e,t,n,r){let i=A(.5);if(e.shape===`hex`){let a=i?{x:n.x,y:t.y}:{x:t.x,y:n.y};for(let i of[...Zn(t,a),...Zn(a,n)])e.insideWithBorder(i.x,i.y)&&e.set(i.x,i.y,r)}else i?($B(e,t.x,n.x,t.y,!0,r),$B(e,t.y,n.y,n.x,!1,r)):($B(e,t.y,n.y,t.x,!1,r),$B(e,t.x,n.x,n.y,!0,r))}function $B(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function eV(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function tV(e,t){let n=null,r=-1;for(let i of e.rooms){let a=HB(i),o=e.shape===`hex`?Yn(a,t):(a.x-t.x)**2+(a.y-t.y)**2;o>r&&(r=o,n=i)}return n}_e();function nV(e,t){return[[e,t-1],[e,t+1],[e-1,t],[e+1,t]]}function rV(e,t){return Jn(e,t).map(e=>[e.x,e.y])}var iV=2/Math.sqrt(3);function aV(e,t,n,r){let i=$n(e,t,iV,1),a=$n(n,r,iV,1);return(i.x-a.x)**2+(i.y-a.y)**2}function oV(e){let{width:t,height:n}=e;if(t<5||n<5)throw Error(`a cave needs at least 5x5 cells`);if(e.chambers.length<1)throw Error(`a cave needs at least one chamber`);let r=e.wall??0,i=e.floor??1,a=e.kinds??[],o=e.shape??`square`,s=o===`hex`,c=s?rV:nV,l=(e,t,n,r)=>s?Yn({x:e,y:t},{x:n,y:r}):Math.abs(e-n)+Math.abs(t-r),u=(e,t,n,r)=>s?aV(e,t,n,r):(e-n)**2+(t-r)**2;if(e.random===void 0&&e.seed===void 0)throw Error(`a cave needs a seed or a random source`);let d=e.random,f=e=>O(e,void 0,d),p=new VB(t,n,[...YB,...a],r,o),m=(e,n)=>n*t+e,h=(e,t)=>p.insideWithBorder(e,t),g=new Uint8Array(t*n),_=(e,t)=>{h(e,t)&&(g[m(e,t)]=1)};d===void 0&&w(e.seed);try{let r=new Map,a=new Map;for(let i of e.chambers){if(i.size<1)throw Error(`cave chamber ${i.id} needs at least one cell`);let e=ne(Math.max(1,i.xRange[0]),Math.min(t-2,i.xRange[1]),d),o=ne(Math.max(1,i.yRange[0]),Math.min(n-2,i.yRange[1]),d);r.set(i.id,{x:e,y:o});let s=[{x:e,y:o}],u=new Set([m(e,o)]),p=[],g=(e,t)=>{for(let[n,r]of c(e,t))h(n,r)&&!u.has(m(n,r))&&(u.add(m(n,r)),p.push([n,r]))};for(g(e,o);s.length<i.size&&p.length;){let t=0;if(f(100)<(i.jagged??0))t=f(p.length);else{let n=1/0;for(let r=0;r<p.length;r++){let i=l(p[r][0],p[r][1],e,o);i<n&&(n=i,t=r)}}let[n,r]=p.splice(t,1)[0];s.push({x:n,y:r}),g(n,r)}for(let e of s)_(e.x,e.y);a.set(i.id,s)}let o=(e,r,i,a)=>{let o=e.x,s=e.y;for(let e=0;e<t*n&&(o!==r.x||s!==r.y);e++){if(_(o,s),i>1)for(let[e,t]of c(o,s).slice(0,i-1))_(e,t);let e=c(o,s).filter(([e,t])=>h(e,t)),t=e[0];if(f(100)<a)t=e[f(e.length)];else{let n=1/0;for(let i of e){let e=u(i[0],i[1],r.x,r.y);e<n&&(n=e,t=i)}}[o,s]=t}_(r.x,r.y)};for(let t of e.chambers)for(let e of t.passages){let n=r.get(t.id),i=r.get(e.to);if(!n||!i)throw Error(`cave passage ${t.id} -> ${e.to} names no chamber`);f(100)>=(e.chance??100)||o(n,i,Math.max(1,e.width??1),e.windiness??0)}let s=e.mustBeClear??[];for(let e of s){_(e.x,e.y);for(let[t,n]of c(e.x,e.y))_(t,n)}let v=r.get(e.chambers[0].id);if(v){let e=()=>{let e=new Set([m(v.x,v.y)]),t=[[v.x,v.y]];for(;t.length;){let[n,r]=t.pop();for(let[i,a]of c(n,r))h(i,a)&&g[m(i,a)]&&!e.has(m(i,a))&&(e.add(m(i,a)),t.push([i,a]))}return e};for(let t of[...r.values(),...s])h(t.x,t.y)&&!e().has(m(t.x,t.y))&&o(t,v,1,15)}let y=new Set,b=[];for(let t of e.starts??[]){let e=r.get(t.chamber);if(!e)throw Error(`cave start ${t.side} names no chamber`);if(_(e.x,e.y),y.add(m(e.x,e.y)),t.ring)for(let[t,n]of c(e.x,e.y))h(t,n)&&(_(t,n),y.add(m(t,n)));b.push({side:t.side,x:e.x,y:e.y})}let x=[],S=e.villageDensity??0;if(S>0){let e=[];for(let t=0;t<g.length;t++)g[t]&&!y.has(t)&&e.push(t);let n=Math.floor(e.length*S/1e3);for(let r=0;r<n&&e.length;r++){let n=f(e.length),r=e.splice(n,1)[0];x.push({x:r%t,y:Math.floor(r/t)})}}for(let e=0;e<g.length;e++)g[e]&&p.set(e%t,Math.floor(e/t),i);return{level:p,chambers:[...a.entries()].map(([e,t])=>({id:e,centre:r.get(e),cells:t})),starts:b,villages:x}}finally{d===void 0&&T()}}_e();function sV(e,t,n,r,i){let a=e=>Math.max(2,Math.ceil(e/r)+2),o=a(t),s=a(n),c=new Float64Array(o*s);for(let t=0;t<c.length;t++)c[t]=e();let l=e=>e*e*(3-2*e),u=Array(t*n).fill(0);for(let e=0;e<3;e++){let a=1<<e,d=1/(a*a);for(let e=0;e<n;e++)for(let n=0;n<t;n++){let f=(i?n*cV:n)/r*a,p=(i?e+(n&1)/2:e)/r*a,m=Math.floor(f)%(o-1),h=Math.floor(p)%(s-1),g=l(f-Math.floor(f)),_=l(p-Math.floor(p)),v=(e,t)=>c[(h+t)%s*o+(m+e)%o],y=v(0,0)*(1-g)+v(1,0)*g,b=v(0,1)*(1-g)+v(1,1)*g;u[e*t+n]+=(y*(1-_)+b*_)*d}}for(let e=0;e<u.length;e++)u[e]/=1.3125;return u}var cV=Math.sqrt(3)/2,lV=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]];function uV(e,t,n,r){if(e)for(let e of Jn(t,n))r(e.x,e.y,!1);else for(let[e,i]of lV)r(t+e,n+i,e!==0&&i!==0)}var dV={plains:1,forest:3,hills:5,desert:2,swamp:6,water:24,mountains:40};function fV(e){let{width:t,height:n}=e;if(t<16||n<16)throw Error(`an overworld needs at least 16x16 tiles`);let r=e.seaLevel??.4;if(!(r>0&&r<1))throw Error(`seaLevel must be between 0 and 1`);let i=e.noiseScale??6,a=e.shape===`hex`,o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n;w(e.seed);try{let c=sV(()=>D(),t,n,i,a),l=sV(()=>D(),t,n,i*1.5,a),u=Array(t*n),d=(e,t)=>{let n=o(e,t),i=c[n],a=l[n];return i<r?`water`:i>.78?`mountains`:i>.62?`hills`:a<.3?`desert`:a>.72?i<r+.08?`swamp`:`forest`:`plains`};for(let e=0;e<n;e++)for(let n=0;n<t;n++)u[o(n,e)]=d(n,e);let f=new Set,p=[],m=e.rivers??Math.max(1,Math.floor(t*n/600)),h=[];for(let e=0;e<u.length;e++)c[e]>.7&&u[e]!==`water`&&h.push(e);for(let e=0;e<m*4&&p.length<m&&h.length!==0;e++){let e=h[O(h.length)],r=[],i=e%t,l=Math.floor(e/t),d=new Set;for(let e=0;e<t+n;e++){let e=o(i,l);if(f.has(e)||u[e]===`water`){r.length>0&&r.push({x:i,y:l});break}r.push({x:i,y:l}),d.add(e);let t;if(uV(a,i,l,(e,n)=>{if(!s(e,n))return;let r={x:e,y:n,up:c[o(e,n)]};(!t||r.up<t.up)&&(t=r)}),!t||t.up>=c[o(i,l)]){u[o(i,l)]=`water`;break}[i,l]=[t.x,t.y]}if(r.length>=2){for(let e of r)f.add(o(e.x,e.y));p.push(r)}}let g=[],_=(e,t)=>{if(a)return Qn({x:e,y:t},3).some(e=>s(e.x,e.y)&&u[o(e.x,e.y)]===`water`);for(let n=-3;n<=3;n++)for(let r=-3;r<=3;r++){let i=e+r,a=t+n;if(s(i,a)&&u[o(i,a)]===`water`)return!0}return!1},v=(e,t,n)=>g.every(r=>(a?Yn(r,{x:e,y:t}):Math.abs(r.x-e)+Math.abs(r.y-t))>=n),y=e.settlements??Math.max(2,Math.floor(t*n/500));for(let e=0;e<y*60&&g.length<y;e++){let e=O(t),r=O(n),i=u[o(e,r)];i!==`plains`&&i!==`hills`&&i!==`forest`||!_(e,r)||v(e,r,8)&&g.push({x:e,y:r,kind:i===`hills`?`castle`:`town`})}for(let e of g)e.kind===`town`&&O(2)===0&&(e.kind=`village`);let b=[],x=g[0];if(x){let e=[x],r=g.slice(1);for(;r.length;){let i;for(let o of r)for(let r of e){let e=pV(u,t,n,r,o,a);e&&(!i||e.length<i.path.length)&&(i={path:e,to:o})}if(!i)break;b.push(i.path),e.push(i.to),r.splice(r.indexOf(i.to),1)}}let S=[],C=e.pointsOfInterest??Math.max(1,Math.floor(t*n/900));for(let e=0;e<C*40&&S.length<C;e++){let e=O(t),r=O(n),i=u[o(e,r)];if(i===`water`||i===`mountains`||!v(e,r,6))continue;let a=[`ruin`,`shrine`,`dungeon`],s=a[O(a.length)];S.push({x:e,y:r,kind:s,leadsTo:`overworld-${s}-${S.length}`})}let ee=Math.max(2,e.regionSize??12),w=Math.ceil(t/ee),T=Array(t*n);for(let e=0;e<n;e++)for(let n=0;n<t;n++)T[o(n,e)]=Math.floor(e/ee)*w+Math.floor(n/ee);return{terrain:u,elevation:c,moisture:l,rivers:p,roads:b,settlements:g,pointsOfInterest:S,regions:T,regionColumns:w}}finally{T()}}function pV(e,t,n,r,i,a){let o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n,c=t*n,l=new Float64Array(c).fill(1/0),u=new Int32Array(c).fill(-1),d=o(r.x,r.y),f=o(i.x,i.y);l[d]=0;let p=[d],m=new Uint8Array(c),h=e=>{for(;;){let t=e*2+1,n=t+1,r=e;if(t<p.length&&l[p[t]]<l[p[r]]&&(r=t),n<p.length&&l[p[n]]<l[p[r]]&&(r=n),r===e)return;[p[e],p[r]]=[p[r],p[e]],e=r}},g=()=>{let e=p[0],t=p.pop();return p.length&&(p[0]=t,h(0)),m[e]=0,e},_=e=>{p.push(e),m[e]=1;let t=p.length-1;for(;t>0;){let e=t-1>>1;if(l[p[e]]<=l[p[t]])break;[p[t],p[e]]=[p[e],p[t]],t=e}};for(;p.length;){let n=g();if(n===f){let e=[];for(let n=f;n!==-1;n=u[n])e.push({x:n%t,y:Math.floor(n/t)});return e.reverse()}uV(a,n%t,Math.floor(n/t),(t,r,i)=>{if(!s(t,r))return;let a=o(t,r);if(l[n]===1/0)return;let c=dV[e[a]]*(i?1.5:1);l[n]+c<l[a]&&(l[a]=l[n]+c,u[a]=n,m[a]||_(a))})}}var mV=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};_e();function hV(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=A(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=A(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(oe(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function gV(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function _V(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function vV(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function yV(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),gV(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!_V(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),vV(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function bV(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...yV(n,e()));return r}var xV=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*xV,e=e*69069+1>>>0,this._s1=e*xV,e=e*69069+1>>>0,this._s2=e*xV,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*xV;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var SV=class{getContainer(){return null}setOptions(e){this._options=e}},CV=class extends SV{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function wV(e){return e.charAt(0).toUpperCase()+e.substring(1)}function TV(e,...t){let n=TV.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=wV(d)),d})}TV.map={s:`toString`};var EV=class e extends CV{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};EV.cache=!1;var DV={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},OV=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[DV[8][7],DV[8][1],DV[8][3],DV[8][5]];break;case 6:i=DV[6],a=1,o=[-1,1];break;case 8:i=DV[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},kV=class extends OV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},AV=class extends OV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},jV=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],MV={DiscreteShadowcasting:kV,PreciseShadowcasting:AV,RecursiveShadowcasting:class extends OV{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<jV.length;i++)this._renderOctant(e,t,jV[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,jV[o],n,i),this._renderOctant(e,t,jV[a],n,i),this._renderOctant(e,t,jV[r],n,i),this._renderOctant(e,t,jV[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,jV[r],n,i),this._renderOctant(e,t,jV[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var NV=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=DV[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},PV={Dijkstra:class extends NV{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends NV{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function FV(e,t){return dr(e,t)}function IV(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function LV(e,t,n,r={}){let i=e.shape===`hex`?Zn(t,n):IV(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function RV(e,t,n){let r=e.shape===`hex`?Zn(t,n):IV(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function zV(e,t,n,r){return!((e.shape===`hex`?Yn(t,n):FV(t,n))>r.range||(r.requireLineOfSight??!0)&&!RV(e,t,n))}function BV(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return IV(e,t);case`cone`:return UV(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function VV(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?Zn(t,n):r.kind===`burst`?Qn(n,r.radius):HV(t,n,r.width):BV(t,n,r)}function HV(e,t,n){let r=Yn(e,t);if(r===0)return[{...e}];let i=Zn(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of Qn(o,s))Yn(e,n)===t&&a.push(n)}return a}function UV(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}var WV=.5;function GV(e){return e<0?-Math.round(-e):Math.round(e)}function KV(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/WV)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+GV(Math.cos(i)*r.range),y:t.y+GV(Math.sin(i)*r.range)};for(let n of LV(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function qV(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=FV(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function JV(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function YV(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function XV(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var ZV=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?Yn(this.origin,this.cursor):FV(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return RV(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n)}else this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?VV(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},QV=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new MV.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of Qn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`)for(let e of Qn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}else for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||FV(a,{x:t,y:o})>n)continue;let e=IV(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},$V=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},eH=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new PV.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},tH=class e{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};_e();function nH(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:rH(e,n,a)};let c=new QV(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:iH(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:rH(e,n,a)}}function rH(e,t,n){return re(aH(e,t,n))}function iH(e,t,n,r){let i=aH(e,t,r),a=null,o=oH(t,n);for(let e of i){let t=oH(e,n);t>o&&(o=t,a=e)}return a}function aH(e,t,n){let r=n.blocked,i=[];for(let[a,o]of RB(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function oH(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var sH=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},cH=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},lH=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}check(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},uH=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},dH=class extends S{modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},fH=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>FV(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},pH=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},mH=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},hH=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=VV(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};_e();function gH(e,t={}){return(t.within?[...t.within]:yH(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function _H(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function vH(e,t){let n=[...new Set(e)];oe(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function yH(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var bH=l({AbilityCycle:()=>uH,BossPhases:()=>lH,CombatHooks:()=>dH,DUNGEON_KINDS:()=>YB,Doors:()=>cH,Elevation:()=>$V,FLOOR:()=>BB,FeatureLayer:()=>mV,FieldOfView:()=>QV,Level:()=>VB,MultiStageAbility:()=>mH,MultiTurnBeam:()=>hH,Pathfinder:()=>eH,Scheduler:()=>tH,Secrets:()=>sH,Stealth:()=>fH,TargetingController:()=>ZV,TriggerTracker:()=>pH,WALL:()=>zB,areaFalloffMultiplier:()=>YV,ballistica:()=>LV,canTarget:()=>zV,candidateCells:()=>gH,cellsNear:()=>_H,chainTargets:()=>qV,chebyshevDistance:()=>FV,checkDeterminism:()=>bV,compareDungeonArtifacts:()=>yV,coneCells:()=>UV,coneSector:()=>KV,decideMonsterAI:()=>nH,eligibleBuilders:()=>qB,findFreeCell:()=>eV,furthestRoom:()=>tV,generateCave:()=>oV,generateDungeon:()=>ZB,generateDungeonGraph:()=>XB,generateOverworld:()=>fV,hallBuilder:()=>WB,hasLineOfSight:()=>RV,hexConeCells:()=>HV,knockbackPath:()=>XV,neighbourOffsets:()=>RB,pickBuilder:()=>JB,rangeMultiplier:()=>JV,rectCenter:()=>HB,rectsOverlap:()=>UB,resolveArea:()=>BV,resolveAreaOnLevel:()=>VV,rollRoster:()=>hV,selectDistinctCells:()=>vH,traceLine:()=>IV});function xH(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var SH=class e{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=xH(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=xH(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function CH(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var wH=class e{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};_e();function TH(e,t,n=()=>ne(1,20)){return e+n()>=t}var EH=class e{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},DH=class e{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},OH=class e{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...kH(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function kH(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function AH(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function jH(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function MH(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!jH(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!AH(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function NH(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function PH(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return NH(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}_e();function FH(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=ie(n.map(e=>e.weight));return r===null?null:n[r]}function IH(e){return e.affix}function LH(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function RH(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function zH(e,t){e.affix===void 0?RH(t):(t.affix=e.affix,t.cursed=e.cursed??!1)}function BH(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function VH(e){e.identified=!0}function HH(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&RH(e),e.level):e.level??0}function UH(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function WH(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function GH(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return NH(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var KH=class e{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};_e();function qH(e){if(e.entries.length===0||!A(e.chance??1))return null;let t=ie(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var JH=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function YH(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}_e();function XH(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=O(0,e+1);[t[e],t[n]]=[t[n],t[e]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var ZH=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=XH(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function QH(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function $H(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0):(n.add({...s,quantity:i}),!1))}function eU(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function tU(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function nU(e,t){return[...tU(eU(t))].every(([t,n])=>e.base(t)>=n)}function rU(e,t){let n=tU(eU(t));if(![...n].every(([t,n])=>e.base(t)>=n))return!1;for(let[t,r]of n)e.setBase(t,e.base(t)-r);return!0}function iU(e,t,n=1){for(let[r,i]of tU(eU(t)))e.setBase(r,e.base(r)+i*n)}function aU(e,t,n,r){return rU(e,t)?n.refund(Math.floor(t.amount/r)):0}var oU=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};_e();function sU(e,t,n){return oe([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var cU=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},lU=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(uU(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=uU(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=uU(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function uU(e,t){return[e,t].sort().join(`\0`)}var dU=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function fU(e,t={},n){let r=new SH({base:_U(e)}),i;e.growth!==void 0&&(i=new wH(gU(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);LH(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new Dn,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function pU(e,t={},n){return e.map(e=>fU(e,t,n))}function mU(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function hU(e,t,n,r){let i=fU(e,t,r);if(i.stats=SH.fromJSON({base:_U(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=wH.fromJSON(gU(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function gU(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function _U(e){let t={};for(let[n,r]of Object.entries(e))if(!dU.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var vU=l({Advancement:()=>JH,Appearances:()=>ZH,AuraField:()=>cU,Barrier:()=>oU,Charges:()=>KH,EquipmentSlots:()=>DH,Inventory:()=>OH,Progression:()=>wH,SkillPoints:()=>EH,StatBlock:()=>SH,SupportLedger:()=>lU,affixOf:()=>IH,applyAffix:()=>LH,applyItemStatusEffect:()=>GH,applyStatusEffect:()=>PH,assignAppearances:()=>XH,assignTraits:()=>sU,buildEntities:()=>pU,buildEntity:()=>fU,buy:()=>QH,canAfford:()=>nU,composeModifiers:()=>xH,convertToCharges:()=>aU,copyAffix:()=>zH,craft:()=>MH,damageItem:()=>UH,enchant:()=>HH,fromEntitySaveState:()=>hU,identify:()=>VH,matchesContext:()=>BH,powerCurve:()=>CH,refund:()=>iU,removeAffix:()=>RH,repairItem:()=>WH,rollAffix:()=>FH,rollLoot:()=>qH,scaledModifiers:()=>YH,sell:()=>$H,skillCheck:()=>TH,spend:()=>rU,toEntitySaveState:()=>mU}),yU=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},bU=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},xU=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};_e();function SU(e){if(e.entries.length===0||!A(e.rate))return null;let t=ie(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var CU=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},wU=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return TU(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function TU(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var EU=l({EnvironmentClock:()=>CU,Overworld:()=>bU,SideTurns:()=>wU,TurnClock:()=>xU,World:()=>yU,alignmentBonus:()=>TU,rollEncounter:()=>SU});_e();function DU(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{OU(t,t.name??`#${n+1}`,e.shape);let a=kU(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function OU(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function kU(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)AU(e,t,i,r)&&n.push([i,r]);return n}function AU(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var jU=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function MU(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function NU(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>MU(e,t))&&(n=r);return n}var PU=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){let t=await this.runList(e);if(t!==void 0){if(this.options.onUnknownCommand)return this.options.onUnknownCommand({goto:t}),this.state;throw Error(`a "goto ${t}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async runList(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)return e}}async step(e){if(`say`in e)await this.speak(e.say,e.speaker,e.portrait);else{if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.portrait,e.choices);return e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`wait`in e)await new Promise(t=>setTimeout(t,e.wait*1e3));else if(`setSwitch`in e)this.state.game.setSwitch(e.setSwitch,e.value);else if(`setVariable`in e)this.state.game.setVariable(e.setVariable,e.value);else if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount)}else{if(`if`in e){let t=MU(e.if,this.state.game);return this.runList(t?e.then:e.else??[])}if(`move`in e)await this.options.move?.(e.move.target,e.move.steps);else{if(`goto`in e)return e.goto;`call`in e?await e.call(this.state):this.options.onUnknownCommand?.(e)}}}}speak(e,t,n,r){return this.options.present({text:e,speaker:t,portrait:n,choices:r})}};function FU(e,t){t&&e.has?.(t)&&e.play?.(t)}var IU=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=LU(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=LU(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}jumpBy(e,t){return!this.target&&(this.facing=LU(e,t),this.x+=e,this.y+=t,this.fromX=this.x,this.fromY=this.y,this.place(),this.playIdle(),!0)}update(e){this.sprite.update?.(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=RU(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=RU(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){FU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){FU(this.sprite,this.options.idleAnimation?.(this.facing))}};function LU(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function RU(e,t,n){return e+(t-e)*n}var zU=[`up`,`down`,`left`,`right`],BU={up:{dx:0,dy:-1},down:{dx:0,dy:1},left:{dx:-1,dy:0},right:{dx:1,dy:0}},VU={up:{around:`down`,left90:`left`,right90:`right`},down:{around:`up`,left90:`right`,right90:`left`},left:{around:`right`,left90:`down`,right90:`up`},right:{around:`left`,left90:`up`,right90:`down`}},HU=class{constructor(e,t,n={}){this.index=0,this.waiting=0,this.mover=e,this.route=t,this.options=n}get done(){return!this.route.repeat&&this.index>=this.route.steps.length}update(e){if(this.mover.isMoving||this.done||this.waiting>0&&(this.waiting=Math.max(0,this.waiting-e),this.waiting>0))return;this.index>=this.route.steps.length&&(this.index=0);let t=this.route.steps[this.index];(this.runStep(t)||this.route.skippable)&&this.index++}runStep(e){if(`turn`in e){let{dx:t,dy:n}=this.resolveTurn(e);return this.mover.turnTo(t,n),!0}if(`wait`in e)return this.waiting=e.wait,!0;if(`jump`in e)return this.attempt(e.jump.dx,e.jump.dy,(e,t)=>this.mover.jumpBy(e,t));if(`step`in e)return this.attempt(e.step.dx,e.step.dy,(e,t)=>this.mover.moveBy(e,t));let{dx:t,dy:n}=this.resolveDirection(e);return this.attempt(t,n,(e,t)=>this.mover.moveBy(e,t))}resolveDirection(e){return e.dir===`random`?BU[this.pickDirection()]:e.dir===`forward`?BU[this.mover.facing]:e.dir===`backward`?BU[VU[this.mover.facing].around]:e.dir===`toward`||e.dir===`away`?this.resolveAim(e.dir,e):BU[e.dir]}resolveTurn(e){if(e.turn===`random`)return BU[this.pickDirection()];if(e.turn===`around`||e.turn===`left90`||e.turn===`right90`)return BU[VU[this.mover.facing][e.turn]];if(e.turn===`toward`||e.turn===`away`){let t=this.resolveAim(e.turn,e);return t.dx===0&&t.dy===0?BU[this.mover.facing]:t}return BU[e.turn]}resolveAim(e,t){let n=`target`in t?t.target():t,r=e===`toward`?1:-1,i=n.x-this.mover.x,a=n.y-this.mover.y;return Math.abs(i)>=Math.abs(a)?{dx:r*Math.sign(i)||0,dy:0}:{dx:0,dy:r*Math.sign(a)||0}}attempt(e,t,n){return e===0&&t===0?!0:this.options.canMove&&!this.options.canMove(e,t)?!1:n(e,t)}pickDirection(){let e=this.options.random??Math.random;return zU[Math.floor(e()*zU.length)]}},UU=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){FU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){FU(this.sprite,this.options.idleAnimation?.(this.facing))}};function WU(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 GU(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function KU(e,t){let n=kn(e.x,t.x,t.x+t.width),r=kn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function qU(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=JU(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:JU(o,e.y,e.width,e.height,n,i,a,!1)}}function JU(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var YU=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?MU(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return n.tracked&&(r.tracked=n.tracked),r}};function XU(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(ZU(e.id,r))}return t.map(e=>n.get(e))}function ZU(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var QU=class{constructor(e){this.name=e}},$U=4,eW=8,tW=new WeakMap;function nW(e){return tW.get(e)}function rW(e,t){return tW.set(e,t),e}var iW=1e3,aW=class{constructor(e){this.pos=0,this.depth=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&tW.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){if(++this.depth>iW)throw Error(`Marshal: values nested more than ${iW} deep`);try{return this.readTagged()}finally{this.depth--}}readTagged(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==$U||t>eW)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${$U}.${eW} or lower)`);return this.readValue()}};function oW(e){return new aW(e).readDocument()}function sW(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function cW(e){let t=[$U,eW];return lW(t,e),new Uint8Array(t)}function lW(e,t){if(t==null)e.push(uW(`0`));else if(t===!0)e.push(uW(`T`));else if(t===!1)e.push(uW(`F`));else if(t instanceof QU)e.push(uW(`:`)),dW(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(uW(`i`)),fW(e,t)):(e.push(uW(`f`)),dW(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(uW(`"`)),dW(e,t);else if(Array.isArray(t)){e.push(uW(`[`)),fW(e,t.length);for(let n of t)lW(e,n)}else if(t instanceof Map){let n=tW.has(t);e.push(uW(n?`}`:`{`)),fW(e,t.size);for(let[n,r]of t)lW(e,n),lW(e,r);n&&lW(e,tW.get(t))}else if(sW(t)){e.push(uW(`o`)),e.push(uW(`:`)),dW(e,t.class);let n=Object.entries(t.ivars);fW(e,n.length);for(let[t,r]of n)e.push(uW(`:`)),dW(e,t),lW(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function uW(e){return e.charCodeAt(0)}function dW(e,t){let n=new TextEncoder().encode(t);fW(e,n.length);for(let t of n)e.push(t)}function fW(e,t){if(t===0)e.push(0);else if(t>0&&t<=122)e.push(t+5);else if(t<0&&t>=-123)e.push(t-5&255);else{if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}}function pW(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,speaker:e.speaker})}function mW(e,t={}){let n={};for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function hW(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}var gW=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>PU,FreeMover:()=>UU,GameState:()=>jU,GridMover:()=>IU,MoveRouteRunner:()=>HU,QuestLog:()=>YU,RubySymbol:()=>QU,aabbOverlap:()=>WU,activePage:()=>NU,automap:()=>DU,circleAabbOverlap:()=>KU,circleOverlap:()=>GU,conditionHolds:()=>MU,decodeMarshal:()=>oW,encodeMarshal:()=>cW,extractDialogueCatalog:()=>mW,hashDefaultOf:()=>nW,importTwee:()=>hW,parseDialogueText:()=>pW,questsFromRows:()=>XU,resolveAabbAgainstTiles:()=>qU,withHashDefault:()=>rW}),_W=CH(20,2,100),vW=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new wH(e.species.growth??_W,{level:e.level??1}),this.stats=new SH({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},yW=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},bW=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){if(t<0||t>=this.active.length)return;let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function xW(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function SW(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var CW=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=Math.max(-this.max,Math.min(this.max,n+t)),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function wW(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function TW(e,t,n,r){let i=null,a=EW(e,n,r);return t.forEach((e,t)=>{let o=EW(e.types,n,r);o<a&&(a=o,i=t)}),i}function EW(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var DW=class extends S{},OW=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},kW=class{constructor(e){this.chanceToHit=AW(e.chanceToHit??1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=Math.max(0,e.damage)*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let t=[],n=e.defender.hp;for(let r=0;r<=e.strikes;r++)r>0&&(e.hits?.[r-1]??!0)&&(n-=Math.max(0,e.damage)),t.push({strike:r,time:r*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:Math.max(0,n),defenderDamage:this.defenderHp0-Math.max(0,n)});this.frames=t}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}};function AW(e){return Math.max(0,Math.min(1,e))}var jW=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},MW=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new kW({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new jW({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},NW=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},PW=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},FW=l({AttackDialog:()=>MW,AttackPreview:()=>kW,BattleHooks:()=>DW,BattleStats:()=>PW,Creature:()=>vW,Field:()=>OW,Party:()=>bW,StatStages:()=>CW,TypeMatrix:()=>yW,UnitSelector:()=>jW,Whiteboard:()=>NW,battleOrder:()=>xW,checkEvolution:()=>SW,chooseMove:()=>wW,chooseSwitch:()=>TW});function IW(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function LW(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function RW(e){let t=[];for(let n=7;n>=0;n--){let r=``,i=0;for(let t=0;t<8;t++){let a=e.board[n*8+t];if(!a){i++;continue}i>0&&(r+=String(i),i=0);let o={pawn:`p`,knight:`n`,bishop:`b`,rook:`r`,queen:`q`,king:`k`}[a.kind];r+=a.side===`white`?o.toUpperCase():o}i>0&&(r+=String(i)),t.push(r)}let n=(e.castling.whiteKingside?`K`:``)+(e.castling.whiteQueenside?`Q`:``)+(e.castling.blackKingside?`k`:``)+(e.castling.blackQueenside?`q`:``);return`${t.join(`/`)} ${e.turn===`white`?`w`:`b`} ${n||`-`} ${e.enPassant===null?`-`:LW(e.enPassant)}`}function zW(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:IW(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(HW(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return ZW(n,`white`),ZW(n,`black`),o}function BW(e){return e===`white`?`black`:`white`}function VW(e){return e&7}function HW(e){return e>>3}function UW(e,t){return e>=0&&e<8&&t>=0&&t<8}function WW(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function GW(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var KW=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],qW=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],JW=[[1,1],[-1,1],[-1,-1],[1,-1]],YW=[[1,0],[0,1],[-1,0],[0,-1]];function XW(e,t,n){let r=VW(t),i=HW(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!UW(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of KW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of qW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:JW,kinds:[`bishop`,`queen`]},{steps:YW,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;UW(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function ZW(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function QW(e,t){return XW(e.board,ZW(e.board,t),BW(t))}function $W(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=VW(t),a=HW(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;UW(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(UW(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!UW(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of KW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(JW);break;case`rook`:o(YW);break;case`queen`:o(JW),o(YW);break;case`king`:{for(let[o,s]of qW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!QW(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!XW(e.board,o+5,BW(n.side))&&!XW(e.board,o+6,BW(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!XW(e.board,o+3,BW(n.side))&&!XW(e.board,o+2,BW(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function eG(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${LW(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[tG(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[tG(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=BW(n.side)}function tG(e,t){let n=VW(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function nG(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of $W(e,n)){let n=GW(e);eG(n,r),!QW(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function rG(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${LW(t.from)} to move`);let r=$W(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${LW(t.from)}-${LW(t.to)} is not a legal move here`);let i=GW(e);if(eG(i,r),QW(i,e.turn))throw Error(`${LW(t.from)}-${LW(t.to)} leaves the king in check`);eG(e,r)}function iG(e){return nG(e).length>0?`ongoing`:QW(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var aG=1e5;function oG(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??aG;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}function sG(e,t){return e.moves(t).map(n=>({move:n,child:e.apply(t,n)}))}function cG(e,t){let n=null,r=t?-1/0:1/0;for(let{move:i,score:a}of e)(n===null||(t?a>r:a<r))&&(n=i,r=a);return n}function lG(){return globalThis.process?.getBuiltinModule?.(`node:worker_threads`)}function uG(){let e=globalThis.process?.getBuiltinModule?.(`node:worker_threads`)?.parentPort??null,t=globalThis,n=e=>{let t=[],n=new Set,r=e=>{if(typeof e!=`object`||!e||n.has(e))return;if(n.add(e),ArrayBuffer.isView(e)){let n=e.buffer;n instanceof ArrayBuffer&&!t.includes(n)&&t.push(n);return}if(e instanceof ArrayBuffer){t.includes(e)||t.push(e);return}if(Array.isArray(e)){for(let t of e)r(t);return}let i=Object.getPrototypeOf(e);if(i===Object.prototype||i===null)for(let t of Object.values(e))r(t)};return r(e),t},r=(n,r=[])=>{e?e.postMessage(n,r):t.postMessage(n,r)},i=async e=>{try{let t=await Function(`return (${e.code});`)()(...e.args);r({ok:!0,value:t},n(t))}catch(e){let t=e;r({ok:!1,message:String(t?.message??e),stack:typeof t?.stack==`string`?t.stack:void 0})}};e?e.on(`message`,e=>void i(e)):t.onmessage=e=>void i(e.data)}var dG=e=>{if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return null;let t=URL.createObjectURL(new Blob([`(${uG.toString()})()`],{type:`text/javascript`})),n;try{n=new Worker(t)}catch(e){throw URL.revokeObjectURL(t),e}return n.onmessage=t=>e.reply(t.data),n.onerror=t=>e.fail(Error(t.message||`the worker failed to run`)),n.onmessageerror=()=>e.fail(Error(`the worker sent a reply that could not be deserialized`)),{post:(e,t)=>n.postMessage(e,t),terminate:()=>{n.terminate(),URL.revokeObjectURL(t)}}},fG=e=>{let t=lG();if(!t)return null;let n=new t.Worker(`(${uG.toString()})()`,{eval:!0});return n.on(`message`,t=>e.reply(t)),n.on(`error`,t=>e.fail(t instanceof Error?t:Error(String(t)))),n.on(`messageerror`,()=>e.fail(Error(`the worker sent a reply that could not be deserialized`))),n.on(`exit`,t=>e.fail(Error(`the worker exited with code ${t} before answering`))),{post:(e,t)=>n.postMessage(e,t),terminate:()=>void n.terminate()}};function pG(e){let t=Error(e.message);return e.stack&&(t.stack=e.stack),t}function mG(e,t,n={}){return new Promise((r,i)=>{if(n.signal?.aborted){i(n.signal.reason);return}let a=!1,o,s,c=e=>{a||(a=!0,o!==void 0&&clearTimeout(o),n.signal?.removeEventListener(`abort`,l),s?.terminate(),e())};function l(){c(()=>i(n.signal.reason))}let u={reply:e=>c(()=>{e.ok?r(e.value):i(pG(e))}),fail:e=>c(()=>i(e))};try{s=dG(u)??fG(u)}catch(e){i(e);return}if(!s)i(Error(`spawn() needs Web Workers or node:worker_threads, and this environment offers neither`));else{n.timeout!==void 0&&n.timeout>0&&(o=setTimeout(()=>c(()=>i(Error(`the task did not answer within ${n.timeout} ms`))),n.timeout)),n.signal?.addEventListener(`abort`,l,{once:!0});try{s.post({code:e.toString(),args:t??[]},n.transfer??[])}catch(e){c(()=>i(e))}}})}var hG=1e5,gG={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function _G(e,t={}){return vG(e,t).move}function vG(e,t={}){let n=oG(SG,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}async function yG(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??bG();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=SG.currentPlayer(e),o=sG(SG,e);if(SG.isTerminal(e)||!o.length)return{move:null,score:SG.evaluate(e,a),nodes:0};let s=Math.max(1,Math.min(i,o.length)),c=Array(o.length),l=0,u=!1,d=0,f=t.signal?{signal:t.signal}:{};if(await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let t=await mG(xG,[o[e].child,a,n-1,r],f);l+=t.nodes,t.budgetExceeded?u=!0:c[e]={move:o[e].move,score:t.score}}})),u)return{move:null,score:SG.evaluate(e,a),nodes:l};let p=c.filter(e=>e!==void 0),m=cG(p,!0);return{move:m,score:p.find(e=>e.move===m)?.score??SG.evaluate(e,a),nodes:l}}function bG(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}function xG(e,t,n,r){let i={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0},a=e=>e===`white`?`black`:`white`,o=e=>e&7,s=e=>e>>3,c=(e,t)=>e>=0&&e<8&&t>=0&&t<8,l=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],u=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],d=[[1,1],[-1,1],[-1,-1],[1,-1]],f=[[1,0],[0,1],[-1,0],[0,-1]],p=(e,t,n)=>{let r=o(t),i=s(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!c(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of l){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of u){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let p=[{steps:d,kinds:[`bishop`,`queen`]},{steps:f,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of p)for(let[o,s]of t){let t=r+o,l=i+s;for(;c(t,l);){let r=e[l*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,l+=s}}return!1},m=(e,t)=>{let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n},h=(e,t)=>p(e.board,m(e.board,t),a(t)),g=(e,t)=>{let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=o(t),m=s(t),g=a=>{for(let[o,s]of a){let a=i+o,l=m+s;for(;c(a,l);){let i=l*8+a,c=e.board[i];if(!c)r.push({from:t,to:i});else{c.side!==n.side&&r.push({from:t,to:i});break}a+=o,l+=s}}};switch(n.kind){case`pawn`:{let a=n.side===`white`?1:-1,o=n.side===`white`?1:6,s=n.side===`white`?7:0;if(c(i,m+a)&&!e.board[(m+a)*8+i]){let n=(m+a)*8+i;if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),m===o&&!e.board[(m+2*a)*8+i]&&r.push({from:t,to:(m+2*a)*8+i})}for(let o of[-1,1]){if(!c(i+o,m+a))continue;let l=(m+a)*8+i+o,u=e.board[l];if(u&&u.side!==n.side){if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:m*8+i+o})}break}case`knight`:for(let[a,o]of l){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];(!l||l.side!==n.side)&&r.push({from:t,to:s})}break;case`bishop`:g(d);break;case`rook`:g(f);break;case`queen`:g(d),g(f);break;case`king`:{for(let[a,o]of u){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:s})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!h(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!p(e.board,o+5,a(n.side))&&!p(e.board,o+6,a(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!p(e.board,o+3,a(n.side))&&!p(e.board,o+2,a(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r},_=(e,t)=>{let n=e.board[t.from];if(!n)throw Error(`no piece on ${t.from} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7},i=(e,t)=>{let n=o(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[i(n.side,t.from)]=!1);let s=e.board[t.to];if(s&&s.kind===`rook`&&r(s.side,t.to)&&(e.castling[i(s.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=a(n.side)},v=e=>({board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}),y=e=>{let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of g(e,n)){let n=v(e);_(n,r),!h(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t},b=e=>y(e).length>0?`ongoing`:h(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`,x=(e,t)=>{let n=e.board[t.to];return(t.promotion?i[t.promotion]:0)*10+(n?i[n.kind]:0)},S=(e,t)=>t.slice().sort((t,n)=>x(e,n)-x(e,t)),C=(e,t)=>{let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*i[t.kind]);return t===1?n:-n},ee=(e,t)=>{let n=b(e);return n===`stalemate`||!h(e,e.turn)?0:(n===`white-wins`?1:-1)===t?1e5:-1e5},w=e=>b(e)===`ongoing`?C(e,t):ee(e,t),T=0,E=!1,te=(e,n,i,a)=>{if(++T>r)return E=!0,0;let o=(e.turn===`white`?1:-1)===t;if(n===0||b(e)!==`ongoing`)return w(e);let s=S(e,y(e));if(!s.length)return w(e);let c=o?-1/0:1/0;for(let t of s){let r=v(e),s=g(r,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!s)throw Error(`a legal move stopped being legal: ${t.from}-${t.to}`);_(r,s);let l=te(r,n-1,i,a);if(E)return l;if(o?(c=Math.max(c,l),i=Math.max(i,c)):(c=Math.min(c,l),a=Math.min(a,c)),a<=i)break}return c};return{score:te(e,n,-1/0,1/0),nodes:T,budgetExceeded:E}}var SG={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>TG(e,nG(e)),apply:(e,t)=>{let n=GW(e);return rG(n,t),n},isTerminal:e=>iG(e)!==`ongoing`,evaluate:(e,t)=>iG(e)===`ongoing`?CG(e,t):wG(e,t)};function CG(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*gG[t.kind]);return t===1?n:-n}function wG(e,t){let n=iG(e);return n===`stalemate`||!QW(e,e.turn)?0:(n===`white-wins`?1:-1)===t?hG:-1e5}function TG(e,t){return t.slice().sort((t,n)=>EG(e,n)-EG(e,t))}function EG(e,t){let n=e.board[t.to];return(t.promotion?gG[t.promotion]:0)*10+(n?gG[n.kind]:0)}function DG(e,t){return e.positions[RW(t)]??null}var OG={q:`queen`,r:`rook`,b:`bishop`,n:`knight`};function kG(e){let t=/^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(e);if(!t)throw Error(`not a UCI move: "${e}"`);let n=t[3]?OG[t[3]]:void 0;return n?{from:IW(t[1]),to:IW(t[2]),promotion:n}:{from:IW(t[1]),to:IW(t[2])}}var AG={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5},jG=[`queen`,`rook`,`bishop`,`knight`],MG=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],NG=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],PG=[[1,1],[-1,1],[-1,-1],[1,-1]],FG=[[1,0],[0,1],[-1,0],[0,-1]];function IG(e){return 1n<<BigInt(e)}function LG(e){return Math.log2(Number(e))}function RG(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=IG(o*8+e))}return a})}var zG=RG(MG),BG=RG(NG);function VG(e,t){return e.pieces[t]|e.pieces[t+1]|e.pieces[t+2]|e.pieces[t+3]|e.pieces[t+4]|e.pieces[t+5]}function HG(e,t){let n=IG(t);for(let t=0;t<12;t++)if(e.pieces[t]&n)return t;return-1}function UG(e,t,n){let r=n?0:6,i=t&7,a=t>>3,o=n?a-1:a+1;for(let t of[-1,1]){let n=i+t;if(o>=0&&o<8&&n>=0&&n<8&&e.pieces[r]&IG(o*8+n))return!0}if(zG[t]&e.pieces[r+1]||BG[t]&e.pieces[r+5])return!0;let s=[{steps:PG,kinds:[2,4]},{steps:FG,kinds:[3,4]}];for(let{steps:t,kinds:n}of s)for(let[o,s]of t){let t=i+o,c=a+s;for(;t>=0&&t<8&&c>=0&&c<8;){let i=HG(e,c*8+t);if(i!==-1){if(i>=r&&i<r+6&&n.includes(i-r))return!0;break}t+=o,c+=s}}return!1}function WG(e,t){return e===`white`?t?1:2:t?4:8}function GG(e){let t=Array(12).fill(0n),n=[-1,-1];if(e.board.forEach((e,r)=>{if(!e)return;let i=(e.side===`white`?0:6)+AG[e.kind];t[i]|=IG(r),e.kind===`king`&&(n[e.side===`white`?0:1]=r)}),n[0]===-1||n[1]===-1)throw Error(`a position without both kings cannot go on bitboards`);return{pieces:t,turn:e.turn,castling:+!!e.castling.whiteKingside|(e.castling.whiteQueenside?2:0)|(e.castling.blackKingside?4:0)|(e.castling.blackQueenside?8:0),enPassant:e.enPassant,halfmove:0,kings:n}}function KG(){return GG(WW())}function qG(e){let t=e.turn===`white`,n=t?0:6,r=VG(e,n),i=VG(e,n===0?6:0),a=r|i,o=[],s=[];for(let c=0;c<64;c++){if(!(r&IG(c)))continue;let l=-1;for(let t=0;t<6;t++)if(e.pieces[n+t]&IG(c)){l=t;break}s.length=0,JG(e,c,l,a,i,s);for(let n of s){let r=YG(e,n);UG(e,e.kings[+!t],!t)||o.push({...n}),XG(e,n,r)}}return o}function JG(e,t,n,r,i,a){let o=e.turn===`white`,s=t&7,c=t>>3,l=(e,n)=>{a.push(n?{from:t,to:e,promotion:n}:{from:t,to:e})},u=e=>{for(let[t,n]of e){let e=s+t,a=c+n;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=IG(o);if(!(r&s))l(o);else{i&s&&l(o);break}e+=t,a+=n}}};switch(n){case 0:{let n=o?8:-8,a=o?1:6,u=o?7:0,d=t+n;if(d>=0&&d<64&&!(r&IG(d))){if(d>>3===u)for(let e of jG)l(d,e);else{l(d);let e=t+2*n;c===a&&!(r&IG(e))&&l(e)}}for(let r of[-1,1]){let a=s+r;if(a<0||a>7)continue;let o=t+n+r;if(!(o<0||o>=64)){if(i&IG(o)){if(o>>3===u)for(let e of jG)l(o,e);else l(o)}else o===e.enPassant&&l(o)}}break}case 1:{let n=zG[t]&~VG(e,o?0:6);for(;n;){let e=n&-n;l(LG(e)),n^=e}break}case 2:u(PG);break;case 3:u(FG);break;case 4:u(PG),u(FG);break;case 5:{let n=BG[t]&~VG(e,o?0:6);for(n&=~e.pieces[o?11:5];n;){let e=n&-n;l(LG(e)),n^=e}let i=o?0:56,a=e.castling,s=o?a&1:a&4,c=o?a&2:a&8;t===i+4&&!UG(e,t,!o)&&(s&&!(r&IG(i+5))&&!(r&IG(i+6))&&!UG(e,i+5,!o)&&!UG(e,i+6,!o)&&l(i+6),c&&!(r&IG(i+3))&&!(r&IG(i+2))&&!(r&IG(i+1))&&!UG(e,i+3,!o)&&!UG(e,i+2,!o)&&l(i+2));break}}}function YG(e,t){let n=e.turn===`white`,r=+!n,i=r*6,a=IG(t.from),o=IG(t.to),s=-1;for(let t=0;t<6;t++)if(e.pieces[i+t]&a){s=t;break}if(s===-1)throw Error(`no piece on ${t.from} to move`);let c={captured:null,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kingSquare:e.kings[r]},l=(1-r)*6,u=n?8:-8,d=t.to;s===0&&t.to===e.enPassant&&(d=t.to-u);let f=IG(d);for(let t=0;t<6;t++)if(e.pieces[l+t]&f){c.captured={color:1-r,kind:t},e.pieces[l+t]^=f;break}let p=n?0:56,m=n?56:0;if(s===5&&(e.castling&=~(WG(e.turn,!0)|WG(e.turn,!1))),s===3&&(t.from===p||t.from===p+7)&&(e.castling&=~WG(e.turn,t.from===p+7)),c.captured?.kind===3&&(d===m||d===m+7)&&(e.castling&=~WG(n?`black`:`white`,d===m+7)),e.pieces[i+s]^=a,t.promotion?e.pieces[i+AG[t.promotion]]|=o:e.pieces[i+s]|=o,s===5&&Math.abs(t.to-t.from)===2){let n=i+3;t.to>t.from?e.pieces[n]^=IG(p+7)|IG(p+5):e.pieces[n]^=IG(p)|IG(p+3)}return e.enPassant=s===0&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.halfmove=s===0||c.captured?0:e.halfmove+1,s===5&&(e.kings[r]=t.to),e.turn=n?`black`:`white`,c}function XG(e,t,n){e.turn=e.turn===`white`?`black`:`white`;let r=e.turn===`white`,i=+!r,a=i*6,o=IG(t.to),s=t.promotion?0:(()=>{for(let t=0;t<6;t++)if(e.pieces[a+t]&o)return t;throw Error(`nothing on ${t.to} to take back`)})();if(t.promotion?e.pieces[a+AG[t.promotion]]^=o:e.pieces[a+s]^=o,e.pieces[a+s]|=IG(t.from),s===5&&Math.abs(t.to-t.from)===2){let n=r?0:56,i=a+3;t.to>t.from?e.pieces[i]^=IG(n+7)|IG(n+5):e.pieces[i]^=IG(n)|IG(n+3)}if(n.captured){let a=r?8:-8,o=s===0&&t.to===n.enPassant?t.to-a:t.to;e.pieces[(1-i)*6+n.captured.kind]|=IG(o)}e.castling=n.castling,e.enPassant=n.enPassant,e.halfmove=n.halfmove,e.kings[i]=n.kingSquare}function ZG(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`perft depth must be a non-negative integer`);if(t===0)return 1;let n=0;for(let r of qG(e)){let i=YG(e,r);n+=ZG(e,t-1),XG(e,r,i)}return n}function QG(e,t={}){let n=1e6,r=[100,320,330,500,900,0],i=Math.max(1,Math.floor(t.depth??3)),a=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),o=t.timeMs===void 0?-1:Date.now()+Math.max(1,t.timeMs),s={pieces:e.pieces.slice(),turn:e.turn,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kings:[e.kings[0],e.kings[1]]};function c(e){return 1n<<BigInt(e)}function l(e){return Math.log2(Number(e))}let u=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],d=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[[1,1],[-1,1],[-1,-1],[1,-1]],p=[[1,0],[0,1],[-1,0],[0,-1]];function m(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=c(o*8+e))}return a})}let h=m(u),g=m(d);function _(e){return s.pieces[e]|s.pieces[e+1]|s.pieces[e+2]|s.pieces[e+3]|s.pieces[e+4]|s.pieces[e+5]}function v(e){let t=c(e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e%6;return-1}function y(e,t){let n=t?0:6,r=e&7,i=e>>3,a=t?i-1:i+1;for(let e of[-1,1]){let t=r+e;if(a>=0&&a<8&&t>=0&&t<8&&s.pieces[n]&c(a*8+t))return!0}if(h[e]&s.pieces[n+1]||g[e]&s.pieces[n+5])return!0;let o=[{steps:f,kinds:[2,4]},{steps:p,kinds:[3,4]}];for(let{steps:e,kinds:n}of o)for(let[a,o]of e){let e=r+a,l=i+o;for(;e>=0&&e<8&&l>=0&&l<8;){let r=v(l*8+e);if(r!==-1){if((()=>{let t=c(l*8+e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e<6?0:1;return-1})()===+!t&&n.includes(r))return!0;break}e+=a,l+=o}}return!1}let b=0n,x=11400714819323198485n;function S(){x=x+11400714819323198485n&18446744073709551615n;let e=x;return e=(e^e>>30n)*13787848793156543929n&18446744073709551615n,e=(e^e>>27n)*10723151780598845931n&18446744073709551615n,e^e>>31n}let C=Array.from({length:12},()=>Array.from({length:64},()=>S())),ee=S(),w=Array.from({length:16},()=>S()),T=Array.from({length:8},()=>S());function E(){let e=0n;for(let t=0;t<12;t++){let n=s.pieces[t];for(;n;){let r=n&-n;e^=C[t][l(r)],n^=r}}return s.turn===`black`&&(e^=ee),e^=w[s.castling],s.enPassant!==null&&(e^=T[s.enPassant&7]),e}b=E();function te(e,t){return e===`white`?t?1:2:t?4:8}function D(e){let t=s.turn===`white`,n=+!t,r=n*6,i=c(e.from),a=c(e.to),o=-1;for(let e=0;e<6;e++)if(s.pieces[r+e]&i){o=e;break}let l={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:s.kings[n],key:b,nullMove:!1},u=(1-n)*6,d=t?8:-8,f=e.to;o===0&&e.to===s.enPassant&&(f=e.to-d);let p=c(f);for(let e=0;e<6;e++)if(s.pieces[u+e]&p){l.captured={color:1-n,kind:e},s.pieces[u+e]^=p;break}let m=t?0:56,h=t?56:0;o===5&&(s.castling&=~(te(s.turn,!0)|te(s.turn,!1))),o===3&&(e.from===m||e.from===m+7)&&(s.castling&=~te(s.turn,e.from===m+7)),l.captured&&l.captured.kind===3&&(f===h||f===h+7)&&(s.castling&=~te(t?`black`:`white`,f===h+7));let g={queen:4,rook:3,bishop:2,knight:1};if(s.pieces[r+o]^=i,e.promotion?s.pieces[r+g[e.promotion]]|=a:s.pieces[r+o]|=a,o===5&&Math.abs(e.to-e.from)===2){let t=r+3;e.to>e.from?s.pieces[t]^=c(m+7)|c(m+5):s.pieces[t]^=c(m)|c(m+3)}return s.enPassant=o===0&&Math.abs(e.to-e.from)===16?(e.from+e.to)/2:null,s.halfmove=o===0||l.captured?0:s.halfmove+1,o===5&&(s.kings[n]=e.to),s.turn=t?`black`:`white`,b=E(),l}function O(e,t){s.turn=s.turn===`white`?`black`:`white`;let n=s.turn===`white`,r=+!n,i=r*6,a=c(e.to),o=e.promotion?0:(()=>{for(let e=0;e<6;e++)if(s.pieces[i+e]&a)return e;return-1})(),l={queen:4,rook:3,bishop:2,knight:1};if(e.promotion?s.pieces[i+l[e.promotion]]^=a:s.pieces[i+o]^=a,s.pieces[i+o]|=c(e.from),o===5&&Math.abs(e.to-e.from)===2){let t=n?0:56,r=i+3;e.to>e.from?s.pieces[r]^=c(t+7)|c(t+5):s.pieces[r]^=c(t)|c(t+3)}if(t.captured){let i=n?8:-8,a=o===0&&e.to===t.enPassant?e.to-i:e.to;s.pieces[(1-r)*6+t.captured.kind]|=c(a)}s.castling=t.castling,s.enPassant=t.enPassant,s.halfmove=t.halfmove,s.kings[r]=t.kingSquare,b=t.key}function ne(){let e={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:-1,key:b,nullMove:!0};return s.enPassant=null,s.halfmove+=1,s.turn=s.turn===`white`?`black`:`white`,b=E(),e}function k(e){s.turn=s.turn===`white`?`black`:`white`,s.enPassant=e.enPassant,s.halfmove=e.halfmove,b=e.key}function A(e,t,n,r,i){let a=s.turn===`white`,o=e&7,u=e>>3,d=(t,n)=>{i.push(n?{from:e,to:t,promotion:n}:{from:e,to:t})},m=e=>{for(let[t,i]of e){let e=o+t,a=u+i;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=c(o);if(!(n&s))d(o);else{r&s&&d(o);break}e+=t,a+=i}}},v=[`queen`,`rook`,`bishop`,`knight`];if(t===0){let t=a?8:-8,i=a?1:6,l=a?7:0,f=e+t;if(f>=0&&f<64&&!(n&c(f))){if(f>>3===l)for(let e of v)d(f,e);else{d(f);let r=e+2*t;u===i&&!(n&c(r))&&d(r)}}for(let n of[-1,1]){let i=o+n;if(i<0||i>7)continue;let a=e+t+n;if(!(a<0||a>=64)){if(r&c(a)){if(a>>3===l)for(let e of v)d(a,e);else d(a)}else a===s.enPassant&&d(a)}}}else if(t===1){let t=h[e]&~_(a?0:6);for(;t;){let e=t&-t;d(l(e)),t^=e}}else if(t===2)m(f);else if(t===3)m(p);else if(t===4)m(f),m(p);else{let t=g[e]&~_(a?0:6);for(t&=~s.pieces[a?11:5];t;){let e=t&-t;d(l(e)),t^=e}let r=a?0:56,i=s.castling,o=a?i&1:i&4,u=a?i&2:i&8;e===r+4&&!y(e,!a)&&(o&&!(n&c(r+5))&&!(n&c(r+6))&&!y(r+5,!a)&&!y(r+6,!a)&&d(r+6),u&&!(n&c(r+3))&&!(n&c(r+2))&&!(n&c(r+1))&&!y(r+3,!a)&&!y(r+2,!a)&&d(r+2))}}function re(){let e=s.turn===`white`,t=e?0:6,n=_(t),r=_(t===0?6:0),i=n|r,a=[],o=[];for(let l=0;l<64;l++){if(!(n&c(l)))continue;let u=-1;for(let e=0;e<6;e++)if(s.pieces[t+e]&c(l)){u=e;break}o.length=0,A(l,u,i,r,o);for(let t of o){let n=D(t);y(s.kings[+!e],!e)||a.push({...t}),O(t,n)}}return a}function ie(e){let t=e?0:6;return s.pieces[t+1]!==0n||s.pieces[t+2]!==0n||s.pieces[t+3]!==0n||s.pieces[t+4]!==0n}function ae(){let e=0,t=0;for(let n=0;n<12;n++){if(n%6==5)continue;let r=s.pieces[n];for(;r;)r&=r-1n,e++,(n%6==1||n%6==2)&&t++}return e===0||e===1&&t===1}function oe(){let e=0,t=0;for(let n=0;n<12;n++){let r=s.pieces[n];for(;r;)r&=r-1n,n%6==4?e++:n%6!=5&&n%6!=0&&t++}return e===0||e===2&&t<=2}function se(e,t,n,r){let i=t&7,a=n?t>>3:7-(t>>3),o=3.5-Math.abs(i-3.5),s=3.5-Math.abs(a-3.5);return e===0?(a-1)*12+Math.max(0,o)*4:e===1?(o+s)*6-12:e===2?(o+s)*4:e===3?(o+s)*2+(a===6?12:0):e===4?(o+s)*2:r?(o+s)*10:-a*10+o*2}function j(){let e=oe(),t=0;for(let n=0;n<12;n++){let i=n<6,a=n%6,o=s.pieces[n];for(;o;){let n=o&-o,s=l(n),c=r[a]+se(a,s,i,e);t+=i?c:-c,o^=n}}return s.turn===`white`?t:-t}let ce=65536,le=Array(ce).fill(-1n),ue=Array(ce).fill(-1),de=Array(ce).fill(0),fe=Array(ce).fill(0),pe=Array(ce).fill(0);function me(e){let t=e.promotion===`queen`?1:e.promotion===`rook`?2:e.promotion===`bishop`?3:e.promotion===`knight`?4:0;return e.from|e.to<<6|t<<12}function he(e,t,n,r){let i=Number(b&BigInt(65535));if(le[i]!==b)return{score:null,move:0};let a=pe[i];if(ue[i]<e)return{score:null,move:a};let o=de[i];o>99e3?o-=r:o<-99e3&&(o+=r);let s=fe[i];return s===0||s===1&&o>=n||s===2&&o<=t?{score:o,move:a}:{score:null,move:a}}function ge(e,t,n,r,i){let a=Number(b&BigInt(65535));if(le[a]===b&&ue[a]>e)return;let o=t;t>99e3?o+=i:t<-99e3&&(o-=i),le[a]=b,ue[a]=e,de[a]=o,fe[a]=n,pe[a]=r}let _e=Array.from({length:64},()=>[0,0]),ve=Array.from({length:2},()=>Array.from({length:64},()=>Array(64).fill(0)));function M(e){let t=s.turn===`white`?6:0,n=c(e);for(let e=4;e>=0;e--)if(s.pieces[t+e]&n)return e;return-1}function N(e,t,n){let i=s.turn===`white`?0:1,a=e.map(e=>{let a=me(e);if(a===t)return 3e6;let o=M(e.to),c=v(e.from),l=e.to===s.enPassant&&c===0;if(o!==-1||l){let t=2e6+(l?r[0]:r[o])*8-c;return e.promotion&&(t+=900),t}return e.promotion?15e5:n<64?_e[n][0]===a?1e6:_e[n][1]===a?9e5:ve[i][e.from][e.to]:0}),o=e.map((e,t)=>t);for(let e=0;e<o.length;e++){let t=e;for(let n=e+1;n<o.length;n++)a[o[n]]>a[o[t]]&&(t=n);[o[e],o[t]]=[o[t],o[e]]}return o}let ye=0,be=!1,P=[];function xe(){return be?!0:ye>a||t.signal?.aborted||o!==-1&&!(ye&2047)&&Date.now()>=o?(be=!0,!0):!1}function Se(e,t,n){if(ye++,xe())return 0;let i=s.turn===`white`;if(s.halfmove>=100||ae())return 0;if(y(s.kings[+!i],!i))return F(1,e,t,n,!1);let a=j();if(a>=t)return t;a>e&&(e=a);let o=re().filter(e=>{if(e.promotion||e.to===s.enPassant&&v(e.from)===0)return!0;let t=i?6:0,n=c(e.to);for(let e=0;e<5;e++)if(s.pieces[t+e]&n)return!0;return!1}),l=N(o,0,Math.min(n,63));for(let i of l){let s=o[i],c=M(s.to);if(a+(c===-1?900:r[c])+200<e)continue;let l=D(s);P.push(b);let u=-Se(-t,-e,n+1);if(P.pop(),O(s,l),be)return 0;if(u>=t)return t;u>e&&(e=u)}return e}function F(e,t,n,r,i){if(ye++,xe())return 0;let a=s.turn===`white`;if(s.halfmove>=100||ae())return 0;let o=0;for(let e of P)if(e===b&&++o>=2)return 0;if(r>=64)return j();if(e<=0)return Se(t,n,r);let c=y(s.kings[+!a],!a),l=he(e,t,n,r);if(l.score!==null)return l.score;if(c)i=!1;else if(i&&e>=3&&ie(a)&&n<99e3){let t=e>4?3:2,i=ne();P.push(b);let a=-F(e-1-t,-n,-n+1,r+1,!1);if(P.pop(),k(i),be)return 0;if(a>=n)return n}let u=re();if(u.length===0)return c?-(1e5-r):0;let d=N(u,l.move,Math.min(r,63)),f=+!a,p=-1e6,m=0,h=2;for(let i=0;i<d.length;i++){let a=u[d[i]],o=me(a),l=M(a.to)!==-1||a.to===s.enPassant&&v(a.from)===0,g=D(a);P.push(b);let _;if(i===0)_=-F(e-1,-n,-t,r+1,!0);else{let o=0;e>=3&&i>=4&&!l&&!a.promotion&&!c&&(o=1),o>0?(_=-F(e-1-o,-t-1,-t,r+1,!0),!be&&_>t&&(_=-F(e-1,-n,-t,r+1,!0))):(_=-F(e-1,-t-1,-t,r+1,!0),!be&&_>t&&_<n&&(_=-F(e-1,-n,-t,r+1,!0)))}if(P.pop(),O(a,g),be)return 0;if(_>p&&(p=_,m=o),_>t&&(t=_,h=+(_>=n),!l&&!a.promotion&&r<64&&(ve[f][a.from][a.to]+=e*e,_e[r][0]!==o&&(_e[r][1]=_e[r][0],_e[r][0]=o))),t>=n)break}return ge(e,p,h,m,r),p}let Ce=re();if(Ce.length===0){let e=s.turn===`white`;return{move:null,score:y(s.kings[+!e],!e)?-1e5:0,nodes:ye,depth:0}}P.push(b);let we={from:Ce[0].from,to:Ce[0].to,...Ce[0].promotion?{promotion:Ce[0].promotion}:{}},Te=-1e6,Ee=0,De=Ce.map(e=>({...e}));for(let e=1;e<=i;e++){let t=-1e6,r=n,i=!1,a=we,o=Te;e>=4&&Ee>0&&(i=!0,t=Te-24,r=Te+24);for(let s=0;s<3;s++){let s=t,c=r,l=a,u=-1e6,d=N(De,me({from:a.from,to:a.to,promotion:a.promotion}),0),f=[];for(let n=0;n<d.length;n++){let i=De[d[n]],a=D(i);P.push(b);let o;if(n===0?o=-F(e-1,-r,-t,1,!0):(o=-F(e-1,-t-1,-t,1,!0),!be&&o>t&&o<r&&(o=-F(e-1,-r,-t,1,!0))),P.pop(),O(i,a),be)break;f.push(i),o>u&&(u=o,l=i),o>t&&(t=o)}if(be)break;for(let e of De)f.includes(e)||f.push(e);if(De=f,a=l,o=u,!i)break;if(u<=s||u>=c)t=-1e6,r=n,i=!1;else break}if(be||(we=a,Te=o,De=[we,...De.filter(e=>e!==we)],Ee=e,Te>99e3||Te<-99e3)||xe())break}return P.pop(),Ee===0?{move:null,score:j(),nodes:ye,depth:0}:{move:we,score:Te,nodes:ye,depth:Ee}}function $G(e){let t=`pieces`in e?e:GG(e);return{pieces:t.pieces.slice(),turn:t.turn,castling:t.castling,enPassant:t.enPassant,halfmove:t.halfmove,kings:[t.kings[0],t.kings[1]]}}function eK(e,t={}){return QG($G(e),{depth:t.depth,maxNodes:t.maxNodes,timeMs:t.timeMs,signal:t.signal})}function tK(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}async function nK(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??tK();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=$G(e),o=qG(a);if(!o.length)return{...QG(a,{depth:n,maxNodes:r}),rootScores:[]};let s=Math.max(1,Math.min(i,o.length)),c=o.map(e=>{let t=$G(a);return YG(t,e),t}),l=Array(o.length),u=0,d=0,f=t.signal?{signal:t.signal}:{};await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let i=await mG(QG,[c[e],{depth:Math.max(1,n-1),maxNodes:r,timeMs:t.timeMs}],f);u+=i.nodes,l[e]=-i.score}}));let p=0;for(let e=1;e<o.length;e++)(l[e]??-1/0)>(l[p]??-1/0)&&(p=e);let m=o[p];return{move:{from:m.from,to:m.to,...m.promotion?{promotion:m.promotion}:{}},score:l[p]??0,nodes:u,depth:n,rootScores:o.map((e,t)=>({move:{from:e.from,to:e.to,...e.promotion?{promotion:e.promotion}:{}},score:l[t]??0}))}}var rK={queen:`Q`,rook:`R`,bishop:`B`,knight:`N`},iK={Q:`queen`,R:`rook`,B:`bishop`,N:`knight`},aK={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5};function oK(e){let t={queen:0,rook:1,bishop:2,knight:3};return`K${e.slice().sort((e,n)=>t[e]-t[n]).map(e=>rK[e]).join(``)}K`}var sK=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;function cK(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=n+1<e.length?e[n+1]:0,a=n+2<e.length?e[n+2]:0;t+=sK[r>>2]+sK[(r&3)<<4|i>>4],t+=n+1<e.length?sK[(i&15)<<2|a>>6]:`=`,t+=n+2<e.length?sK[a&63]:`=`}return t}function lK(e){if(e.length%4!=0)throw Error(`tablebase data is not base64: length is not a multiple of 4`);let t=Array(e.length);for(let n=0;n<e.length;n++){if(e[n]===`=`){t[n]=-1;continue}let r=sK.indexOf(e[n]);if(r===-1)throw Error(`tablebase data is not base64: ${e[n]}`);t[n]=r}let n=[];for(let e=0;e<t.length;e+=4){let[r,i,a,o]=[t[e],t[e+1],t[e+2],t[e+3]];if(r===-1||i===-1)throw Error(`tablebase data is not base64: padding inside a quantum`);n.push(r<<2|i>>4),a!==-1&&n.push((i&15)<<4|a>>2),o!==-1&&n.push((a&3)<<6|o)}return new Uint8Array(n)}function uK(e){let t=Array(256).fill(0);for(let n of e)t[n]++;let n=t.map((e,t)=>({count:e,symbol:t})).filter(e=>e.count>0),r=[1,n.length];if(n.length===0)return cK(new Uint8Array([1,0,0,0,0,0]));if(n.length===1){r.push(n[0].symbol,0);let t=new Uint8Array(r.length+4);return t.set(r,0),t[r.length]=e.length&255,t[r.length+1]=e.length>>8&255,t[r.length+2]=e.length>>16&255,t[r.length+3]=e.length>>24&255,cK(t)}let i=dK(n.map(e=>e.count)),a=n.map((e,t)=>({symbol:e.symbol,length:i[t]})).sort((e,t)=>e.symbol-t.symbol);for(let e of a)r.push(e.symbol);for(let e of a)r.push(e.length);let o=fK(a),s=new Map;for(let e=0;e<a.length;e++)s.set(a[e].symbol,o[e]);let c=0;for(let e of n)c+=e.count*s.get(e.symbol).length;let l=new Uint8Array(r.length+4+Math.ceil(c/8));l.set(r,0),l[r.length]=e.length&255,l[r.length+1]=e.length>>8&255,l[r.length+2]=e.length>>16&255,l[r.length+3]=e.length>>24&255;let u=0,d=r.length+4;for(let t of e){let e=s.get(t);for(let t=e.length-1;t>=0;t--)e.code>>t&1&&(l[d+(u>>3)]|=1<<7-(u&7)),u++}return cK(l)}function dK(e){let t=e.length;if(t===0)return[];let n=e.slice(),r=Array(t).fill(0),i=e.map((e,t)=>t),a=[];for(;i.length>1;){i.sort((e,t)=>n[e]-n[t]);let e=i.shift(),t=i.shift();a.push([e,t]),n[e]+=n[t],n[t]=-1,i.push(e)}for(let e=a.length-1;e>=0;e--){let[t,n]=a[e];r[n]=r[t]+1,r[t]++}if(r.some(e=>e>32))throw Error(`tablebase Huffman code too deep`);return r}function fK(e){let t=e.slice().sort((e,t)=>e.length-t.length||e.symbol-t.symbol),n=0,r=t[0].length,i=new Map;for(let e of t)n<<=e.length-r,i.set(e.symbol,{code:n,length:e.length}),n++,r=e.length;return e.map(e=>i.get(e.symbol))}function pK(e){let t=lK(e);if(t.length<2)throw Error(`tablebase data holds no header`);if(t[0]!==1)throw Error(`tablebase data version ${t[0]} is not 1`);let n=t[1];if(2+2*n>t.length)throw Error(`tablebase data ends inside its header`);let r=[],i=[];for(let e=0;e<n;e++)r.push(t[2+e]);for(let e=0;e<n;e++)i.push(t[2+n+e]);let a=2+2*n;if(n===0){if(a+4!==t.length)throw Error(`tablebase data trails its empty header`);return new Uint8Array}if(n===1){if(a+4!==t.length)throw Error(`tablebase data trails its single-symbol header`);let e=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24;return new Uint8Array(e).fill(r[0])}if(a+4>t.length)throw Error(`tablebase data ends before its count`);let o=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24,s=r.map((e,t)=>({symbol:e,length:i[t]})),c=fK(s),l={};for(let e=0;e<s.length;e++){let t=l;for(let n=c[e].length-1;n>=0;n--){let r=c[e].code>>n&1;n===0?r?t.one={symbol:s[e].symbol}:t.zero={symbol:s[e].symbol}:(r?t.one=t.one??{}:t.zero=t.zero??{},t=r?t.one:t.zero)}}let u=new Uint8Array(o),d=0,f=0,p=a+4,m=(t.length-p)*8;for(;d<o;){if(f>=m)throw Error(`tablebase data ends before its count`);let e=l;for(;;){let n=t[p+(f>>3)]>>7-(f&7)&1;if(f++,e=n?e.one:e.zero,!e)throw Error(`tablebase data walks off its Huffman tree`);if(e.symbol!==void 0)break}u[d++]=e.symbol}for(;f<m;f++)if(t[p+(f>>3)]>>7-(f&7)&1)throw Error(`tablebase data does not end in zero padding`);return u}function mK(e){let t=pK(e);if(t.length%2!=0)throw Error(`tablebase distances are not byte pairs`);let n=new Uint16Array(t.length/2);for(let e=0;e<n.length;e++)n[e]=t[2*e]|t[2*e+1]<<8;return n}function hK(e){if(e.version!==1)throw Error(`${e.id}: unknown tablebase version ${String(e.version)}`);if(e.id!==oK(e.white))throw Error(`${e.id}: id does not match its extras`);for(let t of e.white)if(!iK[rK[t]])throw Error(`${e.id}: not a tablebase piece: ${String(t)}`);let t=2+e.white.length,n=1;for(let e=0;e<t;e++)n*=64;if(n*=2,e.positions!==n)throw Error(`${e.id}: claims ${e.positions} positions, holds ${n}`);let r=pK(e.wdl);if(r.length!==n)throw Error(`${e.id}: WDL decodes to ${r.length} positions, needs ${n}`);let i=mK(e.dtm);if(i.length!==n)throw Error(`${e.id}: distances decode to ${i.length} positions, need ${n}`);let a={queen:0,rook:1,bishop:2,knight:3};return{id:e.id,extras:e.white.slice().sort((e,t)=>a[e]-a[t]).map(e=>aK[e]),positions:n,wdl:r,dtm:i}}function gK(e){if(`pieces`in e){let t=[];for(let n=0;n<12;n++){let r=e.pieces[n];for(;r;){let e=r&-r;t.push({kind:n%6,side:n<6?`white`:`black`,square:Math.log2(Number(e))}),r^=e}}return t}let t=[];return e.board.forEach((e,n)=>{e&&t.push({kind:aK[e.kind],side:e.side,square:n})}),t}function _K(e){if(`pieces`in e)return e.castling!==0;let t=e.castling;return t.whiteKingside||t.whiteQueenside||t.blackKingside||t.blackQueenside}function vK(e,t,n=0){if(!Number.isInteger(n)||n<0)throw RangeError(`halfmove must be a non-negative integer`);let r=gK(t),i=r.filter(e=>e.kind===5&&e.side===`white`),a=r.filter(e=>e.kind===5&&e.side===`black`);if(i.length!==1||a.length!==1||r.some(e=>e.kind===0)||r.some(e=>e.kind!==5&&e.side===`black`)||_K(t))return null;let o=r.filter(e=>e.kind!==5).sort((e,t)=>t.kind-e.kind).map(e=>e.kind);if(!o.length)return null;let s={4:`Q`,3:`R`,2:`B`,1:`N`},c=e[`K${o.map(e=>s[e]).join(``)}K`];if(!c)return null;let l=r.find(e=>e.kind===5&&e.side===`white`).square,u=r.find(e=>e.kind===5&&e.side===`black`).square,d=o.map((e,t)=>r.filter(t=>t.kind===e&&t.side===`white`).map(e=>e.square).sort((e,t)=>e-t)[yK(o,e,t)]),f=l;for(let e of d)f=f*64+e;f=f*64+u,f=f*2+ +(t.turn===`black`);let p=c.wdl[f];if(p===0)return null;let m=c.dtm[f],h=p===3?`win`:p===1?`loss`:`draw`;return h!==`draw`&&m>100-n&&(h=`draw`),{outcome:h,dtm:m}}function yK(e,t,n){let r=0;for(let i=0;i<n;i++)e[i]===t&&r++;return r}_e();var bK=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return nr(this.width,e,t)}inside(e,t){return tr(this.width,this.height,e,t)}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function xK(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function SK(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>wK(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>wK(e,t,!1)):[]}function CK(e,t){if(!SK(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||wK(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function wK(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function TK(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function EK(e,t,n){let r=AK(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0,s=null;for(let t of jK(e.size,r)){if(i[t]!==a||NK(i,e.size,t)!==0)continue;let n=MK(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(NK(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&NK(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function DK(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function OK(e){return e.passes>=2?`finished`:`ongoing`}function kK(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=MK(e.board,e.size,r),a=new Set;for(let t of i)for(let n of jK(e.size,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function AK(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function jK(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function MK(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of jK(t,n))a.push(e)}}return i}function NK(e,t,n){let r=MK(e,t,n),i=new Set;for(let n of r)for(let r of jK(t,n))e[r]===null&&i.add(r);return i.size}function PK(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function FK(){let e=YK(2,6);return e[0]===e[1]?[...e,...e]:e}function IK(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t)if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;RK(e,t,n)&&c.push({from:`bar`,to:t,die:r})}else for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):RK(e,i,n)&&c.push({from:t,to:i,die:r})}return c}function LK(e,t){if(!IK(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function RK(e,t,n){return e.points[t]*n>=-1}function zK(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function BK(e){return oe(e)}function VK(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function HK(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function UK(e){let t=zK();return e===void 0?BK(t):E(e,()=>BK(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function WK(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function GK(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!JK(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function KK(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function qK(e){return e.foundations.every(e=>e.length===13)}function JK(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function YK(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>ne(1,t))}function XK(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return YK(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var ZK=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=YK(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ne(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function QK(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function $K(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function eq(e,t,n){return uq(e,t,n)&&!lq(e,t,n)}function tq(e,t){if(!eq(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function nq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=mq(e,n,pq(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||lq(e,o,a))continue;let s=hq(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function rq(e,t){let n=nq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=cq(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function iq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function aq(e,t,n){let r=cq(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||fq(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function oq(e,t,n,r){let i=cq(e,t),a=cq(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(fq(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function sq(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=t.maxActions??t.actions,t.overwatch=!1)}function cq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function lq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function uq(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function dq(e,t,n){return e.shape===`hex`?Jn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function fq(e,t,n){return e.shape===`hex`?Yn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function pq(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&dq(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function mq(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of dq(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function hq(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of dq(e,t.x,t.y)){let a=`${i.x},${i.y}`;uq(e,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!lq(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var gq=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return tr(this.width,this.height,e,t)}index(e,t){return this.inside(e,t)?nr(this.width,e,t):-1}};function _q(e){return{currency:e,pool:[]}}function vq(e,t,n,r){return e.currency<r||!eq(t,n.x,n.y)?!1:(tq(t,n),e.currency-=r,!0)}function yq(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!eq(t,r,i)?!1:(tq(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function bq(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function xq(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function Sq(e,t,n,r){return e.currency+=xq(t,n,r),e.currency}_e();function Cq(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function wq(e,t,n,r,i=!1){if(!Pq(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function Tq(e,t,n){return Pq(e,t,n)&&Lq(e,t,n)<1/0&&!Fq(e,t,n)}function Eq(e,t){if(!Tq(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function Dq(e,t){let n=Nq(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=Rq(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||Lq(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function Oq(e,t){let n=Dq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=Nq(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function kq(e,t,n){let r=Nq(e,t),i=Nq(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(Yn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[Aq(e,r,i)];return i.hp>0&&a.push(Aq(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function Aq(e,t,n){let r=Iq(e,n.x,n.y).defense,i=A(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function jq(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function Mq(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function Nq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function Pq(e,t,n){return tr(e.width,e.height,t,n)}function Fq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function Iq(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function Lq(e,t,n){return Iq(e,t,n).moveCost}function Rq(e,t,n,r){let i=[],a=(e,t)=>{[i[e],i[t]]=[i[t],i[e]]},o=e=>{i.push(e);let t=i.length-1;for(;t>0;){let e=t-1>>1;if(i[e].cost<=i[t].cost)break;a(t,e),t=e}},s=()=>{if(i.length===0)return;let e=i[0],t=i.pop();if(i.length>0){i[0]=t;let e=0;for(;;){let t=e*2+1,n=t+1,r=e;if(t<i.length&&i[t].cost<i[r].cost&&(r=t),n<i.length&&i[n].cost<i[r].cost&&(r=n),r===e)break;a(e,r),e=r}}return e},c=new Map([[`${t.x},${t.y}`,0]]);for(o({x:t.x,y:t.y,cost:0});;){let t=s();if(t===void 0)break;let i=`${t.x},${t.y}`;if(!(t.cost>(c.get(i)??1/0)))for(let i of Jn(t.x,t.y)){if(!Pq(e,i.x,i.y))continue;let a=Lq(e,i.x,i.y);if(a===1/0||r.has(`${i.x},${i.y}`))continue;let s=t.cost+a;if(s>n)continue;let l=`${i.x},${i.y}`;s<(c.get(l)??1/0)&&(c.set(l,s),o({x:i.x,y:i.y,cost:s}))}}return c}var zq=l({BoardGrid:()=>bK,DiceCup:()=>ZK,FactionFog:()=>gq,addSkirmishUnit:()=>Eq,addTacticalUnit:()=>tq,applyBackgammonMove:()=>LK,applyCheckersMove:()=>CK,applyMove:()=>rG,applyUpkeep:()=>Sq,armyIncome:()=>xq,backgammonMoves:()=>IK,bankUnit:()=>bq,bitboardFromChess:()=>GG,bitboardMoves:()=>qG,canPlaceSkirmishUnit:()=>Tq,canPlaceTacticalUnit:()=>eq,checkersMoves:()=>SK,chessGame:()=>SG,chooseMove:()=>_G,cloneChess:()=>GW,createDeck:()=>zK,deal:()=>VK,dealSolitaire:()=>UK,drawSolitaire:()=>WK,endSkirmishTurn:()=>Mq,endTacticalTurn:()=>sq,gameResult:()=>iG,goResult:()=>OK,goScore:()=>kK,huffDecode:()=>pK,huffEncode:()=>uK,inCheck:()=>QW,legalMoves:()=>nG,loadTablebaseEnding:()=>hK,makeMove:()=>YG,moveSkirmishUnit:()=>Oq,moveSolitaireTableau:()=>GK,moveSolitaireToFoundation:()=>KK,moveTacticalUnit:()=>rq,parseFen:()=>zW,parseUciMove:()=>kG,passGo:()=>DK,perft:()=>ZG,playGo:()=>EK,positionKey:()=>RW,probeBook:()=>DG,probeTablebase:()=>vK,recall:()=>yq,recruit:()=>vq,rollBackgammonDice:()=>FK,rollDice:()=>YK,rollExpression:()=>XK,scoreDice:()=>QK,search:()=>vG,searchAsync:()=>yG,searchTourney:()=>eK,searchTourneyAsync:()=>nK,setSkirmishTerrain:()=>wq,setTacticalOverwatch:()=>iq,shuffleDeck:()=>BK,skirmishAttack:()=>kq,skirmishIncome:()=>jq,skirmishMoves:()=>Dq,solitaireWon:()=>qK,sq:()=>IW,squareName:()=>LW,startingArmy:()=>_q,startingBackgammon:()=>PK,startingBitboard:()=>KG,startingCheckers:()=>xK,startingChess:()=>WW,startingGo:()=>TK,startingSkirmish:()=>Cq,startingTactics:()=>$K,tablebaseId:()=>oK,tacticalAttack:()=>oq,tacticalMoves:()=>nq,tourneyThink:()=>QG,trickWinner:()=>HK,triggerTacticalOverwatch:()=>aq,unmakeMove:()=>XG});function Bq(e){let t;try{t=IN(e)}catch(t){return console.warn(`${t.message} - "${e}" will be silent`),Vq()}return new Audio(t)}function Vq(){return{play(){},pause(){},currentTime:0,volume:1,loop:!1}}var Hq=new p,Uq=class{constructor(e,t={}){this.next=0,this.suspended_=!1,this.plays=0;let n=Math.max(1,t.poolSize??4),r=t.create??Bq;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1,t=1){if(this.suspended_)return;this.plays++;let n=this.pool[this.next];this.next=(this.next+1)%this.pool.length,n.volume=this.volume*e,n.playbackRate=t,n.currentTime=0,Promise.resolve(n.play()).catch(()=>{}),this.caption&&Hq.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}suspend(){this.suspended_=!0,this.stopAll()}resume(){this.suspended_=!1}get isSuspended(){return this.suspended_}};function Wq(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*qq(t,d,s,e)}return Yq(l,o)}function Gq(e={},t=e=>new Audio(e)){let n=t(Wq(e));return Promise.resolve(n.play()).catch(()=>{}),n}function Kq(e={},t={}){return new Uq(Wq(e),t)}function qq(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return Jq(n,r)}}function Jq(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function Yq(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);Xq(i,0,`RIFF`),i.setUint32(4,36+n,!0),Xq(i,8,`WAVE`),Xq(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),Xq(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function Xq(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function Zq(e,t){let[n,r]=e,i=n*4*eJ[t]/r;if(!Number.isInteger(i)||i<1)throw Error(`a ${t} grid does not cut a ${n}/${r} bar into whole slots (it needs ${i})`);return i}function Qq(e,t){return e/eJ[t]}function $q(e){if(typeof e!=`object`||!e)throw Error(`a groove template must be an object`);let{name:t,timeSignature:n,ppq:r,tempoBpm:i,subdivision:a,offsets:o}=e;if(typeof t!=`string`||t.length===0)throw Error(`a groove template needs a non-empty name`);if(!Array.isArray(n)||n.length!==2)throw Error(`groove template "${t}": timeSignature must be [beats, beatValue]`);let[s,c]=n;if(!Number.isInteger(s)||s<1)throw Error(`groove template "${t}": time signature numerator must be a positive integer, got ${String(s)}`);if(!Number.isInteger(c)||c<1||c&c-1)throw Error(`groove template "${t}": time signature denominator must be a power of two, got ${String(c)}`);if(!Number.isInteger(r)||r<1)throw Error(`groove template "${t}": ppq must be a positive integer, got ${String(r)}`);if(!Number.isFinite(i)||i<=0)throw Error(`groove template "${t}": tempoBpm must be greater than 0, got ${String(i)}`);if(a!==`8n`&&a!==`16n`&&a!==`32n`)throw Error(`groove template "${t}": subdivision must be 8n, 16n or 32n, got ${String(a)}`);let l=Qq(r,a);if(!Number.isInteger(l)||l<1)throw Error(`groove template "${t}": ${r} ppq does not cut into whole ${a} ticks (it needs ${String(l)})`);let u=Zq(n,a);if(!Array.isArray(o)||o.length!==u)throw Error(`groove template "${t}": a ${a} grid in ${s}/${c} has ${u} slots, this carries ${Array.isArray(o)?o.length:String(o)}`);o.forEach((e,n)=>{if(typeof e!=`object`||!e)throw Error(`groove template "${t}": slot ${n} must be an object`);if(e.subdivisionIndex!==n)throw Error(`groove template "${t}": slots must run in order, slot ${n} carries ${String(e.subdivisionIndex)}`);if(!Number.isInteger(e.timeOffsetTicks))throw Error(`groove template "${t}": slot ${n} has a fractional timeOffsetTicks (${String(e.timeOffsetTicks)}); ticks are whole numbers`);if(!Number.isFinite(e.velocityFactor)||e.velocityFactor<0)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${String(e.velocityFactor)}, which must be a finite number of at least 0`)})}var eJ,tJ=s((()=>{eJ={"8n":2,"16n":4,"32n":8}}));function nJ(e){let t=e.intensity;if(!Number.isFinite(t)||t<0||t>1)throw Error(`humanization intensity must be between 0 and 1, got ${String(e.intensity)}`);let n=e.timingVarianceMs??xJ;if(!Number.isFinite(n)||n<0)throw Error(`timingVarianceMs must be a finite number of at least 0, got ${String(e.timingVarianceMs)}`);let r=e.velocityVariance??SJ;if(!Number.isFinite(r)||r<0)throw Error(`velocityVariance must be a finite number of at least 0, got ${String(e.velocityVariance)}`);let i=e.style?CJ[e.style]:wJ,a=e.grooveTemplate??null;return a&&$q(a),{intensity:t,timingMs:n,velocityVariance:r,timingScale:i.timing,velocityScale:i.velocity,template:a,warn:e.onWarn??(e=>console.warn(e))}}function rJ(e){let t=[];for(let n of e)n.type===`tempo`&&t.push({tick:n.tick,microsecondsPerQuarter:n.microsecondsPerQuarter});t.sort((e,t)=>e.tick-t.tick);let n=[{tick:0,microsecondsPerQuarter:5e5}];for(let e of t)e.tick===n[n.length-1].tick?n[n.length-1]=e:n.push(e);return n}function iJ(e,t){let n=0,r=e.length-1,i=0;for(;n<=r;){let a=n+r>>1;e[a].tick<=t?(i=a,n=a+1):r=a-1}return 6e7/e[i].microsecondsPerQuarter}function aJ(e,t,n){return e*t*n/6e4}function oJ(e,t,n){return e*6e4/(t*n)}function sJ(e){let t=null;return()=>{if(t!==null){let e=t;return t=null,e}let n=Math.sqrt(-2*Math.log(1-e.float())),r=2*Math.PI*e.float();return t=n*Math.sin(r),n*Math.cos(r)}}function cJ(e){let t=new Uint8Array(256);for(let e=0;e<256;e++)t[e]=e;for(let n=255;n>0;n--){let r=e.int(n+1),i=t[n];t[n]=t[r],t[r]=i}let n=(e,t)=>e&1?t:-t;return e=>{let r=Math.floor(e),i=e-r,a=i*i*i*(i*(i*6-15)+10),o=n(t[r&255],i);return o+a*(n(t[r+1&255],i-1)-o)}}function lJ(e){let t=new Map;for(let n of e.offsets)t.set(n.subdivisionIndex,{ms:oJ(n.timeOffsetTicks,e.ppq,e.tempoBpm),factor:n.velocityFactor});return t}function uJ(e){let t=new Uint8Array(e.length),n=new Map;for(let t=0;t<e.length;t++){let r=e[t];if(r.type!==`noteOn`||r.channel===vJ)continue;let i=n.get(r.channel);i?i.push({index:t,note:r.note}):n.set(r.channel,[{index:t,note:r.note}])}for(let e of n.values())for(let n=1;n<e.length-1;n++)e[n].note>e[n-1].note&&e[n].note>e[n+1].note&&(t[e[n].index]=1);return t}function dJ(e){return e.channel===vJ?yJ.includes(e.note):e.note<bJ}function fJ(e,t,n){let r=nJ(t),i=new j(t.seed),a=sJ(i),o=cJ(i),s=e.ticksPerQuarter,c=rJ(e.events),l=r.template?lJ(r.template):null,u=r.template?Qq(s,r.template.subdivision):0,d=r.template?Zq(r.template.timeSignature,r.template.subdivision):0,f=n===`groove`?uJ(e.events):null,p=[],m=new Map,h=!1;for(let t=0;t<e.events.length;t++){let i=e.events[t];if(i.type===`noteOff`){let e=m.get(TJ(i)),t=e&&e.length>0?e.shift():0;p.push(t===0?{...i}:{...i,tick:i.tick+t});continue}if(i.type!==`noteOn`){p.push({...i});continue}let g=iJ(c,i.tick);r.template&&!h&&Math.abs(g-r.template.tempoBpm)>gJ&&(h=!0,r.warn(`groove template "${r.template.name}" is written at ${r.template.tempoBpm} BPM but this file is at ${g.toFixed(1)} BPM by tick ${i.tick}: its offsets are rescaled to keep the same timing in milliseconds`));let _=aJ(r.timingMs*r.timingScale,s,g),v=a()*_+o(i.tick/s*pJ)*_*mJ;if(n===`groove`&&dJ(i)){let e=aJ(_J,s,g);v=Math.min(e,Math.max(-e,v))}let y;l&&(y=l.get(Math.floor(i.tick/u)%d));let b=Math.round(r.intensity*((y?aJ(y.ms,s,g):0)+v));i.tick+b<0&&(b=-i.tick);let x=Math.round(i.velocity*(1+r.intensity*((y?y.factor:1)-1))+r.intensity*a()*r.velocityVariance*r.velocityScale);f&&f[t]===1&&(x=Math.round(x*(1+r.intensity*hJ))),x=Math.min(127,Math.max(1,x));let S=TJ(i),C=m.get(S);C?C.push(b):m.set(S,[b]),p.push({...i,tick:i.tick+b,velocity:x})}return p.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:s,events:p,loopStartTick:e.loopStartTick}}var pJ,mJ,hJ,gJ,_J,vJ,yJ,bJ,xJ,SJ,CJ,wJ,TJ,EJ=s((()=>{_e(),tJ(),pJ=.25,mJ=.5,hJ=.15,gJ=1,_J=5,vJ=9,yJ=[35,36],bJ=48,xJ=8,SJ=10,CJ={jazz:{timing:1.3,velocity:1.1},rock:{timing:.8,velocity:1.2},classical:{timing:.6,velocity:1.4},funk:{timing:1,velocity:1.3}},wJ={timing:1,velocity:1},TJ=e=>`${e.channel}:${e.note}`})),DJ=l({LiteHumanizer:()=>OJ}),OJ,kJ=s((()=>{EJ(),OJ=class{constructor(){this.tierName=`lite`,this.approximateSizeMb=.05}async initialize(){}async process(e,t){if(t.grooveTemplate)throw Error(`the lite tier applies no groove grid: ask HumanizerFactory for "groove" when a template is in play`);return fJ(e,t,`lite`)}}})),AJ=l({GrooveHumanizer:()=>jJ}),jJ,MJ=s((()=>{EJ(),jJ=class{constructor(){this.tierName=`groove`,this.approximateSizeMb=.5}async initialize(){}async process(e,t){return fJ(e,t,`groove`)}}})),NJ=class e{static async create(t){let n=await e.load(t);return await n.initialize(),n}static async load(e){switch(e){case`lite`:return new(await(Promise.resolve().then(()=>(kJ(),DJ)))).LiteHumanizer;case`groove`:return new(await(Promise.resolve().then(()=>(MJ(),AJ)))).GrooveHumanizer;case`magenta`:throw Error(`the 'magenta' tier is not shipped: it needs @magenta/music and a PerformanceRNN checkpoint, and neither can be fetched from a file:// build`);default:throw Error(`unknown humanizer tier: ${String(e)}`)}}};async function PJ(e,t){let{tier:n,...r}=t,i=n??(r.grooveTemplate?`groove`:`lite`);return(await NJ.create(i)).process(e,r)}var FJ=5e5,IJ=111;function LJ(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[],p=null;for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===176){let e=t[r++],n=t[r++];f.push({tick:c,type:`control`,channel:i,controller:e,value:n}),e===IJ&&p===null&&(p=c)}else if(n===192){let e=t[r++];f.push({tick:c,type:`program`,channel:i,program:e})}else if(n===224){let e=t[r++],n=t[r++];f.push({tick:c,type:`pitchBend`,channel:i,value:(n<<7|e)-8192})}else if(n===160||n===208)r+=n===160?2:1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f,loopStartTick:p}}var RJ=2;function zJ(e){let t=[{tick:0,time:0,microsecondsPerQuarter:FJ}];for(let n of e.events){if(n.type!==`tempo`)continue;let r=t[t.length-1];t.push({tick:n.tick,time:r.time+(n.tick-r.tick)*r.microsecondsPerQuarter/e.ticksPerQuarter/1e6,microsecondsPerQuarter:n.microsecondsPerQuarter})}return t}function BJ(e,t,n){let r=e[0];for(let t of e)if(t.tick<=n)r=t;else break;return r.time+(n-r.tick)*r.microsecondsPerQuarter/t/1e6}function VJ(e){return e.loopStartTick===null?null:BJ(zJ(e),e.ticksPerQuarter,e.loopStartTick)}function HJ(e){let t=zJ(e),n=Array.from({length:16},()=>({program:0,bank:0,volume:100,expression:127,pan:64,bend:0})),r=e=>{let t=n[e]??n[0];return{program:t.program,bank:t.bank,gain:t.volume/127*(t.expression/127),pan:(t.pan-64)/64,...t.bend?{bend:t.bend}:{}}},i=[],a=new Map;for(let o of e.events){if(o.type===`tempo`)continue;if(o.type===`pitchBend`){(n[o.channel]??n[0]).bend=o.value/8192*RJ;continue}if(o.type===`program`){(n[o.channel]??n[0]).program=o.program;continue}if(o.type===`control`){let e=n[o.channel]??n[0];o.controller===0?e.bank=o.value:o.controller===7?e.volume=o.value:o.controller===10?e.pan=o.value:o.controller===11&&(e.expression=o.value);continue}let s=BJ(t,e.ticksPerQuarter,o.tick),c=`${o.channel}:${o.note}`;if(o.type===`noteOn`)a.set(c,{time:s,velocity:o.velocity,voice:r(o.channel)});else{let e=a.get(c);e&&(i.push({time:e.time,duration:Math.max(.01,s-e.time),note:o.note,velocity:e.velocity,channel:o.channel,...e.voice}),a.delete(c))}}for(let[e,t]of a){let[n,r]=e.split(`:`).map(Number);i.push({time:t.time,duration:.3,note:r,velocity:t.velocity,channel:n,...t.voice})}return i.sort((e,t)=>e.time-t.time)}function UJ(e){return 440*2**((e-69)/12)}var WJ=class e{constructor(e,t={}){this.elapsed=0,this.index=0,this.playing=!1,this.notes=HJ(e),this.playFn=t.play??Gq,this.waveform=t.waveform??`square`,this.volume=t.volume??.2}static async create(t,n={}){return new e(n.humanize?await PJ(t,n.humanize):t,n)}play(){this.playing=this.index<this.notes.length}pause(){this.playing=!1}stop(){this.playing=!1,this.elapsed=0,this.index=0}update(e){if(this.playing){for(this.elapsed+=e;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:UJ(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}get isPlaying(){return this.playing}get duration(){let e=this.notes.at(-1);return e?e.time+e.duration:0}},GJ=8e3,KJ=96e3;function qJ(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++)t[n]=Math.round(Math.max(-1,Math.min(1,e[n]))*32767);return t}function JJ(e,t,n,r){let i=Math.max(1,Math.round(e.length*n/t));if(i>r)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let a=new Float32Array(i);for(let r=0;r<a.length;r++){let i=r*t/n,o=Math.floor(i),s=Math.min(o+1,e.length-1);a[r]=e[o]+(e[s]-e[o])*(i-o)}return a}function YJ(e){if(typeof OfflineAudioContext>`u`)throw Error(`no OfflineAudioContext here: pass a decoder of your own to decode a SoundFont 3`);return new OfflineAudioContext(1,1,e)}function XJ(e=YJ,t={}){let n=t.sampleFrames??16777216;return async(t,r)=>{if(!(r>=400&&r<=2e5))throw Error(`a sample rate of ${r} Hz is not one a SoundFont can state`);let i=Math.max(GJ,Math.min(KJ,r)),a=t.slice().buffer,o=await e(i).decodeAudioData(a);if(o.length>n)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let s=o.getChannelData(0);return qJ(o.sampleRate===r?s:JJ(s,o.sampleRate,r,n))}}var ZJ={keyRange:43,velRange:44,instrument:41,sampleId:53,rootKey:58,coarseTune:51,fineTune:52,sampleModes:54,attenuation:48,pan:17,attack:34,hold:35,decay:36,sustain:37,release:38};function QJ(e){return 2**(e/1200)}function $J(e){return e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function eY(e,t){let n=``;for(let r=0;r<20;r++){let i=e[t+r];if(i===0)break;n+=String.fromCharCode(i)}return n}function tY(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t=>String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3]);if(n(0)!==`RIFF`||n(8)!==`sfbk`)throw Error(`not a SoundFont 2 file`);let r=new Map,i=new Map,a=(e,o)=>{let s=e;for(;s+8<=o;){let e=n(s),o=t.getUint32(s+4,!0);e===`LIST`?(i.set(n(s+8),{at:s,size:o}),a(s+12,s+8+o)):r.set(e,{at:s+8,size:o}),s+=8+o+(o&1)}};a(12,e.length);for(let e of[`phdr`,`pbag`,`pgen`,`inst`,`ibag`,`igen`,`shdr`,`smpl`])if(!r.has(e))throw Error(`SoundFont is missing "${e}"`);let o=(e,t,n)=>{let i=r.get(e),a=[];for(let e=i.at;e+t<=i.at+i.size;e+=t)a.push(n(e));return a},s=n=>o(n,4,n=>({oper:t.getUint16(n,!0),lo:e[n+2],hi:e[n+3],amount:t.getInt16(n+2,!0)})),c=e=>o(e,4,e=>t.getUint16(e,!0)),l=o(`phdr`,38,n=>({name:eY(e,n),preset:t.getUint16(n+20,!0),bank:t.getUint16(n+22,!0),bag:t.getUint16(n+24,!0)})),u=o(`inst`,22,n=>({name:eY(e,n),bag:t.getUint16(n+20,!0)})),d=o(`shdr`,46,n=>({name:eY(e,n),start:t.getUint32(n+20,!0),end:t.getUint32(n+24,!0),loopStart:t.getUint32(n+28,!0),loopEnd:t.getUint32(n+32,!0),rate:t.getUint32(n+36,!0),rootKey:e[n+40],correction:t.getInt8(n+41),link:t.getUint16(n+42,!0),type:t.getUint16(n+44,!0)})),f=r.get(`smpl`),p=e.slice(f.at,f.at+f.size),m=d.filter(e=>e.end>e.start&&!(e.type&32768)),h=m.some(e=>e.type&16);if(h&&!m.every(e=>e.type&16))throw Error(`SoundFont mixes compressed and plain samples, which it cannot address consistently`);let g=h?p.length:p.length>>1;if(m.some(e=>e.end>g))throw Error(`a sample points outside the sample data: the SoundFont is damaged`);let _=h?new Int16Array:new Int16Array(p.buffer,0,p.length>>1),v=i.get(`INFO`)??null;return{bytes:e,presets:l,presetBags:c(`pbag`),presetGens:s(`pgen`),instruments:u,instBags:c(`ibag`),instGens:s(`igen`),samples:d,smplBytes:p,smpl:_,compressed:h,info:v?e.slice(v.at,v.at+8+v.size+(v.size&1)):null}}function nY(e,t,n){return t.slice(e[n],e[n+1]??t.length)}function rY(e,t,n,r,i){let a=e[r].bag,o=e[r+1]?.bag??t.length-1,s=[],c=null;for(let e=a;e<o;e++){let r=nY(t,n,e),o=new Map;for(let e of r)o.set(e.oper,e);o.has(i)?s.push({gens:o,global:c}):e===a&&(c=o)}return s}function iY(e,t){return e.gens.get(t)??e.global?.get(t)??null}function aY(e,t,n,r=`piano`){return e.get(`${t}:${n}`)??(t===128?e.get(`128:0`):e.get(`0:${n}`))??(r===`piano`?e.get(`0:0`):void 0)}function oY(e,t={}){let n=tY($J(e));if(n.compressed)throw Error(`SoundFont 3 (Ogg Vorbis samples) needs decoding first: use loadSoundFont() or decodeSoundFont(), or convert it with "mwg-soundfonts convert <in.sf3> <out.sf2>"`);let r=new Map,i=new Map,a=e=>{if(r.has(e))return r.get(e);let t=n.samples[e];if(!t||t.end<=t.start||t.type&32768)return r.set(e,null),null;let a=new Float32Array(t.end-t.start);for(let e=0;e<a.length;e++)a[e]=n.smpl[t.start+e]/32768;let o={data:a,rate:t.rate||22050,loopStart:t.loopStart-t.start,loopEnd:t.loopEnd-t.start};return r.set(e,o),i.set(e,{rootKey:t.rootKey===255?60:t.rootKey,correction:t.correction}),o},o=new Map;for(let e=0;e<n.presets.length-1;e++)o.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);function s(e,r,s,c){let l=aY(o,e,r,t.missingProgram);if(l===void 0)return[];let u=[],d=(e,t,n)=>{let r=iY(e,t);return!r||n>=r.lo&&n<=r.hi};for(let e of rY(n.presets,n.presetBags,n.presetGens,l,ZJ.instrument)){if(!d(e,ZJ.keyRange,s)||!d(e,ZJ.velRange,c))continue;let t=iY(e,ZJ.instrument).amount;if(n.instruments[t+1])for(let r of rY(n.instruments,n.instBags,n.instGens,t,ZJ.sampleId)){if(!d(r,ZJ.keyRange,s)||!d(r,ZJ.velRange,c))continue;let t=iY(r,ZJ.sampleId).amount,n=a(t);if(!n)continue;let o=(t,n=0)=>(iY(r,t)?.amount??n)+(iY(e,t)?.amount??0),l=iY(r,ZJ.rootKey)?.amount,f=iY(r,ZJ.sampleModes)?.amount??0,p=i.get(t);u.push({sample:n,rootKey:l!==void 0&&l>=0?l:p.rootKey,cents:o(ZJ.coarseTune)*100+o(ZJ.fineTune)+p.correction,loop:(f&3)==1||(f&3)==3,gain:10**(-Math.max(0,o(ZJ.attenuation))/200),pan:Math.max(-1,Math.min(1,o(ZJ.pan)/500)),attack:QJ(o(ZJ.attack,-12e3)),hold:QJ(o(ZJ.hold,-12e3)),decay:QJ(o(ZJ.decay,-12e3)),sustain:10**(-Math.max(0,o(ZJ.sustain))/200),release:QJ(o(ZJ.release,-12e3))})}}return u}return{voices:s,hasPreset:(e,t)=>o.has(`${e}:${t}`)||o.has(`0:${t}`),presetCount:o.size}}function sY(e){let t=new Set,n=[];for(let r of e)for(let e of HJ(r)){let r=e.channel===9?128:e.bank,i=`${r}:${e.program}`;t.has(i)||(t.add(i),n.push({bank:r,program:e.program}))}return n}function cY(e,t){let n=new Set(tY($J(e)).presets.slice(0,-1).map(e=>`${e.bank}:${e.preset}`)),r=new Set,i=[];for(let{bank:e,program:a}of t){let t=`${e}:${a}`;r.has(t)||(r.add(t),!(n.has(t)||e!==128&&n.has(`0:${a}`))&&i.push({bank:e,program:a}))}return i}function lY(e){return[e&255,e>>8&255]}function uY(e){return[e&255,e>>8&255,e>>16&255,e>>24&255]}function dY(e){let t=[...e].map(e=>e.charCodeAt(0)&255).slice(0,20);return[...t,...Array(20-t.length).fill(0)]}function fY(e){return[...e].map(e=>e.charCodeAt(0))}function pY(e,t){let n=new Uint8Array(8+t.length+(t.length&1));return n.set(fY(e),0),new DataView(n.buffer).setUint32(4,t.length,!0),n.set(t,8),n}function mY(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function hY(e,t){let n=mY([new Uint8Array(fY(e)),...t]);return mY([new Uint8Array(fY(`LIST`)),new Uint8Array(uY(n.length)),n])}function gY(e){if(e.length===0)throw Error(`mergeSoundFonts needs at least one SoundFont`);let t=e.map(e=>tY($J(e))),n=t[0].compressed;if(t.some(e=>e.compressed!==n))throw Error(`cannot merge a SoundFont 3 with a SoundFont 2: decode it first with decodeSoundFont()`);let r={bytes:new Uint8Array,presets:[],presetBags:[],presetGens:[],instruments:[],instBags:[],instGens:[],samples:[],smplBytes:new Uint8Array,smpl:new Int16Array,compressed:n,info:t[0].info},i=[],a=0;for(let e of t){let t=r.instruments.length,o=r.samples.length,s=r.presetBags.length,c=r.presetGens.length,l=r.instBags.length,u=r.instGens.length,d=n?a:a>>1;r.presets.push(...e.presets.slice(0,-1).map(e=>({...e,bag:e.bag+s}))),r.presetBags.push(...e.presetBags.slice(0,-1).map(e=>e+c)),r.presetGens.push(...e.presetGens.slice(0,e.presetBags[e.presetBags.length-1]).map(e=>e.oper===ZJ.instrument?{...e,amount:e.amount+t}:e)),r.instruments.push(...e.instruments.slice(0,-1).map(e=>({...e,bag:e.bag+l}))),r.instBags.push(...e.instBags.slice(0,-1).map(e=>e+u)),r.instGens.push(...e.instGens.slice(0,e.instBags[e.instBags.length-1]).map(e=>e.oper===ZJ.sampleId?{...e,amount:e.amount+o}:e)),r.samples.push(...e.samples.slice(0,-1).map(e=>({...e,start:e.start+d,end:e.end+d,loopStart:n?e.loopStart:e.loopStart+d,loopEnd:n?e.loopEnd:e.loopEnd+d,link:e.link+o})));let f=n?e.smplBytes:e.smplBytes.subarray(0,e.smplBytes.length&-2);i.push(f),a+=f.length}return r.presetBags.push(r.presetGens.length),r.instBags.push(r.instGens.length),r.presets.push({name:`EOS`,preset:0,bank:0,bag:r.presetBags.length-1}),r.instruments.push({name:`EOS`,bag:r.instBags.length-1}),r.samples.push({name:`EOS`,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0}),r.smplBytes=mY(i),n||(r.smpl=new Int16Array(r.smplBytes.slice().buffer)),xY(r,_Y(r))}function _Y(e){let t=new Set,n=[];for(let r=0;r<e.presets.length-1;r++){let i=`${e.presets[r].bank}:${e.presets[r].preset}`;t.has(i)||(t.add(i),n.push(r))}return n}async function vY(e,t,n={}){let r=n.sampleFrames??16777216,i=n.totalFrames??134217728,a=$J(e),o=tY(a);if(!o.compressed)return a.slice().buffer;let s=tY(new Uint8Array(xY(o,_Y(o)))),c=[],l=new Map,u=0,d=[];for(let e of s.samples){if(!(e.end>e.start)||e.type&32768){d.push(e);continue}let n=`${e.start}:${e.end}`,a=l.get(n);if(!a){if(!(e.rate>=400&&e.rate<=2e5))throw Error(`a sample states ${e.rate} Hz, which no SoundFont does: the font is damaged`);let o=await t(s.smplBytes.subarray(e.start,e.end),e.rate);if(o.length>r||u+o.length>i)throw Error("the decoded sample data is larger than the limits allow: subset the font, or raise `limits`");a={start:u,length:o.length},l.set(n,a),c.push(o),u+=o.length}d.push({...e,start:a.start,end:a.start+a.length,loopStart:a.start+Math.min(e.loopStart,a.length),loopEnd:a.start+Math.min(e.loopEnd,a.length),type:e.type&-17})}let f=new Int16Array(u),p=0;for(let e of c)f.set(e,p),p+=e.length;let m={...s,samples:d,smpl:f,smplBytes:new Uint8Array(f.buffer),compressed:!1};return xY(m,_Y(m))}async function yY(e,t={}){return oY(await vY(e,t.decode??XJ(void 0,t.limits),t.limits),t)}function bY(e,t){let n=tY($J(e)),r=new Map;for(let e=0;e<n.presets.length-1;e++)r.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);let i=new Set,a=[];for(let{bank:e,program:n}of t){let t=aY(r,e,n);t!==void 0&&!i.has(t)&&(i.add(t),a.push(t))}return a.sort((e,t)=>e-t),xY(n,a)}function xY(e,t){let n=t=>{let n=e.samples[t];return!!n&&n.end>n.start&&!(n.type&32768)},r=(e,t,n)=>e.map(e=>e.oper===t?{oper:t,lo:n.get(e.amount)&255,hi:n.get(e.amount)>>8&255,amount:n.get(e.amount)}:e),i=[],a=new Map;{let n=new Set;for(let r of t){let t=e.presets[r].bag,a=e.presets[r+1]?.bag??e.presetBags.length-1;for(let r=t;r<a;r++){let t=nY(e.presetBags,e.presetGens,r);if(!t.some(e=>e.oper===ZJ.instrument))continue;let a=t.find(e=>e.oper===ZJ.instrument).amount;e.instruments[a+1]&&(n.has(a)||(n.add(a),i.push(a)))}}}let o=new Map(i.map((e,t)=>[e,t]));for(let t of i){let r=e.instruments[t].bag,i=e.instruments[t+1]?.bag??e.instBags.length-1,o=[];for(let t=r;t<i;t++){let r=nY(e.instBags,e.instGens,t);if(!r.some(e=>e.oper===ZJ.sampleId))continue;let i=r.find(e=>e.oper===ZJ.sampleId).amount;n(i)&&o.push(r)}a.set(t,o)}let s=[];{let t=new Set,r=i=>{if(t.has(i)||!n(i))return;t.add(i),s.push(i);let a=e.samples[i].link;a!==i&&r(a)};for(let e of i)for(let t of a.get(e))r(t.find(e=>e.oper===ZJ.sampleId).amount)}let c=new Map(s.map((e,t)=>[e,t])),l=e=>[...lY(e.oper),e.lo,e.hi],u=e=>[...lY(e),...lY(0)],d=[],f=[],p=[];for(let n of t){let t=e.presets[n],i=d.length,a=t.bag,s=e.presets[n+1]?.bag??e.presetBags.length-1;for(let t=a;t<s;t++){let n=nY(e.presetBags,e.presetGens,t);(t===a&&!n.some(e=>e.oper===ZJ.instrument)||n.some(e=>e.oper===ZJ.instrument))&&(d.push(f.length),f.push(...r(n,ZJ.instrument,o)))}p.push({name:t.name,preset:t.preset,bank:t.bank,bag:i})}d.push(f.length);let m=[],h=[],g=[];for(let t of i){let n=m.length,i=a.get(t),o=e.instruments[t].bag,s=e.instruments[t+1]?.bag??e.instBags.length-1;for(let t=o;t<s;t++){let n=nY(e.instBags,e.instGens,t);t===o&&!n.some(e=>e.oper===ZJ.sampleId)&&(m.push(h.length),h.push(...n))}for(let e of i)m.push(h.length),h.push(...r(e,ZJ.sampleId,c));g.push({name:e.instruments[t].name,bag:n})}m.push(h.length);let _=[],v=[];for(let t of s){let n=e.samples[t],r=c.get(t);if(e.compressed){let t=v.length;for(let t=n.start;t<n.end;t++)v.push(e.smplBytes[t]);_.push({...n,start:t,end:t+(n.end-n.start),link:c.get(n.link)??r});continue}let i=v.length/2;for(let t=n.start;t<n.end;t++){let n=e.smpl[t];v.push(n&255,n>>8&255)}_.push({...n,start:i,end:i+(n.end-n.start),loopStart:i+(n.loopStart-n.start),loopEnd:i+(n.loopEnd-n.start),link:c.get(n.link)??r})}let y=e=>[...dY(e.name),...lY(e.preset),...lY(e.bank),...lY(e.bag),...Array(12).fill(0)],b=e.presets[e.presets.length-1],x=pY(`phdr`,[...p.flatMap(y),...y({name:b?.name??`EOS`,preset:0,bank:0,bag:d.length-1})]),S=pY(`pbag`,d.flatMap(u)),C=pY(`pgen`,f.flatMap(l)),ee=pY(`pmod`,Array(10).fill(0)),w=e=>[...dY(e.name),...lY(e.bag)],T=e.instruments[e.instruments.length-1],E=pY(`inst`,[...g.flatMap(w),...w({name:T?.name??`EOS`,bag:m.length-1})]),te=pY(`ibag`,m.flatMap(u)),D=pY(`igen`,h.flatMap(l)),O=pY(`imod`,Array(10).fill(0)),ne=e=>[...dY(e.name),...uY(e.start),...uY(e.end),...uY(e.loopStart),...uY(e.loopEnd),...uY(e.rate),e.rootKey,e.correction&255,...lY(e.link),...lY(e.type)],k={name:``,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0},A=pY(`shdr`,[..._.flatMap(ne),...ne(k)]),re=hY(`sdta`,[pY(`smpl`,v)]),ie=hY(`pdta`,[x,S,ee,C,E,te,O,D,A]),ae=mY([new Uint8Array(fY(`sfbk`)),...e.info?[e.info]:[],re,ie]);return mY([new Uint8Array(fY(`RIFF`)),new Uint8Array(uY(ae.length)),ae]).buffer}var SY=22050,CY=.35,wY=480;function TY(e,t={}){return kY(DY(e,t))}async function EY(e,t={}){return mG(kY,[DY(LJ(e),{soundfont:t.soundFontBytes?oY(t.soundFontBytes,{missingProgram:t.missingProgram}):null,sampleRate:t.sampleRate,gain:t.gain,maxDuration:t.maxDuration})])}function DY(e,t){let n=t.sampleRate??SY,r=t.gain??CY,i=t.maxDuration??wY;if(!(n>0))throw Error(`render sample rate must be positive`);if(!(r>=0))throw Error(`render gain must not be negative`);if(!(i>0))throw Error(`render max duration must be positive`);let a=HJ(e).filter(e=>e.time<i);if(a.length===0)throw Error(`MIDI file has no notes`);let o=t.soundfont??null,s=new Map;return{notes:a.map(e=>({...e,frequency:UJ(e.note),voices:o?OY(o,s,e):void 0})),loopStart:VJ(e),sampleRate:n,gain:r,maxDuration:i}}function OY(e,t,n){let r=n.channel===9?128:n.bank,i=`${r}:${n.program}:${n.note}:${n.velocity>>3}`,a=t.get(i);return a||(a=e.voices(r,n.program,n.note,n.velocity),t.set(i,a)),a}function kY(e){let{sampleRate:t,gain:n,maxDuration:r}=e,i=e.notes,a=i.reduce((e,t)=>Math.max(e,t.time+t.duration),0),o=Math.min(r,a+1.5),s=Math.max(1,Math.ceil(o*t)),c=new Float32Array(s),l=new Float32Array(s),u=Math.min(e.loopStart??0,Math.max(0,o-.1));function d(e){let t=(Math.max(-1,Math.min(1,e))+1)*Math.PI/4;return[Math.cos(t),Math.sin(t)]}function f(e,t,n,r,i,a,o,s){let c=i.sample.data;if(c.length===0)return;let l=2**(((r.note-i.rootKey)*100+i.cents+(r.bend??0)*100)/1200)*i.sample.rate/n;if(!(l>0))return;let u=r.time+r.duration,f=Math.max(.002,i.attack),p=f+i.hold+Math.min(i.decay,30),m=Math.max(.03,Math.min(i.release,4)),h=c.length/i.sample.rate,g=r.channel===9?Math.max(u,r.time+Math.min(2,h)):Math.max(u,r.time+f),_=g-r.time,v=a*i.gain,y=v*i.sustain,[b,x]=d(r.pan+i.pan),S=i.loop&&i.sample.loopEnd>i.sample.loopStart,C=i.sample.loopEnd-i.sample.loopStart,ee=Math.min(s,o+Math.ceil((g+m+.02-r.time)*n)),w=0;for(let a=o;a<ee;a++){let o=a/n-r.time,s;s=o<f?o/f*v:o<f+i.hold?v:o<p?v+(y-v)*((o-f-i.hold)/Math.max(1e-6,p-f-i.hold)):o<_?y:o<_+m?y*(1-(o-_)/m):0,S&&w>=i.sample.loopEnd&&(w=i.sample.loopStart+(w-i.sample.loopStart)%C);let u=Math.floor(w),d=Math.min(1,Math.max(0,w-u)),h;if(!S&&w>=c.length||u<0)h=0;else{let e=c[Math.min(u,c.length-1)];h=e+(c[Math.min(u+1,c.length-1)]-e)*d}e[a]+=h*s*b,t[a]+=h*s*x,w+=l}}function p(e){return e<8?{wave:`triangle`,attack:.005,decay:1.2,sustain:.25,release:.2,detune:0}:e<16?{wave:`sine`,attack:.003,decay:.8,sustain:.1,release:.5,detune:0}:e<24?{wave:`square`,attack:.01,decay:.1,sustain:.7,release:.08,detune:0,cutoff:2500}:e<32?{wave:`sawtooth`,attack:.004,decay:.6,sustain:.15,release:.15,detune:0,cutoff:3e3}:e<40?{wave:`triangle`,attack:.005,decay:.4,sustain:.5,release:.1,detune:0}:e<56?{wave:`sawtooth`,attack:.12,decay:.2,sustain:.8,release:.3,detune:6,cutoff:3500}:e<80?{wave:`sawtooth`,attack:.04,decay:.15,sustain:.75,release:.12,detune:0,cutoff:4500}:e<88?{wave:`square`,attack:.01,decay:.1,sustain:.8,release:.1,detune:0,cutoff:3800}:e<104?{wave:`sawtooth`,attack:.25,decay:.3,sustain:.7,release:.5,detune:8,cutoff:2200}:{wave:`triangle`,attack:.005,decay:.5,sustain:.2,release:.2,detune:0}}function m(e,t){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI);return 4*Math.abs(e-Math.floor(e)-.5)-1}}}function h(e,t,n,r,i,a){return e<t?e/t:e<t+n?1-(1-r)*((e-t)/Math.max(1e-6,n)):e<i?r:e<i+a?r*(1-(e-i)/a):0}function g(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function _(e,t,n,r,i,a,o){if(r.channel===9){v(e,t,n,r,i,a,o);return}let s=p(r.program),c=r.frequency*2**((s.detune+(r.bend??0)*100)/1200),l=Math.max(r.duration,s.attack+.01),u=Math.max(.02,s.release),f=Math.min(o,a+Math.ceil((l+u+.02)*n)),[g,_]=d(r.pan),y=s.cutoff!==void 0,b=y?1-Math.exp(-2*Math.PI*Math.min(s.cutoff,c*8+800)/n):0,x=0,S=0,C=2*Math.PI*c/n;for(let o=a;o<f;o++){let a=o/n-r.time,c=m(s.wave,S);S+=C,x=y?x+b*(c-x):c;let d=i*h(a,s.attack,s.decay,s.sustain,l,u);e[o]+=x*d*g,t[o]+=x*d*_}}function v(e,t,n,r,i,a,o){let[s,c]=d(r.pan),l=r.note*7919+a;if(r.note===35||r.note===36||r.note<45){let l=i*1.4,u=Math.min(o,a+Math.ceil(.27*n)),d=0;for(let i=a;i<u;i++){let a=i/n-r.time,o=a<.12?150*(45/150)**(a/.12):45;d+=2*Math.PI*o/n;let u=l*(.001/l)**Math.min(1,a/.22);e[i]+=Math.sin(d)*u*s,t[i]+=Math.sin(d)*u*c}return}let u=r.note===38||r.note===40,f=u?.16:r.note>=49?.5:.06,p=i*(u?.9:.5),m=Math.min(o,a+Math.ceil((f+.02)*n));for(let i=a;i<m;i++){let o=i/n-r.time,u=p*(.001/p)**Math.min(1,o/f),d=g(l,i-a)*u;e[i]+=d*s,t[i]+=d*c}}for(let e of i){let r=Math.floor(e.time*t);if(r>=s)continue;let i=n*Math.max(.02,e.velocity/127*e.gain),a=e.voices??[];if(a.length>0)for(let n of a)f(c,l,t,e,n,i,r,s);else _(c,l,t,e,i,r,s)}return{sampleRate:t,left:c,right:l,loopStart:u,loopEnd:o,duration:o}}function AY(e,t){let n=e.createBuffer(2,Math.max(1,t.left.length),t.sampleRate);return n.getChannelData(0).set(t.left),n.getChannelData(1).set(t.right),n}function jY(e,t={}){let n=new Map,r=t.read??MY;async function i(n){let i=await r(n),a=new Uint8Array(i,0,Math.min(4,i.byteLength));if(a[0]===77&&a[1]===84&&a[2]===104&&a[3]===100){let n=await EY(i,t.midi);return{buffer:AY(e,n),loop:{start:n.loopStart,end:n.loopEnd}}}return{buffer:await e.decodeAudioData(i.slice(0))}}return(e,t)=>{let r=n.get(t);return r||(r=i(t).catch(e=>{throw n.delete(t),e}),n.set(t,r)),r}}async function MY(e){return await WN([e]),GN(e)}var NY=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.suspended_=!1,this.duckLevel_=1,this.volume=e.volume??1,this.create=e.create??Bq}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){e.length===0?this.stop(t):(this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack())}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;this.current=r,t<=0?(r.volume=this.volume*this.duckLevel_,Promise.resolve(r.play()).catch(()=>{}),i?.pause()):(r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume*this.duckLevel_,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0}))}stop(e=1){this.trackQueue=null;let t=this.current;t&&(this.current=null,e<=0?t.pause():this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0}))}suspend(){this.suspended_=!0,this.current?.pause();for(let e of this.fades)e.audio.pause()}resume(){this.suspended_&&(this.suspended_=!1,this.current&&Promise.resolve(this.current.play()).catch(()=>{}))}duck(e=.5,t=.5){let n=Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,r=this.duckLevel_;this.duckLevel_=n;for(let e of this.fades)e.to=r>0?e.to/r*n:this.volume*n;if(this.current){let e=this.volume*n;t<=0?this.current.volume=e:this.fades.push({audio:this.current,elapsed:0,duration:t,from:this.current.volume,to:e,stopAtEnd:!1})}}unduck(e=.5){this.duck(1,e)}get duckLevel(){return this.duckLevel_}get isSuspended(){return this.suspended_}update(e){if(!this.suspended_)for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},PY=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}suspend(){this.music.suspend();for(let e of this.cues.values())e.suspend()}resume(){this.music.resume();for(let e of this.cues.values())e.resume()}};function FY(e,t,n,r,i,a){let o=e.createBufferSource();o.buffer=n,o.playbackRate.value=i;let s=e.createGain();s.gain.value=r;let c=null;return typeof e.createStereoPanner==`function`?(c=e.createStereoPanner(),c.pan.value=a,o.connect(s),s.connect(c),c.connect(t)):(o.connect(s),s.connect(t)),{source:o,gain:s,panner:c}}var IY=class{constructor(e,t){this.source=null,this.gainNode=null,this.pannerNode=null,this.buffer=null,this.params={volume:1,pitch:1,pan:0},this.loopRegion=null,this.repeat=!0,this.startedAt=0,this.offset=0,this.context=e,this.destination=t??e.destination}get isPlaying(){return this.source!==null}get duration(){return this.buffer?.duration??0}play(e,t={}){this.stop();let n=t.volume??1,r=t.pitch??1,i=t.pan??0,{source:a,gain:o,panner:s}=FY(this.context,this.destination,e,n,r,i),c=t.loop??null,l=t.repeat??!0;if(a.loop=l,c&&(a.loopStart=c.start,a.loopEnd=c.end),!l){let e=a;a.onended=()=>{this.source===e&&this.clearNodes()}}this.source=a,this.gainNode=o,this.pannerNode=s,this.buffer=e,this.params={volume:n,pitch:r,pan:i},this.loopRegion=c,this.repeat=l,this.offset=Math.min(Math.max(0,t.pos??0),Math.max(0,e.duration-.001)),this.startedAt=this.context.currentTime,a.start(0,this.offset)}update(e){if(e.volume!==void 0&&(this.params.volume=e.volume),e.pitch!==void 0&&(this.params.pitch=e.pitch),e.pan!==void 0&&(this.params.pan=e.pan),!this.source||!this.gainNode)return;let t=this.context.currentTime;this.gainNode.gain.setTargetAtTime(this.params.volume,t,.02),this.source.playbackRate.value=this.params.pitch,this.pannerNode&&(this.pannerNode.pan.value=this.params.pan)}stop(e=0){let t=this.position(),n=this.source,r=this.gainNode;if(this.clearNodes(),this.offset=t,n)try{if(e>0&&r){let t=this.context.currentTime;r.gain.cancelScheduledValues(t),r.gain.setValueAtTime(r.gain.value,t),r.gain.linearRampToValueAtTime(0,t+e),n.stop(t+e+.02)}else n.stop()}catch{}}position(){if(!this.source||!this.buffer)return this.offset;let e=Math.max(0,this.context.currentTime-this.startedAt)*this.params.pitch,t=this.offset+e;if(this.repeat&&this.duration>0){let e=this.loopRegion?.start??0,n=this.loopRegion?.end??this.buffer.duration;n>e&&t>=n&&(t=e+(t-e)%(n-e))}return t}seek(e){this.restore({...this.state(),pos:e})}state(){return{...this.params,pos:this.position()}}restore(e){let t=this.buffer;this.update({volume:e.volume,pitch:e.pitch,pan:e.pan}),t&&this.source?this.play(t,{volume:e.volume,pitch:e.pitch,pan:e.pan,pos:e.pos,loop:this.loopRegion,repeat:this.repeat}):this.offset=Math.max(0,e.pos)}clearNodes(){this.source&&(this.source.onended=null),this.source=null,this.gainNode=null,this.pannerNode=null}};function LY(e,t,n,r){let i=Number(e);return Math.min(n,Math.max(t,Number.isFinite(i)?i:r))}var RY=class e{constructor(e,t={}){this.tracks={bgm:null,bgs:null},this.saved={bgm:null,bgs:null},this.requests={bgm:0,bgs:0},this.me=null,this.meToken=0,this.suspendedBgm=null,this.seNodes=new Set,this.mixerLevels={bgm:{volume:1,muted:!1},bgs:{volume:1,muted:!1},me:{volume:1,muted:!1},se:{volume:1,muted:!1}},this.context=e,this.destination=t.destination??e.destination,this.load=t.load??jY(e);let n=()=>{let t=e.createGain();return t.connect(this.destination),t};this.kindGains={bgm:n(),bgs:n(),me:n(),se:n()},this.bgmChannel=new IY(e,this.kindGains.bgm),this.bgsChannel=new IY(e,this.kindGains.bgs)}setMixer(e,t){let n=this.mixerLevels[e];t.volume!==void 0&&(n.volume=LY(t.volume,0,1,1)),t.muted!==void 0&&(n.muted=t.muted),this.kindGains[e].gain.value=n.muted?0:n.volume}mixer(e){return{...this.mixerLevels[e]}}playBgm(e){return this.playLoop(`bgm`,e)}playBgs(e){return this.playLoop(`bgs`,e)}stopBgm(){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop()}stopBgs(){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop()}fadeOutBgm(e=1){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop(Math.max(0,e))}fadeOutBgs(e=1){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop(Math.max(0,e))}currentTrack(e){let t=this.tracks[e];if(t){let n=e===`bgm`?this.bgmChannel:this.bgsChannel;return{...t,pos:n.isPlaying?n.position():t.pos}}return e===`bgm`?this.suspendedBgm:null}saveBgm(){return this.saved.bgm=this.currentTrack(`bgm`),this.saved.bgm}saveBgs(){return this.saved.bgs=this.currentTrack(`bgs`),this.saved.bgs}replayBgm(){return this.saved.bgm?this.playBgm(this.saved.bgm):Promise.resolve()}replayBgs(){return this.saved.bgs?this.playBgs(this.saved.bgs):Promise.resolve()}async playMe(t){let n=e.normalize(t),r=++this.meToken;if(this.stopMeNodes(),!n.name)return;let i=await this.load(`me`,n.name);if(r!==this.meToken||!i)return;let a=this.currentTrack(`bgm`);a&&(this.suspendedBgm=a,this.requests.bgm++,this.bgmChannel.stop(),this.tracks.bgm=null);let{source:o}=FY(this.context,this.kindGains.me,i.buffer,n.volume/100,n.pitch/100,n.pan/100);this.me={source:o,token:r},o.onended=()=>{this.me?.token===r&&this.finishMe()},o.start(0)}stopMe(e=!0){this.stopMeNodes(),e&&this.finishMe()}async playSe(t){let n=e.normalize(t);if(!n.name)return;let r=await this.load(`se`,n.name);if(!r)return;let{source:i}=FY(this.context,this.kindGains.se,r.buffer,n.volume/100,n.pitch/100,n.pan/100),a={source:i};this.seNodes.add(a),i.onended=()=>{this.seNodes.delete(a)},i.start(0)}stopSe(){for(let e of this.seNodes){e.source.onended=null;try{e.source.stop()}catch{}}this.seNodes.clear()}stopAll(){this.requests.bgm++,this.requests.bgs++,this.tracks.bgm=null,this.tracks.bgs=null,this.suspendedBgm=null,this.bgmChannel.stop(),this.bgsChannel.stop(),this.stopMeNodes(),this.stopSe()}snapshot(){return{bgm:this.currentTrack(`bgm`),bgs:this.currentTrack(`bgs`),savedBgm:this.saved.bgm,savedBgs:this.saved.bgs}}restore(e){e&&typeof e==`object`&&(this.saved.bgm=e.savedBgm??null,this.saved.bgs=e.savedBgs??null,e.bgm&&this.playBgm(e.bgm),e.bgs&&this.playBgs(e.bgs))}static normalize(e){return{name:String(e?.name||``),volume:LY(e?.volume,0,100,90),pitch:LY(e?.pitch,10,400,100),pan:LY(e?.pan,-100,100,0),pos:Math.max(0,Number(e?.pos)||0)}}async playLoop(t,n){let r=t===`bgm`?this.bgmChannel:this.bgsChannel,i=e.normalize(n);if(!i.name){this.requests[t]++,this.tracks[t]=null,t===`bgm`&&(this.suspendedBgm=null),r.stop();return}let a=this.tracks[t];if(a&&a.name===i.name&&!(i.pos>0)){this.tracks[t]={...i,pos:0},r.update({volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100});return}if(t===`bgm`&&this.me){this.requests.bgm++,this.suspendedBgm=i,this.tracks.bgm=null,r.stop();return}let o=++this.requests[t];r.stop(),this.tracks[t]={...i,pos:0};let s=await this.load(t,i.name);o===this.requests[t]&&(s?r.play(s.buffer,{volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100,pos:i.pos,loop:s.loop??null}):this.tracks[t]=null)}stopMeNodes(){let e=this.me;if(this.me=null,e){e.source.onended=null;try{e.source.stop()}catch{}}}finishMe(){this.me=null;let e=this.suspendedBgm;this.suspendedBgm=null,e&&!this.tracks.bgm&&this.playBgm(e)}},zY=class{constructor(e,t={}){this.onEnded=new p,this.buffer=null,this.loop=null,this.repeat=!1,this.playing=!1,this.paused=!1,this.resumeAt=0,this.context=e,this.channel=new IY(e,t.destination),this.volume_=Math.min(1,Math.max(0,t.volume??1))}load(e){this.stop(),`left`in e?(this.buffer=AY(this.context,e),this.loop={start:e.loopStart,end:e.loopEnd}):(this.buffer=e,this.loop=null)}play(e={}){this.buffer&&(this.repeat=e.repeat??!1,this.paused=!1,this.playing=!0,this.resumeAt=e.pos??0,this.start())}pause(){this.playing&&!this.paused&&(this.resumeAt=this.channel.position(),this.paused=!0,this.channel.stop())}resume(){this.paused&&this.buffer&&(this.paused=!1,this.start())}togglePause(){this.paused?this.resume():this.pause()}stop(){this.channel.stop(),this.playing=!1,this.paused=!1,this.resumeAt=0}get isPlaying(){return this.playing&&!this.paused}get isPaused(){return this.paused}get duration(){return this.buffer?.duration??0}position(){return this.playing?this.paused?this.resumeAt:this.channel.position():0}seek(e){if(!this.buffer)return;let t=Math.min(Math.max(0,e),this.buffer.duration);this.paused?this.resumeAt=t:this.playing&&this.play({pos:t,repeat:this.repeat})}get volume(){return this.volume_}set volume(e){this.volume_=Math.min(1,Math.max(0,e)),this.channel.update({volume:this.volume_})}update(){!this.playing||this.paused||this.channel.isPlaying||(this.playing=!1,this.resumeAt=0,this.onEnded.dispatch())}start(){this.buffer&&this.channel.play(this.buffer,{volume:this.volume_,pos:this.resumeAt,loop:this.loop,repeat:this.repeat})}},BY=65536;function VY(e){let t=UY(e.subarray(0,BY));if(!t)return null;let n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=new TextDecoder(`utf-8`),i=7,a=()=>{if(i+4>t.length)return null;let e=n.getUint32(i,!0);return i+=4,i+e<=t.length?e:null},o=a();if(o===null||(i+=o,i+4>t.length))return null;let s=n.getUint32(i,!0);i+=4;let c=null,l=null;for(let e=0;e<s;e++){let e=a();if(e===null)break;let n=r.decode(t.subarray(i,i+e));i+=e;let o=n.indexOf(`=`);if(o<0)continue;let s=n.slice(0,o).toUpperCase(),u=/^\d+$/.test(n.slice(o+1))?Number(n.slice(o+1)):null;u!==null&&(s===`LOOPSTART`?c=u:s===`LOOPLENGTH`&&(l=u))}return c===null?null:{loopStart:c,loopLength:l}}function HY(e,t,n){if(!e||!(t>0))return null;let r=e.loopStart/t,i=e.loopLength?(e.loopStart+e.loopLength)/t:n;return r>=0&&i>r&&r<n?{start:r,end:Math.min(i,n)}:null}function UY(e){let t=[3,118,111,114,98,105,115],n=[],r=0;for(;r+27<=e.length;){if(e[r]!==79||e[r+1]!==103||e[r+2]!==103||e[r+3]!==83)return null;let i=e[r+26],a=r+27+i;if(a>e.length)return null;let o=a;for(let a=0;a<i;a++){let i=e[r+27+a];if(o+i>e.length)return null;for(let t=0;t<i;t++)n.push(e[o+t]);if(o+=i,i<255){if(t.every((e,t)=>n[t]===e))return Uint8Array.from(n);n=[]}}r=o}return null}function WY(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function GY(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var KY=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},qY=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return WY(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return GY(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t),t)}};kJ(),MJ();var JY=256,YY=64,XY=10,ZY=2,QY=.05,$Y=4,eX=96;function tX(e,t){let n=e.length,r=0;for(let i=1;i<n;i++){let a=n>>1;for(;r&a;)r^=a,a>>=1;if(r^=a,i<r){let n=e[i];e[i]=e[r],e[r]=n,n=t[i],t[i]=t[r],t[r]=n}}for(let r=2;r<=n;r<<=1){let i=-2*Math.PI/r,a=Math.cos(i),o=Math.sin(i),s=r>>1;for(let i=0;i<n;i+=r){let n=1,r=0;for(let c=0;c<s;c++){let l=i+c,u=l+s,d=e[u]*n-t[u]*r,f=e[u]*r+t[u]*n;e[u]=e[l]-d,t[u]=t[l]-f,e[l]+=d,t[l]+=f;let p=n*a-r*o;r=n*o+r*a,n=p}}}}function nX(e,t){if(e.length===0||t<=0)return[];let n=JY/2,r=new Float32Array(e.length+256);r.set(e,n);let i=new Float64Array(JY);for(let e=0;e<JY;e++)i[e]=.5-.5*Math.cos(2*Math.PI*e/255);let a=new Float64Array(JY),o=new Float64Array(JY),s=new Float64Array(JY/2),c=[],l=[],u=0;for(let e=0;e+JY<=r.length;e+=YY){let t=0;for(let n=0;n<JY;n++)a[n]=r[e+n]*i[n],o[n]=0,t+=a[n]*a[n];l.push(u===0?t===0?0:1/0:t/u-1),u=t,tX(a,o);let n=0;for(let e=0;e<JY/2;e++){let t=Math.hypot(a[e],o[e]),r=t-s[e];r>0&&(n+=r),s[e]=t}c.push(n)}let d=[],f=-1/0;for(let e=0;e<c.length;e++){let r=Math.max(0,e-XY),i=Math.min(c.length-1,e+XY),a=i-r+1,o=0;for(let e=r;e<=i;e++)o+=c[e];o/=a;let s=0;for(let e=r;e<=i;e++)s+=(c[e]-o)**2;let u=o+ZY*Math.sqrt(s/a);if(c[e]<=0||c[e]<u||l[e]<QY&&(e===0||l[e-1]<QY)||e>0&&c[e-1]>c[e]||e+1<c.length&&c[e+1]>=c[e]||e-f<$Y)continue;let p=(e*YY+n-eX)/t;d.push(Math.max(0,p)),f=e}return d}tJ();var rX=`extracted`,iX=[4,4],aX=120,oX=120,sX=480;function cX(e){let t=[...e].sort((e,t)=>e-t),n=t.length>>1;return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function lX(e){return Math.round(cX(e))}function uX(e){for(let t of e.events)if(t.type===`tempo`)return Math.round(6e7/t.microsecondsPerQuarter*100)/100;return aX}function dX(e){return e.events.filter(e=>e.type===`noteOn`)}function fX(e){return dX(e).map(e=>e.velocity)}function pX(e,t,n,r,i){let a=e.map((e,t)=>({subdivisionIndex:t,timeOffsetTicks:e.time.length>0?lX(e.time):0,velocityFactor:e.velocity.length>0?i(e):1}));return{name:rX,timeSignature:[...iX],ppq:n,tempoBpm:r,subdivision:t,offsets:a}}var mX=class{async extractFromMidiPair(e,t,n=`16n`){let r=t.ticksPerQuarter,i=Qq(r,n),a=Zq(iX,n),o=r/e.ticksPerQuarter,s=dX(e).map(e=>({channel:e.channel,note:e.note,tick:e.tick*o,velocity:e.velocity})),c=new Set,l=[];for(let e of dX(t)){let t=-1,n=1/0;for(let r=0;r<s.length;r++){let i=s[r];if(c.has(r)||i.channel!==e.channel||i.note!==e.note)continue;let a=Math.abs(i.tick-e.tick);a<n&&(n=a,t=r)}t<0||n>i/2||(c.add(t),l.push({slotTick:s[t].tick,delta:e.tick-s[t].tick,factor:s[t].velocity>0?e.velocity/s[t].velocity:null}))}let u=Array.from({length:a},()=>({time:[],velocity:[]}));for(let e of l){let t=(Math.round(e.slotTick/i)%a+a)%a;u[t].time.push(e.delta),e.factor!==null&&u[t].velocity.push(e.factor)}return pX(u,n,r,uX(t),e=>cX(e.velocity))}async extractFromSingleMidi(e,t=`16n`){let n=e.ticksPerQuarter,r=Qq(n,t),i=Zq(iX,t),a=Array.from({length:i},()=>({time:[],velocity:[]}));for(let t of dX(e)){let e=Math.round(t.tick/r)*r,n=(Math.round(e/r)%i+i)%i;a[n].time.push(t.tick-e),a[n].velocity.push(t.velocity)}let o=cX(fX(e));return pX(a,t,n,uX(e),e=>o<=0?1:cX(e.velocity)/o)}async extractFromAudioBuffer(e,t=`16n`,n=oX){if(!Number.isFinite(n)||n<=0)throw Error(`tempoBpm must be greater than 0, got ${String(n)}`);let r=[];for(let t=0;t<e.numberOfChannels;t++)r.push(e.getChannelData(t));let i=new Float32Array(e.length);for(let e of r)for(let t=0;t<e.length;t++)i[t]+=e[t]/r.length;let a=nX(i,e.sampleRate);if(a.length===0)throw Error(`no onsets detected in the buffer - a groove needs audible attacks, and this audio has none`);let o=sX,s=Qq(o,t),c=Zq(iX,t),l=n*o/60,u=Array.from({length:c},()=>({time:[],velocity:[]}));for(let e of a){let t=e*l,n=Math.round(t/s)*s;u[(Math.round(n/s)%c+c)%c].time.push(t-n)}return pX(u,t,o,n,()=>1)}};tJ();var hX=`mwg-groove:`,gX=36,_X=64,vX=[`8n`,`16n`,`32n`],yX=new TextEncoder;function bX(e){throw Error(`the ${e} format is not shipped: it is an undocumented proprietary container, and a guessed reader could load a different groove than the file holds`)}function xX(e){return[...e].map(e=>e.charCodeAt(0)&127)}function SX(e){let t=[e&127],n=e>>>7;for(;n>0;)t.unshift(n&127|128),n>>>=7;return t}function CX(e,t){return[255,e,...SX(t.length),...t]}function wX(e){$q(e);let{name:t,timeSignature:n,ppq:r,subdivision:i,offsets:a}=e,o=Zq(n,i),s=Qq(r,i);if(r>32767)throw Error(`groove template "${t}": ppq ${r} does not fit MIDI's 15-bit division`);if(gX+o-1>127)throw Error(`groove template "${t}": ${o} slots need pitches up to ${gX+o-1}, past MIDI's top note of 127`);let c=Math.round(6e7/e.tempoBpm);if(c<1||c>16777215)throw Error(`groove template "${t}": tempoBpm ${e.tempoBpm} does not fit MIDI's three-byte tempo (${c} microseconds)`);a.forEach((e,n)=>{if(Math.abs(e.timeOffsetTicks)>=s)throw Error(`groove template "${t}": slot ${n} is offset by ${e.timeOffsetTicks} ticks, outside the +/-${s} the MIDI encoding's one-slot anchor can tell from a slot shift`);let r=Math.round(_X*e.velocityFactor);if(r<1||r>127)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${e.velocityFactor}, outside the ${1/_X} to ${127/_X} the MIDI encoding can store at ${1/_X} per velocity unit`)});let l=[{tick:0,bytes:CX(81,[c>>16&255,c>>8&255,c&255])},{tick:0,bytes:CX(88,[n[0],Math.log2(n[1]),24,8])},{tick:0,bytes:CX(1,[...yX.encode(hX+t)])}];a.forEach((e,t)=>{let n=s*(t+1)+e.timeOffsetTicks,r=n+Math.max(1,Math.floor(s/4));l.push({tick:n,bytes:[144,gX+t,Math.round(_X*e.velocityFactor)]}),l.push({tick:r,bytes:[128,gX+t,0]})}),l.sort((e,t)=>e.tick-t.tick);let u=[],d=0;for(let e of l)u.push(...SX(e.tick-d),...e.bytes),d=e.tick;return u.push(0,255,47,0),new Uint8Array([...xX(`MThd`),0,0,0,6,0,0,0,1,r>>8&255,r&255,...xX(`MTrk`),u.length>>>24&255,u.length>>>16&255,u.length>>>8&255,u.length&255,...u])}function TX(e,t){for(let n of vX)try{if(Zq(e,n)===t)return n}catch{}throw Error(`a ${t}-slot groove in ${e[0]}/${e[1]} is not one of the 8n, 16n or 32n grids`)}function EX(e){let t=typeof e==`string`?yX.encode(e):e,n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=(e,n)=>{if(r+e>t.length)throw Error(`truncated MIDI file while reading ${n}`)},a=(e,n)=>{i(e,n);let a=``;for(let n=0;n<e;n++)a+=String.fromCharCode(t[r+n]);return r+=e,a},o=e=>(i(1,e),t[r++]),s=e=>{i(2,e);let t=n.getUint16(r);return r+=2,t},c=e=>{i(4,e);let t=n.getUint32(r);return r+=4,t},l=e=>{let t=0;for(let n=0;n<4;n++){let n=o(e);if(t=t<<7|n&127,!(n&128))return t}throw Error(`a variable-length quantity in ${e} runs past four bytes`)};if(a(4,`the file header`)!==`MThd`)throw Error(`not a Standard MIDI File: the MThd header is missing`);let u=c(`the header length`);if(u<6)throw Error(`MThd is ${u} bytes, expected at least 6`);let d=s(`the format`),f=s(`the track count`),p=s(`the division`);if(r+=u-6,d>1)throw Error(`MIDI format ${d} is not a file this reader understands`);if(p&32768)throw Error(`SMPTE time in the division carries no tick grid to read a groove from`);if(f!==1)throw Error(`an mwg groove file holds one track, this one has ${f}`);if(a(4,`the track header`)!==`MTrk`)throw Error(`the MTrk track header is missing`);let m=c(`the track length`),h=r+m;if(h>t.length)throw Error(`truncated MIDI file: the track runs past the end of the data`);let g=0,_=0,v=null,y=null,b=null,x=!1,S=new Map;for(;r<h;){g+=l(`a delta time`);let e=t[r];if(e<128){if(_===0)throw Error(`data at tick ${g} follows a delta time with no running status to read it under`);e=_}else r++,e<240&&(_=e);if(e===255){let e=o(`a meta type`),n=l(`a meta length`);i(n,`a meta event`);let a=r;if(e===81&&n===3)v=t[a]<<16|t[a+1]<<8|t[a+2];else if(e===88&&n>=2)y=[t[a],2**t[a+1]];else if((e===1||e===3)&&n>0){let e=``;for(let r=0;r<n;r++)e+=String.fromCharCode(t[a+r]);e.startsWith(hX)&&(b=e.slice(11))}r+=n,e===47&&(x=!0),_=0;continue}if(e===240||e===247){r+=l(`a sysex length`),_=0;continue}let n=e&240;if(n===144||n===128){let e=o(`a note number`),t=o(`a note velocity`);if(n===144&&t>0){if(S.has(e))throw Error(`pitch ${e} carries more than one note-on, which no groove encodes`);S.set(e,{tick:g,velocity:t})}}else if(n===176||n===224)i(2,`a controller or bend event`),r+=2;else if(n===192||n===208)i(1,`a program or channel-aftertouch event`),r+=1;else throw Error(`unexpected status byte 0x${e.toString(16)} at tick ${g}`)}if(!x)throw Error(`the track has no end-of-track meta, so the file is incomplete`);if(b===null)throw Error(`no ${hX} text meta: this file was not written as a groove`);if(y===null)throw Error(`no time-signature meta: an mwg groove file always carries one`);let C=p,ee=S.size,w=TX(y,ee),T=Qq(C,w),E=[];for(let e=0;e<ee;e++){let t=S.get(gX+e);if(!t)throw Error(`slot ${e} is missing: expected a note on pitch ${gX+e}`);E.push({subdivisionIndex:e,timeOffsetTicks:t.tick-T*(e+1),velocityFactor:t.velocity/_X})}let te={name:b,timeSignature:y,ppq:C,tempoBpm:v===null?120:Math.round(6e7/v*100)/100,subdivision:w,offsets:E};return $q(te),te}function DX(e){let t=typeof e==`string`?e:new TextDecoder().decode(e),n;try{n=JSON.parse(t)}catch(e){throw Error(`not valid JSON: ${e instanceof Error?e.message:String(e)}`)}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a groove JSON export must be an object`);return $q(n),n}var OX=class{async exportFormat(e,t){switch(t){case`json`:return $q(e),JSON.stringify(e,null,2);case`midi`:return wX(e);case`ableton-agr`:case`reaper-groove`:return bX(t);default:throw Error(`unknown groove format: ${String(t)}`)}}async importFormat(e,t){switch(t){case`json`:return DX(e);case`midi`:return EX(e);case`ableton-agr`:case`reaper-groove`:return bX(t);default:throw Error(`unknown groove format: ${String(t)}`)}}},kX=l({AudioBus:()=>RY,AudioListener:()=>KY,Channel:()=>IY,GrooveConverter:()=>OX,GrooveExtractor:()=>mX,GrooveHumanizer:()=>jJ,HumanizerFactory:()=>NJ,LiteHumanizer:()=>OJ,MidiPlayer:()=>WJ,Music:()=>NY,MusicPlayer:()=>zY,Orchestrator:()=>PY,Sound:()=>Uq,SoundSource:()=>qY,assertGrooveTemplate:()=>$q,audioGain:()=>WY,audioPan:()=>GY,collectSoundFontUsage:()=>sY,createAudio:()=>Bq,createAudioLoader:()=>jY,decodeSoundFont:()=>vY,humanizeMidi:()=>PJ,loadSoundFont:()=>yY,loopRegionFromTags:()=>HY,mergeSoundFonts:()=>gY,midiLoopStart:()=>VJ,missingSoundFontPrograms:()=>cY,noteToFrequency:()=>UJ,onCaption:()=>Hq,parseMidi:()=>LJ,parseSoundFont:()=>oY,parseVorbisLoopTags:()=>VY,playTone:()=>Gq,renderMidiToBuffer:()=>TY,renderMidiToBufferAsync:()=>EY,scheduleMidi:()=>HJ,subdivisionCount:()=>Zq,subsetSoundFont:()=>bY,synthesizeSound:()=>Kq,synthesizeTone:()=>Wq,toAudioBuffer:()=>AY,webAudioSampleDecoder:()=>XJ});tJ();function AX(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function jX(e){if(e?.version!==1||typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`unsupported neural model or observation version`);if(!Array.isArray(e.layers)||!e.layers.length||e.layers.length>32)throw RangeError(`a neural model needs 1..32 layers`);let t=0;for(let n=0;n<e.layers.length;n++){let r=e.layers[n];if(!r||!Number.isInteger(r.inputSize)||!Number.isInteger(r.outputSize)||r.inputSize<1||r.outputSize<1||r.inputSize>4096||r.outputSize>4096)throw RangeError(`neural layer dimensions must be integers in 1..4096`);if(t+=r.inputSize*r.outputSize+r.outputSize,t>1e6)throw RangeError(`neural model exceeds one million parameters`);if(n&&e.layers[n-1].outputSize!==r.inputSize)throw RangeError(`neural layer dimensions do not connect`);if(!Array.isArray(r.weights)||!Array.isArray(r.biases)||r.weights.length!==r.inputSize*r.outputSize||r.biases.length!==r.outputSize||!Array.from(r.weights).every(Number.isFinite)||!Array.from(r.biases).every(Number.isFinite))throw TypeError(`neural weights and biases must be finite and match layer dimensions`)}let n=e.layers.map(e=>({...e,weights:Float64Array.from(e.weights),biases:Float64Array.from(e.biases),buffer:new Float64Array(e.outputSize)})),r=(e,t)=>{if(e.length!==n[0].inputSize)throw TypeError(`neural input must be finite and match the model`);for(let t=0;t<e.length;t++)if(!Number.isFinite(e[t]))throw TypeError(`neural input must be finite`);let r=n[n.length-1];if(t&&t.length!==r.outputSize)throw RangeError(`neural output buffer has the wrong size`);let i=e;for(let e=0;e<n.length;e++){let t=n[e];for(let r=0;r<t.outputSize;r++){let a=t.biases[r];for(let e=0;e<t.inputSize;e++)a+=t.weights[r*t.inputSize+e]*i[e];if(!Number.isFinite(a))throw RangeError(`neural activation overflow`);t.buffer[r]=e===n.length-1?a:Math.max(0,a)}i=t.buffer}let a=t??new Float64Array(r.outputSize);return a.set(r.buffer),a},i=new Float64Array(n[n.length-1].outputSize);return{predict:r,select(e,t){let n=e.mask;if(n&&(n.length!==i.length||!Array.from(n).every(e=>typeof e==`boolean`)))throw TypeError(`neural action mask must contain one boolean per output`);r(e.input,i);let a=null;for(let e=0;e<i.length;e++)(!n||n[e])&&(a===null||i[e]>i[a])&&(a=e);if(a===null||!t)return a;let o=t();if(!Number.isFinite(o)||o<0||o>=1)throw RangeError(`sampling random must return a value in [0, 1)`);let s=0;for(let e=0;e<i.length;e++)(!n||n[e])&&(s+=Math.exp(i[e]-i[a]));let c=o*s;for(let e=0;e<i.length;e++)if((!n||n[e])&&(c-=Math.exp(i[e]-i[a]),c<0))return e;return a}}}function MX(e,t,n){let r=Function(`return (${e});`)()(t);return n.map(e=>r.predict(e))}var NX=class{constructor(e){this.evaluator=jX(e),this.model=structuredClone(e)}predict(e,t){return this.evaluator.predict(e,t)}selectAction(e,t){return this.evaluator.select(e,t)}exportModel(){return structuredClone(this.model)}behavior(e,t,n,r=!1){if(t.length!==this.model.layers[this.model.layers.length-1].outputSize)throw RangeError(`neural action mapping must match output size`);let i=structuredClone(t);return{id:e,decide:e=>{e.checkpoint();let t=this.selectAction(n(e.perception),r?e.random:void 0);return t===null?null:structuredClone(i[t])}}}predictBatchAsync(e,t={}){let n=this.model.layers[0].inputSize,r=this.model.layers[this.model.layers.length-1].outputSize;if(e.length>65536||e.length*Math.max(n,r)>1e6)return Promise.reject(RangeError(`neural batch exceeds its observation or value limit`));for(let t of e)if(!t||t.length!==n)return Promise.reject(TypeError(`neural batch inputs must match the model`));return mG(MX,[jX.toString(),this.model,e],t)}};_e();var PX=class{get truncated(){return!this.terminated&&this.steps>=this.maxSteps}constructor(e,t,n=j){if(this.steps=0,this.terminated=!1,this.ready=!1,this.agentCount=0,this.rules=e,this.Random=n,this.random=new this.Random(0),!Number.isInteger(t.maxSteps)||t.maxSteps<1||t.maxSteps>1e6)throw RangeError(`training maxSteps must be in 1..1000000`);if(typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`training requires an observation version`);this.maxSteps=t.maxSteps,this.observationVersion=e.observationVersion}reset(e){if(!Number.isInteger(e)||e<0||e>4294967295)throw RangeError(`training seed must be uint32`);this.random=new this.Random(e),this.state=this.rules.initial(this.random),this.steps=0,this.terminated=this.rules.finished?.(this.state)??!1,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:!1}}step(e){if(!this.ready||this.terminated||this.truncated)throw Error(`training episode needs reset before step`);let t=this.observations();if(e.length!==this.agentCount)throw RangeError(`training action count must match the agent roster`);for(let n=0;n<e.length;n++){let r=e[n],i=t[n].mask;if(r===null?!i||i.some(Boolean):!Number.isInteger(r)||r<0||i&&(r>=i.length||!i[r]))throw RangeError(`training action is not legal`)}let n=structuredClone(this.state),r=this.rules.command(this.state,e),i=this.rules.rule(this.state,r,this.random),a=Array.from(this.rules.rewards(n,r,i));if(a.length!==this.agentCount||!a.every(Number.isFinite))throw TypeError(`training rewards must be finite and match the agent roster`);this.state=i.state,this.steps++,this.terminated=i.status===`finished`;let o=this.observations();if(o.length!==this.agentCount)throw RangeError(`training agent roster changed during an episode`);return{observations:o,rewards:a,terminated:this.terminated,truncated:this.truncated}}snapshot(){if(!this.ready)throw Error(`training environment needs reset before snapshot`);return structuredClone({version:1,observationVersion:this.observationVersion,state:this.state,seed:this.random.seed,random:this.random.getState().map(e=>e>>>0),steps:this.steps,maxSteps:this.maxSteps,terminated:this.terminated,truncated:this.truncated})}restore(e){if(e.version!==1||e.observationVersion!==this.observationVersion||e.maxSteps!==this.maxSteps)throw TypeError(`training snapshot version, schema or step limit does not match`);if(!Number.isInteger(e.steps)||e.steps<0||e.steps>this.maxSteps||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295||!Array.isArray(e.random)||e.random.length!==4||!e.random.every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!e.random.some(e=>e!==0)||typeof e.terminated!=`boolean`||typeof e.truncated!=`boolean`||e.terminated&&e.truncated||e.truncated!==(!e.terminated&&e.steps===this.maxSteps))throw TypeError(`invalid training snapshot`);this.state=structuredClone(e.state),this.random=new this.Random(e.seed),this.random.setState(e.random),this.steps=e.steps,this.terminated=e.terminated,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:this.truncated}}observations(){let e=structuredClone(Array.from(this.rules.observe(this.state)));if(!e.length||e.length>4096)throw RangeError(`training requires 1..4096 agents`);for(let t of e)if(!t.input.length||t.input.length>4096||!Array.from(t.input).every(Number.isFinite)||t.mask&&(!t.mask.length||t.mask.length>4096||!Array.from(t.mask).every(e=>typeof e==`boolean`)))throw TypeError(`invalid training observation`);return e}};function FX(e,t,n){return IX(n),LX(e,t,n,{Generator:j,createNeuralEvaluator:jX})}function IX(e){let t=e.trajectoryLimit??0;if(!e.seeds.length||e.seeds.length>1e4||!Array.from(e.seeds).every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!Number.isInteger(t)||t<0||t*e.seeds.length>1e4)throw RangeError(`rollouts require 1..10000 uint32 seeds and at most 10000 stored transitions`)}function LX(e,t,n,r){if(t.observationVersion!==e.observationVersion)throw TypeError(`model observation schema does not match environment`);let i=n.trajectoryLimit??0,a=r.createNeuralEvaluator(t);return Array.from(n.seeds,t=>{if(n.signal?.aborted)throw n.signal.reason;let o=new r.Generator((t^2654435769)>>>0),s=e.reset(t),c=s.rewards.map(()=>0),l=[],u=0;for(;!s.terminated&&!s.truncated;){if(n.signal?.aborted)throw n.signal.reason;let t=s.observations.map(e=>a.select(e,n.sample?()=>o.float():void 0)),r=e.step(t);for(let e=0;e<c.length;e++)if(c[e]+=r.rewards[e],!Number.isFinite(c[e]))throw RangeError(`training cumulative reward overflow`);l.length<i&&l.push({before:s,actions:t,after:r}),s=r,u++}return{seed:t,steps:u,rewards:c,terminated:s.terminated,truncated:s.truncated,trajectory:l}})}function RX(e,t,n,r){let i=Function(`return (${e[0]});`)(),a=Function(`return (${e[1]});`)(),o=Function(`return (${e[2]});`)(),s=class extends o{constructor(e,t){super(e,t,i)}};return Function(`return (${e[3]});`)()(Function(`return (${e[4]});`)()({TrainingEnvironment:s},t),n,r,{Generator:i,createNeuralEvaluator:a})}async function zX(e,t,n,r){let i=r.jobs??4;if(!Number.isInteger(i)||i<1||i>64)throw RangeError(`rollout jobs must be in 1..64`);if(r.signal?.aborted)throw r.signal.reason;let a=r.trajectoryLimit??0;IX(r),jX(n);let o=new AbortController,s=()=>o.abort(r.signal?.reason);r.signal?.addEventListener(`abort`,s,{once:!0});let c=[j.toString(),jX.toString(),PX.toString(),LX.toString(),e.toString()],l=Math.min(i,r.seeds.length);try{return(await Promise.all(Array.from({length:l},(e,i)=>{let s=Math.floor(i*r.seeds.length/l),u=Math.floor((i+1)*r.seeds.length/l),d=r.seeds.slice(s,u);return mG(RX,[c,t,n,{seeds:d,sample:r.sample,trajectoryLimit:a}],{signal:o.signal,timeout:r.timeout})}))).flat()}finally{o.abort(),r.signal?.removeEventListener(`abort`,s)}}function BX(e,t){let n=[...t.actions];if(!n.length||n.some(e=>typeof e!=`string`))throw TypeError(`imitation needs the recorded action names in policy order`);let r=pn(t.events),i=e.reset(t.seed);if(i.observations.length!==1)throw Error(`imitation trains the recorded player alone: the environment must expose one agent`);let a=[],o=i,s=0;for(let t of r){if(o.terminated||o.truncated)break;let r=n.indexOf(t.action);if(r<0)throw Error(`a recorded action ${JSON.stringify(t.action)} is not in the action list`);a.push({observation:o.observations[0],action:r,frame:t.frame}),o=e.step([r]),s++}return{samples:a,steps:s,terminated:o.terminated,truncated:o.truncated}}function VX(e,t,n){let r=e.reset(n.seed),i=r.rewards.map(()=>0),a=[],o=0;for(;!r.terminated&&!r.truncated;){let n=t(r.observations);if(!Array.isArray(n)||n.length!==r.observations.length)throw RangeError(`the seeded-run chooser must return one action per agent`);a.push([...n]);let s=e.step(n);for(let e=0;e<i.length;e++)if(i[e]+=s.rewards[e],!Number.isFinite(i[e]))throw RangeError(`seeded-run cumulative reward overflow`);r=s,o++}return{seed:n.seed,steps:o,actions:a,rewards:i,terminated:r.terminated,truncated:r.truncated}}function HX(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var UX=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=Wt(e.state,`campaign state`)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel,n=Wt(e.state,`level result state`),r=e.result===void 0?void 0:Wt(e.result,`level result`);if(this._state=n,r!==void 0&&(this._results[t]=r),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=Wt(t.results,`snapshot.results`),i}};_e();function WX(e){let t=new j(e.seed);return{...HX({state:Wt(e.initialState,`initialState`),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}_e();function GX(e,t,n){let r=KX.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rr(a.events)!==Rr(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rr(r.state)!==Rr(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var KX=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.recordJournal=e.journal!==null,this.journal=e.journal??new wn,this.actorOf=e.history?.actorOf??null,this.history=e.history?new Or(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.random.getState(),n=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler}),r;try{r=this.history?Wt(n.state,`state`):null,this.recordJournal&&this.journal.append(e,n.events)}catch(e){throw this.random.setState(t),e}return this._state=n.state,n.cost!=null&&this._scheduler.spend(n.cost),this.history&&this.history.push(this.historySnapshot(r)),n}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=n.random??new j;r.setState(t.random);let i=tH.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:wn.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(e=Wt(this._state,`state`)){return{...this.snapshot(),state:e}}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=tH.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},qX=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pr({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=KX.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},JX=class{constructor(e){this.saves=new zt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},YX=l({Campaign:()=>UX,CampaignSave:()=>JX,EventPresentation:()=>qX,Scheduler:()=>tH,SimulationRuntime:()=>KX,TrainingEnvironment:()=>PX,advanceToInput:()=>AX,imitationFromReplay:()=>BX,runHeadlessScenario:()=>WX,runRollouts:()=>FX,runRolloutsAsync:()=>zX,runScenario:()=>HX,runSeededEpisode:()=>VX,validateSimulationReplay:()=>GX}),XX=d(c(((e,t,n)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(n,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},ee=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},w=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[w],d=o?n:n[r]||(n[r]={}),f=d[w]||(d[w]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?ee(g,t):c&&typeof g==`function`?ee(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,D=Math.floor,O=function(e){return isNaN(e=+e)?0:(e>0?D:te)(e)},ne=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},k=function(e){return function(e,t){var n=String(ne(e)),r=O(t),i=n.length,a,o;return r<0||r>=i?void 0:(a=n.charCodeAt(r),a<55296||a>56319||r+1===i||(o=n.charCodeAt(r+1))<56320||o>57343?a:(a-55296<<10)+(o-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return k(this,e)}}),n.String.codePointAt;var A=Math.max,re=Math.min,ie=function(e,t){return e=O(e),e<0?A(e+t,0):re(e,t)},ae=String.fromCharCode,oe=String.fromCodePoint;E(E.S+E.F*(!!oe&&oe.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],ie(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?ae(a):ae(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var se={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},j={isSpaceSeparator:function(e){return typeof e==`string`&&se.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||se.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||se.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ce,le,ue,de,fe,pe,me,he,ge,_e=function(e,t){ce=String(e),le=`start`,ue=[],de=0,fe=1,pe=0,me=void 0,he=void 0,ge=void 0;do me=xe(),ke[le]();while(me.type!==`eof`);return typeof t==`function`?ve({"":ge},``,t):ge};function ve(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=ve(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=ve(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var M,N,ye,be,P;function xe(){for(M=`default`,N=``,ye=!1,be=1;;){P=Se();var e=Ce[M]();if(e)return e}}function Se(){if(ce[de])return String.fromCodePoint(ce.codePointAt(de))}function F(){var e=Se();return e===`
|
|
1387
1387
|
`?(fe++,pe=0):e?pe+=e.length:pe++,e&&(de+=e.length),e}var Ce={default:function(){switch(P){case` `:case`\v`:case`\f`:case` `:case`\xA0`:case``:case`
|
|
1388
1388
|
`:case`\r`:case`\u2028`:case`\u2029`:F();return;case`/`:F(),M=`comment`;return;case void 0:return F(),we(`eof`)}if(j.isSpaceSeparator(P))F();else return Ce[le]()},comment:function(){switch(P){case`*`:F(),M=`multiLineComment`;return;case`/`:F(),M=`singleLineComment`;return}throw Me(F())},multiLineComment:function(){switch(P){case`*`:F(),M=`multiLineCommentAsterisk`;return;case void 0:throw Me(F())}F()},multiLineCommentAsterisk:function(){switch(P){case`*`:F();return;case`/`:F(),M=`default`;return;case void 0:throw Me(F())}F(),M=`multiLineComment`},singleLineComment:function(){switch(P){case`
|
|
1389
1389
|
`:case`\r`:case`\u2028`:case`\u2029`:F(),M=`default`;return;case void 0:return F(),we(`eof`)}F()},value:function(){switch(P){case`{`:case`[`:return we(`punctuator`,F());case`n`:return F(),Te(`ull`),we(`null`,null);case`t`:return F(),Te(`rue`),we(`boolean`,!0);case`f`:return F(),Te(`alse`),we(`boolean`,!1);case`-`:case`+`:F()===`-`&&(be=-1),M=`sign`;return;case`.`:N=F(),M=`decimalPointLeading`;return;case`0`:N=F(),M=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:N=F(),M=`decimalInteger`;return;case`I`:return F(),Te(`nfinity`),we(`numeric`,1/0);case`N`:return F(),Te(`aN`),we(`numeric`,NaN);case`"`:case`'`:ye=F()===`"`,N=``,M=`string`;return}throw Me(F())},identifierNameStartEscape:function(){if(P!==`u`)throw Me(F());F();var e=Oe();switch(e){case`$`:case`_`:break;default:if(!j.isIdStartChar(e))throw Pe()}N+=e,M=`identifierName`},identifierName:function(){switch(P){case`$`:case`_`:case``:case``:N+=F();return;case`\\`:F(),M=`identifierNameEscape`;return}if(j.isIdContinueChar(P))N+=F();else return we(`identifier`,N)},identifierNameEscape:function(){if(P!==`u`)throw Me(F());F();var e=Oe();switch(e){case`$`:case`_`:case``:case``:break;default:if(!j.isIdContinueChar(e))throw Pe()}N+=e,M=`identifierName`},sign:function(){switch(P){case`.`:N=F(),M=`decimalPointLeading`;return;case`0`:N=F(),M=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:N=F(),M=`decimalInteger`;return;case`I`:return F(),Te(`nfinity`),we(`numeric`,be*(1/0));case`N`:return F(),Te(`aN`),we(`numeric`,NaN)}throw Me(F())},zero:function(){switch(P){case`.`:N+=F(),M=`decimalPoint`;return;case`e`:case`E`:N+=F(),M=`decimalExponent`;return;case`x`:case`X`:N+=F(),M=`hexadecimal`;return}return we(`numeric`,be*0)},decimalInteger:function(){switch(P){case`.`:N+=F(),M=`decimalPoint`;return;case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},decimalPointLeading:function(){if(j.isDigit(P))N+=F(),M=`decimalFraction`;else throw Me(F())},decimalPoint:function(){switch(P){case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F(),M=`decimalFraction`;else return we(`numeric`,be*Number(N))},decimalFraction:function(){switch(P){case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},decimalExponent:function(){switch(P){case`+`:case`-`:N+=F(),M=`decimalExponentSign`;return}if(j.isDigit(P))N+=F(),M=`decimalExponentInteger`;else throw Me(F())},decimalExponentSign:function(){if(j.isDigit(P))N+=F(),M=`decimalExponentInteger`;else throw Me(F())},decimalExponentInteger:function(){if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},hexadecimal:function(){if(j.isHexDigit(P))N+=F(),M=`hexadecimalInteger`;else throw Me(F())},hexadecimalInteger:function(){if(j.isHexDigit(P))N+=F();else return we(`numeric`,be*Number(N))},string:function(){switch(P){case`\\`:F(),N+=Ee();return;case`"`:if(ye)return F(),we(`string`,N);N+=F();return;case`'`:if(!ye)return F(),we(`string`,N);N+=F();return;case`
|
|
@@ -1396,12 +1396,12 @@ fn mainFragment(
|
|
|
1396
1396
|
`+t+`}`}}return r.pop(),i=t,m}function g(e){if(e.length===0)return m(e,!0);var t=String.fromCodePoint(e.codePointAt(0));if(!j.isIdStartChar(t))return m(e,!0);for(var n=t.length;n<e.length;n++)if(!j.isIdContinueChar(String.fromCodePoint(e.codePointAt(n))))return m(e,!0);return e}function _(e){if(r.indexOf(e)>=0)throw TypeError(`Converting circular structure to JSON5`);r.push(e);var t=i;i+=s;for(var n=[],a=0;a<e.length;a++){var o=p(String(a),e);n.push(o===void 0?`null`:o)}var c;if(n.length===0)c=`[]`;else if(s===``)c=`[`+n.join(`,`)+`]`;else{var l=`,
|
|
1397
1397
|
`+i,u=n.join(l);c=`[
|
|
1398
1398
|
`+i+u+`,
|
|
1399
|
-
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),
|
|
1400
|
-
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw
|
|
1401
|
-
`),n,t))}function
|
|
1402
|
-
`)return r;r++}}return r}function
|
|
1403
|
-
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function
|
|
1404
|
-
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function VX(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new SX({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function HX(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=xX.default.parse(a);if(typeof e==`string`)return e}catch{}throw new SX({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new SX({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function UX(e){return/^_\(\s*["']/.test(e.trim())}function WX(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function GX(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function KX(e,t,n,r,i){return new SX({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function qX(e,t,n,r,i){let a=BX(n,r??`<mwl>`,i);return new SX({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function JX(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:$X(n)},...r===void 0?{}:{journal:eZ(r)}};return JSON.stringify(i)}function YX(e,t){return XX(e,t).world}function XX(e,t){let n=JSON.parse(e),r=QX(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=ZX(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=ZX(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:$X(r.hookState)},...r.journal===void 0?{}:{journal:eZ(r.journal)}}}function ZX(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Mt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return Wt(t,`saved world`)}function QX(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function $X(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Mt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function eZ(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Mt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function tZ(e,t,n={}){let r=e.search(/\s+where\s+/),i=r<0?e:e.slice(0,r),a={...t};if(r>=0)for(let t of e.slice(r).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let r=new nZ(e[2],a,n.helpers??{});if(a[e[1]]=r.parseOr(),!r.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let o=new nZ(i,a,n.helpers??{}),s=o.parseOr();if(!o.atEnd())throw Error(`unexpected token in MWL condition: ${o.peek()}`);return iZ(s)}var nZ=class{constructor(e,t,n){this.index=0,this.tokens=rZ(e),this.context=t,this.helpers=n}parseOr(){let e=this.parseAnd();for(;this.take(`or`);)e=iZ(e)||iZ(this.parseAnd());return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);)e=iZ(e)&&iZ(this.parseNot());return e}parseNot(){return this.take(`not`)?!iZ(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){let e=this.parseOr();return this.expect(`)`),e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}};function rZ(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function iZ(e){return e!==!1&&e!==0&&e!==``}function aZ(e){let t=new dZ(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function oZ(e,t){let n=typeof e==`string`?aZ(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=oZ(n.left,t),i=oZ(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var sZ=256,cZ=4096,lZ=/(?:\d+(?:\.\d*)?|\.\d+)/y,uZ=/[A-Za-z_][A-Za-z0-9_.-]*/y,dZ=class{constructor(e){this.index=0,this.depth=0,this.operators=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,this.operator(),e={kind:`binary`,op:`^`,left:e,right:this.nested(()=>this.power())}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.nested(()=>this.expression());if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=this.match(lZ);if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=this.match(uZ);if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}match(e){return e.lastIndex=this.index,e.exec(this.source)}nested(e){if(++this.depth>sZ)throw Error(`MWL expression is nested more than ${sZ} deep`);try{return e()}finally{this.depth--}}operator(){if(++this.operators>cZ)throw Error(`MWL expression has more than ${cZ} operators`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){let e=this.source.slice(this.index,this.index+40);return this.index+40<this.source.length?`${e}...`:e}};function fZ(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function pZ(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function mZ(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function hZ(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function gZ(e,t){return _Z(e.attributes[t])}function _Z(e){return e===void 0?void 0:e===`true`||e===`yes`}function vZ(e,t){return e!==void 0&&t.includes(e)?e:void 0}function yZ(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function bZ(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}_e();var xZ=pZ,SZ=(e,t,n)=>hZ(e,t,n)??n;function CZ(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}var wZ=1048576;function TZ(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.reduce((e,t)=>Math.max(e,t.length),0);if(r*n>wZ)throw Error(`MWL terrain is ${r}x${n}, more than ${wZ} cells`);let i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var EZ=/\$\(([^)]*)\)/g,DZ=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,OZ=class e{constructor(e,t={}){this.journal=new wn,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??CZ(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new j,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||YZ(n.attributes.x,t.x))&&(n.attributes.y===void 0||YZ(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];this.isConsumedElse(e,t)||(n.tag===`say`?this.showSay(n):n.tag===`dialogue`?this.showDialogue(n):this.executeNode(n))}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!VZ(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return JX(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=XX(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new j().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:SZ(e,`hitpoints`,1),movement:SZ(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:SZ(e,`gold`,0),income:SZ(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=SZ(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[xZ(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:SZ(e,`x`,0),y:SZ(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=BZ(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&zZ(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=TZ(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=LZ(e,`x`),i=LZ(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=xZ(e,`id`),n={hp:SZ(e,`hp`,1),x:SZ(e,`x`,0),y:SZ(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=gZ(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length||this.world.units[t])continue;let i=this.unitTypes.get(t);if(!i)throw Error(`MWL side ${n} leader "${t}" is neither a unit nor a unit type`);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i.hitpoints,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i.movement,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(SZ(t,`x`,0),SZ(t,`y`,0),xZ(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??xZ(t,`target`),SZ(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??xZ(t,`target`),SZ(t,`delta`,SZ(t,`amount`,0))),gold:(e,t)=>e.addGold(xZ(t,`side`),SZ(t,`delta`,SZ(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,SZ(e,`x`,0),SZ(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:SZ(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??xZ(e,`target`),SZ(e,`x`,0),SZ(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?NZ(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??xZ(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...PZ(t)})))}cmdUnstoreUnit(e){let t=xZ(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(xZ(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=SZ(e,`x`,0)),e.attributes.y!==void 0&&(i.y=SZ(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))FZ(n,t)}cmdHealUnit(e){let t=LZ(e,`amount`),n=LZ(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=SZ(e,`x`,0),n=SZ(e,`y`,0),r={x:t,y:n,side:xZ(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=xZ(e,`side`),n=SZ(e,`x`,0),r=SZ(e,`y`,0),i=SZ(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?xZ(e,`target`):xZ(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=SZ(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);let n=0;for(;n<t&&this.nodeConditionMatches(e);)this.runBlock(this.commandChildren(e)),n++;if(n===t&&this.nodeConditionMatches(e)){if(e.attributes.on_limit===`error`)throw Error(`MWL while reached its max_iterations cap of ${t}`);this.onTrace?.({type:`while_limit`,iterations:t})}}cmdForeach(e){let t=this.variableAt(xZ(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(xZ(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&VZ(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=yZ(this.world,AZ(this.world,e.attributes.side),{result:t,bonus:hZ(e,`bonus`),carryoverPercentage:mZ(e,`carryover_percentage`),carryoverAdd:gZ(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(EZ,(e,n)=>{try{return String(oZ(n,t))}catch{return``}}).replace(DZ,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(EZ,(e,t)=>String(oZ(t,this.numericVariables()))).replace(DZ,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,oZ(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())?this.setVariableAt(e,oZ(t,a)):this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return qZ(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);KZ(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:BZ(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&zZ(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=hZ(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&zZ(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return RZ(this.variableAt(e.attributes.variable),e.attributes,JZ(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):tZ(e.attributes.test,HZ(this.world.variables),{helpers:this.conditionHelpers()})}conditionHelpers(){if(this.testHelpers)return this.testHelpers;let e=e=>{let t={};for(let n of e){let e=String(n),r=e.indexOf(`=`);r<=0?t.value=e:t[e.slice(0,r)]=e.slice(r+1)}return t},t={have_unit:(...t)=>{let n=e(t);return Object.entries(this.world.units).some(([e,t])=>t.alive&&(n.id===void 0||e===n.id)&&zZ(t,e,n))},have_location:(...t)=>{let n=e(t),r=this.world.map,i=Number(n.x),a=Number(n.y);if(!r||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<0||i>=r.width||a>=r.height)return!1;let o=r.codes[a*r.width+i];return n.terrain===void 0||o===n.terrain}};for(let[n,r]of Object.entries(this.hooks?.predicate??{}))t[n]=(...t)=>!!r(this.worldView(),e(t));return this.testHelpers=t,t}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&RZ(this.variableAt(t),e.attributes,JZ(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&zZ(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=LZ(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=LZ(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=LZ(e,`x`),n=LZ(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{KZ(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function kZ(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:KZ(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=MZ(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?NZ(e,t.filter??{}):MZ(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=yZ(e,t.side??null,t)}}function AZ(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function jZ(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function MZ(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function NZ(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&zZ(i,r,t)&&(i.alive=!1,n++);return n}function PZ(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function FZ(e,t){let n=IZ(t.hp);n!==void 0&&(e.hp=n);let r=IZ(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=_Z(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=_Z(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function IZ(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function LZ(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function RZ(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return VZ(e,r(t.equals));if(t.not_equals!==void 0)return!VZ(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>VZ(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>VZ(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function zZ(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=_Z(n.can_recruit),a=_Z(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||YZ(n.x,e.x))&&(n.y===void 0||YZ(n.y,e.y))}function BZ(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function VZ(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function HZ(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function UZ(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function WZ(e){let t=UZ(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function GZ(e){return typeof e!=`string`}function KZ(e,t,n){let r=WZ(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=GZ(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function qZ(e,t){let n=e;for(let e of UZ(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function JZ(e){return t=>qZ(e,t)}function YZ(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var XZ=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function ZZ(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=XZ.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...TZ(t.slice(r).map(QZ).join(`
|
|
1405
|
-
`))}}function QZ(e){let t=e.length;for(;t>0&&(e[t-1]===`,`||/\s/.test(e[t-1]));)t--;return e.slice(0,t)}function $Z(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var eQ={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`},openAttributes:`string`},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`,on_limit:`id`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},tQ={...eQ,game:{...eQ.game,required:[`schema`]},table:{...eQ.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...eQ.terrain_type,required:[`id`]},movetype:{...eQ.movetype,required:[`id`]},unit_type:{...eQ.unit_type,required:[`id`]},unit:{...eQ.unit,required:[`id`,`type`,`side`]}};function nQ(e,t=eQ){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(s){for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!oQ(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${sQ(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))oQ(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}}else{if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location})}};e.forEach(e=>o(e)),rQ(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location})}else if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function rQ(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=$Z(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0)t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});else try{iQ(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function iQ(e,t,n,r=`;`,i=`=`){return Hr(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function aQ(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function oQ(e,t){return cQ(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||aQ(e)}function sQ(e){return cQ(e)?`one of ${e.join(`, `)}`:e}function cQ(e){return Array.isArray(e)}function lQ(e,t={}){return dQ(AX(wX(e,t),t.file),t)}function uQ(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=wX(r.source,{...t,file:r.file});n.push(...AX(e,r.file))}return dQ(n,t)}function dQ(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=nQ(e,t.schemas??(n===`1.0`?tQ:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if(fQ(t))for(let e of mQ(n).map(e=>e.trim()).filter(pQ))i.add(hQ(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function fQ(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function pQ(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function mQ(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function hQ(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function gQ(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function _Q(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function vQ(e,t={}){let n=[{name:`game-data.ts`,content:_Q(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(gQ(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function yQ(e,t={},n={}){let r=vQ(uQ(e,t),n),i=vQ(uQ(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var bQ=/^[A-Za-z_][\w-]*$/,xQ=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function SQ(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!bQ.test(n)||!bQ.test(r)?null:{type:n,name:r}}function CQ(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=SQ(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function wQ(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;e===void 0?r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n}):oQ(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${sQ(e)} on hook ${t.id}`,location:n})}return r}function TQ(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function EQ(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=xQ.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1406
|
-
`)}function
|
|
1407
|
-
`)}\n`}function zQ(e,t){let n=e.split(/[^A-Za-z0-9]+/).filter(e=>e.length>0).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)||`Table`,r=/^[A-Za-z_$]/.test(n)?n:`_${n}`,i=r;for(let e=2;t.has(i);e++)i=`${r}${e}`;return t.add(i),i}function BQ(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function VQ(e){switch(e){case`number`:return`number`;case`boolean`:return`boolean`;case`list`:return`string[]`;case`map`:return`Record<string, string>`;default:return`string`}}function HQ(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>GQ(e,t))}}function UQ(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function WQ(e,t,n={}){return XV(e,t.map(e=>GQ(e,n)))}function GQ(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=oZ(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function KQ(e,t={}){let n=[],r=new Map,i=fZ(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(XQ(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(XQ(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(XQ(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}QQ(e,t.mapBounds,n)}qQ(i,n),JQ(i,t.tableReferences,n);let a=CQ(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!SQ(t)&&n.push(XQ(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...wQ(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(XQ(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function qQ(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??ZQ()})}else if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function JQ(e,t,n){if(!t)return;let r=new Map;for(let t of e){let e=t.tag===`table`?t.attributes.id:void 0;e&&!r.has(e)&&r.set(e,t)}let i=e=>{try{return $Z(e.attributes.columns??``)}catch{return}},a=e=>e.children.filter(e=>e.tag===`row`);for(let o of t){let t=r.get(o.table);if(!t){n.push(XQ(`MWL_TABLE_REFERENCE`,`unknown table "${o.table}" in tableReferences`,ZQ()));continue}let s=i(t)?.find(e=>e.name===o.column);if(!s){n.push(XQ(`MWL_TABLE_REFERENCE`,`unknown column "${o.column}" in table "${o.table}"`,t.location));continue}let c,l;if(`oneOf`in o)c=new Set(o.oneOf),l=`one of the declared values`;else if(`node`in o.references){let t=new Set;for(let n of e)n.tag===o.references.node&&n.attributes.id&&t.add(n.attributes.id);c=t,l=`node "${o.references.node}"`}else{let e=o.references,s=r.get(e.table),u=s?i(s)?.find(t=>t.name===e.column):void 0;if(!s||!u){n.push(XQ(`MWL_TABLE_REFERENCE`,`unknown reference target "${e.table}.${e.column}" for table "${o.table}" column "${o.column}"`,t.location));continue}let d=new Set;for(let e of a(s))for(let t of YQ(e,u,s.attributes.list_delimiter))d.add(t);c=d,l=`${e.table}.${e.column}`}let u=t.attributes.list_delimiter;a(t).forEach((e,t)=>{for(let r of YQ(e,s,u))c.has(r)||n.push({code:`MWL_TABLE_REFERENCE`,message:`table "${o.table}" row ${t+1} column "${o.column}": unknown value "${r}" (expected ${l})`,location:e.valueLocations?.[o.column]??e.attributeLocations?.[o.column]??e.location??ZQ()})})}}function YQ(e,t,n){let r=e.attributes[t.name];return r===void 0||r===``?[]:t.type===`list`?r.split(n??`;`).map(e=>e.trim()).filter(e=>e.length>0):[r]}function XQ(e,t,n){return{code:e,message:t,location:n??ZQ()}}function ZQ(){return{file:`<mwl>`,line:1,column:1}}function QQ(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function $Q(e,t={}){return KQ({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function e$(e,t={}){try{let n=uQ(e,t),r=t$(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function t$(e){let t=fZ(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(eQ)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function n$(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(f$(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=d$(o,a.type);s===void 0?r.push(f$(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function r$(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function i$(e,t){let n=new Map;for(let r of e){let e=o$(...s$(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function a$(e,t){let n=new Map;for(let r of e){let e=o$(...s$(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function o$(...e){return JSON.stringify(e)}function s$(e,t){if(typeof t==`function`){let n=t(e);return c$(n)?[...n]:[n]}return l$(t)?t.map(t=>u$(e[t],String(t))):[u$(e[t],String(t))]}function c$(e){return Array.isArray(e)}function l$(e){return Array.isArray(e)}function u$(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function d$(e,t){if(t===`string`)return e;if(t===`id`)return aQ(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>aQ(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function f$(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function p$(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return oZ(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var m$=l({MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>OZ,MwlSyntaxError:()=>SX,attributeTypeDescription:()=>sQ,campaignChain:()=>DQ,carryoverIntoScenario:()=>bZ,coerceTableValue:()=>iQ,collectHookReferences:()=>CQ,compile:()=>lQ,compileAndEmitSources:()=>yQ,compileNodes:()=>dQ,compileSources:()=>uQ,composeEffects:()=>WQ,contentCatalog:()=>NQ,contentReport:()=>t$,createExpressionScriptHost:()=>p$,createWorld:()=>CZ,decodeSave:()=>YX,decodeSaveEnvelope:()=>XX,effectToModifier:()=>GQ,emitArtifacts:()=>vQ,emitHooksDeclaration:()=>EQ,emitModule:()=>_Q,emitTableTypes:()=>RQ,encodeSave:()=>JX,endLevelCarryover:()=>yZ,evaluateCondition:()=>tZ,evaluateExpression:()=>oZ,execute:()=>kZ,extractCatalog:()=>gQ,hookTypes:()=>xQ,inventoryItem:()=>UQ,isGettext:()=>UX,isMwlId:()=>aQ,itemDefinition:()=>HQ,loadContent:()=>e$,parse:()=>AX,parseExpression:()=>aZ,parseHookReference:()=>SQ,parseMapFile:()=>ZZ,parseTableColumns:()=>$Z,parseTerrain:()=>TZ,parseValue:()=>HX,preprocess:()=>wX,readAttributes:()=>n$,readChildren:()=>r$,readTableIndex:()=>a$,readTableMap:()=>i$,schema01:()=>eQ,schema10:()=>tQ,sideVisionGroups:()=>jZ,tableKey:()=>o$,typedRows:()=>LQ,validAttributeValue:()=>oQ,validate:()=>nQ,validateCatalog:()=>KQ,validateCatalogNodes:()=>$Q,validateHookAttributes:()=>wQ,validateHookReferences:()=>TQ,validateWorld:()=>ZX}),h$=class{constructor(e,t={}){if(this.latestDecision=null,this.decide=e,this.every=t.every??1,!Number.isInteger(this.every)||this.every<1||this.every>1e6)throw RangeError(`a suggestion budget must be a frame count in 1..1000000`);this.since=this.every-1}update(e){return this.since++,this.since<this.every?null:(this.since=0,this.latestDecision=this.decide(e),this.latestDecision)}get latest(){return this.latestDecision}clear(){this.latestDecision=null}};function g$(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function _$(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function v$(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function y$(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var b$=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},x$=class{constructor(e=[],t={}){this.levels=new Map,this.base=new b$(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},S$=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},C$=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},w$=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??T$,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function T$(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=E$(r,t.aspects.number(`keep_away`,0))),n}function E$(e,t){return!(t>0)||e>=t?0:-(t-e)}function D$(e){return e?Math.max(0,e.priority??1):0}var O$=l({AIBudgetExceededError:()=>N$,AICancelledError:()=>M$,Aspects:()=>b$,Difficulty:()=>x$,Goals:()=>S$,HeuristicAI:()=>w$,JavaScriptAI:()=>j$,NeuralPolicy:()=>iX,RecruitmentPattern:()=>C$,Suggester:()=>h$,alphaBetaSearch:()=>FW,defaultWeigh:()=>T$,firstWins:()=>LW,goalScore:()=>D$,keepAwayScore:()=>E$,personalScoreView:()=>_$,rootSplits:()=>IW,scoreWith:()=>y$,sideScoreView:()=>v$,subjectsWhere:()=>g$}),k$=1e4,A$=16,j$=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,R$(e.maxSteps??k$,`maxSteps`),z$(e.maxMilliseconds??A$,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=F$(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??k$,a=t.maxMilliseconds??this.options.maxMilliseconds??A$;R$(i,`maxSteps`),z$(a,`maxMilliseconds`);let o=0,s=B$(),c=[],l=L$(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new M$;if(o>i||B$()-s>a)throw new N$},d={perception:I$(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:I$(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=P$(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof M$)m=`cancelled`;else if(e instanceof N$)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:F$(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,F$(r)),this.options.onDecision?.(h),h}search(e,t,n){return FW(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,F$(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,F$(n))}}dispose(){this.agents.clear(),this.states.clear()}},M$=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},N$=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function P$(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return I$(e)}function F$(e){return I$(e)}function I$(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(I$):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,I$(t)]))}function L$(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function R$(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function z$(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function B$(){return typeof performance>`u`?Date.now():performance.now()}return _e(),Pa(),$o(),xs(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return O$}}),e.Achievements=En,e.ActionJournal=wn,e.ActorAnimator=rF,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return qH}}),e.AnimatedSprite=RM,e.Animation=IM,e.ArticulatedChain=cN,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return eX}}),e.BLOB_SHAPES=CF,e.Bar=Fz,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return uW}}),e.Beam=UP,e.Beams=WP,e.BitmapLabel=$I,e.Blob=wr,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return mq}}),e.Button=qR,e.CIRCLE8=lr,e.COLOR_BLINDNESS_MATRICES=XN,e.Camera=WN,e.CanonicalState=Gt,e.ChainRig=lN,e.Checkbox=sz,e.ClothSprite=uF,e.Collection=cn,e.ColorTransformBatcher=Jj,e.Container2D=J,e.DataTable=pz,e.DeformableSprite=GM,e.DialogueStage=rB,e.Dropdown=dz,e.DropdownView=fz,e.EMPTY=MP,e.Easing=Er,e.EntityRegistry=Nr,e.FLOATING_TEXT_STACK_GAP=Vz,e.FeedbackClient=Un,e.FixedStepper=Tr,e.Flights=HP,e.FloatingText=Bz,e.FloatingTextStack=Gz,e.FogLayer=YP,e.Game=Rj,e.Generator=j,e.Gradient=VF,e.Grid=xz,e.HALO_ANIMATION=XP,e.Halo=ZP,e.HazeLayer=vF,e.HelpScreen=Jz,e.HookRegistry=S,e.HttpTransport=Yt,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return hR}}),e.IconGrid=lL,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ve}}),e.JavaRandom=St,e.Label=cI,e.LastRun=vn,e.LayeredSprite=zP,e.LightningArc=GP,e.LiquidLayer=qP,e.ListView=cL,e.LoadQueue=Mr,e.LoadingScreen=Xz,e.LockstepClient=Qt,e.Logger=b,e.MarkupText=qI,e.MersenneTwister=he,e.MessageBox=GR,e.MessageLog=fI,e.Meter=Mz,e.Minimap=eP,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return m$}}),e.NEIGHBOURS4=sr,e.NEIGHBOURS8=cr,e.NO_COLOR_ADD=iM,e.NeonGlow=SF,e.NewsClient=an,e.NewsSeenTracker=sn,e.NinePatch=tL,e.Node2D=FF,e.OnScreenKeyboard=QR,e.ParticleEmitter=tF,e.PinnedDeform=WM,e.Player=un,e.PlayerInput=vt,e.PlayerStats=nn,e.PresentationQueue=Pr,e.Projectile=BP,e.QualityScaler=jj,e.RENDERING_DECISIONS=UF,e.RPGM_AUTOTILE_SLOT_BASES=uP,e.RPGM_AUTOTILE_SLOT_COUNTS=dP,e.RPGM_FLOOR_AUTOTILE_TABLE=pP,e.RPGM_WALL_AUTOTILE_TABLE=mP,e.RadioGroup=cz,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return C}}),e.RandomStreams=ge,e.ReactionTable=Dn,e.RebindScreen=Az,e.Recorder=ln,e.Rectangle2D=G,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return VN}}),e.RichLabel=OI,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return YV}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return GU}}),e.RpgmAutotileAtlas=lP,e.RunHistory=tn,e.SaveSyncClient=Xt,e.SaveSystem=zt,e.Scene=m,e.Scene2D=zj,e.SceneComponentHost=v,e.SceneStack=h,e.ScreenEffects=nF,e.ScreenReader=rL,e.ScrollBox=vz,e.Session=On,e.Settings=Nn,e.SettingsScreen=jz,e.Shape2D=LF,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return bX}}),e.SkeletalSprite=sN,Object.defineProperty(e,"Skeleton",{enumerable:!0,get:function(){return KM}}),e.Skins=Oz,e.Slider=oz,e.Spawner=Wn,e.Spinner=uz,e.SpringSprite=dF,e.Sprite2D=zF,e.SpriteAttachment=KP,e.SpriteGroup=VM,e.SpriteMotion=sF,e.SpriteSheet=UN,e.StageScript=iB,e.StateRegistry=Kt,e.StatsScreen=Yz,e.StatusVisuals=iF,e.StoredValue=Bt,e.StoryScreen=uB,e.StorySequence=lB,e.SyncGuard=zr,e.TabbedList=uL,e.TelemetryClient=rn,e.TerrainGraphicsLayer=HF,e.Text2D=RF,e.TextModel=KR,e.TextPrompt=ez,e.Texture2D=q,e.TileMap=RP,e.TiledSprite=BF,e.TintedSprite=aM,e.Toast=Kz,e.Tooltip=qz,e.TreeView=gz,e.Tweener=Dr,e.UPPERCASE_KEYBOARD=YR,e.UndoHistory=Or,e.VerticalLabel=rz,e.Viewport=JN,e.Window=aL,e.WindowStack=oL,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return tU}}),e.XP_AUTOTILE_PATTERNS=hP,e.XP_NEIGHBORS_TO_PATTERN=gP,e.advanceReveal=aI,e.anchorAlign=yz,e.applyAllImageModifiers=TM,e.applyImageModifiers=wM,e.applyTextureModifiers=AM,e.assertAutotileLayout=bP,e.autotileCellParts=EP,e.autotileFrames=OF,e.bitmapLabelStyle=eL,e.blendMatrix=yM,e.blendPixels=NM,e.blobIndex=DF,e.cellFromKey=or,e.cellIndex=nr,e.cellInside=tr,e.cellKey=ar,e.cellX=rr,e.cellY=ir,e.channelScaleMatrix=vM,e.channelSwapMatrix=bM,e.chebyshev=dr,e.checkNoControlCharacters=kt,e.checkSize=Ot,e.clamp=kn,e.cloneData=Wt,e.colorShiftMatrix=_M,e.completeReveal=oI,e.contrastRatio=eB,e.createCamera=qN,e.createColorBlindnessFilter=ZN,e.createHandles=_,e.createLayers=IF,e.croppedTexture=EM,e.defaultSettings=An,e.defaultStorage=Rt,e.defaultTheme=QF,e.deserializeReplay=fn,e.detectWebGpu=GF,e.distance=pr,e.downloadReplayFile=xn,e.effectiveMusicVolume=jn,e.effectiveSfxVolume=Mn,e.escapeHtml=BI,e.euclidean=ur,e.exportReplayFile=gn,e.extractDialogueCatalog=cB,e.fitWindowZoom=pI,e.floatingTextAgeAtLeast=zz,e.floatingTextAlpha=Lz,e.floatingTextRise=Rz,e.floatingTextStackLifePenalty=Hz,e.floatingTextStackLift=Uz,e.floatingTextStackMoves=Wz,e.flowLayout=Ez,e.glowFalloff=bF,e.hazeField=gF,e.hexDistance=Yn,e.hexLine=Zn,e.hexNeighbors=Jn,e.hexRange=Qn,e.hexRotate=AF,e.hexToPixel=$n,e.highContrastTheme=$F,e.imageModifier=hM,e.importReplayFile=_n,e.importTwee=oB,e.inspectGraphicsCapabilities=WF,e.isOnScreen=BM,e.layoutMarkupLines=LI,e.layoutVertical=nz,e.linesToDrop=dI,e.loadSvgSkeleton=ZF,e.loadTiledMap=XF,e.manhattan=fr,e.markupAccessibilityText=II,e.markupToHtml=FI,e.maskPixels=MM,e.matchTerrainRule=MF,e.meetsContrast=tB,e.messageBoxPresenter=Zz,e.minimapCellCenter=$N,e.motionDuration=Cr,e.newlyRevealed=QN,e.packColorAdd=tM,e.packTintAdd=nM,e.paintFogPixels=JP,e.paintGlowPixels=xF,e.paintHazePixels=_F,e.paletteRangeMapping=uM,e.parseCSV=Br,e.parseColorPairs=OM,e.parseDialogueLines=Wr,e.parseDialogueText=sB,e.parseImagePath=mM,e.parseInbound=Pt,e.parseMarkdown=TI,e.parseMarkup=NI,e.parsePaletteLists=kM,e.parseReplayEvents=pn,e.parseRotateMode=gM,e.parseTwee=Gr,e.pickReplayFile=Cn,e.pixelToHex=er,e.positionMarkupLines=zI,e.prefersReducedMotion=yr,e.readReplayFile=Sn,e.recolorTexture=pM,e.rectOf=HN,e.reducedMotion=br,e.registerColorTransform=eM,e.relativeLuminance=$z,e.remapPixels=dM,e.resolveAnchor=bz,e.resolveTerrainGraphics=NF,e.resumeRunPlayer=bn,e.revealComplete=sI,e.rotatePixels=PM,e.rpgmAutotileFrame=cP,e.rpgmAutotileSlot=fP,e.rpgmTableEdgeCells=jP,e.runCheckpoint=yn,e.sanitizeInboundText=At,e.scramble=Ct,e.screenReader=iL,e.scrollOffset=_z,e.serializeReplay=dn,e.setReducedMotion=xr,e.setTheme=tI,e.sharpenText=hI,e.sliceSpans=DI,e.sliderFraction=iz,e.sliderValueAt=az,e.snapZoom=KN,e.spinValue=lz,e.splitScreenHalves=YN,e.spriteColorMatrix=xM,e.squareRotate=kF,e.startReveal=iI,e.stateChecksum=Rr,e.stripMarkdown=EI,e.stripMarkup=PI,e.takeLastEntries=uI,e.theme=Q,e.themeChanged=$,e.tileFrame=FP,e.tileFrameIndex=LP,e.tileFrameSheet=IP,e.uncloneablePath=Vt,e.unscramble=wt,e.validateSchema=Nt,e.version=f,e.watchReducedMotion=Sr,e.weightedFlood=kr,e.withTextureCanvas=fM,e.xpAutotilePattern=vP,e.xpAutotileRef=_P,e})({});
|
|
1399
|
+
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),ZX=class extends Error{constructor(e){super(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`),this.name=`MwlSyntaxError`,this.diagnostic=e}},QX=new Set([`define`,`enddef`,`arg`,`ifdef`,`ifndef`,`else`,`endif`,`include`]);function $X(e,t={}){let n=new Map,r=new Set(t.defines??[]),i=e.split(/\r?\n/),a=[],o=[!0],s=null;for(let e=0;e<i.length;e++){let c=i[e],l=/^\s*#([A-Za-z_][\w-]*)(?:\s+(.*))?$/.exec(c);if(l&&QX.has(l[1])){let i=l[1],u=l[2]?.trim()??``;if(i===`define`){if(!o.at(-1)||s)continue;let n=yZ(u);if(n.length===0)throw xZ(`MWL_DEFINE`,`macro name is required`,t.file,e,c);s={name:n[0],parameters:n.slice(1),body:[]},r.add(n[0]);continue}if(i===`arg`){s&&u&&s.parameters.push(u.split(/\s+/)[0]);continue}if(i===`enddef`){if(!s)throw xZ(`MWL_ENDDEF`,`unexpected #enddef`,t.file,e,c);n.set(s.name,{name:s.name,parameters:s.parameters,body:s.body.join(`
|
|
1400
|
+
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw xZ(`MWL_ELSE`,`unexpected #else`,t.file,e,c);o[o.length-1]=o[o.length-2]&&!o.at(-1);continue}if(i===`endif`){if(o.length<2)throw xZ(`MWL_ENDIF`,`unexpected #endif`,t.file,e,c);o.pop();continue}if(i===`include`){if(o.at(-1)){let n=t.includes?.[bZ(u)];if(n===void 0)throw xZ(`MWL_INCLUDE`,`include not supplied: ${u}`,t.file,e,c);a.push($X(n,t))}continue}}s?o.at(-1)&&s.body.push(c):o.at(-1)&&!/^\s*#/.test(c)&&a.push(c)}if(s)throw xZ(`MWL_ENDDEF`,`macro ${s.name} is missing #enddef`,t.file,i.length-1,i.at(-1)??``);if(o.length!==1)throw xZ(`MWL_ENDIF`,`conditional is missing #endif`,t.file,i.length-1,i.at(-1)??``);return nZ(eZ(a.join(`
|
|
1401
|
+
`),n,t))}function eZ(e,t,n){let r=``,i=0;for(;i<e.length;){let a=iZ(e,i);if(a!==i){r+=e.slice(i,a),i=a;continue}let o=e[i];if(o!==`{`){r+=o,i++;continue}let s=e.indexOf(`}`,i+1);if(s<0){r+=o,i++;continue}let c=e.slice(i,s+1),l=yZ(e.slice(i+1,s)),u=t.get(l[0]);if(u){let e=u.body;for(let t=0;t<u.parameters.length;t++){let n=u.parameters[t],r=l.find(e=>e.startsWith(`${n}=`)),i=r?r.slice(n.length+1):l[t+1]??``;e=e.replaceAll(`{${n}}`,i)}r+=eZ(e,t,n)}else if(n.macroPolicy!==`ignore`&&tZ(l[0]))throw SZ(`MWL_MACRO`,`unknown macro "${l[0]}"`,e,n.file,i);else r+=c;i=s+1}return r}function tZ(e){return e!==void 0&&fZ.test(e)}function nZ(e){let t=/^_\(\s*("(?:[^"\\]|\\[\s\S])*"|'(?:[^'\\]|\\[\s\S])*')\s*\)/,n=``,r=0;for(;r<e.length;){let i=iZ(e,r);if(i!==r){n+=e.slice(r,i),r=i;continue}let a=e[r];if(a===`_`){let i=t.exec(e.slice(r));if(i){n+=`{"$gettext": ${i[1]}}`,r+=i[0].length;continue}}n+=a,r++}return n}function rZ(e,t){let n=e[t],r=t+1;for(;r<e.length;){let t=e[r];if(t===`\\`)r+=2;else{if(t===n)return r+1;if(t===`
|
|
1402
|
+
`)return r;r++}}return r}function iZ(e,t){let n=e[t];if(n===`"`||n===`'`)return rZ(e,t);let r=e[t+1];if(n===`/`&&(r===`/`||r===`*`)){let n=r===`/`?e.indexOf(`
|
|
1403
|
+
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function aZ(e,t=`<mwl>`){let n=nZ(e);if(n.trim()===``)return[];let r;try{r=XX.default.parse(n)}catch(e){throw gZ(e,n,t)}if(r===void 0)return[];if(!Array.isArray(r))throw new ZX({code:`MWL_DOCUMENT`,message:`MWL document must be a top-level array of nodes`,location:{file:t,line:1,column:1},lineText:n.split(/\r?\n/)[0]??``});let i={file:t,sites:pZ(n,t),cursor:{index:0},parent:void 0};return oZ(r).map(e=>uZ(e,i))}function oZ(e){let t=[];for(let n of e){let e=sZ(n);Array.isArray(e)?t.push(...e):t.push(e)}return t}function sZ(e){if(Array.isArray(e))return e.flatMap(e=>sZ(e));if(typeof e!=`object`||!e)return e;let t=e;if(typeof t.tag!=`string`){let n=Object.keys(t);if(n.length!==1||!fZ.test(n[0]))return e;let r=n[0],i=t[r];return Array.isArray(i)?i.map(e=>cZ(r,e)):cZ(r,i)}let n={...t},r=[];Array.isArray(t.children)&&r.push(...t.children.flatMap(e=>sZ(e)));for(let[e,i]of Object.entries(t)){if(e===`tag`||e===`children`||!fZ.test(e)||!lZ(i))continue;let t=Array.isArray(i)?i:[i];r.push(...t.map(t=>cZ(e,t))),delete n[e]}return r.length&&(n.children=r),n}function cZ(e,t){return typeof t!=`object`||!t||Array.isArray(t)?{tag:e,value:t}:sZ({tag:e,...t})}function lZ(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(`$gettext`in e)||Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&!Array.isArray(e))}function uZ(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw new ZX({code:`MWL_TAG`,message:`MWL node must be an object with a tag`,location:t.parent??{file:t.file,line:1,column:1}});let n=e;if(typeof n.tag!=`string`||!fZ.test(n.tag))throw new ZX({code:`MWL_TAG`,message:`MWL node needs a tag name`,location:t.parent??{file:t.file,line:1,column:1}});let r=n.tag,i=mZ(t,r),a=i.location,o=n.children??[];if(!Array.isArray(o))throw new ZX({code:`MWL_TAG`,message:`children of [${r}] must be an array`,location:a});let s={},c={},l={},u=[];for(let[e,t]of Object.entries(n)){if(e===`tag`||e===`children`)continue;s[e]=dZ(r,e,t,a,u);let n=i.properties?.get(e);n&&(c[e]=n.location,l[e]=n.valueLocation)}let d={...t,parent:a},f={tag:r,attributes:s,children:o.map(e=>uZ(e,d)),location:a,gettext:u};return Object.defineProperties(f,{attributeLocations:{value:c,enumerable:!1},valueLocations:{value:l,enumerable:!1}}),f}function dZ(e,t,n,r,i){if(!fZ.test(t)||t.startsWith(`$`)||t.startsWith(`_`))throw new ZX({code:`MWL_ATTRIBUTE`,message:`unknown attribute "${t}" on [${e}]`,location:r});if(typeof n==`string`)return n;if(typeof n==`number`&&Number.isFinite(n))return String(n);if(typeof n==`boolean`)return n?`true`:`false`;if(typeof n==`object`&&n&&!Array.isArray(n)){let e=Object.keys(n),r=n.$gettext;if(e.length===1&&e[0]===`$gettext`&&typeof r==`string`)return i.push(t),r}throw new ZX({code:`MWL_ATTRIBUTE`,message:`attribute "${t}" on [${e}] must be a string, number, boolean, or _("...")`,location:r})}var fZ=/^[A-Za-z_][\w-]*$/;function pZ(e,t){let n=[],r=[];for(let i=0;i<e.length;){let a=iZ(e,i);if(a!==i){i=a;continue}let o=e[i];if(o===`{`){let e={start:i,properties:new Map};r.push(e),i++;continue}if(o===`}`){r.pop(),i++;continue}let s=/[A-Za-z_$][\w$-]*/y;s.lastIndex=i;let c=s.exec(e);if(!c){i++;continue}let l=c.index+c[0].length;for(;/\s/.test(e[l]??``);)l++;if(e[l]!==`:`){i=c.index+c[0].length;continue}let u=l+1;for(;/\s/.test(e[u]??``);)u++;let d=r.at(-1);if(d&&(d.properties.set(c[0],{location:hZ(e,t,c.index),valueLocation:hZ(e,t,u)}),c[0]===`tag`&&(e[u]===`"`||e[u]===`'`))){let r=rZ(e,u),i=e.slice(u,r),a;try{a=XX.default.parse(i)}catch{a=void 0}typeof a==`string`&&n.push({tag:a,location:hZ(e,t,c.index),properties:d.properties})}i=c.index+c[0].length}return n}function mZ(e,t){for(let n=e.cursor.index;n<e.sites.length;n++)if(e.sites[n].tag===t)return e.cursor.index=n+1,e.sites[n];return{tag:t,location:e.parent??{file:e.file,line:1,column:1}}}function hZ(e,t,n){let r=1,i=1;for(let t=0;t<n;t++)e[t]===`
|
|
1404
|
+
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function gZ(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new ZX({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function _Z(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=XX.default.parse(a);if(typeof e==`string`)return e}catch{}throw new ZX({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new ZX({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function vZ(e){return/^_\(\s*["']/.test(e.trim())}function yZ(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function bZ(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function xZ(e,t,n,r,i){return new ZX({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function SZ(e,t,n,r,i){let a=hZ(n,r??`<mwl>`,i);return new ZX({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function CZ(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:OZ(n)},...r===void 0?{}:{journal:kZ(r)}};return JSON.stringify(i)}function wZ(e,t){return TZ(e,t).world}function TZ(e,t){let n=JSON.parse(e),r=DZ(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=EZ(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=EZ(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:OZ(r.hookState)},...r.journal===void 0?{}:{journal:kZ(r.journal)}}}function EZ(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Mt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return Wt(t,`saved world`)}function DZ(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function OZ(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Mt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function kZ(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Mt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function AZ(e,t,n={}){let r=e.search(/\s+where\s+/),i=r<0?e:e.slice(0,r),a={...t};if(r>=0)for(let t of e.slice(r).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let r=new jZ(e[2],a,n.helpers??{});if(a[e[1]]=r.parseOr(),!r.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let o=new jZ(i,a,n.helpers??{}),s=o.parseOr();if(!o.atEnd())throw Error(`unexpected token in MWL condition: ${o.peek()}`);return NZ(s)}var jZ=class{constructor(e,t,n){this.index=0,this.tokens=MZ(e),this.context=t,this.helpers=n}parseOr(){let e=this.parseAnd();for(;this.take(`or`);)e=NZ(e)||NZ(this.parseAnd());return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);)e=NZ(e)&&NZ(this.parseNot());return e}parseNot(){return this.take(`not`)?!NZ(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){let e=this.parseOr();return this.expect(`)`),e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}};function MZ(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function NZ(e){return e!==!1&&e!==0&&e!==``}function PZ(e){let t=new BZ(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function FZ(e,t){let n=typeof e==`string`?PZ(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=FZ(n.left,t),i=FZ(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var IZ=256,LZ=4096,RZ=/(?:\d+(?:\.\d*)?|\.\d+)/y,zZ=/[A-Za-z_][A-Za-z0-9_.-]*/y,BZ=class{constructor(e){this.index=0,this.depth=0,this.operators=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,this.operator(),e={kind:`binary`,op:`^`,left:e,right:this.nested(()=>this.power())}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.nested(()=>this.expression());if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=this.match(RZ);if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=this.match(zZ);if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}match(e){return e.lastIndex=this.index,e.exec(this.source)}nested(e){if(++this.depth>IZ)throw Error(`MWL expression is nested more than ${IZ} deep`);try{return e()}finally{this.depth--}}operator(){if(++this.operators>LZ)throw Error(`MWL expression has more than ${LZ} operators`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){let e=this.source.slice(this.index,this.index+40);return this.index+40<this.source.length?`${e}...`:e}};function VZ(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function HZ(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function UZ(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function WZ(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function GZ(e,t){return KZ(e.attributes[t])}function KZ(e){return e===void 0?void 0:e===`true`||e===`yes`}function qZ(e,t){return e!==void 0&&t.includes(e)?e:void 0}function JZ(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function YZ(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}_e();var XZ=HZ,ZZ=(e,t,n)=>WZ(e,t,n)??n;function QZ(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}var $Z=1048576;function eQ(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.reduce((e,t)=>Math.max(e,t.length),0);if(r*n>$Z)throw Error(`MWL terrain is ${r}x${n}, more than ${$Z} cells`);let i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var tQ=/\$\(([^)]*)\)/g,nQ=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,rQ=class e{constructor(e,t={}){this.journal=new wn,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??QZ(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new j,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||wQ(n.attributes.x,t.x))&&(n.attributes.y===void 0||wQ(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];this.isConsumedElse(e,t)||(n.tag===`say`?this.showSay(n):n.tag===`dialogue`?this.showDialogue(n):this.executeNode(n))}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!gQ(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return CZ(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=TZ(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new j().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:ZZ(e,`hitpoints`,1),movement:ZZ(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:ZZ(e,`gold`,0),income:ZZ(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=ZZ(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[XZ(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:ZZ(e,`x`,0),y:ZZ(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=hQ(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&mQ(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=eQ(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=fQ(e,`x`),i=fQ(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=XZ(e,`id`),n={hp:ZZ(e,`hp`,1),x:ZZ(e,`x`,0),y:ZZ(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=GZ(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length||this.world.units[t])continue;let i=this.unitTypes.get(t);if(!i)throw Error(`MWL side ${n} leader "${t}" is neither a unit nor a unit type`);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i.hitpoints,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i.movement,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(ZZ(t,`x`,0),ZZ(t,`y`,0),XZ(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??XZ(t,`target`),ZZ(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??XZ(t,`target`),ZZ(t,`delta`,ZZ(t,`amount`,0))),gold:(e,t)=>e.addGold(XZ(t,`side`),ZZ(t,`delta`,ZZ(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,ZZ(e,`x`,0),ZZ(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:ZZ(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??XZ(e,`target`),ZZ(e,`x`,0),ZZ(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?cQ(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??XZ(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...lQ(t)})))}cmdUnstoreUnit(e){let t=XZ(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(XZ(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=ZZ(e,`x`,0)),e.attributes.y!==void 0&&(i.y=ZZ(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))uQ(n,t)}cmdHealUnit(e){let t=fQ(e,`amount`),n=fQ(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=ZZ(e,`x`,0),n=ZZ(e,`y`,0),r={x:t,y:n,side:XZ(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=XZ(e,`side`),n=ZZ(e,`x`,0),r=ZZ(e,`y`,0),i=ZZ(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?XZ(e,`target`):XZ(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=ZZ(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);let n=0;for(;n<t&&this.nodeConditionMatches(e);)this.runBlock(this.commandChildren(e)),n++;if(n===t&&this.nodeConditionMatches(e)){if(e.attributes.on_limit===`error`)throw Error(`MWL while reached its max_iterations cap of ${t}`);this.onTrace?.({type:`while_limit`,iterations:t})}}cmdForeach(e){let t=this.variableAt(XZ(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(XZ(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&gQ(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=JZ(this.world,aQ(this.world,e.attributes.side),{result:t,bonus:WZ(e,`bonus`),carryoverPercentage:UZ(e,`carryover_percentage`),carryoverAdd:GZ(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(tQ,(e,n)=>{try{return String(FZ(n,t))}catch{return``}}).replace(nQ,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(tQ,(e,t)=>String(FZ(t,this.numericVariables()))).replace(nQ,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,FZ(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())?this.setVariableAt(e,FZ(t,a)):this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return SQ(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);xQ(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:hQ(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&mQ(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=WZ(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&mQ(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return pQ(this.variableAt(e.attributes.variable),e.attributes,CQ(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):AZ(e.attributes.test,_Q(this.world.variables),{helpers:this.conditionHelpers()})}conditionHelpers(){if(this.testHelpers)return this.testHelpers;let e=e=>{let t={};for(let n of e){let e=String(n),r=e.indexOf(`=`);r<=0?t.value=e:t[e.slice(0,r)]=e.slice(r+1)}return t},t={have_unit:(...t)=>{let n=e(t);return Object.entries(this.world.units).some(([e,t])=>t.alive&&(n.id===void 0||e===n.id)&&mQ(t,e,n))},have_location:(...t)=>{let n=e(t),r=this.world.map,i=Number(n.x),a=Number(n.y);if(!r||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<0||i>=r.width||a>=r.height)return!1;let o=r.codes[a*r.width+i];return n.terrain===void 0||o===n.terrain}};for(let[n,r]of Object.entries(this.hooks?.predicate??{}))t[n]=(...t)=>!!r(this.worldView(),e(t));return this.testHelpers=t,t}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&pQ(this.variableAt(t),e.attributes,CQ(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&mQ(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=fQ(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=fQ(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=fQ(e,`x`),n=fQ(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{xQ(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function iQ(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:xQ(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=sQ(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?cQ(e,t.filter??{}):sQ(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=JZ(e,t.side??null,t)}}function aQ(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function oQ(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function sQ(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function cQ(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&mQ(i,r,t)&&(i.alive=!1,n++);return n}function lQ(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function uQ(e,t){let n=dQ(t.hp);n!==void 0&&(e.hp=n);let r=dQ(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=KZ(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=KZ(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function dQ(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function fQ(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function pQ(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return gQ(e,r(t.equals));if(t.not_equals!==void 0)return!gQ(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>gQ(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>gQ(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function mQ(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=KZ(n.can_recruit),a=KZ(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||wQ(n.x,e.x))&&(n.y===void 0||wQ(n.y,e.y))}function hQ(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function gQ(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function _Q(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function vQ(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function yQ(e){let t=vQ(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function bQ(e){return typeof e!=`string`}function xQ(e,t,n){let r=yQ(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=bQ(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function SQ(e,t){let n=e;for(let e of vQ(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function CQ(e){return t=>SQ(e,t)}function wQ(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var TQ=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function EQ(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=TQ.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...eQ(t.slice(r).map(DQ).join(`
|
|
1405
|
+
`))}}function DQ(e){let t=e.length;for(;t>0&&(e[t-1]===`,`||/\s/.test(e[t-1]));)t--;return e.slice(0,t)}function OQ(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var kQ={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`},openAttributes:`string`},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`,on_limit:`id`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},AQ={...kQ,game:{...kQ.game,required:[`schema`]},table:{...kQ.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...kQ.terrain_type,required:[`id`]},movetype:{...kQ.movetype,required:[`id`]},unit_type:{...kQ.unit_type,required:[`id`]},unit:{...kQ.unit,required:[`id`,`type`,`side`]}};function jQ(e,t=kQ){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(s){for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!FQ(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${IQ(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))FQ(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}}else{if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location})}};e.forEach(e=>o(e)),MQ(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location})}else if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function MQ(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=OQ(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0)t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});else try{NQ(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function NQ(e,t,n,r=`;`,i=`=`){return Hr(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function PQ(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function FQ(e,t){return LQ(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||PQ(e)}function IQ(e){return LQ(e)?`one of ${e.join(`, `)}`:e}function LQ(e){return Array.isArray(e)}function RQ(e,t={}){return BQ(aZ($X(e,t),t.file),t)}function zQ(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=$X(r.source,{...t,file:r.file});n.push(...aZ(e,r.file))}return BQ(n,t)}function BQ(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=jQ(e,t.schemas??(n===`1.0`?AQ:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if(VQ(t))for(let e of UQ(n).map(e=>e.trim()).filter(HQ))i.add(WQ(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function VQ(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function HQ(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function UQ(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function WQ(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function GQ(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function KQ(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function qQ(e,t={}){let n=[{name:`game-data.ts`,content:KQ(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(GQ(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function JQ(e,t={},n={}){let r=qQ(zQ(e,t),n),i=qQ(zQ(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var YQ=/^[A-Za-z_][\w-]*$/,XQ=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function ZQ(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!YQ.test(n)||!YQ.test(r)?null:{type:n,name:r}}function QQ(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=ZQ(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function $Q(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;e===void 0?r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n}):FQ(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${IQ(e)} on hook ${t.id}`,location:n})}return r}function e$(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function t$(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=XQ.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1406
|
+
`)}function n$(e,t){let n=e.scenarios;if(n.length===0)throw Error(`campaign ${e.id} declares no scenarios`);let r=new Set(n.map(e=>e.id));if(r.size!==n.length)throw Error(`campaign ${e.id} declares a scenario twice`);let i=e.firstScenario||n[0].id;if(!r.has(i))throw Error(`campaign ${e.id} starts on an unknown scenario: ${i}`);return{start:i,levels:n.map(e=>({id:e.id,run:(n,r)=>{let i=t.run(e,n,r);return i.next===void 0?{...i,next:e.nextScenario??null}:i}}))}}var r$=HZ,i$=UZ,a$=WZ,o$=GZ,s$=qZ;function c$(e){let t=VZ(e.roots);return{campaigns:t.filter(e=>e.tag===`campaign`).map(e=>({id:r$(e,`id`),name:e.attributes.name,title:e.attributes.title,description:e.attributes.description,startScene:e.attributes.start_scene,firstScenario:e.attributes.first_scenario,scenarios:e.children.filter(e=>e.tag===`scenario`).map(e=>({id:r$(e,`id`),nextScenario:e.attributes.next_scenario||void 0}))})),items:t.filter(e=>e.tag===`item`).map(e=>({id:r$(e,`id`),name:r$(e,`name`),slot:e.attributes.slot,stackable:o$(e,`stackable`),weight:i$(e,`weight`),image:e.attributes.image,icon:e.attributes.icon,effects:e.children.filter(e=>e.tag===`effect`).map(u$)})),monsters:t.filter(e=>e.tag===`monster`).map(e=>({id:r$(e,`id`),name:e.attributes.name,hp:a$(e,`hp`,1),accuracy:i$(e,`accuracy`),evasion:i$(e,`evasion`),damage:d$(e,`damage_min`,`damage_max`),armor:d$(e,`armor_min`,`armor_max`),experience:a$(e,`experience`),maxLevel:a$(e,`max_level`),image:e.attributes.image,types:e.attributes.types?.split(`,`).map(e=>e.trim()).filter(Boolean),baseStats:[`attack`,`defense`,`speed`,`hp`].reduce((t,n)=>{let r=i$(e,n);return r!==void 0&&(t[n===`hp`?`maxHp`:n]=r),t},{})})),statuses:t.filter(e=>e.tag===`status`).map(e=>({id:r$(e,`id`),name:e.attributes.name,duration:a$(e,`duration`),tick:e.attributes.tick,modifiers:e.attributes.modifiers})),loot:t.filter(e=>e.tag===`loot`).map(e=>({item:r$(e,`item`),chance:i$(e,`chance`),quantity:a$(e,`quantity`),weight:i$(e,`weight`)})),turnClocks:t.filter(e=>e.tag===`turn_clock`).map(e=>({id:r$(e,`id`),tick:i$(e,`tick`),hunger:i$(e,`hunger`)})),ai:t.filter(e=>e.tag===`ai`).map(e=>({id:r$(e,`id`),strategy:e.attributes.strategy,target:e.attributes.target,difficulty:i$(e,`difficulty`),scope:s$(e.attributes.scope,[`actor`,`controller`]),provider:s$(e.attributes.provider,[`javascript`,`lua`]),algorithm:s$(e.attributes.algorithm,[`rules`,`alpha_beta`]),depth:a$(e,`depth`),maxNodes:a$(e,`max_nodes`),player:e.attributes.player,moves:e.attributes.moves,apply:e.attributes.apply,terminal:e.attributes.terminal,evaluate:e.attributes.evaluate,behaviors:e.children.filter(e=>e.tag===`behavior`).map(e=>({id:r$(e,`id`),when:e.attributes.when,action:e.attributes.action,hook:e.attributes.hook}))})),moves:t.filter(e=>e.tag===`battle_move`).map(e=>({id:r$(e,`id`),type:r$(e,`type`),target:r$(e,`target`),power:i$(e,`power`),cost:i$(e,`cost`)})),typeMatchups:t.filter(e=>e.tag===`type_matchup`).map(e=>({attacker:r$(e,`attacker`),defender:r$(e,`defender`),multiplier:i$(e,`multiplier`)??1})),evolutions:t.filter(e=>e.tag===`evolution`).map(e=>({from:r$(e,`from`),into:r$(e,`into`),level:a$(e,`level`,1)})),tables:t.filter(e=>e.tag===`table`).map(l$)}}function l$(e){let t=OQ(r$(e,`columns`));return{id:r$(e,`id`),columns:t,rows:e.children.filter(e=>e.tag===`row`).map(n=>{let r={};for(let i of t){let t=n.attributes[i.name];t!==void 0&&(r[i.name]=NQ(t,i.type,i.name,e.attributes.list_delimiter,e.attributes.map_delimiter))}return r})}}function u$(e){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].find(t=>e.attributes[t]!==void 0);return{applyTo:r$(e,`apply_to`),operation:t,value:t?e.attributes[t]:void 0,range:e.attributes.range}}function d$(e,t,n){let r=i$(e,t),i=i$(e,n);return r===void 0||i===void 0?void 0:[r,i]}function f$(e,t){let n=[];function r(e,t){n.push({code:`MWL_OBJECT`,message:t,location:e.location??{file:`<mwl>`,line:1,column:1}})}function i(e){let n={},a=Object.hasOwn(t,e.tag)?t[e.tag]:void 0;if(!a)return r(e,`no object schema for tag "${e.tag}"`),n;for(let[t,i]of Object.entries(e.attributes)){let o=(a.attributes&&Object.hasOwn(a.attributes,t)?a.attributes[t]:void 0)??a.openAttributes;if(!o||!FQ(i,o)){r(e,`invalid or undeclared attribute "${t}" on "${e.tag}"`);continue}let s=i;o===`number`||o===`integer`?s=Number(i):o===`boolean`&&(s=i===`true`||i===`yes`),Object.defineProperty(n,t,{value:s,enumerable:!0,writable:!0,configurable:!0})}for(let t of a.required??[])Object.hasOwn(e.attributes,t)||r(e,`missing required attribute "${t}" on "${e.tag}"`);let o=new Map;for(let t of e.children){let e=o.get(t.tag)??[];e.push(i(t)),o.set(t.tag,e)}for(let[t,i]of o){if(Object.hasOwn(n,t)){r(e,`attribute and child tag "${t}" collide on "${e.tag}"`);continue}let o=a.cardinality?.[t]?.max===1;o&&i.length>1&&r(e,`multiple "${t}" children on "${e.tag}"`),Object.defineProperty(n,t,{value:o?i[0]:i,enumerable:!0,writable:!0,configurable:!0})}return n}return{value:e.map(i),diagnostics:n}}function p$(e){return e.rows}function m$(e,t={}){let n=[`// ${t.header??`Generated from MWL tables - do not edit by hand.`}`];e.length>0&&n.push(`import { typedRows } from '@datamoc/mw_games/mwl';`,`import type { MwlContentCatalog } from '@datamoc/mw_games/mwl';`);let r=new Set;for(let i of e){let e=h$(i.id,r);for(let a of i.columns){if(!t.literalColumns?.includes(a.name))continue;if(a.type!==`string`)throw Error(`literal column "${i.id}.${a.name}" must be a string`);let o=[...new Set(i.rows.map(e=>e[a.name]).filter(e=>e!==void 0))];if(o.some(e=>typeof e!=`string`))throw Error(`literal column "${i.id}.${a.name}" contains a non-string value`);let s=h$(`${e}_${a.name}`,r);n.push(``,`export const ${s}Values = ${JSON.stringify(o.sort())} as const;`,`export type ${s} = typeof ${s}Values[number];`)}n.push(``,`const ${e}Columns = [${i.columns.map(e=>`{ name: ${JSON.stringify(e.name)}, type: ${JSON.stringify(e.type)} }`).join(`, `)}] as const;`),n.push(`export interface ${e}Row {`);for(let e of i.columns)n.push(`\t${g$(e.name)}?: ${_$(e.type)};`);n.push(`}`,``,`/** Typed rows of the \`${i.id}\` table. */`);let a=`${e[0].toLowerCase()}${e.slice(1)}Rows`;n.push(`export function ${a}(catalog: Pick<MwlContentCatalog, 'tables'>): ${e}Row[] {`,`\tconst table = catalog.tables.find((entry) => entry.id === ${JSON.stringify(i.id)});`,`\treturn typedRows({ columns: ${e}Columns, rows: table?.rows ?? [] });`,`}`)}return`${n.join(`
|
|
1407
|
+
`)}\n`}function h$(e,t){let n=e.split(/[^A-Za-z0-9]+/).filter(e=>e.length>0).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)||`Table`,r=/^[A-Za-z_$]/.test(n)?n:`_${n}`,i=r;for(let e=2;t.has(i);e++)i=`${r}${e}`;return t.add(i),i}function g$(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function _$(e){switch(e){case`number`:return`number`;case`boolean`:return`boolean`;case`list`:return`string[]`;case`map`:return`Record<string, string>`;default:return`string`}}function v$(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>x$(e,t))}}function y$(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function b$(e,t,n={}){return xH(e,t.map(e=>x$(e,n)))}function x$(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=FZ(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function S$(e,t={}){let n=[],r=new Map,i=VZ(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(E$(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(E$(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(E$(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}O$(e,t.mapBounds,n)}C$(i,n),w$(i,t.tableReferences,n);let a=QQ(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!ZQ(t)&&n.push(E$(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...$Q(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(E$(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function C$(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??D$()})}else if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function w$(e,t,n){if(!t)return;let r=new Map;for(let t of e){let e=t.tag===`table`?t.attributes.id:void 0;e&&!r.has(e)&&r.set(e,t)}let i=e=>{try{return OQ(e.attributes.columns??``)}catch{return}},a=e=>e.children.filter(e=>e.tag===`row`);for(let o of t){let t=r.get(o.table);if(!t){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown table "${o.table}" in tableReferences`,D$()));continue}let s=i(t)?.find(e=>e.name===o.column);if(!s){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown column "${o.column}" in table "${o.table}"`,t.location));continue}let c,l;if(`oneOf`in o)c=new Set(o.oneOf),l=`one of the declared values`;else if(`node`in o.references){let t=new Set;for(let n of e)n.tag===o.references.node&&n.attributes.id&&t.add(n.attributes.id);c=t,l=`node "${o.references.node}"`}else{let e=o.references,s=r.get(e.table),u=s?i(s)?.find(t=>t.name===e.column):void 0;if(!s||!u){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown reference target "${e.table}.${e.column}" for table "${o.table}" column "${o.column}"`,t.location));continue}let d=new Set;for(let e of a(s))for(let t of T$(e,u,s.attributes.list_delimiter))d.add(t);c=d,l=`${e.table}.${e.column}`}let u=t.attributes.list_delimiter;a(t).forEach((e,t)=>{for(let r of T$(e,s,u))c.has(r)||n.push({code:`MWL_TABLE_REFERENCE`,message:`table "${o.table}" row ${t+1} column "${o.column}": unknown value "${r}" (expected ${l})`,location:e.valueLocations?.[o.column]??e.attributeLocations?.[o.column]??e.location??D$()})})}}function T$(e,t,n){let r=e.attributes[t.name];return r===void 0||r===``?[]:t.type===`list`?r.split(n??`;`).map(e=>e.trim()).filter(e=>e.length>0):[r]}function E$(e,t,n){return{code:e,message:t,location:n??D$()}}function D$(){return{file:`<mwl>`,line:1,column:1}}function O$(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function k$(e,t={}){return S$({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function A$(e,t={}){try{let n=zQ(e,t),r=j$(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function j$(e){let t=VZ(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(kQ)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function M$(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(H$(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=V$(o,a.type);s===void 0?r.push(H$(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function N$(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function P$(e,t){let n=new Map;for(let r of e){let e=I$(...L$(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function F$(e,t){let n=new Map;for(let r of e){let e=I$(...L$(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function I$(...e){return JSON.stringify(e)}function L$(e,t){if(typeof t==`function`){let n=t(e);return R$(n)?[...n]:[n]}return z$(t)?t.map(t=>B$(e[t],String(t))):[B$(e[t],String(t))]}function R$(e){return Array.isArray(e)}function z$(e){return Array.isArray(e)}function B$(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function V$(e,t){if(t===`string`)return e;if(t===`id`)return PQ(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>PQ(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function H$(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function U$(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return FZ(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var W$=l({MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>rQ,MwlSyntaxError:()=>ZX,attributeTypeDescription:()=>IQ,campaignChain:()=>n$,carryoverIntoScenario:()=>YZ,coerceTableValue:()=>NQ,collectHookReferences:()=>QQ,compile:()=>RQ,compileAndEmitSources:()=>JQ,compileNodes:()=>BQ,compileSources:()=>zQ,composeEffects:()=>b$,contentCatalog:()=>c$,contentReport:()=>j$,createExpressionScriptHost:()=>U$,createWorld:()=>QZ,decodeSave:()=>wZ,decodeSaveEnvelope:()=>TZ,effectToModifier:()=>x$,emitArtifacts:()=>qQ,emitHooksDeclaration:()=>t$,emitModule:()=>KQ,emitTableTypes:()=>m$,encodeSave:()=>CZ,endLevelCarryover:()=>JZ,evaluateCondition:()=>AZ,evaluateExpression:()=>FZ,execute:()=>iQ,extractCatalog:()=>GQ,hookTypes:()=>XQ,inventoryItem:()=>y$,isGettext:()=>vZ,isMwlId:()=>PQ,itemDefinition:()=>v$,loadContent:()=>A$,nodesToObjects:()=>f$,parse:()=>aZ,parseExpression:()=>PZ,parseHookReference:()=>ZQ,parseMapFile:()=>EQ,parseTableColumns:()=>OQ,parseTerrain:()=>eQ,parseValue:()=>_Z,preprocess:()=>$X,readAttributes:()=>M$,readChildren:()=>N$,readTableIndex:()=>F$,readTableMap:()=>P$,schema01:()=>kQ,schema10:()=>AQ,sideVisionGroups:()=>oQ,tableKey:()=>I$,typedRows:()=>p$,validAttributeValue:()=>FQ,validate:()=>jQ,validateCatalog:()=>S$,validateCatalogNodes:()=>k$,validateHookAttributes:()=>$Q,validateHookReferences:()=>e$,validateWorld:()=>EZ}),G$=class{constructor(e,t={}){if(this.latestDecision=null,this.decide=e,this.every=t.every??1,!Number.isInteger(this.every)||this.every<1||this.every>1e6)throw RangeError(`a suggestion budget must be a frame count in 1..1000000`);this.since=this.every-1}update(e){return this.since++,this.since<this.every?null:(this.since=0,this.latestDecision=this.decide(e),this.latestDecision)}get latest(){return this.latestDecision}clear(){this.latestDecision=null}};function K$(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function q$(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function J$(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function Y$(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var X$=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},Z$=class{constructor(e=[],t={}){this.levels=new Map,this.base=new X$(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},Q$=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},$$=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},e1=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??t1,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function t1(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=n1(r,t.aspects.number(`keep_away`,0))),n}function n1(e,t){return!(t>0)||e>=t?0:-(t-e)}function r1(e){return e?Math.max(0,e.priority??1):0}var i1=l({AIBudgetExceededError:()=>l1,AICancelledError:()=>c1,Aspects:()=>X$,Difficulty:()=>Z$,Goals:()=>Q$,HeuristicAI:()=>e1,JavaScriptAI:()=>s1,NeuralPolicy:()=>NX,RecruitmentPattern:()=>$$,Suggester:()=>G$,alphaBetaSearch:()=>oG,defaultWeigh:()=>t1,firstWins:()=>cG,goalScore:()=>r1,keepAwayScore:()=>n1,personalScoreView:()=>q$,rootSplits:()=>sG,scoreWith:()=>Y$,sideScoreView:()=>J$,subjectsWhere:()=>K$}),a1=1e4,o1=16,s1=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,m1(e.maxSteps??a1,`maxSteps`),h1(e.maxMilliseconds??o1,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=d1(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??a1,a=t.maxMilliseconds??this.options.maxMilliseconds??o1;m1(i,`maxSteps`),h1(a,`maxMilliseconds`);let o=0,s=g1(),c=[],l=p1(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new c1;if(o>i||g1()-s>a)throw new l1},d={perception:f1(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:f1(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=u1(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof c1)m=`cancelled`;else if(e instanceof l1)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:d1(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,d1(r)),this.options.onDecision?.(h),h}search(e,t,n){return oG(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,d1(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,d1(n))}}dispose(){this.agents.clear(),this.states.clear()}},c1=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},l1=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function u1(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return f1(e)}function d1(e){return f1(e)}function f1(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(f1):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,f1(t)]))}function p1(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function m1(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function h1(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function g1(){return typeof performance>`u`?Date.now():performance.now()}return _e(),Pa(),$o(),xs(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return i1}}),e.Achievements=En,e.ActionJournal=wn,e.ActorAnimator=xF,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return vU}}),e.AnimatedSprite=nN,e.Animation=eN,e.ArticulatedChain=EN,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return kX}}),e.BLOB_SHAPES=VF,e.Bar=eB,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return FW}}),e.Beam=sF,e.Beams=cF,e.BitmapLabel=_L,e.Blob=wr,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return zq}}),e.Button=dz,e.CIRCLE8=lr,e.COLOR_BLINDNESS_MATRICES=mP,e.Camera=cP,e.CanonicalState=Gt,e.ChainRig=DN,e.Checkbox=Tz,e.ClothSprite=OF,e.Collection=cn,e.ColorTransformBatcher=fM,e.Container2D=J,e.DataTable=Pz,e.DeformableSprite=lN,e.DialogueStage=OB,e.Dropdown=kz,e.DropdownView=Nz,e.EMPTY=XP,e.Easing=Er,e.EntityRegistry=Nr,e.FLOATING_TEXT_STACK_GAP=oB,e.FeedbackClient=Un,e.FixedStepper=Tr,e.Flights=oF,e.FloatingText=aB,e.FloatingTextStack=uB,e.FogLayer=pF,e.Game=nM,e.Generator=j,e.Gradient=aI,e.Grid=Bz,e.HALO_ANIMATION=mF,e.Halo=hF,e.HazeLayer=IF,e.HelpScreen=mB,e.HookRegistry=S,e.HttpTransport=Yt,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return NR}}),e.IconGrid=DL,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ve}}),e.JavaRandom=St,e.Label=EI,e.LastRun=vn,e.LayeredSprite=rF,e.LightningArc=lF,e.LiquidLayer=dF,e.ListView=EL,e.LoadQueue=Mr,e.LoadingScreen=gB,e.LockstepClient=Qt,e.Logger=b,e.MarkupText=dL,e.MarqueeLabel=EB,e.MersenneTwister=he,e.MessageBox=lz,e.MessageLog=AI,e.Meter=Zz,e.Minimap=vP,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return W$}}),e.NEIGHBOURS4=sr,e.NEIGHBOURS8=cr,e.NO_COLOR_ADD=SM,e.NeonGlow=BF,e.NewsClient=an,e.NewsSeenTracker=sn,e.NinePatch=yL,e.Node2D=$F,e.OnScreenKeyboard=gz,e.ParticleEmitter=yF,e.PinnedDeform=cN,e.Player=un,e.PlayerInput=vt,e.PlayerStats=nn,e.PresentationQueue=Pr,e.Projectile=iF,e.QualityScaler=jj,e.RENDERING_DECISIONS=sI,e.RPGM_AUTOTILE_SLOT_BASES=OP,e.RPGM_AUTOTILE_SLOT_COUNTS=kP,e.RPGM_FLOOR_AUTOTILE_TABLE=jP,e.RPGM_WALL_AUTOTILE_TABLE=MP,e.RadioGroup=Ez,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return C}}),e.RandomStreams=ge,e.ReactionTable=Dn,e.RebindScreen=Yz,e.Recorder=ln,e.Rectangle2D=G,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return aP}}),e.RichLabel=KI,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return bH}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return gW}}),e.RpgmAutotileAtlas=DP,e.RunHistory=tn,e.SaveSyncClient=Xt,e.SaveSystem=zt,e.Scene=m,e.Scene2D=rM,e.SceneComponentHost=v,e.SceneStack=h,e.ScreenEffects=bF,e.ScreenReader=xL,e.ScrollBox=Mz,e.ScrollDrag=jz,e.ScrollText=TB,e.Session=On,e.Settings=Nn,e.SettingsScreen=Xz,e.Shape2D=tI,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return YX}}),e.SkeletalSprite=TN,Object.defineProperty(e,"Skeleton",{enumerable:!0,get:function(){return uN}}),e.Skins=qz,e.Slider=wz,e.Spawner=Wn,e.Spinner=Oz,e.SpringSprite=kF,e.Sprite2D=rI,e.SpriteAttachment=uF,e.SpriteGroup=aN,e.SpriteMotion=TF,e.SpriteSheet=sP,e.StageScript=kB,e.StateRegistry=Kt,e.StatsScreen=hB,e.StatusVisuals=SF,e.StoredValue=Bt,e.StoryScreen=FB,e.StorySequence=PB,e.SyncGuard=zr,e.TabbedList=OL,e.TelemetryClient=rn,e.TerrainGraphicsLayer=oI,e.Text2D=nI,e.TextModel=uz,e.TextPrompt=vz,e.Texture2D=q,e.TileMap=nF,e.TiledSprite=iI,e.TintedSprite=CM,e.Toast=dB,e.Tooltip=fB,e.TooltipHost=pB,e.TransitionRunner=Zj,e.TreeView=Lz,e.Tweener=Dr,e.UPPERCASE_KEYBOARD=pz,e.UndoHistory=Or,e.VerticalLabel=xz,e.Viewport=fP,e.Window=CL,e.WindowStack=wL,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return EU}}),e.XP_AUTOTILE_PATTERNS=NP,e.XP_NEIGHBORS_TO_PATTERN=PP,e.advanceReveal=CI,e.anchorAlign=Rz,e.applyAllImageModifiers=UM,e.applyImageModifiers=HM,e.applyTextureModifiers=JM,e.assertAutotileLayout=RP,e.autotileCellParts=WP,e.autotileFrames=KF,e.bitmapLabelStyle=vL,e.blendMatrix=LM,e.blendPixels=ZM,e.blobIndex=GF,e.cellFromKey=or,e.cellIndex=nr,e.cellInside=tr,e.cellKey=ar,e.cellX=rr,e.cellY=ir,e.channelScaleMatrix=IM,e.channelSwapMatrix=RM,e.chebyshev=dr,e.checkNoControlCharacters=kt,e.checkSize=Ot,e.clamp=kn,e.cloneData=Wt,e.colorShiftMatrix=FM,e.completeReveal=wI,e.contrastRatio=bB,e.createCamera=dP,e.createColorBlindnessFilter=hP,e.createHandles=_,e.createLayers=eI,e.croppedTexture=WM,e.defaultSettings=An,e.defaultStorage=Rt,e.defaultTheme=gI,e.deserializeReplay=fn,e.detectWebGpu=lI,e.dissolve=Yj,e.distance=pr,e.downloadReplayFile=xn,e.effectiveMusicVolume=jn,e.effectiveSfxVolume=Mn,e.ellipsize=SB,e.escapeHtml=iL,e.euclidean=ur,e.exportReplayFile=gn,e.extractDialogueCatalog=NB,e.fitWindowZoom=jI,e.floatingTextAgeAtLeast=iB,e.floatingTextAlpha=nB,e.floatingTextRise=rB,e.floatingTextStackLifePenalty=sB,e.floatingTextStackLift=cB,e.floatingTextStackMoves=lB,e.flowLayout=Gz,e.glowFalloff=RF,e.grow=Kj,e.hazeField=PF,e.hexDistance=Yn,e.hexLine=Zn,e.hexNeighbors=Jn,e.hexRange=Qn,e.hexRotate=JF,e.hexToPixel=$n,e.highContrastTheme=_I,e.imageModifier=NM,e.importReplayFile=_n,e.importTwee=jB,e.inspectGraphicsCapabilities=cI,e.iris=Jj,e.isOnScreen=iN,e.layoutMarkupLines=tL,e.layoutVertical=bz,e.linesToDrop=kI,e.loadSvgSkeleton=hI,e.loadTiledMap=mI,e.manhattan=fr,e.markupAccessibilityText=eL,e.markupToHtml=$I,e.marqueeOffset=wB,e.maskPixels=XM,e.matchTerrainRule=XF,e.meetsContrast=xB,e.messageBoxPresenter=_B,e.minimapCellCenter=_P,e.motionDuration=Cr,e.newlyRevealed=gP,e.openAnimationFrame=Xj,e.packColorAdd=yM,e.packTintAdd=bM,e.paintFogPixels=fF,e.paintGlowPixels=zF,e.paintHazePixels=FF,e.paletteRangeMapping=OM,e.parseCSV=Br,e.parseColorPairs=KM,e.parseDialogueLines=Wr,e.parseDialogueText=MB,e.parseImagePath=MM,e.parseInbound=Pt,e.parseMarkdown=UI,e.parseMarkup=ZI,e.parsePaletteLists=qM,e.parseReplayEvents=pn,e.parseRotateMode=PM,e.parseTwee=Gr,e.pickReplayFile=Cn,e.pixelToHex=er,e.pop=Gj,e.popScale=Lj,e.positionMarkupLines=rL,e.prefersReducedMotion=yr,e.readReplayFile=Sn,e.recolorTexture=jM,e.rectOf=oP,e.reducedMotion=br,e.registerColorTransform=vM,e.relativeLuminance=yB,e.remapPixels=kM,e.resolveAnchor=zz,e.resolveEasing=Rj,e.resolveTerrainGraphics=ZF,e.resumeRunPlayer=bn,e.revealComplete=TI,e.rotatePixels=QM,e.rpgmAutotileFrame=EP,e.rpgmAutotileSlot=AP,e.rpgmTableEdgeCells=YP,e.runCheckpoint=yn,e.sanitizeInboundText=At,e.scramble=Ct,e.screenReader=SL,e.scrollOffset=Az,e.serializeReplay=dn,e.setReducedMotion=xr,e.setTheme=yI,e.sharpenText=NI,e.shrink=Uj,e.sliceSpans=GI,e.slide=qj,e.sliderFraction=Sz,e.sliderValueAt=Cz,e.snapZoom=uP,e.spinValue=Dz,e.splitScreenHalves=pP,e.spriteColorMatrix=zM,e.squareRotate=qF,e.startReveal=SI,e.stateChecksum=Rr,e.stripMarkdown=WI,e.stripMarkup=QI,e.takeLastEntries=OI,e.theme=Q,e.themeChanged=$,e.tileDelays=Fj,e.tileFrame=$P,e.tileFrameIndex=tF,e.tileFrameSheet=eF,e.tileProgress=Ij,e.tileShrink=Hj,e.truncateLines=CB,e.uncloneablePath=Vt,e.unscramble=wt,e.validateSchema=Nt,e.version=f,e.watchReducedMotion=Sr,e.weightedFlood=kr,e.withTextureCanvas=AM,e.xpAutotilePattern=IP,e.xpAutotileRef=FP,e})({});
|