var Ej=Object.defineProperty;var Tj=(J,q)=>{for(var Q in q)Ej(J,Q,{get:q[Q],enumerable:!0,configurable:!0,set:(Z)=>q[Q]=()=>Z})};var g6=31,wJ=0,yq=1,Eq=2,Tq=3,_q=4,bq=5,kX=6,IX=7,Sq=8,s8=9,P8=10,BJ=11,S0=12,o0=13,t6=14,d9=15,vq=16,l9=17;var OX=20,DX=21,wX=22,BX=23,CX=24,AX=25,Sz=26,vz=27,xz=28,uz=29,xq=30,RX=31,yX=2,gz=0,fz=1,EX=2,TX=3,pz=4,mz=5;var cz=8,oz=9,dz=10,lz=11,nz=12,az=13;var rz=15;function tz(J){switch(J){case 67:case 68:case 70:case 72:case 73:case 76:case 80:case 83:case 85:case 87:case 88:case 89:case 96:return 0;case 66:return 2;case 55:case 65:case 69:case 71:case 74:case 75:case 78:return 1}return 1}function ez(J){const q=String.fromCharCode(J),Q=_j.get(q);if(Q)return Q;return`unknown code ${q}`}var CJ=0,gq=1,sz=2;var iz=69;var _j=new Map([["N","Game Pak"],["D","64DD Disk"],["C","Expandable Game: Game Pak Part"],["E","Expandable Game: 64DD Disk Part"],["Z","Aleck64 Game Pak"]]);function J5(J,q,Q){const Z=q.sp_mem.subRegion(4096,4096);J.setControlU64(S0,0x00000000_34000000n),J.setControlU64(vq,0x00000000_7006e463n),J.setControlU64(s8,0x00000000_00005000n),J.setControlU64(o0,0x00000000_0000005cn),J.setControlU64(d9,0x00000000_00000b22n),J.setControlU64(_q,0x00000000_007ffff0n),J.setControlU64(t6,0xffffffff_ffffffffn),J.setControlU64(Sq,0xffffffff_ffffffffn),J.setControlU64(xq,0xffffffff_ffffffffn),J.cop1ControlChanged();const X=0x00000000_00000000n;if(J.setRegU64(0,X),J.setRegU64(1,X),J.setRegU64(2,0xffffffff_d1731be9n),J.setRegU64(3,0xffffffff_d1731be9n),J.setRegU64(4,0x00000000_00001be9n),J.setRegU64(5,0xffffffff_f45231e5n),J.setRegU64(6,0xffffffff_a4001f0cn),J.setRegU64(7,0xffffffff_a4001f08n),J.setRegU64(8,0x00000000_000000c0n),J.setRegU64(9,X),J.setRegU64(10,0x00000000_00000040n),J.setRegU64(11,0xffffffff_a4000040n),J.setRegU64(16,X),J.setRegU64(17,X),J.setRegU64(18,X),J.setRegU64(19,X),J.setRegU64(20,BigInt(Q.tvType)),J.setRegU64(21,X),J.setRegU64(23,0x00000000_00000006n),J.setRegU64(24,X),J.setRegU64(25,0xffffffff_d73f2993n),J.setRegU64(26,X),J.setRegU64(27,X),J.setRegU64(28,X),J.setRegU64(29,0xffffffff_a4001ff0n),J.setRegU64(30,X),J.setRegU64(31,0xffffffff_a4001554n),Q.tvType==CJ){switch(Q.cic){case"6102":J.setRegU64(5,0xffffffff_c0f1d859n),J.setRegU64(14,0x00000000_2de108ean),J.setRegU64(24,X);break;case"6103":J.setRegU64(5,0xffffffff_d4646273n),J.setRegU64(14,0x00000000_1af99984n),J.setRegU64(24,X);break;case"6105":J.setRegU64(5,0xffffffff_decaaad1n),J.setRegU64(14,0x00000000_0cf85c13n),J.setRegU64(24,0x00000000_00000002n);break;case"6106":J.setRegU64(5,0xffffffff_b04dc903n),J.setRegU64(14,0x00000000_1af99984n),J.setRegU64(24,0x00000000_00000002n);break;default:break}J.setRegU64(20,X),J.setRegU64(23,0x00000000_00000006n),J.setRegU64(31,0xffffffff_a4001554n)}else{switch(Q.cic){case"6102":J.setRegU64(5,0xffffffff_c95973d5n),J.setRegU64(14,0x00000000_2449a366n);break;case"6103":J.setRegU64(5,0xffffffff_95315a28n),J.setRegU64(14,0x00000000_5baca1dfn);break;case"6105":J.setRegU64(5,0x00000000_5493fb9an),J.setRegU64(14,0xffffffff_c2c20384n);break;case"6106":J.setRegU64(5,0xffffffff_e067221fn),J.setRegU64(14,0x00000000_5cd2b70fn);break;default:break}J.setRegU64(20,0x00000000_00000001n),J.setRegU64(23,X),J.setRegU64(24,0x00000000_00000003n),J.setRegU64(31,0xffffffff_a4001550n)}switch(Q.cic){case"6101":J.setRegU64(22,0x00000000_0000003fn);break;case"6102":J.setRegU64(1,0x00000000_00000001n),J.setRegU64(2,0x00000000_0ebda536n),J.setRegU64(3,0x00000000_0ebda536n),J.setRegU64(4,0x00000000_0000a536n),J.setRegU64(12,0xffffffff_ed10d0b3n),J.setRegU64(13,0x00000000_1402a4ccn),J.setRegU64(15,0x00000000_3103e121n),J.setRegU64(22,0x00000000_0000003fn),J.setRegU64(25,0xffffffff_9debb54fn);break;case"6103":J.setRegU64(1,0x00000000_00000001n),J.setRegU64(2,0x00000000_49a5ee96n),J.setRegU64(3,0x00000000_49a5ee96n),J.setRegU64(4,0x00000000_0000ee96n),J.setRegU64(12,0xffffffff_ce9dfbf7n),J.setRegU64(13,0xffffffff_ce9dfbf7n),J.setRegU64(15,0x00000000_18b63d28n),J.setRegU64(22,0x00000000_00000078n),J.setRegU64(25,0xffffffff_825b21c9n);break;case"6105":Z.set32(0,1007534016),Z.set32(4,Q.tvType==CJ?3181905916:2376599548),Z.set32(8,632096704),Z.set32(12,822608000),Z.set32(16,1426128892),Z.set32(20,1007534016),Z.set32(24,2376597540),Z.set32(28,1007398912),J.setRegU64(1,X),J.setRegU64(2,0xffffffff_f58b0fbfn),J.setRegU64(3,0xffffffff_f58b0fbfn),J.setRegU64(4,0x00000000_00000fbfn),J.setRegU64(12,0xffffffff_9651f81en),J.setRegU64(13,0x00000000_2d42aac5n),J.setRegU64(15,0x00000000_56584d60n),J.setRegU64(22,0x00000000_00000091n),J.setRegU64(25,0xffffffff_cdce565fn);break;case"6106":J.setRegU64(1,X),J.setRegU64(2,0xffffffff_a95930a4n),J.setRegU64(3,0xffffffff_a95930a4n),J.setRegU64(4,0x00000000_000030a4n),J.setRegU64(12,0xffffffff_bcb59510n),J.setRegU64(13,0xffffffff_bcb59510n),J.setRegU64(15,0x00000000_7a3c07f4n),J.setRegU64(22,0x00000000_00000085n),J.setRegU64(25,0x00000000_465e3f72n);break;default:break}J.pc=2751463488}var _X=function(J){return(J>>26&63)===28};class bX{constructor(J){this.hardware=J,this.breakpoints=new Map}reset(){this.breakpoints.clear()}toggle(J){const q=this.hardware.memMap.readMemoryInternal32(J);let Q;if(_X(q))Q=this.breakpoints[J]||0,delete this.breakpoints[J];else Q=28<<26,this.breakpoints[J]=q;this.hardware.memMap.writeMemoryInternal32(J,Q)}isBreakpoint(J){const q=this.hardware.memMap.readMemoryInternal32(J);return _X(q)}getInstruction(J){const q=this.hardware.memMap.readMemoryInternal32(J);if(_X(q))return this.breakpoints[J]||0;return q}}function q5(J,q){let Q=J.toString();while(Q.length>>0}let Z=Q.toString(16);if(q){const X=q>>2;while(Z.length{for(let Q in J)if(Object.prototype.hasOwnProperty.call(J,Q)&&J[Q]===q)return Q;return N(q)},Object.freeze(J)}var Y5=32768,K5=16384,SX=8192,z5=4096,W5=2048,F5=1024,$5=512,H5=256,G5=32,j5=16,N5=8,L5=4,V5=2,P5=1,w0=t({RightBottom:0,RightRight:1,RightLeft:2,RightTop:3,TopLeft:4,TopRight:5,BottomLeft:6,BottomRight:7,CenterLeft:8,CenterRight:9,LeftStick:10,RightStick:11,LeftTop:12,LeftBottom:13,LeftLeft:14,LeftRight:15,CenterCenter:16}),Q5=17,Z5=t({AxisLeftX:0,AxisLeftY:1,AxisRightX:2,AxisRightY:3}),X5=4;class fq{constructor(){this.buttons=0,this.stick_x=0,this.stick_y=0}}class vX{constructor(){this.inputs=[new fq,new fq,new fq,new fq];const J=document.querySelector("body");J.addEventListener("keyup",(q)=>{this.handleKey(0,q.key,!1)}),J.addEventListener("keydown",(q)=>{this.handleKey(0,q.key,!0)}),this.gamepads={},this.activeGamepadidx=-1,window.addEventListener("gamepadconnected",(q)=>{this.connectGamepad(q)},!1),window.addEventListener("gamepaddisconnected",(q)=>{this.disconnectGamepad(q)},!1),this.controllerMapping=new U5}handleKey(J,q,Q){switch(q){case"a":this.setButton(J,z5,Q);break;case"s":this.setButton(J,Y5,Q);break;case"x":this.setButton(J,K5,Q);break;case"z":this.setButton(J,SX,Q);break;case"y":this.setButton(J,SX,Q);break;case"c":this.setButton(J,G5,Q);break;case"v":this.setButton(J,j5,Q);break;case"t":this.setButton(J,W5,Q);break;case"g":this.setButton(J,F5,Q);break;case"f":this.setButton(J,$5,Q);break;case"h":this.setButton(J,H5,Q);break;case"i":this.setButton(J,N5,Q);break;case"k":this.setButton(J,L5,Q);break;case"j":this.setButton(J,V5,Q);break;case"l":this.setButton(J,P5,Q);break;case"ArrowLeft":this.setStickX(J,Q?-80:0);break;case"ArrowRight":this.setStickX(J,Q?80:0);break;case"ArrowDown":this.setStickY(J,Q?-80:0);break;case"ArrowUp":this.setStickY(J,Q?80:0);break}}setStickX(J,q){this.inputs[J].stick_x=q}setStickY(J,q){this.inputs[J].stick_y=q}setButton(J,q,Q){let Z=this.inputs[J].buttons;if(Q)Z|=q;else Z&=~q;this.inputs[J].buttons=Z}connectGamepad(J){const q=J.gamepad;if(console.log(`Gamepad connected at index ${q.index}: ${q.id}. ${q.buttons.length} buttons, ${q.axes.length} axes.`),this.gamepads[q.index]=q,this.activeGamepadidx<0)if(this.isStandardGamepad(q))this.activeGamepadidx=q.index;else console.log("Gamepad mapping is non-standard, ignoring")}disconnectGamepad(J){const q=J.gamepad;if(delete this.gamepads[q.index],q.index==this.activeGamepadidx)this.activeGamepadidx=-1}isStandardGamepad(J){if(J.mapping!=="standard")return console.log(`gamepad mapping is unhandled: (${J.mapping})`),!1;if(J.axes.length{if(Q.gpModifier===void 0?!0:q[Q.gpModifier].pressed==Q.gpModifierDown)this.setButton(0,Z,q[Q.gpButton].pressed)}),this.setStickX(0,J.axes[Z5.AxisLeftX]*80),this.setStickY(0,J.axes[Z5.AxisLeftY]*-80)}}class U5{constructor(){const J=new Map;this.mappings=J,J.set(N5,new a0(w0.RightTop,w0.BottomLeft,!0)),J.set(L5,new a0(w0.RightBottom,w0.BottomLeft,!0)),J.set(V5,new a0(w0.RightLeft,w0.BottomLeft,!0)),J.set(P5,new a0(w0.RightRight,w0.BottomLeft,!0)),J.set(Y5,new a0(w0.RightBottom,w0.BottomLeft,!1)),J.set(K5,new a0(w0.RightRight,w0.BottomLeft,!1)),J.set(G5,new a0(w0.TopLeft)),J.set(j5,new a0(w0.TopRight)),J.set(z5,new a0(w0.CenterRight)),J.set(SX,new a0(w0.BottomRight)),J.set(W5,new a0(w0.LeftTop)),J.set(F5,new a0(w0.LeftBottom)),J.set($5,new a0(w0.LeftLeft)),J.set(H5,new a0(w0.LeftRight))}}class a0{constructor(J,q,Q){this.gpButton=J,this.gpModifier=q,this.gpModifierDown=Q}}function M5(J,q){F6=J,pq=q}function h5(){if(F6)F6.html("")}function h(J){if(pq)J=`${pq()}: ${J}`;if(console.log(J),F6)F6.append(`${J}
`),F6.scrollTop(F6[0].scrollHeight)}function k5(J){if(pq)J=`${pq()}: ${J}`;if(console.warn(J),F6)F6.append(`${J}
`),F6.scrollTop(F6[0].scrollHeight)}function I5(J){if(F6)F6.append(J)}var F6,pq;function O5(){i8=void 0,e6=void 0}function D5(){return i8||e6?!0:!1}function w5(J){let Q=J;for(let Z of[i8,e6]){if(!Z)continue;if(!Z.tick())Q=0;let X=Math.floor(Z.getAvailableBytes()/8);X=Math.max(0,X-100),Q=Math.min(Q,X)}return Q}var i8=null,e6=null;function A5(J,q,Q){let Z=11,X=B5;for(let Y=0;Y>3&1;let W=((K==1?~q[Y]:q[Y])&7)%3==1?K:1-K;if(X==C5){if(q[Y]==1||q[Y]==9)W=1;if(q[Y]==11||q[Y]==14)W=0}X=W==1?C5:B5}}var B5=[4,7,10,7,14,5,14,1,12,15,8,15,6,3,6,9],C5=[4,1,10,7,14,5,14,1,12,9,8,5,6,3,12,9];var S5=function(J,q,Q){let Z=0;for(let X=0;X>>7-K&1)^(Z&128?133:0)}for(let X=8;X!==0;X--)Z=Z<<1^(Z&128?133:0);return Z&255},v5=function(J){let q=0;for(let Q=0;Q<16;Q++)q=(q<<1|J>>>15-Q&1)^(q&16?21:0);return q&31},Sj=5,mq=64,R5=63,x5=0,vj=1,xj=2,uj=3,gj=4,fj=5,pj=6,mj=7,cj=8,u5=255,oj=0,dj=253,y5=254,lj=255,E5=0,xX=1,T5=2,_5=16,nj=128,aj=192,b5=1280;var rj=64,sj=128;class uX{constructor(J,q){this.hardware=J,this.pifRam=this.hardware.pif_mem.subRegion(1984,64);const Q=new cq(q[0]);Q.present=!0,Q.attachControllerPack(J.mempacks[0]),this.channels=[Q,new cq(q[1]),new cq(q[2]),new cq(q[3]),new g5(J)]}get controlByte(){return this.pifRam.getU8(R5)}set controlByte(J){this.pifRam.set8(R5,J)}cpuRead(J){}cpuWrite(J){}dmaWrite(J,q){if(this.pifRam.copy(0,J,q,mq),this.controlByte&1)this.controlByte&=~1,this.configure()}dmaRead(J,q){if(this.controlByte&2)this.processCICChallenge();else this.execute();J.copy(q,this.pifRam,0,mq)}processCICChallenge(){const J=new Uint8Array(30),q=new Uint8Array(30);for(let Q=0;Q<15;++Q)J[Q*2+0]=this.pifRam.u8[48+Q]>>>4&15,J[Q*2+1]=this.pifRam.u8[48+Q]>>>0&15;A5(J,q,30);for(let Q=0;Q<15;++Q)this.pifRam.u8[48+Q]=(q[Q*2]<<4)+q[Q*2+1];this.pifRam.u8[46]=0,this.pifRam.u8[47]=0}configure(){for(let Q of this.channels)Q.init();let J=0,q=0;while(J=mq)break;const X=Q[1];if(J++,X==y5)break;const Y=Z&63,K=J;J+=Y;const z=X&63,W=J;if(J+=z,J>=mq)break;const G=this.pifRam.u8.subarray(K,K+Y),H=this.pifRam.u8.subarray(W,W+z);this.channels[q].joybusConfigure(Q,Y,z,G,H),q++}}execute(){for(let J of this.channels){if(J.reset)continue;if(J.skip)continue;const q=J.frame[0],Q=J.frame[1];if(q&128)continue;if(q&64)continue;const Z=q&63,X=Q&63,Y=J.joybusCommand(Z,X,J.txBuf,J.rxBuf);if(YX)J.frame[1]|=rj}}}class gX{constructor(){this.init()}expectTx(J,q,Q){if(q!=Q)h(`${J}: got tx ${q} but expect ${Q}`)}init(){this.frame=0,this.tx=0,this.rx=0,this.txBuf=null,this.rxBuf=null,this.skip=!0,this.reset=!1}joybusConfigure(J,q,Q,Z,X){this.frame=J,this.tx=q,this.rx=Q,this.txBuf=Z,this.rxBuf=X,this.skip=!1}}class cq extends gX{constructor(J){super();this.inputs=J,this.present=!1,this.attachment=E5,this.memory=null,this.rumbleActive=!1}attachControllerPack(J){this.attachment=xX,this.memory=J}joybusCommand(J,q,Q,Z){if(!this.present)return 0;const X=Q[0];switch(X){case u5:return this.getStatus(J,q,Q,Z);case x5:return this.getStatus(J,q,Q,Z);case vj:return this.readController(J,q,Q,Z);case xj:return this.readAccessory(J,q,Q,Z);case uj:return this.writeAccessory(J,q,Q,Z)}return n64js.halt("Unknown controller command "+X),0}getStatus(J,q,Q,Z){return this.expectTx("kCmdGetStatus",J,1),Z[0]=b5>>>8,Z[1]=b5&255,Z[2]=this.attachment==E5?2:1,3}readController(J,q,Q,Z){this.expectTx("kCmdControllerRead",J,1);let X=this.inputs.buttons,Y=this.inputs.stick_x,K=this.inputs.stick_y;if(e6)e6.sync32(3203395597,"input"),X=e6.reflect32(X),Y=e6.reflect32(Y),K=e6.reflect32(K);return Z[0]=X>>>8,Z[1]=X&255,Z[2]=Y,Z[3]=K,4}readAccessory(J,q,Q,Z){this.expectTx("kCmdControllerAccessoryRead",J,3);const X=Q[1]<<8|Q[2]&224;if((Q[2]&31)!=v5(X))return 0;switch(this.attachment){case xX:const K=this.memory.data;for(let z=0,W=X;z=49152)this.rumbleActive=Q[3]&1;break;default:return 0}return Z[q-1]=S5(Q,3,J-3),q}}class g5 extends gX{constructor(J){super();this.hardware=J}joybusCommand(J,q,Q,Z){const X=Q[0];switch(X){case u5:return this.getStatus(J,q,Q,Z);case x5:return this.getStatus(J,q,Q,Z);case gj:return this.readEeprom(J,q,Q,Z);case fj:return this.writeEeprom(J,q,Q,Z);case pj:return this.rtcStatus(J,q,Q,Z);case mj:return this.rtcRead(J,q,Q,Z);case cj:return this.rtcWrite(J,q,Q,Z)}return n64js.halt(`Unknown cartridge command: ${X}`),0}getEepromID(){switch(this.hardware.saveType){case"Eeprom4k":return nj;case"Eeprom16k":return aj}return 0}getEeprom(){switch(this.hardware.saveType){case"Eeprom4k":case"Eeprom16k":return this.hardware.saveMem}return null}getStatus(J,q,Q,Z){this.expectTx("kCmdGetStatus",J,1);const X=this.getEepromID();if(!X)return 0;return Z[0]=X>>>8,Z[1]=X&255,Z[2]=0,3}readEeprom(J,q,Q,Z){this.expectTx("kCmdEepromRead",J,2);const X=this.getEeprom();if(!X)return 0;const Y=Q[1]*8;for(let K=0;K>>8,Z[1]=_5&255,Z[2]=0,3}rtcRead(J,q,Q,Z){return n64js.warn("rtc read unhandled"),0}rtcWrite(J,q,Q,Z){return n64js.warn("rtc write unhandled"),0}}function J0(J,q){if(!J)throw new f5(q)}class f5{constructor(J){this.message=J}toString(){return"AssertException: "+this.message}}function AJ(J){return J>>>26&63}function RJ(J){return J>>>16&31}function yJ(J){return J&63}function $6(J){return J>>>21&31}function p5(J){return J>>>16&3}function H6(J){return J&63}function J8(J){return J>>>6&31}function z0(J){return J>>>11&31}function f6(J){return J>>>16&31}function H0(J){return(J&65535)<<16>>16}function e0(J){return J>>>6&31}function u(J){return J>>>11&31}function D(J){return J>>>16&31}function y(J){return J>>>21&31}function EJ(J){return J&63}function ij(J){return J&67108863}function q8(J){return J&65535}function g(J){return(J&65535)<<16>>16}function o(J){return J>>>21&31}function d0(J,q){return J+4+H0(q)*4>>>0}function M8(J,q){return(J&4026531840|ij(q)*4)>>>0}var tj=function(J){return H0(J)&65535},m5=function(J){return H0(J)<<16>>16},I=function(){return"?"},J3=function(J){return o5[yJ(J.opcode)](J)},q3=function(J){return d5[$6(J.opcode)](J)},Q3=function(J){switch(J0((J.opcode>>>18&7)===0,"cc bit is not 0"),p5(J.opcode)){case 0:return`BC1F !c ? --> ${J.branchAddress}`;case 1:return`BC1T c ? --> ${J.branchAddress}`;case 2:return`BC1FL !c ? --> ${J.branchAddress}`;case 3:return`BC1TL c ? --> ${J.branchAddress}`}return"???"},n9=function(J,q){const Q=q.toUpperCase();switch(H6(J.opcode)){case 0:return`ADD.${Q} ${J.fd(q)} = ${J.fs(q)} + ${J.ft(q)}`;case 1:return`SUB.${Q} ${J.fd(q)} = ${J.fs(q)} - ${J.ft(q)}`;case 2:return`MUL.${Q} ${J.fd(q)} = ${J.fs(q)} * ${J.ft(q)}`;case 3:return`DIV.${Q} ${J.fd(q)} = ${J.fs(q)} / ${J.ft(q)}`;case 4:return`SQRT.${Q} ${J.fd(q)} = sqrt(${J.fs(q)})`;case 5:return`ABS.${Q} ${J.fd(q)} = abs(${J.fs(q)})`;case 6:return`MOV.${Q} ${J.fd(q)} = ${J.fs(q)}`;case 7:return`NEG.${Q} ${J.fd(q)} = -${J.fs(q)}`;case 8:return`ROUND.L.${Q} ${J.fd("l")} = round.l(${J.fs(q)})`;case 9:return`TRUNC.L.${Q} ${J.fd("l")} = trunc.l(${J.fs(q)})`;case 10:return`CEIL.L.${Q} ${J.fd("l")} = ceil.l(${J.fs(q)})`;case 11:return`FLOOR.L.${Q} ${J.fd("l")} = floor.l(${J.fs(q)})`;case 12:return`ROUND.W.${Q} ${J.fd("w")} = round.w(${J.fs(q)})`;case 13:return`TRUNC.W.${Q} ${J.fd("w")} = trunc.w(${J.fs(q)})`;case 14:return`CEIL.W.${Q} ${J.fd("w")} = ceil.w(${J.fs(q)})`;case 15:return`FLOOR.W.${Q} ${J.fd("w")} = floor.w(${J.fs(q)})`;case 32:return`CVT.S.${Q} ${J.fd("s")} = (s)${J.fs(q)}`;case 33:return`CVT.D.${Q} ${J.fd("d")} = (d)${J.fs(q)}`;case 36:return`CVT.W.${Q} ${J.fd("w")} = (w)${J.fs(q)}`;case 37:return`CVT.L.${Q} ${J.fd("l")} = (l)${J.fs(q)}`;case 48:return`C.F.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 49:return`C.UN.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 50:return`C.EQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 51:return`C.UEQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 52:return`C.OLT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 53:return`C.ULT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 54:return`C.OLE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 55:return`C.ULE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 56:return`C.SF.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 57:return`C.NGLE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 58:return`C.SEQ.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 59:return`C.NGL.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 60:return`C.LT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 61:return`C.NGE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 62:return`C.LE.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`;case 63:return`C.NGT.${Q} c = ${J.fs(q)} cmp ${J.ft(q)}`}return`Cop1.${q}${v(H6(J.opcode),8)}?`},Z3=function(J){return n9(J,"s")},X3=function(J){return n9(J,"d")},Y3=function(J){return n9(J,"w")},K3=function(J){return n9(J,"l")},z3=function(J){return l5[$6(J.opcode)](J)},W3=function(J){return n5[$6(J.opcode)](J)},F3=function(J){return a5[$6(J.opcode)](J)},$3=function(J){switch(EJ(J.opcode)){case 1:return"TLBR";case 2:return"TLBWI";case 6:return"TLBWR";case 8:return"TLBP";case 24:return"ERET"}return"Unk"},H3=function(J){return r5[RJ(J.opcode)](J)};function mX(J,q,Q){const Z=new c5(J,q,Q),X=s5[AJ(q)](Z);return{instruction:Z,disassembly:X,isJumpTarget:!1}}function i5(J,q,Q){const Z=n64js.breakpoints(),X=[],Y=new Set;for(let K=J;K${v(J,32)}`;return v(J,32)}makeRegSpan(J){if(this.outputHTML)return`${J}`;return J}makeFPRegSpan(J){const q=J.replace("-",".");if(this.outputHTML)return`${q}`;return q}}var o5=[(J)=>{if(J.opcode===0)return"NOP";return`SLL ${J.rd} = ${J.rt} << ${J.sa}`},I,(J)=>`SRL ${J.rd} = ${J.rt} >>> ${J.sa}`,(J)=>`SRA ${J.rd} = ${J.rt} >> ${J.sa}`,(J)=>`SLLV ${J.rd} = ${J.rt} << ${J.rs}`,I,(J)=>`SRLV ${J.rd} = ${J.rt} >>> ${J.rs}`,(J)=>`SRAV ${J.rd} = ${J.rt} >> ${J.rs}`,(J)=>`JR ${J.rs}`,(J)=>`JALR ${J.rd}, ${J.rs}`,I,I,(J)=>`SYSCALL ${v(J.opcode>>6&1048575,20)}`,(J)=>`BREAK ${v(J.opcode>>6&1048575,20)}`,I,(J)=>"SYNC",(J)=>`MFHI ${J.rd} = MultHi`,(J)=>`MTHI MultHi = ${J.rs}`,(J)=>`MFLO ${J.rd} = MultLo`,(J)=>`MTLO MultLo = ${J.rs}`,(J)=>`DSLLV ${J.rd} = ${J.rt} << ${J.rs}`,I,(J)=>`DSRLV ${J.rd} = ${J.rt} >>> ${J.rs}`,(J)=>`DSRAV ${J.rd} = ${J.rt} >> ${J.rs}`,(J)=>`MULT ${J.rs} * ${J.rt}`,(J)=>`MULTU ${J.rs} * ${J.rt}`,(J)=>`DIV ${J.rs} / ${J.rt}`,(J)=>`DIVU ${J.rs} / ${J.rt}`,(J)=>`DMULT ${J.rs} * ${J.rt}`,(J)=>`DMULTU ${J.rs} * ${J.rt}`,(J)=>`DDIV ${J.rs} / ${J.rt}`,(J)=>`DDIVU ${J.rs} / ${J.rt}`,(J)=>`ADD ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`ADDU ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`SUB ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`SUBU ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`AND ${J.rd} = ${J.rs} & ${J.rt}`,(J)=>{if(D(J.opcode)===0)if(y(J.opcode)===0)return`CLEAR ${J.rd} = 0`;else return`MOV ${J.rd} = ${J.rs}`;return`OR ${J.rd} = ${J.rs} | ${J.rt}`},(J)=>`XOR ${J.rd} = ${J.rs} ^ ${J.rt}`,(J)=>`NOR ${J.rd} = ~( ${J.rs} | ${J.rt} )`,I,I,(J)=>`SLT ${J.rd} = ${J.rs} < ${J.rt}`,(J)=>`SLTU ${J.rd} = ${J.rs} < ${J.rt}`,(J)=>`DADD ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`DADDU ${J.rd} = ${J.rs} + ${J.rt}`,(J)=>`DSUB ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`DSUBU ${J.rd} = ${J.rs} - ${J.rt}`,(J)=>`TGE trap( ${J.rs} >= ${J.rt} )`,(J)=>`TGEU trap( ${J.rs} >= ${J.rt} )`,(J)=>`TLT trap( ${J.rs} < ${J.rt} )`,(J)=>`TLTU trap( ${J.rs} < ${J.rt} )`,(J)=>`TEQ trap( ${J.rs} == ${J.rt} )`,I,(J)=>`TNE trap( ${J.rs} != ${J.rt} )`,I,(J)=>`DSLL ${J.rd} = ${J.rt} << ${J.sa}`,I,(J)=>`DSRL ${J.rd} = ${J.rt} >>> ${J.sa}`,(J)=>`DSRA ${J.rd} = ${J.rt} >> ${J.sa}`,(J)=>`DSLL32 ${J.rd} = ${J.rt} << (32+${J.sa})`,I,(J)=>`DSRL32 ${J.rd} = ${J.rt} >>> (32+${J.sa})`,(J)=>`DSRA32 ${J.rd} = ${J.rt} >> (32+${J.sa})`];if(o5.length!=64)throw"Oops, didn't build the special table correctly";var d5=[(J)=>`MFC0 ${J.rt} <- ${TJ[z0(J.opcode)]}`,(J)=>`DMFC0 ${J.rt} <- ${TJ[z0(J.opcode)]}`,I,I,(J)=>`MTC0 ${J.rt} -> ${TJ[z0(J.opcode)]}`,(J)=>`DMTC0 ${J.rt} -> ${TJ[z0(J.opcode)]}`,I,I,I,I,I,I,I,I,I,I,$3,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I];if(d5.length!=32)throw"Oops, didn't build the cop0 table correctly";var l5=[(J)=>`MFC1 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC1 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC1 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`DCFC1 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`MTC1 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC1 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC1 CCR${u(J.opcode)} = ${J.rt}`,(J)=>`DCTC1 CCR${u(J.opcode)} = ${J.rt}`,Q3,I,I,I,I,I,I,I,Z3,X3,I,I,Y3,K3,I,I,I,I,I,I,I,I,I,I];if(l5.length!=32)throw"Oops, didn't build the cop1 table correctly";var n5=[(J)=>`MFC2 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC2 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC2 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`DCFC2 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`MTC2 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC2 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC2 CCR${u(J.opcode)} = ${J.rt}`,(J)=>`DCTC2 CCR${u(J.opcode)} = ${J.rt}`,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I];if(n5.length!=32)throw"Oops, didn't build the cop2 table correctly";var a5=[(J)=>`MFC3 ${J.rt_d} = ${J.fs()}`,(J)=>`DMFC3 ${J.rt_d} = ${J.fs()}`,(J)=>`CFC3 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`DCFC3 ${J.rt_d} = CCR${u(J.opcode)}`,(J)=>`MTC3 ${J.fs_d()} = ${J.rt}`,(J)=>`DMTC3 ${J.fs_d()} = ${J.rt}`,(J)=>`CTC3 CCR${u(J.opcode)} = ${J.rt}`,(J)=>`DCTC3 CCR${u(J.opcode)} = ${J.rt}`,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I];if(a5.length!=32)throw"Oops, didn't build the cop3 table correctly";var r5=[(J)=>`BLTZ ${J.rs} < 0 --> ${J.branchAddress}`,(J)=>`BGEZ ${J.rs} >= 0 --> ${J.branchAddress}`,(J)=>`BLTZL ${J.rs} < 0 --> ${J.branchAddress}`,(J)=>`BGEZL ${J.rs} >= 0 --> ${J.branchAddress}`,I,I,I,I,(J)=>`TGEI ${J.rs} >= ${J.rt} --> trap `,(J)=>`TGEIU ${J.rs} >= ${J.rt} --> trap `,(J)=>`TLTI ${J.rs} < ${J.rt} --> trap `,(J)=>`TLTIU ${J.rs} < ${J.rt} --> trap `,(J)=>`TEQI ${J.rs} == ${J.rt} --> trap `,I,(J)=>`TNEI ${J.rs} != ${J.rt} --> trap `,I,(J)=>`BLTZAL ${J.rs} < 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BGEZAL ${J.rs} >= 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BLTZALL ${J.rs} < 0 --> ${J.branchAddress}${J.writesRA()}`,(J)=>`BGEZALL ${J.rs} >= 0 --> ${J.branchAddress}${J.writesRA()}`,I,I,I,I,I,I,I,I,I,I,I,I];if(r5.length!=32)throw"Oops, didn't build the special table correctly";var s5=[J3,H3,(J)=>`J --> ${J.jumpAddress}`,(J)=>`JAL --> ${J.jumpAddress}${J.writesRA()}`,(J)=>{if(y(J.opcode)==D(J.opcode))return`B --> ${J.branchAddress}`;return`BEQ ${J.rs} == ${J.rt} --> ${J.branchAddress}`},(J)=>`BNE ${J.rs} != ${J.rt} --> ${J.branchAddress}`,(J)=>`BLEZ ${J.rs} <= 0 --> ${J.branchAddress}`,(J)=>`BGTZ ${J.rs} > 0 --> ${J.branchAddress}`,(J)=>`ADDI ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`ADDIU ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`SLTI ${J.rt_d} = (${J.rs} < ${J.imm})`,(J)=>`SLTIU ${J.rt_d} = (${J.rs} < ${J.imm})`,(J)=>`ANDI ${J.rt_d} = ${J.rs} & ${J.imm}`,(J)=>`ORI ${J.rt_d} = ${J.rs} | ${J.imm}`,(J)=>`XORI ${J.rt_d} = ${J.rs} ^ ${J.imm}`,(J)=>`LUI ${J.rt_d} = ${J.imm} << 16`,q3,z3,W3,F3,(J)=>`BEQL ${J.rs} == ${J.rt} --> ${J.branchAddress}`,(J)=>`BNEL ${J.rs} != ${J.rt} --> ${J.branchAddress}`,(J)=>`BLEZL ${J.rs} <= 0 --> ${J.branchAddress}`,(J)=>`BGTZL ${J.rs} > 0 --> ${J.branchAddress}`,(J)=>`DADDI ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`DADDIU ${J.rt_d} = ${J.rs} + ${J.imm}`,(J)=>`LDL ${J.rt_d} <- ${J.memload()}`,(J)=>`LDR ${J.rt_d} <- ${J.memload()}`,I,I,I,I,(J)=>`LB ${J.rt_d} <- ${J.memload()}`,(J)=>`LH ${J.rt_d} <- ${J.memload()}`,(J)=>`LWL ${J.rt_d} <- ${J.memload()}`,(J)=>`LW ${J.rt_d} <- ${J.memload()}`,(J)=>`LBU ${J.rt_d} <- ${J.memload()}`,(J)=>`LHU ${J.rt_d} <- ${J.memload()}`,(J)=>`LWR ${J.rt_d} <- ${J.memload()}`,(J)=>`LWU ${J.rt_d} <- ${J.memload()}`,(J)=>`SB ${J.rt} -> ${J.memstore()}`,(J)=>`SH ${J.rt} -> ${J.memstore()}`,(J)=>`SWL ${J.rt} -> ${J.memstore()}`,(J)=>`SW ${J.rt} -> ${J.memstore()}`,(J)=>`SDL ${J.rt} -> ${J.memstore()}`,(J)=>`SDR ${J.rt} -> ${J.memstore()}`,(J)=>`SWR ${J.rt} -> ${J.memstore()}`,(J)=>`CACHE ${v(D(J.opcode),8)}, ${J.memaccess()}`,(J)=>`LL ${J.rt_d} <- ${J.memload()}`,(J)=>`LWC1 ${J.ft_d()} <- ${J.memload()}`,I,I,(J)=>`LLD ${J.rt_d} <- ${J.memload()}`,(J)=>`LDC1 ${J.ft_d()} <- ${J.memload()}`,(J)=>`LDC2 ${J.gt_d} <- ${J.memload()}`,(J)=>`LD ${J.rt_d} <- ${J.memload()}`,(J)=>`SC ${J.rt} -> ${J.memstore()}`,(J)=>`SWC1 ${J.ft()} -> ${J.memstore()}`,(J)=>"BREAKPOINT",I,(J)=>`SCD ${J.rt} -> ${J.memstore()}`,(J)=>`SDC1 ${J.ft()} -> ${J.memstore()}`,(J)=>`SDC2 ${J.gt} -> ${J.memstore()}`,(J)=>`SD ${J.rt} -> ${J.memstore()}`];if(s5.length!=64)throw"Oops, didn't build the simple table correctly";var YW=function(J){return J&63},G3=function(J){return J>>>6&31},t8=function(J){return J>>>11&31},r9=function(J){return J>>>16&31},a9=function(J){return J>>>21&31},j3=function(J){return J>>>26&63},t5=function(J){return J>>>21&31},N3=function(J){return J>>>16&31},oq=function(J){return J>>>7&15},e5=function(J){return(J&127)<<25>>25},JW=function(J){return J>>>21&15},L3=function(J){return J>>>11&31},V3=function(J){return J>>>16&31},P3=function(J){return J>>>11&31},U3=function(J){return J>>>6&31},M3=function(J){return J&67108863},cX=function(J){return J&65535},h3=function(J){return cX(J)<<16>>16},qW=function(J){return J>>>21&31},QW=function(J){return cX(J)<<16>>16},k3=function(J){return J&65535},I3=function(J,q){return J+4+h3(q)*4},O3=function(J,q){return J&4026531840|M3(q)*4},ZW=function(J){return v(J,16)},_J=function(J){return J},T3=function(J){return E3[YW(J.opcode)](J)},h8=function(J){return`unknown: ${N(J.opcode)}`};function dq(J,q){const Q=new KW(J,q),Z=S3[j3(q)](Q);return{address:J,instruction:Q,disassembly:Z,isJumpTarget:!1}}function s9(J,q,Q){return dX(J,q,q,Q-q)}function dX(J,q,Q,Z){const X=[],Y=new Set,K=J.length-1;for(let z=0;z=0?"+":"")+q.toString()}}var C3=(()=>{let J=[];for(let q=0;q<64;q++)J[q]=h8;return J[0]=(q)=>{if(q.opcode===0)return"NOP";return`SLL ${q.rd} = ${q.rt} << ${q.sa}`},J[2]=(q)=>`SRL ${q.rd} = ${q.rt} >>> ${q.sa}`,J[3]=(q)=>`SRA ${q.rd} = ${q.rt} >> ${q.sa}`,J[4]=(q)=>`SLLV ${q.rd} = ${q.rt} << ${q.rs}`,J[6]=(q)=>`SRLV ${q.rd} = ${q.rt} >>> ${q.rs}`,J[7]=(q)=>`SRAV ${q.rd} = ${q.rt} >> ${q.rs}`,J[8]=(q)=>`JR ${q.rs}`,J[9]=(q)=>`JALR ${q.rd}, ${q.rs}`,J[13]=(q)=>`BREAK ${v(q.opcode>>6&1048575,20)}`,J[32]=(q)=>`ADD ${q.rd} = ${q.rs} + ${q.rt}`,J[33]=(q)=>`ADDU ${q.rd} = ${q.rs} + ${q.rt}`,J[34]=(q)=>`SUB ${q.rd} = ${q.rs} - ${q.rt}`,J[35]=(q)=>`SUBU ${q.rd} = ${q.rs} - ${q.rt}`,J[36]=(q)=>`AND ${q.rd} = ${q.rs} & ${q.rt}`,J[37]=(q)=>`OR ${q.rd} = ${q.rs} | ${q.rt}`,J[38]=(q)=>`XOR ${q.rd} = ${q.rs} ^ ${q.rt}`,J[39]=(q)=>`NOR ${q.rd} = ~( ${q.rs} | ${q.rt} )`,J[42]=(q)=>`SLT ${q.rd} = ${q.rs} < ${q.rt}`,J[43]=(q)=>`SLTU ${q.rd} = ${q.rs} < ${q.rt}`,J})(),A3=(()=>{let J=[];for(let q=0;q<32;q++)J.push(h8);return J[0]=(q)=>`BLTZ ${q.rs} < 0 --> ${q.branchAddress}`,J[1]=(q)=>`BGEZ ${q.rs} >= 0 --> ${q.branchAddress}`,J[16]=(q)=>`BLTZAL ${q.rs} < 0 --> ${q.branchAddress}${q.writesRA()}`,J[17]=(q)=>`BGEZAL ${q.rs} >= 0 --> ${q.branchAddress}${q.writesRA()}`,J})(),R3=(()=>{let J=[];for(let q=0;q<32;q++)J.push(h8);return J[0]=(q)=>`MFC0 ${q.rt_d} <- ${q.c0reg}`,J[4]=(q)=>`MTC0 ${q.rt} -> ${q.c0reg}`,J})(),y3=(()=>{let J=[];for(let q=0;q<32;q++)J.push(h8);J[0]=(q)=>`MFC2 ${q.rt_d} = ${t8(q.opcode)}[${oq(q.opcode)}]`,J[2]=(q)=>`CFC2 ${q.rt_d} = ${q.c2flag}`,J[4]=(q)=>`MTC2 V${t8(q.opcode)}[${oq(q.opcode)}] = ${q.rt}`,J[6]=(q)=>`CTC2 ${q.c2flag} = ${q.rt}`;for(let q=16;q<32;q++)J[q]=T3;return J})(),E3=(()=>{let J=[];for(let q=0;q<64;q++)J.push(h8);return J[0]=(q)=>`VMULF ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[1]=(q)=>`VMULU ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[2]=(q)=>`VRNDP ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[3]=(q)=>`VMULQ ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[4]=(q)=>`VMUDL ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[5]=(q)=>`VMUDM ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[6]=(q)=>`VMUDN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[7]=(q)=>`VMUDH ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[8]=(q)=>`VMACF ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[9]=(q)=>`VMACU ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[10]=(q)=>`VRNDN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[11]=(q)=>`VMACQ ${q.cop2VD}, ACC = oddify(ACC)`,J[12]=(q)=>`VMADL ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[13]=(q)=>`VMADM ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[14]=(q)=>`VMADN ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[15]=(q)=>`VMADH ${q.cop2VD} = ${q.cop2VS} * ${q.cop2VT}[${q.cop2VecSelect}]`,J[16]=(q)=>`VADD ${q.cop2VD} = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[17]=(q)=>`VSUB ${q.cop2VD} = ${q.cop2VS} - ${q.cop2VT}[${q.cop2VecSelect}]`,J[18]=(q)=>`VSUT ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[19]=(q)=>`VABS ${q.cop2VD} = sign(${q.cop2VS}) * ${q.cop2VT}[${q.cop2VecSelect}]`,J[20]=(q)=>`VADDC ${q.cop2VD} = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[21]=(q)=>`VSUBC ${q.cop2VD} = ${q.cop2VS} - ${q.cop2VT}[${q.cop2VecSelect}]`,J[22]=(q)=>`VADDB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[23]=(q)=>`VSUBB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[24]=(q)=>`VACCB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[25]=(q)=>`VSUCB ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[26]=(q)=>`VSAD ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[27]=(q)=>`VSAC ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[28]=(q)=>`VSUM ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[29]=(q)=>`VSAR ${q.cop2VD}, ${q.cop2VS}, ${q.cop2VT}[${q.cop2E}]`,J[30]=(q)=>`V30 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[31]=(q)=>`V31 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[32]=(q)=>`VLT ${q.cop2VD}, CC = cmpLT(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[33]=(q)=>`VEQ ${q.cop2VD}, CC = cmpEQ(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[34]=(q)=>`VNE ${q.cop2VD}, CC = cmpNE(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[35]=(q)=>`VGE ${q.cop2VD}, CC = cmpGE(${q.cop2VS}, ${q.cop2VT}[${q.cop2VecSelect}])`,J[36]=(q)=>`VCL ${q.cop2VD}, ACC = ${q.cop2VS} clip ${q.cop2VT}[${q.cop2VecSelect}]`,J[37]=(q)=>`VCH ${q.cop2VD}, ACC = ${q.cop2VS} clip ${q.cop2VT}[${q.cop2VecSelect}]`,J[38]=(q)=>`VCR ${q.cop2VD}, ACC = ${q.cop2VS} crimp ${q.cop2VT}[${q.cop2VecSelect}]`,J[39]=(q)=>`VMRG ${q.cop2VD} = VCC ? ${q.cop2VS} : ${q.cop2VT}[${q.cop2VecSelect}]`,J[40]=(q)=>`VAND ${q.cop2VD} = ${q.cop2VS} & ${q.cop2VT}[${q.cop2VecSelect}]`,J[41]=(q)=>`VNAND ${q.cop2VD} = ~(${q.cop2VS} & ${q.cop2VT}[${q.cop2VecSelect}])`,J[42]=(q)=>`VOR ${q.cop2VD} = ${q.cop2VS} | ${q.cop2VT}[${q.cop2VecSelect}]`,J[43]=(q)=>`VNOR ${q.cop2VD} = ~(${q.cop2VS} | ${q.cop2VT}[${q.cop2VecSelect}])`,J[44]=(q)=>`VXOR ${q.cop2VD} = ${q.cop2VS} ^ ${q.cop2VT}[${q.cop2VecSelect}]`,J[45]=(q)=>`VNXOR ${q.cop2VD} = ~(${q.cop2VS} ^ ${q.cop2VT}[${q.cop2VecSelect}])`,J[46]=(q)=>`V46 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[47]=(q)=>`V47 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[48]=(q)=>`VRCP ${q.cop2VD}[${q.cop2DE}] = 1/${q.cop2VT}[${q.cop2VecSelect}]`,J[49]=(q)=>`VRCPL ${q.cop2VD}[${q.cop2DE}] = 1/${q.cop2VT}[${q.cop2VecSelect}]`,J[50]=(q)=>`VRCPH ${q.cop2VD}[${q.cop2DE}], DIVIN = DIVOUT, ${q.cop2VT}[${q.cop2VecSelect}]`,J[51]=(q)=>`VMOV ${q.cop2VD}[${q.cop2DE}] = ${q.cop2VT}[${q.cop2VecSelect}]`,J[52]=(q)=>`VRSQ ${q.cop2VD}[${q.cop2DE}] = 1/sqrt(${q.cop2VT}[${q.cop2VecSelect}])`,J[53]=(q)=>`VRSQL ${q.cop2VD}[${q.cop2DE}] = 1/sqrt(${q.cop2VT}[${q.cop2VecSelect}])`,J[54]=(q)=>`VRSQH ${q.cop2VD}[${q.cop2DE}], DIVIN = DIVOUT, ${q.cop2VT}[${q.cop2VecSelect}]`,J[55]=(q)=>"VNOP",J[56]=(q)=>`VEXTT ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[57]=(q)=>`VEXTQ ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[58]=(q)=>`VEXTN ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[59]=(q)=>`V59 ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[60]=(q)=>`VINST ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[61]=(q)=>`VINSQ ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[62]=(q)=>`VINSN ${q.cop2VD} = 0, ACC = ${q.cop2VS} + ${q.cop2VT}[${q.cop2VecSelect}]`,J[63]=(q)=>"VNULL",J})(),_3=(()=>{let J=[];for(let q=0;q<32;q++)J.push(h8);return J[0]=(q)=>`LBV ${q.vmemVT}${q.vmemEls(1)} <- ${q.vmemload(1)}`,J[1]=(q)=>`LSV ${q.vmemVT}${q.vmemEls(2)} <- ${q.vmemload(2)}`,J[2]=(q)=>`LLV ${q.vmemVT}${q.vmemEls(4)} <- ${q.vmemload(4)}`,J[3]=(q)=>`LDV ${q.vmemVT}${q.vmemEls(8)} <- ${q.vmemload(8)}`,J[4]=(q)=>`LQV ${q.vmemVT} <- ${q.vmemload(16)}`,J[5]=(q)=>`LRV ${q.vmemVT} <- ${q.vmemload(16)}`,J[6]=(q)=>`LPV ${q.vmemVT} <- ${q.vmemload(8)}`,J[7]=(q)=>`LUV ${q.vmemVT} <- ${q.vmemload(8)}`,J[8]=(q)=>`LHV ${q.vmemVT} <- ${q.vmemload(16)}`,J[9]=(q)=>`LFV ${q.vmemVT} <- ${q.vmemload(16)}`,J[10]=(q)=>`LWV ${q.vmemVT} <- ${q.vmemload(16)}`,J[11]=(q)=>`LTV ${q.vmemVT} <- ${q.vmemload(16)}`,J})(),b3=(()=>{let J=[];for(let q=0;q<32;q++)J.push(h8);return J[0]=(q)=>`SBV ${q.vmemVT}${q.vmemEls(1)} -> ${q.vmemstore(1)}`,J[1]=(q)=>`SSV ${q.vmemVT}${q.vmemEls(2)} -> ${q.vmemstore(2)}`,J[2]=(q)=>`SLV ${q.vmemVT}${q.vmemEls(4)} -> ${q.vmemstore(4)}`,J[3]=(q)=>`SDV ${q.vmemVT}${q.vmemEls(8)} -> ${q.vmemstore(8)}`,J[4]=(q)=>`SQV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[5]=(q)=>`SRV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[6]=(q)=>`SPV ${q.vmemVT} -> ${q.vmemstore(8)}`,J[7]=(q)=>`SUV ${q.vmemVT} -> ${q.vmemstore(8)}`,J[8]=(q)=>`SHV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[9]=(q)=>`SFV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[10]=(q)=>`SWV ${q.vmemVT} -> ${q.vmemstore(16)}`,J[11]=(q)=>`STV ${q.vmemVT} -> ${q.vmemstore(16)}`,J})(),S3=(()=>{let J=[];for(let q=0;q<64;q++)J.push(h8);return J[0]=(q)=>C3[YW(q.opcode)](q),J[1]=(q)=>A3[r9(q.opcode)](q),J[2]=(q)=>`J --> ${q.jumpAddress}`,J[3]=(q)=>`JAL --> ${q.jumpAddress}${q.writesRA()}`,J[4]=(q)=>{if(a9(q.opcode)==r9(q.opcode))return`B --> ${q.branchAddress}`;return`BEQ ${q.rs} == ${q.rt} --> ${q.branchAddress}`},J[5]=(q)=>`BNE ${q.rs} != ${q.rt} --> ${q.branchAddress}`,J[6]=(q)=>`BLEZ ${q.rs} <= 0 --> ${q.branchAddress}`,J[7]=(q)=>`BGTZ ${q.rs} > 0 --> ${q.branchAddress}`,J[8]=(q)=>`ADDI ${q.rt_d} = ${q.rs} + ${q.imm}`,J[9]=(q)=>`ADDIU ${q.rt_d} = ${q.rs} + ${q.imm}`,J[10]=(q)=>`SLTI ${q.rt_d} = (${q.rs} < ${q.imm})`,J[11]=(q)=>`SLTIU ${q.rt_d} = (${q.rs} < ${q.imm})`,J[12]=(q)=>`ANDI ${q.rt_d} = ${q.rs} & ${q.imm}`,J[13]=(q)=>`ORI ${q.rt_d} = ${q.rs} | ${q.imm}`,J[14]=(q)=>`XORI ${q.rt_d} = ${q.rs} ^ ${q.imm}`,J[15]=(q)=>`LUI ${q.rt_d} = ${q.imm} << 16`,J[16]=(q)=>R3[a9(q.opcode)](q),J[18]=(q)=>y3[a9(q.opcode)](q),J[32]=(q)=>`LB ${q.rt_d} <- ${q.memload()}`,J[33]=(q)=>`LH ${q.rt_d} <- ${q.memload()}`,J[35]=(q)=>`LW ${q.rt_d} <- ${q.memload()}`,J[36]=(q)=>`LBU ${q.rt_d} <- ${q.memload()}`,J[37]=(q)=>`LHU ${q.rt_d} <- ${q.memload()}`,J[39]=(q)=>`LWU ${q.rt_d} <- ${q.memload()}`,J[40]=(q)=>`SB ${q.rt} -> ${q.memstore()}`,J[41]=(q)=>`SH ${q.rt} -> ${q.memstore()}`,J[43]=(q)=>`SW ${q.rt} -> ${q.memstore()}`,J[50]=(q)=>_3[t8(q.opcode)](q),J[58]=(q)=>b3[t8(q.opcode)](q),J})();var lX=function(J){let q,Q;if(q=J.match(/(#|0x)?([a-f0-9]{6})/i))Q=q[2];else if(q=J.match(/rgb\(\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)\s*\)/))Q=parseInt(q[1]).toString(16).padStart(2,0)+parseInt(q[2]).toString(16).padStart(2,0)+parseInt(q[3]).toString(16).padStart(2,0);else if(q=J.match(/^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i))Q=q[1]+q[1]+q[2]+q[2]+q[3]+q[3];if(Q)return"#"+Q;return!1},f3=function(J){return g3.find((q)=>q.match(J))},m3=function(J){const q=document.createElement("style");q.innerHTML=J;const Q=document.querySelector("head link[rel=stylesheet], head style");if(Q)document.head.insertBefore(q,Q);else document.head.appendChild(q)};class p6{constructor(J,q,Q,Z,X="div"){this.parent=J,this.object=q,this.property=Q,this._disabled=!1,this._hidden=!1,this.initialValue=this.getValue(),this.domElement=document.createElement("div"),this.domElement.classList.add("controller"),this.domElement.classList.add(Z),this.$name=document.createElement("div"),this.$name.classList.add("name"),p6.nextNameID=p6.nextNameID||0,this.$name.id=`lil-gui-name-${++p6.nextNameID}`,this.$widget=document.createElement(X),this.$widget.classList.add("widget"),this.$disable=this.$widget,this.domElement.appendChild(this.$name),this.domElement.appendChild(this.$widget),this.domElement.addEventListener("keydown",(Y)=>Y.stopPropagation()),this.domElement.addEventListener("keyup",(Y)=>Y.stopPropagation()),this.parent.children.push(this),this.parent.controllers.push(this),this.parent.$children.appendChild(this.domElement),this._listenCallback=this._listenCallback.bind(this),this.name(Q)}name(J){return this._name=J,this.$name.innerHTML=J,this}onChange(J){return this._onChange=J,this}_callOnChange(){if(this.parent._callOnChange(this),this._onChange!==void 0)this._onChange.call(this,this.getValue());this._changed=!0}onFinishChange(J){return this._onFinishChange=J,this}_callOnFinishChange(){if(this._changed){if(this.parent._callOnFinishChange(this),this._onFinishChange!==void 0)this._onFinishChange.call(this,this.getValue())}this._changed=!1}reset(){return this.setValue(this.initialValue),this._callOnFinishChange(),this}enable(J=!0){return this.disable(!J)}disable(J=!0){if(J===this._disabled)return this;return this._disabled=J,this.domElement.classList.toggle("disabled",J),this.$disable.toggleAttribute("disabled",J),this}show(J=!0){return this._hidden=!J,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}options(J){const q=this.parent.add(this.object,this.property,J);return q.name(this._name),this.destroy(),q}min(J){return this}max(J){return this}step(J){return this}decimals(J){return this}listen(J=!0){if(this._listening=J,this._listenCallbackID!==void 0)cancelAnimationFrame(this._listenCallbackID),this._listenCallbackID=void 0;if(this._listening)this._listenCallback();return this}_listenCallback(){this._listenCallbackID=requestAnimationFrame(this._listenCallback);const J=this.save();if(J!==this._listenPrevValue)this.updateDisplay();this._listenPrevValue=J}getValue(){return this.object[this.property]}setValue(J){return this.object[this.property]=J,this._callOnChange(),this.updateDisplay(),this}updateDisplay(){return this}load(J){return this.setValue(J),this._callOnFinishChange(),this}save(){return this.getValue()}destroy(){this.listen(!1),this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.controllers.splice(this.parent.controllers.indexOf(this),1),this.parent.$children.removeChild(this.domElement)}}class $W extends p6{constructor(J,q,Q){super(J,q,Q,"boolean","label");this.$input=document.createElement("input"),this.$input.setAttribute("type","checkbox"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$widget.appendChild(this.$input),this.$input.addEventListener("change",()=>{this.setValue(this.$input.checked),this._callOnFinishChange()}),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.checked=this.getValue(),this}}var v3={isPrimitive:!0,match:(J)=>typeof J==="string",fromHexString:lX,toHexString:lX},lq={isPrimitive:!0,match:(J)=>typeof J==="number",fromHexString:(J)=>parseInt(J.substring(1),16),toHexString:(J)=>"#"+J.toString(16).padStart(6,0)},x3={isPrimitive:!1,match:(J)=>Array.isArray(J),fromHexString(J,q,Q=1){const Z=lq.fromHexString(J);q[0]=(Z>>16&255)/255*Q,q[1]=(Z>>8&255)/255*Q,q[2]=(Z&255)/255*Q},toHexString([J,q,Q],Z=1){Z=255/Z;const X=J*Z<<16^q*Z<<8^Q*Z<<0;return lq.toHexString(X)}},u3={isPrimitive:!1,match:(J)=>Object(J)===J,fromHexString(J,q,Q=1){const Z=lq.fromHexString(J);q.r=(Z>>16&255)/255*Q,q.g=(Z>>8&255)/255*Q,q.b=(Z&255)/255*Q},toHexString({r:J,g:q,b:Q},Z=1){Z=255/Z;const X=J*Z<<16^q*Z<<8^Q*Z<<0;return lq.toHexString(X)}},g3=[v3,lq,x3,u3];class HW extends p6{constructor(J,q,Q,Z){super(J,q,Q,"color");this.$input=document.createElement("input"),this.$input.setAttribute("type","color"),this.$input.setAttribute("tabindex",-1),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$text=document.createElement("input"),this.$text.setAttribute("type","text"),this.$text.setAttribute("spellcheck","false"),this.$text.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this.$display.appendChild(this.$input),this.$widget.appendChild(this.$display),this.$widget.appendChild(this.$text),this._format=f3(this.initialValue),this._rgbScale=Z,this._initialValueHexString=this.save(),this._textFocused=!1,this.$input.addEventListener("input",()=>{this._setValueFromHexString(this.$input.value)}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$text.addEventListener("input",()=>{const X=lX(this.$text.value);if(X)this._setValueFromHexString(X)}),this.$text.addEventListener("focus",()=>{this._textFocused=!0,this.$text.select()}),this.$text.addEventListener("blur",()=>{this._textFocused=!1,this.updateDisplay(),this._callOnFinishChange()}),this.$disable=this.$text,this.updateDisplay()}reset(){return this._setValueFromHexString(this._initialValueHexString),this}_setValueFromHexString(J){if(this._format.isPrimitive){const q=this._format.fromHexString(J);this.setValue(q)}else this._format.fromHexString(J,this.getValue(),this._rgbScale),this._callOnChange(),this.updateDisplay()}save(){return this._format.toHexString(this.getValue(),this._rgbScale)}load(J){return this._setValueFromHexString(J),this._callOnFinishChange(),this}updateDisplay(){if(this.$input.value=this._format.toHexString(this.getValue(),this._rgbScale),!this._textFocused)this.$text.value=this.$input.value.substring(1);return this.$display.style.backgroundColor=this.$input.value,this}}class i9 extends p6{constructor(J,q,Q){super(J,q,Q,"function");this.$button=document.createElement("button"),this.$button.appendChild(this.$name),this.$widget.appendChild(this.$button),this.$button.addEventListener("click",(Z)=>{Z.preventDefault(),this.getValue().call(this.object),this._callOnChange()}),this.$button.addEventListener("touchstart",()=>{},{passive:!0}),this.$disable=this.$button}}class GW extends p6{constructor(J,q,Q,Z,X,Y){super(J,q,Q,"number");this._initInput(),this.min(Z),this.max(X);const K=Y!==void 0;this.step(K?Y:this._getImplicitStep(),K),this.updateDisplay()}decimals(J){return this._decimals=J,this.updateDisplay(),this}min(J){return this._min=J,this._onUpdateMinMax(),this}max(J){return this._max=J,this._onUpdateMinMax(),this}step(J,q=!0){return this._step=J,this._stepExplicit=q,this}updateDisplay(){const J=this.getValue();if(this._hasSlider){let q=(J-this._min)/(this._max-this._min);q=Math.max(0,Math.min(q,1)),this.$fill.style.width=q*100+"%"}if(!this._inputFocused)this.$input.value=this._decimals===void 0?J:J.toFixed(this._decimals);return this}_initInput(){if(this.$input=document.createElement("input"),this.$input.setAttribute("type","text"),this.$input.setAttribute("aria-labelledby",this.$name.id),window.matchMedia("(pointer: coarse)").matches)this.$input.setAttribute("type","number"),this.$input.setAttribute("step","any");this.$widget.appendChild(this.$input),this.$disable=this.$input;const q=()=>{let O=parseFloat(this.$input.value);if(isNaN(O))return;if(this._stepExplicit)O=this._snap(O);this.setValue(this._clamp(O))},Q=(O)=>{const R=parseFloat(this.$input.value);if(isNaN(R))return;this._snapClampSetValue(R+O),this.$input.value=this.getValue()},Z=(O)=>{if(O.key==="Enter")this.$input.blur();if(O.code==="ArrowUp")O.preventDefault(),Q(this._step*this._arrowKeyMultiplier(O));if(O.code==="ArrowDown")O.preventDefault(),Q(this._step*this._arrowKeyMultiplier(O)*-1)},X=(O)=>{if(this._inputFocused)O.preventDefault(),Q(this._step*this._normalizeMouseWheel(O))};let Y=!1,K,z,W,G,H;const j=5,L=(O)=>{K=O.clientX,z=W=O.clientY,Y=!0,G=this.getValue(),H=0,window.addEventListener("mousemove",V),window.addEventListener("mouseup",P)},V=(O)=>{if(Y){const R=O.clientX-K,S=O.clientY-z;if(Math.abs(S)>j)O.preventDefault(),this.$input.blur(),Y=!1,this._setDraggingStyle(!0,"vertical");else if(Math.abs(R)>j)P()}if(!Y){const R=O.clientY-W;if(H-=R*this._step*this._arrowKeyMultiplier(O),G+H>this._max)H=this._max-G;else if(G+H{this._setDraggingStyle(!1,"vertical"),this._callOnFinishChange(),window.removeEventListener("mousemove",V),window.removeEventListener("mouseup",P)},M=()=>{this._inputFocused=!0},k=()=>{this._inputFocused=!1,this.updateDisplay(),this._callOnFinishChange()};this.$input.addEventListener("input",q),this.$input.addEventListener("keydown",Z),this.$input.addEventListener("wheel",X,{passive:!1}),this.$input.addEventListener("mousedown",L),this.$input.addEventListener("focus",M),this.$input.addEventListener("blur",k)}_initSlider(){this._hasSlider=!0,this.$slider=document.createElement("div"),this.$slider.classList.add("slider"),this.$fill=document.createElement("div"),this.$fill.classList.add("fill"),this.$slider.appendChild(this.$fill),this.$widget.insertBefore(this.$slider,this.$input),this.domElement.classList.add("hasSlider");const J=(k,O,R,S,T)=>{return(k-O)/(R-O)*(T-S)+S},q=(k)=>{const O=this.$slider.getBoundingClientRect();let R=J(k,O.left,O.right,this._min,this._max);this._snapClampSetValue(R)},Q=(k)=>{this._setDraggingStyle(!0),q(k.clientX),window.addEventListener("mousemove",Z),window.addEventListener("mouseup",X)},Z=(k)=>{q(k.clientX)},X=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("mousemove",Z),window.removeEventListener("mouseup",X)};let Y=!1,K,z;const W=(k)=>{k.preventDefault(),this._setDraggingStyle(!0),q(k.touches[0].clientX),Y=!1},G=(k)=>{if(k.touches.length>1)return;if(this._hasScrollBar)K=k.touches[0].clientX,z=k.touches[0].clientY,Y=!0;else W(k);window.addEventListener("touchmove",H,{passive:!1}),window.addEventListener("touchend",j)},H=(k)=>{if(Y){const O=k.touches[0].clientX-K,R=k.touches[0].clientY-z;if(Math.abs(O)>Math.abs(R))W(k);else window.removeEventListener("touchmove",H),window.removeEventListener("touchend",j)}else k.preventDefault(),q(k.touches[0].clientX)},j=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("touchmove",H),window.removeEventListener("touchend",j)},L=this._callOnFinishChange.bind(this),V=400;let P;const M=(k)=>{if(Math.abs(k.deltaX)this._max)J=this._max;return J}_snapClampSetValue(J){this.setValue(this._clamp(this._snap(J)))}get _hasScrollBar(){const J=this.parent.root.$children;return J.scrollHeight>J.clientHeight}get _hasMin(){return this._min!==void 0}get _hasMax(){return this._max!==void 0}}class jW extends p6{constructor(J,q,Q,Z){super(J,q,Q,"option");this.$select=document.createElement("select"),this.$select.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this._values=Array.isArray(Z)?Z:Object.values(Z),this._names=Array.isArray(Z)?Z:Object.keys(Z),this._names.forEach((X)=>{const Y=document.createElement("option");Y.innerHTML=X,this.$select.appendChild(Y)}),this.$select.addEventListener("change",()=>{this.setValue(this._values[this.$select.selectedIndex]),this._callOnFinishChange()}),this.$select.addEventListener("focus",()=>{this.$display.classList.add("focus")}),this.$select.addEventListener("blur",()=>{this.$display.classList.remove("focus")}),this.$widget.appendChild(this.$select),this.$widget.appendChild(this.$display),this.$disable=this.$select,this.updateDisplay()}updateDisplay(){const J=this.getValue(),q=this._values.indexOf(J);return this.$select.selectedIndex=q,this.$display.innerHTML=q===-1?J:this._names[q],this}}class NW extends p6{constructor(J,q,Q){super(J,q,Q,"string");this.$input=document.createElement("input"),this.$input.setAttribute("type","text"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$input.addEventListener("input",()=>{this.setValue(this.$input.value)}),this.$input.addEventListener("keydown",(Z)=>{if(Z.code==="Enter")this.$input.blur()}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$widget.appendChild(this.$input),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.value=this.getValue(),this}}var p3=`.lil-gui { font-family: var(--font-family); font-size: var(--font-size); line-height: 1; font-weight: normal; font-style: normal; text-align: left; background-color: var(--background-color); color: var(--text-color); user-select: none; -webkit-user-select: none; touch-action: manipulation; --background-color: #1f1f1f; --text-color: #ebebeb; --title-background-color: #111111; --title-text-color: #ebebeb; --widget-color: #424242; --hover-color: #4f4f4f; --focus-color: #595959; --number-color: #2cc9ff; --string-color: #a2db3c; --font-size: 11px; --input-font-size: 11px; --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; --padding: 4px; --spacing: 4px; --widget-height: 20px; --title-height: calc(var(--widget-height) + var(--spacing) * 1.25); --name-width: 45%; --slider-knob-width: 2px; --slider-input-width: 27%; --color-input-width: 27%; --slider-input-min-width: 45px; --color-input-min-width: 45px; --folder-indent: 7px; --widget-padding: 0 0 0 3px; --widget-border-radius: 2px; --checkbox-size: calc(0.75 * var(--widget-height)); --scrollbar-width: 5px; } .lil-gui, .lil-gui * { box-sizing: border-box; margin: 0; padding: 0; } .lil-gui.root { width: var(--width, 245px); display: flex; flex-direction: column; } .lil-gui.root > .title { background: var(--title-background-color); color: var(--title-text-color); } .lil-gui.root > .children { overflow-x: hidden; overflow-y: auto; } .lil-gui.root > .children::-webkit-scrollbar { width: var(--scrollbar-width); height: var(--scrollbar-width); background: var(--background-color); } .lil-gui.root > .children::-webkit-scrollbar-thumb { border-radius: var(--scrollbar-width); background: var(--focus-color); } @media (pointer: coarse) { .lil-gui.allow-touch-styles, .lil-gui.allow-touch-styles .lil-gui { --widget-height: 28px; --padding: 6px; --spacing: 6px; --font-size: 13px; --input-font-size: 16px; --folder-indent: 10px; --scrollbar-width: 7px; --slider-input-min-width: 50px; --color-input-min-width: 65px; } } .lil-gui.force-touch-styles, .lil-gui.force-touch-styles .lil-gui { --widget-height: 28px; --padding: 6px; --spacing: 6px; --font-size: 13px; --input-font-size: 16px; --folder-indent: 10px; --scrollbar-width: 7px; --slider-input-min-width: 50px; --color-input-min-width: 65px; } .lil-gui.autoPlace { max-height: 100%; position: fixed; top: 0; right: 15px; z-index: 1001; } .lil-gui .controller { display: flex; align-items: center; padding: 0 var(--padding); margin: var(--spacing) 0; } .lil-gui .controller.disabled { opacity: 0.5; } .lil-gui .controller.disabled, .lil-gui .controller.disabled * { pointer-events: none !important; } .lil-gui .controller > .name { min-width: var(--name-width); flex-shrink: 0; white-space: pre; padding-right: var(--spacing); line-height: var(--widget-height); } .lil-gui .controller .widget { position: relative; display: flex; align-items: center; width: 100%; min-height: var(--widget-height); } .lil-gui .controller.string input { color: var(--string-color); } .lil-gui .controller.boolean .widget { cursor: pointer; } .lil-gui .controller.color .display { width: 100%; height: var(--widget-height); border-radius: var(--widget-border-radius); position: relative; } @media (hover: hover) { .lil-gui .controller.color .display:hover:before { content: " "; display: block; position: absolute; border-radius: var(--widget-border-radius); border: 1px solid #fff9; top: 0; right: 0; bottom: 0; left: 0; } } .lil-gui .controller.color input[type=color] { opacity: 0; width: 100%; height: 100%; cursor: pointer; } .lil-gui .controller.color input[type=text] { margin-left: var(--spacing); font-family: var(--font-family-mono); min-width: var(--color-input-min-width); width: var(--color-input-width); flex-shrink: 0; } .lil-gui .controller.option select { opacity: 0; position: absolute; width: 100%; max-width: 100%; } .lil-gui .controller.option .display { position: relative; pointer-events: none; border-radius: var(--widget-border-radius); height: var(--widget-height); line-height: var(--widget-height); max-width: 100%; overflow: hidden; word-break: break-all; padding-left: 0.55em; padding-right: 1.75em; background: var(--widget-color); } @media (hover: hover) { .lil-gui .controller.option .display.focus { background: var(--focus-color); } } .lil-gui .controller.option .display.active { background: var(--focus-color); } .lil-gui .controller.option .display:after { font-family: "lil-gui"; content: "\u2195"; position: absolute; top: 0; right: 0; bottom: 0; padding-right: 0.375em; } .lil-gui .controller.option .widget, .lil-gui .controller.option select { cursor: pointer; } @media (hover: hover) { .lil-gui .controller.option .widget:hover .display { background: var(--hover-color); } } .lil-gui .controller.number input { color: var(--number-color); } .lil-gui .controller.number.hasSlider input { margin-left: var(--spacing); width: var(--slider-input-width); min-width: var(--slider-input-min-width); flex-shrink: 0; } .lil-gui .controller.number .slider { width: 100%; height: var(--widget-height); background-color: var(--widget-color); border-radius: var(--widget-border-radius); padding-right: var(--slider-knob-width); overflow: hidden; cursor: ew-resize; touch-action: pan-y; } @media (hover: hover) { .lil-gui .controller.number .slider:hover { background-color: var(--hover-color); } } .lil-gui .controller.number .slider.active { background-color: var(--focus-color); } .lil-gui .controller.number .slider.active .fill { opacity: 0.95; } .lil-gui .controller.number .fill { height: 100%; border-right: var(--slider-knob-width) solid var(--number-color); box-sizing: content-box; } .lil-gui-dragging .lil-gui { --hover-color: var(--widget-color); } .lil-gui-dragging * { cursor: ew-resize !important; } .lil-gui-dragging.lil-gui-vertical * { cursor: ns-resize !important; } .lil-gui .title { height: var(--title-height); line-height: calc(var(--title-height) - 4px); font-weight: 600; padding: 0 var(--padding); -webkit-tap-highlight-color: transparent; cursor: pointer; outline: none; text-decoration-skip: objects; } .lil-gui .title:before { font-family: "lil-gui"; content: "\u25BE"; padding-right: 2px; display: inline-block; } .lil-gui .title:active { background: var(--title-background-color); opacity: 0.75; } @media (hover: hover) { body:not(.lil-gui-dragging) .lil-gui .title:hover { background: var(--title-background-color); opacity: 0.85; } .lil-gui .title:focus { text-decoration: underline var(--focus-color); } } .lil-gui.root > .title:focus { text-decoration: none !important; } .lil-gui.closed > .title:before { content: "\u25B8"; } .lil-gui.closed > .children { transform: translateY(-7px); opacity: 0; } .lil-gui.closed:not(.transition) > .children { display: none; } .lil-gui.transition > .children { transition-duration: 300ms; transition-property: height, opacity, transform; transition-timing-function: cubic-bezier(0.2, 0.6, 0.35, 1); overflow: hidden; pointer-events: none; } .lil-gui .children:empty:before { content: "Empty"; padding: 0 var(--padding); margin: var(--spacing) 0; display: block; height: var(--widget-height); font-style: italic; line-height: var(--widget-height); opacity: 0.5; } .lil-gui.root > .children > .lil-gui > .title { border: 0 solid var(--widget-color); border-width: 1px 0; transition: border-color 300ms; } .lil-gui.root > .children > .lil-gui.closed > .title { border-bottom-color: transparent; } .lil-gui + .controller { border-top: 1px solid var(--widget-color); margin-top: 0; padding-top: var(--spacing); } .lil-gui .lil-gui .lil-gui > .title { border: none; } .lil-gui .lil-gui .lil-gui > .children { border: none; margin-left: var(--folder-indent); border-left: 2px solid var(--widget-color); } .lil-gui .lil-gui .controller { border: none; } .lil-gui input { -webkit-tap-highlight-color: transparent; border: 0; outline: none; font-family: var(--font-family); font-size: var(--input-font-size); border-radius: var(--widget-border-radius); height: var(--widget-height); background: var(--widget-color); color: var(--text-color); width: 100%; } @media (hover: hover) { .lil-gui input:hover { background: var(--hover-color); } .lil-gui input:active { background: var(--focus-color); } } .lil-gui input:disabled { opacity: 1; } .lil-gui input[type=text], .lil-gui input[type=number] { padding: var(--widget-padding); } .lil-gui input[type=text]:focus, .lil-gui input[type=number]:focus { background: var(--focus-color); } .lil-gui input::-webkit-outer-spin-button, .lil-gui input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .lil-gui input[type=number] { -moz-appearance: textfield; } .lil-gui input[type=checkbox] { appearance: none; -webkit-appearance: none; height: var(--checkbox-size); width: var(--checkbox-size); border-radius: var(--widget-border-radius); text-align: center; cursor: pointer; } .lil-gui input[type=checkbox]:checked:before { font-family: "lil-gui"; content: "\u2713"; font-size: var(--checkbox-size); line-height: var(--checkbox-size); } @media (hover: hover) { .lil-gui input[type=checkbox]:focus { box-shadow: inset 0 0 0 1px var(--focus-color); } } .lil-gui button { -webkit-tap-highlight-color: transparent; outline: none; cursor: pointer; font-family: var(--font-family); font-size: var(--font-size); color: var(--text-color); width: 100%; height: var(--widget-height); text-transform: none; background: var(--widget-color); border-radius: var(--widget-border-radius); border: 1px solid var(--widget-color); text-align: center; line-height: calc(var(--widget-height) - 4px); } @media (hover: hover) { .lil-gui button:hover { background: var(--hover-color); border-color: var(--hover-color); } .lil-gui button:focus { border-color: var(--focus-color); } } .lil-gui button:active { background: var(--focus-color); } @font-face { font-family: "lil-gui"; src: url("data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==") format("woff"); }`,FW=!1;class nX{constructor({parent:J,autoPlace:q=J===void 0,container:Q,width:Z,title:X="Controls",closeFolders:Y=!1,injectStyles:K=!0,touchStyles:z=!0}={}){if(this.parent=J,this.root=J?J.root:this,this.children=[],this.controllers=[],this.folders=[],this._closed=!1,this._hidden=!1,this.domElement=document.createElement("div"),this.domElement.classList.add("lil-gui"),this.$title=document.createElement("div"),this.$title.classList.add("title"),this.$title.setAttribute("role","button"),this.$title.setAttribute("aria-expanded",!0),this.$title.setAttribute("tabindex",0),this.$title.addEventListener("click",()=>this.openAnimated(this._closed)),this.$title.addEventListener("keydown",(W)=>{if(W.code==="Enter"||W.code==="Space")W.preventDefault(),this.$title.click()}),this.$title.addEventListener("touchstart",()=>{},{passive:!0}),this.$children=document.createElement("div"),this.$children.classList.add("children"),this.domElement.appendChild(this.$title),this.domElement.appendChild(this.$children),this.title(X),this.parent){this.parent.children.push(this),this.parent.folders.push(this),this.parent.$children.appendChild(this.domElement);return}if(this.domElement.classList.add("root"),z)this.domElement.classList.add("allow-touch-styles");if(!FW&&K)m3(p3),FW=!0;if(Q)Q.appendChild(this.domElement);else if(q)this.domElement.classList.add("autoPlace"),document.body.appendChild(this.domElement);if(Z)this.domElement.style.setProperty("--width",Z+"px");this._closeFolders=Y}add(J,q,Q,Z,X){if(Object(Q)===Q)return new jW(this,J,q,Q);const Y=J[q];switch(typeof Y){case"number":return new GW(this,J,q,Q,Z,X);case"boolean":return new $W(this,J,q);case"string":return new NW(this,J,q);case"function":return new i9(this,J,q)}console.error(`gui.add failed property:`,q,` object:`,J,` value:`,Y)}addColor(J,q,Q=1){return new HW(this,J,q,Q)}addFolder(J){const q=new nX({parent:this,title:J});if(this.root._closeFolders)q.close();return q}load(J,q=!0){if(J.controllers)this.controllers.forEach((Q)=>{if(Q instanceof i9)return;if(Q._name in J.controllers)Q.load(J.controllers[Q._name])});if(q&&J.folders)this.folders.forEach((Q)=>{if(Q._title in J.folders)Q.load(J.folders[Q._title])});return this}save(J=!0){const q={controllers:{},folders:{}};if(this.controllers.forEach((Q)=>{if(Q instanceof i9)return;if(Q._name in q.controllers)throw new Error(`Cannot save GUI with duplicate property "${Q._name}"`);q.controllers[Q._name]=Q.save()}),J)this.folders.forEach((Q)=>{if(Q._title in q.folders)throw new Error(`Cannot save GUI with duplicate folder "${Q._title}"`);q.folders[Q._title]=Q.save()});return q}open(J=!0){return this._setClosed(!J),this.$title.setAttribute("aria-expanded",!this._closed),this.domElement.classList.toggle("closed",this._closed),this}close(){return this.open(!1)}_setClosed(J){if(this._closed===J)return;this._closed=J,this._callOnOpenClose(this)}show(J=!0){return this._hidden=!J,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}openAnimated(J=!0){return this._setClosed(!J),this.$title.setAttribute("aria-expanded",!this._closed),requestAnimationFrame(()=>{const q=this.$children.clientHeight;this.$children.style.height=q+"px",this.domElement.classList.add("transition");const Q=(X)=>{if(X.target!==this.$children)return;this.$children.style.height="",this.domElement.classList.remove("transition"),this.$children.removeEventListener("transitionend",Q)};this.$children.addEventListener("transitionend",Q);const Z=!J?0:this.$children.scrollHeight;this.domElement.classList.toggle("closed",!J),requestAnimationFrame(()=>{this.$children.style.height=Z+"px"})}),this}title(J){return this._title=J,this.$title.innerHTML=J,this}reset(J=!0){return(J?this.controllersRecursive():this.controllers).forEach((Q)=>Q.reset()),this}onChange(J){return this._onChange=J,this}_callOnChange(J){if(this.parent)this.parent._callOnChange(J);if(this._onChange!==void 0)this._onChange.call(this,{object:J.object,property:J.property,value:J.getValue(),controller:J})}onFinishChange(J){return this._onFinishChange=J,this}_callOnFinishChange(J){if(this.parent)this.parent._callOnFinishChange(J);if(this._onFinishChange!==void 0)this._onFinishChange.call(this,{object:J.object,property:J.property,value:J.getValue(),controller:J})}onOpenClose(J){return this._onOpenClose=J,this}_callOnOpenClose(J){if(this.parent)this.parent._callOnOpenClose(J);if(this._onOpenClose!==void 0)this._onOpenClose.call(this,J)}destroy(){if(this.parent)this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.folders.splice(this.parent.folders.indexOf(this),1);if(this.domElement.parentElement)this.domElement.parentElement.removeChild(this.domElement);Array.from(this.children).forEach((J)=>J.destroy())}controllersRecursive(){let J=Array.from(this.controllers);return this.folders.forEach((q)=>{J=J.concat(q.controllersRecursive())}),J}foldersRecursive(){let J=Array.from(this.folders);return this.folders.forEach((q)=>{J=J.concat(q.foldersRecursive())}),J}}var LW=nX;function c3(){J6.show()}function o3(){J6.hide()}function VW(J){if(J)c3();else o3()}var J6=new LW;J6.title("Options");J6.hide();function MW(){aX=new Map,t9=new Map}function rX(){return t9}function nq(J){let q=t9.get(J);if(q){if(q.opsCompiled>0&&!q.func)q.invalidate();return q}if(!PW.enableDynarec)return null;let Q=aX.get(J)||0;if(Q++,aX.set(J,Q),Q0&&!Q.func)Q.invalidate();return Q}}function XQ(J){let q="";if(J&P0.AA_EN)q+="|AA_EN";if(J&P0.Z_CMP)q+="|Z_CMP";if(J&P0.Z_UPD)q+="|Z_UPD";if(J&P0.IM_RD)q+="|IM_RD";if(J&P0.CLR_ON_CVG)q+="|CLR_ON_CVG";const Q=J&768;if(Q===P0.CVG_DST_CLAMP)q+="|CVG_DST_CLAMP";else if(Q===P0.CVG_DST_WRAP)q+="|CVG_DST_WRAP";else if(Q===P0.CVG_DST_FULL)q+="|CVG_DST_FULL";else if(Q===P0.CVG_DST_SAVE)q+="|CVG_DST_SAVE";const Z=J&3072;if(Z===P0.ZMODE_OPA)q+="|ZMODE_OPA";else if(Z===P0.ZMODE_INTER)q+="|ZMODE_INTER";else if(Z===P0.ZMODE_XLU)q+="|ZMODE_XLU";else if(Z===P0.ZMODE_DEC)q+="|ZMODE_DEC";if(J&P0.CVG_X_ALPHA)q+="|CVG_X_ALPHA";if(J&P0.ALPHA_CVG_SEL)q+="|ALPHA_CVG_SEL";if(J&P0.FORCE_BL)q+="|FORCE_BL";const X=J>>>q7,Y=q.length>0?q.substr(1):"0",K="GBL_c1("+ZQ(X>>>2)+") | GBL_c2("+ZQ(X)+") /*"+q0(X)+"*/";return Y+", "+K}function p0(J){let q=J;if(J===X7)q="G_TX_LOADTILE";if(J===a3)q="G_TX_RENDERTILE";return q}function fJ(J){switch(J){case r3:return"G_TX_WRAP";case iq:return"G_TX_MIRROR";case k8:return"G_TX_CLAMP";case iq|k8:return"G_TX_MIRROR|G_TX_CLAMP"}return J}function pJ(J,q){let Q="";if(q&J.G_ZBUFFER)Q+="|G_ZBUFFER";if(q&J.G_TEXTURE_ENABLE)Q+="|G_TEXTURE_ENABLE";if(q&J.G_SHADE)Q+="|G_SHADE";if(q&J.G_SHADING_SMOOTH)Q+="|G_SHADING_SMOOTH";const Z=q&J.G_CULL_BOTH;if(Z===J.G_CULL_FRONT)Q+="|G_CULL_FRONT";else if(Z===J.G_CULL_BACK)Q+="|G_CULL_BACK";else if(Z===J.G_CULL_BOTH)Q+="|G_CULL_BOTH";if(q&J.G_FOG)Q+="|G_FOG";if(q&J.G_LIGHTING)Q+="|G_LIGHTING";if(q&J.G_TEXTURE_GEN)Q+="|G_TEXTURE_GEN";if(q&J.G_TEXTURE_GEN_LINEAR)Q+="|G_TEXTURE_GEN_LINEAR";if(q&J.G_LOD)Q+="|G_LOD";return Q.length>0?Q.substr(1):"0"}function ZQ(J){const q=J>>>12&3,Q=J>>>8&3,Z=J>>>4&3,X=J>>>0&3;return kW[q]+","+s3[Q]+","+kW[Z]+","+i3[X]}var P0={AA_EN:8,Z_CMP:16,Z_UPD:32,IM_RD:64,CLR_ON_CVG:128,CVG_DST_CLAMP:0,CVG_DST_WRAP:256,CVG_DST_FULL:512,CVG_DST_SAVE:768,ZMODE_OPA:0,ZMODE_INTER:1024,ZMODE_XLU:2048,ZMODE_DEC:3072,CVG_X_ALPHA:4096,ALPHA_CVG_SEL:8192,FORCE_BL:16384,TEX_EDGE:0},sX=0,hW=2;var q7=16,bJ=3,YQ=4,IW=4294967288,OW=0,aq=4,rq=6,iX=8,e9=9,JQ=12,qQ=14,tX=16,QQ=17,eX=19,sq=20;var J7=23,G6=t({G_GBI2_MV_VIEWPORT:8,G_GBI2_MV_LIGHT:10,G_GBI2_MV_POINT:12,G_GBI2_MV_MATRIX:14,G_GBI2_MVO_LOOKATX:0,G_GBI2_MVO_LOOKATY:24,G_GBI2_MVO_L0:48,G_GBI2_MVO_L1:72,G_GBI2_MVO_L2:96,G_GBI2_MVO_L3:120,G_GBI2_MVO_L4:144,G_GBI2_MVO_L5:168,G_GBI2_MVO_L6:192,G_GBI2_MVO_L7:216}),KQ=1<>>8&255,Q=J&255;return q<<24|q<<16|q<<8|Q}function z7(J){const q=dJ[J>>>11&31],Q=dJ[J>>>6&31],Z=dJ[J>>>1&31],X=J&1?255:0;return q<<24|Q<<16|Z<<8|X}var e3=function(J,q,Q){const Z=J.data,X=J.width*4;let Y=0;const K=Q.line<<4;let z=Q.tmem<<3,W=0;for(let G=0;G>>11&31],Z[j+1]=dJ[P>>>6&31],Z[j+2]=dJ[P>>>1&31],Z[j+3]=P&1?255:0,H+=2,j+=4}z+=K,Y+=X,W^=4}},qN=function(J,q,Q){let Z=J.data,X=J.width*4,Y=0,K=Q.line<<3,z=Q.tmem<<3,W=0;for(let G=0;G>>4&15],k=tq[P&15];Z[j+0]=M,Z[j+1]=M,Z[j+2]=M,Z[j+3]=k,H+=1,j+=4}z+=K,Y+=X,W^=4}},ZN=function(J,q,Q){let Z=J.data,X=J.width*4,Y=0,K=Q.line<<3,z=Q.tmem<<3,W=0;for(let G=0;G>>5],k=Y7[(P&16)>>>4],O=K7[(P&14)>>>1],R=Y7[(P&1)>>>0];Z[j+0]=M,Z[j+1]=M,Z[j+2]=M,Z[j+3]=k,Z[j+4]=O,Z[j+5]=O,Z[j+6]=O,Z[j+7]=R,H+=1,j+=8}if(Q.width&1){let L=H^W,V=q[L],P=K7[(V&224)>>>5],M=Y7[(V&16)>>>4];Z[j+0]=P,Z[j+1]=P,Z[j+2]=P,Z[j+3]=M,H+=1,j+=4}z+=K,Y+=X,W^=4}},XN=function(J,q,Q){let Z=J.data,X=J.width*4,Y=0,K=Q.line<<3,z=Q.tmem<<3,W=0;for(let G=0;G>>4],M=tq[(V&15)>>>0];Z[j+0]=P,Z[j+1]=P,Z[j+2]=P,Z[j+3]=P,Z[j+4]=M,Z[j+5]=M,Z[j+6]=M,Z[j+7]=M,H+=1,j+=8}if(Q.width&1){let L=q[H^W],V=tq[(L&240)>>>4];Z[j+0]=V,Z[j+1]=V,Z[j+2]=V,Z[j+3]=V,H+=1,j+=4}z+=K,Y+=X,W^=4}},BW=function(J,q,Q,Z){const X=J.data,Y=J.width*4;let K=0;const z=Q.line<<3;let W=Q.tmem<<3;const G=0;for(let j=0;j<256;++j){const P=2048+(j*4+G)*2,M=q[P+0]<<8|q[P+1];oJ[j]=Z(M)}let H=0;for(let j=0;j>24&255,X[V+1]=M>>16&255,X[V+2]=M>>8&255,X[V+3]=M&255,L+=1,V+=4}W+=z,K+=Y,H^=4}},CW=function(J,q,Q,Z,X){const Y=J.data,K=J.width*4;let z=0;const W=Q.line<<3;let G=Q.tmem<<3;const H=0;for(let L=0;L<16;++L){const M=2048+((Z*16|L)*4+H)*2,k=q[M+0]<<8|q[M+1];oJ[L]=X(k)}let j=0;for(let L=0;L>>4],R=oJ[(k&15)>>>0];Y[P+0]=O>>24&255,Y[P+1]=O>>16&255,Y[P+2]=O>>8&255,Y[P+3]=O&255,Y[P+4]=R>>24&255,Y[P+5]=R>>16&255,Y[P+6]=R>>8&255,Y[P+7]=R&255,V+=1,P+=8}if(Q.width&1){let M=q[V^j],k=oJ[(M&240)>>>4];Y[P+0]=k>>24&255,Y[P+1]=k>>16&255,Y[P+2]=k>>8&255,Y[P+3]=k&255,V+=1,P+=4}G+=W,z+=K,j^=4}};function AW(J,q,Q,Z){const X=Z===mJ.G_TT_IA16?t3:z7;switch(Q.format){case j0.G_IM_FMT_RGBA:switch(Q.size){case l.G_IM_SIZ_32b:return e3(J,q,Q),!0;case l.G_IM_SIZ_16b:return JN(J,q,Q),!0;case l.G_IM_SIZ_8b:return BW(J,q,Q,X),!0;case l.G_IM_SIZ_4b:return CW(J,q,Q,Q.palette,X),!0}break;case j0.G_IM_FMT_IA:switch(Q.size){case l.G_IM_SIZ_16b:return qN(J,q,Q),!0;case l.G_IM_SIZ_8b:return QN(J,q,Q),!0;case l.G_IM_SIZ_4b:return ZN(J,q,Q),!0}break;case j0.G_IM_FMT_I:switch(Q.size){case l.G_IM_SIZ_8b:return XN(J,q,Q),!0;case l.G_IM_SIZ_4b:return YN(J,q,Q),!0}break;case j0.G_IM_FMT_CI:switch(Q.size){case l.G_IM_SIZ_8b:return BW(J,q,Q,X),!0;case l.G_IM_SIZ_4b:return CW(J,q,Q,Q.palette,X),!0}break}return!1}var Y7=[0,255],K7=[0,36,73,109,146,182,219,255],tq=[0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255],dJ=[0,8,16,24,33,41,49,57,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,198,206,214,222,231,239,247,255],oJ=new Uint32Array(256);function _Q(J,q,Q){let Z;switch(q){case bJ:Z=`gsDPSetAlphaCompare(${e8.nameOf(Q)});`;break;case YQ:Z=`gsDPSetDepthSource(${I8.nameOf(Q)});`;break;case IW:Z=`gsDPSetRenderMode(${XQ(Q)});`;break;default:Z=`gsSPSetOtherMode(G_SETOTHERMODE_L, ${N(q)}, ${N(Q)}`;break}J.text(Z)}function bQ(J,q,Q,Z,X){let Y;switch(q){case OW:break;case jQ:Y=`gsDPSetAlphaDither(${TQ.nameOf(X)});`;break;case GQ:Y=`gsDPSetColorDither(${EQ.nameOf(X)});`;break;case HQ:Y=`gsDPSetCombineKey(${yQ.nameOf(X)});`;break;case $Q:Y=`gsDPSetTextureConvert(${RQ.nameOf(X)});`;break;case xJ:Y=`gsDPSetTextureFilter(${cJ.nameOf(X)});`;break;case FQ:Y=`gsDPSetTextureLOD(${AQ.nameOf(X)});`;break;case vJ:Y=`gsDPSetTextureLUT(${mJ.nameOf(X)});`;break;case WQ:Y=`gsDPSetTextureDetail(${CQ.nameOf(X)});`;break;case zQ:Y=`gsDPSetTexturePersp(${BQ.nameOf(X)});`;break;case SJ:Y=`gsDPSetCycleType(${N0.nameOf(X)});`;break;case KQ:Y=`gsDPPipelineMode(${wQ.nameOf(X)});`;break;default:Y=`gsSPSetOtherMode(G_SETOTHERMODE_H, ${N(q)}, ${N(X)});`;break}J.text(Y)}var RW=function(J,q,Q,Z){const X=`${J}, ${q}, ${Q}`,Y=`${X}, ${Z}`;if(J<128&&q<128||q<128&&Q<128||Q<128&&J<128)return`${Y}`;return`${Y}`};function O8(J){const q=J>>>24&255,Q=J>>>16&255,Z=J>>>8&255,X=J&255;return RW(q,Q,Z,X)}function SQ(J){const q=J&255,Q=J>>>8&255,Z=J>>>16&255,X=J>>>24&255;return RW(q,Q,Z,X)}function yW(J){return O8(z7(J))}class JJ{constructor(J){this.gl=J,this.vao=J.createVertexArray(),this.posBuffer=null,this.uvBuffer=null,this.colBuffer=null}bind(){this.gl.bindVertexArray(this.vao)}unbind(){this.gl.bindVertexArray(null)}initPosAttr(J,q){const Q=this.gl;this.bind();const Z=Q.getAttribLocation(J,q),X=Q.createBuffer();Q.enableVertexAttribArray(Z),Q.bindBuffer(Q.ARRAY_BUFFER,X),Q.vertexAttribPointer(Z,4,Q.FLOAT,!1,0,0),this.unbind(),this.posBuffer=X}initColorAttr(J,q){const Q=this.gl;this.bind();const Z=Q.getAttribLocation(J,q),X=Q.createBuffer();Q.enableVertexAttribArray(Z),Q.bindBuffer(Q.ARRAY_BUFFER,X),Q.vertexAttribPointer(Z,4,Q.UNSIGNED_BYTE,!0,0,0),this.unbind(),this.colBuffer=X}initUVsAttr(J,q){const Q=this.gl;this.bind();const Z=Q.getAttribLocation(J,q),X=Q.createBuffer();Q.enableVertexAttribArray(Z),Q.bindBuffer(Q.ARRAY_BUFFER,X),Q.vertexAttribPointer(Z,2,Q.FLOAT,!1,0,0),this.unbind(),this.uvBuffer=X}setPosData(J,q){this.setData(this.posBuffer,J,q)}setColorData(J,q){this.setData(this.colBuffer,J,q)}setUVData(J,q){this.setData(this.uvBuffer,J,q)}setData(J,q,Q){const Z=this.gl;Z.bindBuffer(Z.ARRAY_BUFFER,J),Z.bufferData(Z.ARRAY_BUFFER,q,Q)}}function H7(J,q,Q){let Z=$7(J,q),X=$7(J,Q),Y=J.createProgram();if(J.attachShader(Y,Z),J.attachShader(Y,X),J.linkProgram(Y),!J.getProgramParameter(Y,J.LINK_STATUS))J0(!1,"Unable to initialize the shader program.");return Y}var $7=function(J,q){let Q=document.getElementById(q);if(!Q)return null;let Z=vW(Q),X;if(Q.type==="x-shader/x-fragment")X=J.FRAGMENT_SHADER;else if(Q.type==="x-shader/x-vertex")X=J.VERTEX_SHADER;else return null;return xW(J,Z,X)},vW=function(J){let q="",Q=J.firstChild;while(Q){if(Q.nodeType==Node.TEXT_NODE)q+=Q.textContent;Q=Q.nextSibling}return q},xW=function(J,q,Q){let Z=J.createShader(Q);if(J.shaderSource(Z,q),J.compileShader(Z),!J.getShaderParameter(Z,J.COMPILE_STATUS))return J0(!1,"An error occurred compiling the shaders: "+J.getShaderInfoLog(Z)),null;return Z};function gW(J,q,Q,Z,X){let Y=Z>>20&15,W=Q>>>28&15,G=q>>>15&31,H=Q>>>15&7,j=q>>>12&7,L=Q>>>12&7,V=q>>>9&7,P=Q>>>9&7,M=q>>>5&15,k=Q>>>24&15,O=q>>>0&31,R=Q>>>6&7,S=Q>>>21&7,T=Q>>>3&7,b=Q>>>18&7,p=Q>>>0&7,d;if(Z===N0.G_CYC_FILL)d="col = shade;\n";else if(Z===N0.G_CYC_COPY)d="col = tex0;\n";else if(Z===N0.G_CYC_1CYCLE)d="",d+="col.rgb = ("+vQ[z]+" - "+vQ[W]+") * "+_W[G]+" + "+SW[H]+";\n",d+="col.a = ("+D8[j]+" - "+D8[L]+") * "+D8[V]+" + "+D8[P]+";\n";else d="",d+="col.rgb = ("+vQ[z]+" - "+vQ[W]+") * "+_W[G]+" + "+SW[H]+";\n",d+="col.a = ("+D8[j]+" - "+D8[L]+") * "+D8[V]+" + "+D8[P]+";\n",d+="combined = vec4(col.rgb, col.a);\n",d+="col.rgb = ("+bW[M]+" - "+bW[k]+") * "+zN[O]+" + "+WN[R]+";\n",d+="col.a = ("+xQ[S]+" - "+xQ[T]+") * "+xQ[b]+" + "+xQ[p]+";\n";if(X)d+="if(col.a <= uAlphaThreshold) discard;\n";let V0=W7.replace("{{body}}",d);if(KN){let $0="\n";$0+="\tRGB0 = ("+gQ[z]+" - "+fQ[W]+") * "+uQ[G]+" + "+pQ[H]+"\n",$0+="\t A0 = ("+w8[j]+" - "+w8[L]+") * "+mQ[V]+" + "+cQ[P]+"\n",$0+="\tRGB1 = ("+gQ[M]+" - "+fQ[k]+") * "+uQ[O]+" + "+pQ[R]+"\n",$0+="\t A1 = ("+w8[S]+" - "+w8[T]+") * "+mQ[b]+" + "+cQ[p]+"\n";let z6=V0.split("\n").join("
");h("Compiled "+$0+"\nto\n"+z6)}let I0=xW(J,V0,J.FRAGMENT_SHADER);if(!I0)return null;let F0=J.createProgram();if(J.attachShader(F0,F7),J.attachShader(F0,I0),J.linkProgram(F0),!J.getProgramParameter(F0,J.LINK_STATUS))J0(!1,"Unable to initialize the shader program.");return K=new uW(J,F0,V0),TW.set(Y,K),K}function oQ(J,q){let Q=J>>>20&15,Z=q>>>28&15,X=J>>>15&31,Y=q>>>15&7,K=J>>>12&7,z=q>>>12&7,W=J>>>9&7,G=q>>>9&7,H=J>>>5&15,j=q>>>24&15,L=J>>>0&31,V=q>>>6&7,P=q>>>21&7,M=q>>>3&7,k=q>>>18&7,O=q>>>0&7,R="";return R+="RGB0 = ("+gQ[Q]+" - "+fQ[Z]+") * "+uQ[X]+" + "+pQ[Y]+"\n",R+=" A0 = ("+w8[K]+" - "+w8[z]+") * "+mQ[W]+" + "+cQ[G]+"\n",R+="RGB1 = ("+gQ[H]+" - "+fQ[j]+") * "+uQ[L]+" + "+pQ[V]+"\n",R+=" A1 = ("+w8[P]+" - "+w8[M]+") * "+mQ[k]+" + "+cQ[O]+"\n",R}var KN=!1,TW=new Map,W7=null,F7=null,_W=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","k5","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","zero.rgb"],zN=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","k5","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","? ","zero.rgb"],vQ=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","zero.rgb"],bW=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","lod_frac","prim_lod_frac","zero.rgb"],SW=["combined.rgb","tex0.rgb","tex1.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","zero.rgb"],WN=["combined.rgb","tex1.rgb","tex0.rgb","prim.rgb","shade.rgb","env.rgb","one.rgb","zero.rgb"],D8=["combined.a","tex0.a","tex1.a","prim.a","shade.a","env.a","one.a","zero.a"],xQ=["combined.a","tex1.a","tex0.a","prim.a","shade.a","env.a","one.a","zero.a"],uQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","KeyScale ","CombinedAlph","Texel0_Alpha","Texel1_Alpha","Prim_Alpha ","Shade_Alpha ","Env_Alpha ","LOD_Frac ","PrimLODFrac ","K5 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],gQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","Noise ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],fQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","KeyCenter ","K4 ","0 ","0 ","0 ","0 ","0 ","0 ","0 ","0 "],pQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "],w8=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","PrimLODFrac ","0 "],mQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "],cQ=["Combined ","Texel0 ","Texel1 ","Primitive ","Shade ","Env ","1 ","0 "];class uW{constructor(J,q,Q){this.program=q,this.shaderSource=Q,this.vertexArray=new JJ(J),this.vertexArray.initPosAttr(q,"aPosition"),this.vertexArray.initUVsAttr(q,"aUV"),this.vertexArray.initColorAttr(q,"aColor"),this.uSamplerUniform0=J.getUniformLocation(q,"uSampler0"),this.uSamplerUniform1=J.getUniformLocation(q,"uSampler1"),this.uTexScaleUniform0=J.getUniformLocation(q,"uTexScale0"),this.uTexScaleUniform1=J.getUniformLocation(q,"uTexScale1"),this.uTexOffsetUniform0=J.getUniformLocation(q,"uTexOffset0"),this.uTexOffsetUniform1=J.getUniformLocation(q,"uTexOffset1"),this.uPrimColorUniform=J.getUniformLocation(q,"uPrimColor"),this.uEnvColorUniform=J.getUniformLocation(q,"uEnvColor"),this.uAlphaThresholdUniform=J.getUniformLocation(q,"uAlphaThresholdUniform")}}var $N=function(J){const q=j7("x",J,MQ,VQ),Q=j7("y",J,hQ,PQ),Z=j7("z",J,kQ,UQ);return`${q} ${Q} ${Z}`},j7=function(J,q,Q,Z){const X=q&Q,Y=q&Z;let K="",z="";if(X&&Y)K="clip-err",z="!";else if(X)K="clip-pos",z=">";else if(Y)K="clip-neg",z="<";else K="clip-none",z="0";return`${J}${z}`},dQ,lJ,B8,fW=$("#dlist-content"),FN=0,pW="";class N7{constructor(J,q){this.state=J,this.processDList=q,this.currentOp=0,this.numOps=0,this.bailAfter=-1,this.lastTask,this.stateTimeShown=-1,this.running=!1,this.requested=!1,this.dlFocusCounter=0}onNewTask(J){if(this.lastTask=J,this.requested){if(pW==""||J.detectVersionString().includes(pW)){if(this.dlFocusCounter==FN)this.requested=!1,n64js.breakEmulationForDisplayListDebug(),this.stateTimeShown=-1,this.running=!0;this.dlFocusCounter++}}else this.dlFocusCounter=0}toggle(){if(this.running)this.hideUI(),this.bailAfter=-1,this.running=!1,n64js.toggleRun();else this.showUI(),this.requested=!0}halt(){this.showUI(),this.requested=!1,this.running=!0,this.bailAfter=this.currentOp,this.stateTimeShown=-1}debugDisplayList(){if(this.stateTimeShown==-1){const J=new mW(this);this.processDList(this.lastTask,J,-1),J.finalise(),this.numOps=J.numOps>0?J.numOps-1:0,this.setScrubRange(this.numOps);const q=this.bailAfter==-1?this.numOps:this.bailAfter;this.setScrubTime(q)}if(this.processDList(this.lastTask,null,this.bailAfter),this.stateTimeShown!==this.bailAfter)this.updateStateUI(),this.stateTimeShown=this.bailAfter}postOp(J){if(J>-1&&this.currentOp>=J)return!0;return this.currentOp++,!1}updateStateUI(){lJ.find("#dl-geometrymode-content").html(this.buildStateTab()),lJ.find("#dl-vertices-content").html(this.buildVerticesTab()),lJ.find("#dl-tiles-content").html(this.buildTilesTab()),lJ.find("#dl-combiner-content").html(this.buildCombinerTab()),lJ.find("#dl-rdp-content").html(this.buildRDPTab())}setScrubText(J,q){dQ.find(".scrub-text").html(`uCode op ${J}/${q}.`)}setScrubRange(J){dQ.find("input").attr({min:0,max:J,value:J}),this.setScrubText(J,J)}setScrubTime(J){this.bailAfter=J,this.setScrubText(this.bailAfter,this.numOps);const q=B8.find(`#I${this.bailAfter}`);B8.scrollTop(B8.scrollTop()+q.position().top-B8.height()/2+q.height()/2);const Q="hle-cur-instr";B8.find(".hle-instr").removeClass(Q),q.addClass(Q)}initUI(){const J=fW.find("#controls");this.bailAfter=-1,this.numOps=0;const q=this;J.find("#rwd").click(()=>{if(q.running&&q.bailAfter>0)q.setScrubTime(q.bailAfter-1)}),J.find("#fwd").click(()=>{if(q.running&&q.bailAfter{this.toggle()}),dQ=J.find(".scrub"),dQ.find("input").change(function(){q.setScrubTime($(this).val()|0)}),this.setScrubRange(0),lJ=fW.find(".hle-state"),B8=$('
'),$("#adjacent-debug").empty().append(B8)}showUI(){n64js.debugger().show(),$("#dlist-tab").tab("show")}hideUI(){n64js.debugger().hide()}setDisplayListOutput(J){B8.html(J),J.find(".dl-tip").parent().click(function(){$(this).find(".dl-tip").toggle()})}buildStateTab(){const J=$('
'),q=$("");for(let Q in this.state.geometryMode)if(Object.prototype.hasOwnProperty.call(this.state.geometryMode,Q)){const Z=$(`${Q}`);Z.addClass(this.state.geometryMode[Q]?"dl-debug-geommode-enabled":"dl-debug-geommode-disabled"),q.append(Z)}return J.append(q),J}buildRDPTab(){const J=this.state.rdpOtherModeL,q=this.state.rdpOtherModeH,Q=this.state.textureImage,Z=new Map([["alphaCompare",e8.nameOf(J&bJ)],["depthSource",I8.nameOf(J&YQ)],["renderMode",XQ(J)],["alphaDither",TQ.nameOf(q&jQ)],["colorDither",EQ.nameOf(q&GQ)],["combineKey",yQ.nameOf(q&HQ)],["textureConvert",RQ.nameOf(q&$Q)],["textureFilter",cJ.nameOf(q&xJ)],["textureLUT",mJ.nameOf(q&vJ)],["textureLOD",AQ.nameOf(q&FQ)],["texturePersp",BQ.nameOf(q&zQ)],["textureDetail",CQ.nameOf(q&WQ)],["cycleType",N0.nameOf(q&SJ)],["pipelineMode",wQ.nameOf(q&KQ)],[""," "],["TI.format",j0.nameOf(Q.format)],["TI.size",l.nameOf(Q.size)],["TI.width",Q.width],["TI.address",N(Q.address)]]),X=$('
');for(let[Y,K]of Z){let z=$(`${Y}${K}`);X.append(z)}return X}buildColorsTable(){const J=["fillColor","envColor","primColor","blendColor","fogColor"],q=$('
');for(let Q of J){let Z=$(`${Q}${O8(this.state[Q])}`);q.append(Z)}return q}buildCombinerTab(){const J=$('
');J.append(N0.nameOf(this.state.getCycleType())+"\n"),J.append(this.buildColorsTable()),J.append(oQ(this.state.combine.hi,this.state.combine.lo));const q=this.renderer.getCurrentN64Shader();if(q)J.append(q.shaderSource);return J}buildTexture(J){const q=this.renderer.lookupTexture(J);if(q)return q.createScaledCanvas(8)}buildTilesTab(){const J=$("
");J.append(this.buildTilesTable());const q=[],Q=$("");for(let X=0;X<8;++X){let Y=this.buildTexture(X);q.push(p0(X));let K=$("");K.append(Y?Y:""),Q.append(K)}const Z=$('
');return Z.append($(`${q.join("")}`)),Z.append(Q),J.append(Z),J}buildTilesTable(){const J=["tile #","format","size","line","tmem","palette","cmS","maskS","shiftS","cmT","maskT","shiftT","left","top","right","bottom","width","height","unmasked w","unmasked h"],q=$('
'),Q=$(`${J.join("")}`);q.append(Q);for(let Z=0;Z${Y.join("")}`);q.append(K)}return q}buildVerticesTab(){const J=["vtx #","x","y","z","px","py","pz","pw","color","u","v","clip"],q=$('
'),Q=$(`${J.join("")}`);q.append(Q);for(let Z=0;Z${W.join("")}`);q.append(G)}return q}}class mW{constructor(J){this.debugController=J,this.$currentDis=$("
"),this.$span=void 0,this.numOps=0}begin(J,q,Q){const Z=new Array(Q+1).join("  ");this.$span=$(``),this.$span.append(`${q5(this.numOps,5)} ${v(J,32)}${v(q,32)} ${Z}`),this.$currentDis.append(this.$span)}text(J){this.$span.append(J)}tip(J){const q=$(`
${J}
`);q.hide(),this.$span.append(q)}end(){this.$span.append("
"),this.numOps++}finalise=function(){this.debugController.setDisplayListOutput(this.$currentDis)};rgba8888(J){return O8(J)}rgba5551(J){return yW(J)}}class h0{constructor(J,q,Q){if(Q!==void 0)this.elems=new Float32Array(3),this.elems[0]=J,this.elems[1]=q,this.elems[2]=Q;else this.elems=J||new Float32Array(3)}get x(){return this.elems[0]}get y(){return this.elems[1]}get z(){return this.elems[2]}set x(J){this.elems[0]=J}set y(J){this.elems[1]=J}set z(J){this.elems[2]=J}set(J,q,Q){return this.x=J,this.y=q,this.z=Q,this}dot(J){let q=0;for(let Q=0;Q0)return this.scaleInPlace(1/J);return this}static create(J){const q=new h0;return q.elems[0]=J[0],q.elems[1]=J[1],q.elems[2]=J[2],q}}var cW=function(J,q,Q){return J.getU32(q)&4294901760|J.getU32(Q)>>>16&65535},oW=function(J,q,Q){return J.getU32(q)<<16|J.getU32(Q)&65535},L7=function(J){return J<<18>>18},nJ=function(J){return J<<4>>4},E=t({Nop:0,FillTriangle:8,FillZBufferTriangle:9,TextureTriangle:10,TextureZBufferTriangle:11,ShadeTriangle:12,ShadeZBufferTriangle:13,ShadeTextureTriangle:14,ShadeTextureZBufferTriangle:15,TextureRectangle:36,TextureRectangleFlip:37,SyncLoad:38,SyncPipe:39,SyncTile:40,SyncFull:41,SetKeyGB:42,SetKeyR:43,SetConvert:44,SetScissor:45,SetPrimDepth:46,SetOtherModes:47,LoadTLut:48,SetTileSize:50,LoadBlock:51,LoadTile:52,SetTile:53,FillRectangle:54,SetFillColor:55,SetFogColor:56,SetBlendColor:57,SetPrimColor:58,SetEnvColor:59,SetCombine:60,SetTextureImage:61,SetMaskImage:62,SetColorImage:63}),eq=[1,1,1,1,1,1,1,1,4,6,12,14,12,14,20,22,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],rQ=16,HN=1<=this.endAddr}}class m6{constructor(J){this.displayPrecisionBits=J,this.elems=[0,0,0,0]}loadHiLo(J,q){this.elems[0]=cW(J,q+0,q+16),this.elems[1]=oW(J,q+0,q+16),this.elems[2]=cW(J,q+4,q+20),this.elems[3]=oW(J,q+4,q+20)}toString(){const J=1/(1<>24&63;if(this.type=q,this.shade=(q&4)!=0,this.texture=(q&2)!=0,this.zbuffer=(q&1)!=0,this.loadEdge(J),J.advance(32),this.shade)this.loadShade(J),J.advance(64);if(this.texture)this.loadTexture(J),J.advance(64)}loadEdge(J){this.tile=J.getU32(0)>>16&7,this.rightMajor=(J.getU32(0)&8388608)!=0,this.yl=L7(J.getU32(0)>>0),this.ym=L7(J.getU32(4)>>16),this.yh=L7(J.getU32(4)>>0),this.xl=nJ(J.getU32(8)),this.xh=nJ(J.getU32(16)),this.xm=nJ(J.getU32(24)),this.dxldy=nJ(J.getU32(12)),this.dxhdy=nJ(J.getU32(20)),this.dxmdy=nJ(J.getU32(28))}loadShade(J){this.rgba.loadHiLo(J,0),this.drgba_dx.loadHiLo(J,8),this.drgba_de.loadHiLo(J,32),this.drgba_dy.loadHiLo(J,40)}loadTexture(J){this.stw.loadHiLo(J,0),this.dstw_dx.loadHiLo(J,8),this.dstw_de.loadHiLo(J,32),this.dstw_dy.loadHiLo(J,40)}interpolateX(J){let q=this.yh&~(lQ-1),Q=this.ym,Z=this.xh+(J-q)*this.dxhdy,X;if(J>rQ,K>>rQ]}interpolate(J,q,Q,Z,X){const Y=this.yh&~(lQ-1),K=(q-Y)/lQ,W=this.xh+K*this.dxhdy>>rQ,G=J-W,H=new m6(Q.precisionBits);for(let j=0;j<4;j++)H.elems[j]=Q.elems[j]+Z.elems[j]*K+(X.elems[j]&~31)*G;return H}interpolateShade(J,q){return this.interpolate(J,q,this.rgba,this.drgba_de,this.drgba_dx)}interpolateTexture(J,q){return this.interpolate(J,q,this.stw,this.dstw_de,this.dstw_dx)}calculateRectUVs(){const J=this.yh,q=this.ym,Q=this.interpolateX(this.yh),Z=this.interpolateX(this.ym),X=Math.min(Q[0],Z[0]),Y=Math.max(Q[1],Z[1]),K=this.interpolateTexture(X,J),z=this.interpolateTexture(Y,J),W=this.interpolateTexture(X,q),G=this.interpolateTexture(Y,q),H=1/(1<<16)/32;return[K.elems[0]*H,K.elems[1]*H,z.elems[0]*H,z.elems[1]*H,W.elems[0]*H,W.elems[1]*H,G.elems[0]*H,G.elems[1]*H]}toString(){const J=1/HN,q=1/lQ;let Q="";if(Q+=`\nEdge: tile ${this.tile} yl ${this.yl*q}, ym ${this.ym*q}, yh ${this.yh*q} xl ${this.xl*J}, xm ${this.xm*J}, xh ${this.xh*J} dxldy ${this.dxldy*J}, dxmdy ${this.dxmdy*J}, dxhdy ${this.dxhdy*J} `,this.shade)Q+=`\nShade: rgba ${this.rgba.toString()} drgba_dx ${this.drgba_dx.toString()} drgba_de ${this.drgba_de.toString()} drgba_dy ${this.drgba_dy.toString()} `;if(this.texture)Q+=`Texture: stw ${this.stw.toString()} dstw_dx ${this.dstw_dx.toString()} dstw_de ${this.dstw_de.toString()} dstw_dy ${this.dstw_dy.toString()} `;return Q}}class V7{constructor(J){this.hardware=J,this.commandTable=this.makeCommandTable()}makeCommandTable(){let J=[];for(let q=0;q<64;q++)J.push(this.executeUnknown.bind(this));return J[E.Nop]=this.executeNop.bind(this),J[E.FillTriangle]=this.executeTriangle.bind(this),J[E.FillZBufferTriangle]=this.executeTriangle.bind(this),J[E.TextureTriangle]=this.executeTriangle.bind(this),J[E.TextureZBufferTriangle]=this.executeTriangle.bind(this),J[E.ShadeTriangle]=this.executeTriangle.bind(this),J[E.ShadeZBufferTriangle]=this.executeTriangle.bind(this),J[E.ShadeTextureTriangle]=this.executeTriangle.bind(this),J[E.ShadeTextureZBufferTriangle]=this.executeTriangle.bind(this),J[E.TextureRectangle]=this.executeUnhandled.bind(this),J[E.TextureRectangleFlip]=this.executeUnhandled.bind(this),J[E.SyncLoad]=this.executeSyncLoad.bind(this),J[E.SyncPipe]=this.executeSyncPipe.bind(this),J[E.SyncTile]=this.executeSyncTile.bind(this),J[E.SyncFull]=this.executeSyncFull.bind(this),J[E.SetKeyGB]=this.executeSetKeyGB.bind(this),J[E.SetKeyR]=this.executeSetKeyR.bind(this),J[E.SetConvert]=this.executeSetConvert.bind(this),J[E.SetScissor]=this.executeSetScissor.bind(this),J[E.SetPrimDepth]=this.executeSetPrimDepth.bind(this),J[E.SetOtherModes]=this.executeSetOtherModes.bind(this),J[E.LoadTLut]=this.executeLoadTLut.bind(this),J[E.SetTileSize]=this.executeSetTileSize.bind(this),J[E.LoadBlock]=this.executeLoadBlock.bind(this),J[E.LoadTile]=this.executeLoadTile.bind(this),J[E.SetTile]=this.executeSetTile.bind(this),J[E.FillRectangle]=this.executeFillRectangle.bind(this),J[E.SetFillColor]=this.executeSetFillColor.bind(this),J[E.SetFogColor]=this.executeSetFogColor.bind(this),J[E.SetBlendColor]=this.executeSetBlendColor.bind(this),J[E.SetPrimColor]=this.executeSetPrimColor.bind(this),J[E.SetEnvColor]=this.executeSetEnvColor.bind(this),J[E.SetCombine]=this.executeSetCombine.bind(this),J[E.SetTextureImage]=this.executeSetTextureImage.bind(this),J[E.SetMaskImage]=this.executeSetMaskImage.bind(this),J[E.SetColorImage]=this.executeSetColorImage.bind(this),J}run(J){while(!J.empty()){const Q=J.getU32(0)>>24&63,Z=eq[Q]*8,X=J.curAddr+Z;this.commandTable[Q](Q,J),J.curAddr=X}}executeNop(J,q){}executeUnknown(J,q){console.log(`Unknown RDP command: ${E.nameOf(J)}`)}executeUnhandled(J,q){console.log(`Unhandled RDP command: ${E.nameOf(J)}`)}executeTriangle(J,q){this.executeUnhandled(J,q)}executeSyncLoad(J,q){this.executeUnhandled(J,q)}executeSyncPipe(J,q){this.executeUnhandled(J,q)}executeSyncTile(J,q){this.executeUnhandled(J,q)}executeSyncFull(J,q){this.hardware.dpcDevice.syncFull()}executeSetKeyGB(J,q){this.executeUnhandled(J,q)}executeSetKeyR(J,q){this.executeUnhandled(J,q)}executeSetConvert(J,q){this.executeUnhandled(J,q)}executeSetScissor(J,q){this.executeUnhandled(J,q)}executeSetPrimDepth(J,q){this.executeUnhandled(J,q)}executeSetOtherModes(J,q){this.executeUnhandled(J,q)}executeLoadTLut(J,q){this.executeUnhandled(J,q)}executeSetTileSize(J,q){this.executeUnhandled(J,q)}executeLoadBlock(J,q){this.executeUnhandled(J,q)}executeLoadTile(J,q){this.executeUnhandled(J,q)}executeSetTile(J,q){this.executeUnhandled(J,q)}executeFillRectangle(J,q){this.executeUnhandled(J,q)}executeSetFillColor(J,q){this.executeUnhandled(J,q)}executeSetFogColor(J,q){this.executeUnhandled(J,q)}executeSetBlendColor(J,q){this.executeUnhandled(J,q)}executeSetPrimColor(J,q){this.executeUnhandled(J,q)}executeSetEnvColor(J,q){this.executeUnhandled(J,q)}executeSetCombine(J,q){this.executeUnhandled(J,q)}executeSetTextureImage(J,q){this.executeUnhandled(J,q)}executeSetMaskImage(J,q){this.executeUnhandled(J,q)}executeSetColorImage(J,q){this.executeUnhandled(J,q)}}var NN=function(J,q){let Q=[];const Z=eq[J]*8;for(let X=0;X>24&63,X=eq[Z]*8;if(J.bytesRemaining()>24&63,X=eq[Z]*8,Y=P7(J);if(Y!=null)q.push(Y);J.advance(X)}return q}var lW=new J9,jN=(()=>{let J=[];for(let q=0;q<64;q++)J.push(LN);return J[E.Nop]=VN,J[E.FillTriangle]=C8,J[E.FillZBufferTriangle]=C8,J[E.TextureTriangle]=C8,J[E.TextureZBufferTriangle]=C8,J[E.ShadeTriangle]=C8,J[E.ShadeZBufferTriangle]=C8,J[E.ShadeTextureTriangle]=C8,J[E.ShadeTextureZBufferTriangle]=C8,J[E.TextureRectangle]=Y0,J[E.TextureRectangleFlip]=Y0,J[E.SyncLoad]=Y0,J[E.SyncPipe]=Y0,J[E.SyncTile]=Y0,J[E.SyncFull]=Y0,J[E.SetKeyGB]=Y0,J[E.SetKeyR]=Y0,J[E.SetConvert]=Y0,J[E.SetScissor]=Y0,J[E.SetPrimDepth]=Y0,J[E.SetOtherModes]=Y0,J[E.LoadTLut]=Y0,J[E.SetTileSize]=Y0,J[E.LoadBlock]=Y0,J[E.LoadTile]=Y0,J[E.SetTile]=Y0,J[E.FillRectangle]=Y0,J[E.SetFillColor]=Y0,J[E.SetFogColor]=Y0,J[E.SetBlendColor]=Y0,J[E.SetPrimColor]=Y0,J[E.SetEnvColor]=Y0,J[E.SetCombine]=Y0,J[E.SetTextureImage]=Y0,J[E.SetMaskImage]=Y0,J[E.SetColorImage]=Y0,J})();class r0{constructor(J){this.elems=J||new Float32Array(16)}multiply(J){let q=this.elems,Q=J.elems,Z=new Float32Array(16);for(let X=0;X<4;++X)for(let Y=0;Y<4;++Y)Z[X*4+Y]+=q[X*4+0]*Q[0+Y],Z[X*4+Y]+=q[X*4+1]*Q[4+Y],Z[X*4+Y]+=q[X*4+2]*Q[8+Y],Z[X*4+Y]+=q[X*4+3]*Q[12+Y];return new r0(Z)}transformNormal(J,q){let Q=this.elems,Z=J.elems,X=Z[0],Y=Z[1],K=Z[2];q.elems[0]=Q[0]*X+Q[1]*Y+Q[2]*K,q.elems[1]=Q[4]*X+Q[5]*Y+Q[6]*K,q.elems[2]=Q[8]*X+Q[9]*Y+Q[10]*K}transformPoint(J,q){let Q=this.elems,Z=J.elems,X=Z[0],Y=Z[1],K=Z[2];q.elems[0]=Q[0]*X+Q[1]*Y+Q[2]*K+Q[3],q.elems[1]=Q[4]*X+Q[5]*Y+Q[6]*K+Q[7],q.elems[2]=Q[8]*X+Q[9]*Y+Q[10]*K+Q[11],q.elems[3]=Q[12]*X+Q[13]*Y+Q[14]*K+Q[15]}static identity(){let J=new Float32Array(16);return J[0]=1,J[5]=1,J[10]=1,J[15]=1,new r0(J)}copy(){let J=new Float32Array(16);for(let q=0;q<16;q++)J[q]=this.elems[q];return new r0(J)}static makeOrtho(J,q,Q,Z,X,Y){let K=-(q+J)/(q-J),z=-(Z+Q)/(Z-Q),W=-(Y+X)/(Y-X),G=new Float32Array(16);return G[0]=2/(q-J),G[1]=0,G[2]=0,G[3]=0,G[4]=0,G[5]=2/(Z-Q),G[6]=0,G[7]=0,G[8]=0,G[9]=0,G[10]=-2/(Y-X),G[11]=0,G[12]=K,G[13]=z,G[14]=W,G[15]=1,new r0(G)}}var C0={canvasScale:1,haltOnWarning:!1,dumpMicrocode:!1,dumpMicrocodeSubstring:"",emulationMode:"HLE",dumpRDP:!1},aJ=J6.addFolder("Graphics");aJ.add(C0,"canvasScale").name("Canvas Scale").min(1).max(4).step(0.25);aJ.add(C0,"haltOnWarning").name("Halt on Warning");aJ.add(C0,"dumpMicrocode").name("Dump Microcode");aJ.add(C0,"dumpMicrocodeSubstring").name("Dump Microcode Substring");aJ.add(C0,"emulationMode",{"HLE (Recommended)":"HLE","LLE (Experimental, Slow)":"LLE"}).name("Emulation Mode");aJ.add(C0,"dumpRDP").name("Dump RDP");function rJ(J,q){return(J>>>2)-(q>>>2)+1&1023}var aW=function(J,q){return q?Math.min(1<=this.maxTris)return!1;const G=J.pos,H=q.pos,j=Q.pos;let L=this.numTris*3*4;this.positions[L++]=G.x,this.positions[L++]=G.y,this.positions[L++]=G.z,this.positions[L++]=G.w,this.positions[L++]=H.x,this.positions[L++]=H.y,this.positions[L++]=H.z,this.positions[L++]=H.w,this.positions[L++]=j.x,this.positions[L++]=j.y,this.positions[L++]=j.z,this.positions[L++]=j.w;let V=this.numTris*3*1;this.colours[V++]=J.color,this.colours[V++]=q.color,this.colours[V++]=Q.color;let P=this.numTris*3*2;return this.coords[P++]=Z,this.coords[P++]=X,this.coords[P++]=Y,this.coords[P++]=K,this.coords[P++]=z,this.coords[P++]=W,this.numTris++,!0}}var hN=function(J){return{r:(J>>>11&31)/31,g:(J>>>6&31)/31,b:(J>>>1&31)/31,a:(J>>>0&1)/1}},iW=function(J){return{r:(J>>>24&255)/255,g:(J>>>16&255)/255,b:(J>>>8&255)/255,a:(J>>>0&255)/255}},MN=!0,rW=new Map,sW=new Map;class q9{constructor(J,q){this.state=J,this.ramDV=q,this.vertexStride=2,this.version="",this.triangleBuffer=new M7(64),this.onLoadUcodeHandler=null,this.gbiCommonCommands=new Map([[228,this.executeTexRect.bind(this)],[229,this.executeTexRectFlip.bind(this)],[230,this.executeRDPLoadSync.bind(this)],[231,this.executeRDPPipeSync.bind(this)],[232,this.executeRDPTileSync.bind(this)],[233,this.executeRDPFullSync.bind(this)],[234,this.executeSetKeyGB.bind(this)],[235,this.executeSetKeyR.bind(this)],[236,this.executeSetConvert.bind(this)],[237,this.executeSetScissor.bind(this)],[238,this.executeSetPrimDepth.bind(this)],[239,this.executeSetRDPOtherMode.bind(this)],[240,this.executeLoadTLut.bind(this)],[242,this.executeSetTileSize.bind(this)],[243,this.executeLoadBlock.bind(this)],[244,this.executeLoadTile.bind(this)],[245,this.executeSetTile.bind(this)],[246,this.executeFillRect.bind(this)],[247,this.executeSetFillColor.bind(this)],[248,this.executeSetFogColor.bind(this)],[249,this.executeSetBlendColor.bind(this)],[250,this.executeSetPrimColor.bind(this)],[251,this.executeSetEnvColor.bind(this)],[252,this.executeSetCombine.bind(this)],[253,this.executeSetTImg.bind(this)],[254,this.executeSetZImg.bind(this)],[255,this.executeSetCImg.bind(this)]])}buildCommandTable(){const J=[];for(let q=0;q<256;++q){let Q=this.getHandler(q);if(!Q)Q=this.executeUnknown.bind(this);J.push(Q)}return J}getHandler(J){const q=this.gbiCommonCommands.get(J);if(q)return q;return null}onLoadUcode(J){this.onLoadUcodeHandler=J}executeUnknown(J,q){this.warn(`Unknown display list op ${v0(J>>>24)}`,`cmd0 ${N(J)}, cmd1 ${N(q)}`)}warnUnimplemented(J){this.warn(J,"unimplemented")}warn(J,q){if(sW.get(J))return;sW.set(J,!0);const Q=q!==void 0?`${J}: ${q}`:J;if(C0.haltOnWarning)this.hleHalt(Q);else n64js.warn(Q)}loadMatrix(J,q){const Z=new DataView(this.ramDV.buffer,J);if(q!=64)this.warn("Unusual matrix length",`${q}`);const X=new Float32Array(16);for(let Y=0;Y<4;++Y)X[0+Y]=(Z.getInt16(Y*8+0)<<16|Z.getUint16(Y*8+0+32))*0.0000152587890625,X[4+Y]=(Z.getInt16(Y*8+2)<<16|Z.getUint16(Y*8+2+32))*0.0000152587890625,X[8+Y]=(Z.getInt16(Y*8+4)<<16|Z.getUint16(Y*8+4+32))*0.0000152587890625,X[12+Y]=(Z.getInt16(Y*8+6)<<16|Z.getUint16(Y*8+6+32))*0.0000152587890625;return new r0(X)}previewMatrix(J){const q=J.elems,Q=[q[0],q[1],q[2],q[3]],Z=[q[4],q[5],q[6],q[7]],X=[q[8],q[9],q[10],q[11]],Y=[q[12],q[13],q[14],q[15]];return`
${Q.join("")}
${Z.join("")}
${X.join("")}
${Y.join("")}
`}loadViewport(J){const q=new h0(+this.ramDV.getInt16(J+0)/4,-this.ramDV.getInt16(J+2)/4,+this.ramDV.getInt16(J+4)),Q=new h0(this.ramDV.getInt16(J+8)/4,this.ramDV.getInt16(J+10)/4,this.ramDV.getInt16(J+12));this.state.viewport.set(q,Q)}previewViewport(J){const q=new h0(this.ramDV.getInt16(J+0)/4,this.ramDV.getInt16(J+2)/4,this.ramDV.getInt16(J+4)),Q=new h0(this.ramDV.getInt16(J+8)/4,this.ramDV.getInt16(J+10)/4,this.ramDV.getInt16(J+12));let Z="";return Z+=`scale = (${q.x}, ${q.y}, ${q.z}) `,Z+=`trans = (${Q.x}, ${Q.y}, ${Q.z}) `,Z}loadLight(J,q){if(J>=this.state.lights.length){h(`light index ${J} out of range`);return}this.state.lights[J].color=iW(this.ramDV.getUint32(q+0)),this.state.lights[J].dir=h0.create([this.ramDV.getInt8(q+8),this.ramDV.getInt8(q+9),this.ramDV.getInt8(q+10)]).normaliseInPlace()}previewLight(J){let q="";q+=`color = ${O8(this.ramDV.getUint32(J+0))} `,q+=`colorCopy = ${O8(this.ramDV.getUint32(J+4))} `;const Q=h0.create([this.ramDV.getInt8(J+8),this.ramDV.getInt8(J+9),this.ramDV.getInt8(J+10)]).normaliseInPlace();return q+=`norm = (${Q.x}, ${Q.y}, ${Q.z})`,q}loadVertices(J,q,Q,Z){const X=this.state.geometryMode.lighting,Y=this.state.geometryMode.textureGen,K=this.state.geometryMode.textureGenLinear,z=new DataView(this.ramDV.buffer,Q);if(Z)this.previewVertex(J,q,z,Z,X);if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const W=this.state.modelview[this.state.modelview.length-1],H=this.state.projection[this.state.projection.length-1].multiply(W),j=this.state.texture.scaleS/32,L=this.state.texture.scaleT/32,V=new h0,P=new h0,M=new h0,k=this.renderer.nativeTransform.viTransform,O=this.state.viewport.transform,R=16;for(let S=0;SJ.w)q|=VQ;if(J.y<-J.w)q|=hQ;else if(J.y>J.w)q|=PQ;if(J.z<-J.w)q|=kQ;else if(J.z>J.w)q|=UQ;return q}unpackNormal(J,q){J.x=q<<24>>24,J.y=q<<16>>24,J.z=q<<8>>24}calculateLighting(J,q){const Q=this.state.numLights;let Z=this.state.lights[Q].color.r,X=this.state.lights[Q].color.g,Y=this.state.lights[Q].color.b;for(let K=0;K0)Z+=z.color.r*W,X+=z.color.g*W,Y+=z.color.b*W}return Z=Math.min(Z,1)*255,X=Math.min(X,1)*255,Y=Math.min(Y,1)*255,q<<24|Y<<16|X<<8|Z}previewVertex(J,q,Q,Z,X){const Y=["#","x","y","z","?","u","v",X?"norm":"rgba"];let K="";K+='',K+=`\n`;for(let z=0;z\n`}K+="
${Y.join("")}
${H.join("")}
",Z.tip(K)}executeNoop(J,q,Q){if(Q)Q.text("gsDPNoOp();")}executeSpNoop(J,q,Q){if(Q)Q.text("gsSPNoOp();")}executeLoadUcode(J,q,Q){const Z=q&268435455,Y=this.state.rdpHalf1Cmd1,K=(J&65535)+1;let z="?";if(this.onLoadUcodeHandler){const W=this.onLoadUcodeHandler(Z,4096,Y,K);W.onLoadUcode(this.onLoadUcodeHandler),z=W.version}else this.warn("No loadUcodeHandler set!");if(Q)Q.text(`gsSPLoadUCode(${N(Z)}, 4096, ${N(Y)} ${K}); // ${z}`)}executeRDPHalf1(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_1, ${N(q)});`);this.state.rdpHalf1Cmd1=q}executeRDPHalf2(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_2, ${N(q)});`);this.state.rdpHalf2Cmd1=q}executeRDPLoadSync(J,q,Q){if(Q)Q.text("gsDPLoadSync();")}executeRDPPipeSync(J,q,Q){if(Q)Q.text("gsDPPipeSync();")}executeRDPTileSync(J,q,Q){if(Q)Q.text("gsDPTileSync();")}executeRDPFullSync(J,q,Q){if(Q)Q.text("gsDPFullSync();")}executeSetKeyGB(J,q,Q){if(Q)Q.text("gsDPSetKeyGB(???);")}executeSetKeyR(J,q,Q){if(Q)Q.text("gsDPSetKeyR(???);")}executeSetConvert(J,q,Q){if(Q)Q.text("gsDPSetConvert(???);")}executeSetScissor(J,q,Q){const Z=(J>>>12&4095)/4,X=(J>>>0&4095)/4,Y=(q>>>12&4095)/4,K=(q>>>0&4095)/4,z=q>>>24&2;if(Q)Q.text(`gsDPSetScissor(${wW.nameOf(z)}, ${Z}, ${X}, ${Y}, ${K});`);this.state.scissor.x0=Z,this.state.scissor.y0=X,this.state.scissor.x1=Y,this.state.scissor.y1=K,this.state.scissor.mode=z}executeSetRDPOtherMode(J,q,Q){if(Q)Q.text(`gsDPSetOtherMode(${N(J)}, ${N(q)}); // TODO: fix formatting`);this.state.rdpOtherModeH=J,this.state.rdpOtherModeL=q}executeSetTile(J,q,Q){const Z=J>>>21&7,X=J>>>19&3,Y=J>>>9&511,K=J>>>0&511,z=q>>>24&7,W=q>>>20&15,G=q>>>18&3,H=q>>>14&15,j=q>>>10&15,L=q>>>8&3,V=q>>>4&15,P=q>>>0&15;if(this.state.tiles[z].set(Z,X,Y,K,W,L,V,P,G,H,j),Q){const k=j0.nameOf(Z),O=l.nameOf(X),R=p0(z),S=fJ(L),T=fJ(G);Q.text(`gsDPSetTile(${k}, ${O}, ${Y}, ${K}, ${R}, ${W}, ${T}, ${H}, ${j}, ${S}, ${V}, ${P});`)}}executeSetTileSize(J,q,Q){const Z=J>>>12&4095,X=J>>>0&4095,Y=q>>>24&7,K=q>>>12&4095,z=q>>>0&4095,W=this.state.tiles[Y];if(W.setSize(Z,X,K,z),Q){const G=p0(Y);Q.text(`gsDPSetTileSize(${G}, ${W.left}, ${W.top}, ${W.right}, ${W.bottom});`),Q.tip(`size (${W.width} x ${W.height}), unmasked (${W.unmaskedWidth} x ${W.unmaskedHeight})`)}}executeSetFillColor(J,q,Q){if(Q)Q.text(`gsDPSetFillColor(${Q.rgba8888(q)}); // hi as 5551 = ${Q.rgba5551(q>>>16)}, lo as 5551 = ${Q.rgba5551(q&65535)} `);this.state.fillColor=q}executeSetFogColor(J,q,Q){if(Q)Q.text(`gsDPSetFogColor(${Q.rgba8888(q)});`);this.state.fogColor=q}executeSetBlendColor(J,q,Q){if(Q)Q.text(`gsDPSetBlendColor(${Q.rgba8888(q)});`);this.state.blendColor=q}executeSetPrimColor(J,q,Q){if(Q){const Z=J>>>8&255,X=J>>>0&255;Q.text(`gsDPSetPrimColor(${Z}, ${X}, ${Q.rgba8888(q)});`)}this.state.primColor=q}executeSetPrimDepth(J,q,Q){const Z=q>>>16&65535,X=q&65535;if(Q)Q.text(`gsDPSetPrimDepth(${Z},${X});`)}executeSetEnvColor(J,q,Q){if(Q)Q.text(`gsDPSetEnvColor(${Q.rgba8888(q)});`);this.state.envColor=q}executeSetCombine(J,q,Q){if(Q){const Z=J&16777215,X=q,Y=oQ(Z,X);Q.text(`gsDPSetCombine(${N(Z)}, ${N(X)});\n${Y}`)}this.state.combine.hi=J&16777215,this.state.combine.lo=q}executeSetTImg(J,q,Q){const Z=J>>>21&7,X=J>>>19&3,Y=(J>>>0&4095)+1,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetTextureImage(${j0.nameOf(Z)}, ${l.nameOf(X)}, ${Y}, ${N(K)});`);this.state.textureImage.set(Z,X,Y,K)}executeSetZImg(J,q,Q){const Z=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetDepthImage(${N(Z)});`);this.state.depthImage.address=Z}executeSetCImg(J,q,Q){const Z=J>>>21&7,X=J>>>19&3,Y=(J>>>0&4095)+1,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsDPSetColorImage(${j0.nameOf(Z)}, ${l.nameOf(X)}, ${Y}, ${N(K)});`);if(this.state.colorImage={format:Z,size:X,width:Y,address:K},n64js.hardware().timeline.addEvent(`SetColorImage ${N(K)}`),MN&&!rW.get(K))h(`Setting colorImage to ${N(K)}, ${Y}, size ${l.nameOf(X)}, format ${j0.nameOf(Z)}`),rW.set(K,!0)}executeLoadBlock(J,q,Q){const Z=q>>>24&7,X=J>>>12&4095,Y=J>>>0&4095,K=q>>>12&4095,z=q>>>0&4095;if(X!==0)this.warn("Unexpected non-zero uls in load block");if(Y!==0)this.warn("Unexpected non-zero ult in load block");if(Q){const H=p0(Z);Q.text(`gsDPLoadBlock(${H}, ${X}, ${Y}, ${K}, ${z});`)}const W=this.state.textureImage,G=this.state.tiles[Z];this.state.tmem.loadBlock(W,G,X,Y,K,z,Q),this.state.invalidateTileHashes()}executeLoadTile(J,q,Q){const Z=q>>>24&7,X=J>>>12&4095,Y=J>>>0&4095,K=q>>>12&4095,z=q>>>0&4095;if(Q){const H=p0(Z);Q.text(`gsDPLoadTile(${H}, ${X/4}, ${Y/4}, ${K/4}, ${z/4});`)}const W=this.state.textureImage,G=this.state.tiles[Z];this.state.tmem.loadTile(W,G,X,Y,K,z,Q),this.state.invalidateTileHashes()}executeLoadTLut(J,q,Q){const Z=q>>>24&7,X=J>>>12&4095,Y=J>>>0&4095,K=q>>>12&4095,z=q>>>0&4095;if(Q){const H=p0(Z);Q.text(`gsDPLoadTLUTCmd(${H}, ${rJ(K,X)}); //${X}, ${Y}, ${K}, ${z}`)}const W=this.state.textureImage,G=this.state.tiles[Z];this.state.tmem.loadTLUT(W,G,X,Y,K,z,Q),this.state.invalidateTileHashes()}executeFillRect(J,q,Q){const Z=(q>>>12&4095)>>>2,X=(q>>>0&4095)>>>2;let Y=(J>>>12&4095)>>>2,K=(J>>>0&4095)>>>2;const z=this.gl;if(Q)Q.text(`gsDPFillRectangle(${Z}, ${X}, ${Y}, ${K});`);if(this.state.depthImage.address==this.state.colorImage.address){z.clearDepth(1),z.depthMask(!0),z.clear(z.DEPTH_BUFFER_BIT);return}const W=this.state.getCycleType();let G={r:0,g:0,b:0,a:0};if(W===N0.G_CYC_FILL){if(Y+=1,K+=1,this.state.colorImage.size===l.G_IM_SIZ_16b)G=hN(this.state.fillColor&65535);else G=iW(this.state.fillColor);const H=Y-Z,j=K-X;if(H===this.renderer.nativeTransform.viWidth&&j===this.renderer.nativeTransform.viHeight){z.clearColor(G.r,G.g,G.b,G.a),z.clear(z.COLOR_BUFFER_BIT);return}}else if(W===N0.G_CYC_COPY)Y+=1,K+=1;this.renderer.fillRect(Z,X,Y,K,G)}executeTexRect(J,q,Q){this.state.nextCommand();const Z=this.state.cmd1;this.state.nextCommand();const X=this.state.cmd1;this.rdpTexRect(J,q,Z,X,Q)}rdpTexRect(J,q,Q,Z,X){let Y=(J>>>12&4095)/4,K=(J>>>0&4095)/4;const z=q>>>24&7,W=(q>>>12&4095)/4,G=(q>>>0&4095)/4;let H=(Q>>>16&65535)/32,j=(Q>>>0&65535)/32,L=((Z|0)>>16)/1024;const V=(Z<<16>>16)/1024,P=this.state.getCycleType();if(P===N0.G_CYC_COPY)L*=0.25;if(P===N0.G_CYC_COPY||P===N0.G_CYC_FILL)Y+=1,K+=1;if(L<0)H++;if(V<0)j++;const M=H+L*(Y-W),k=j+V*(K-G);if(X){const O=p0(z);X.text(`gsSPTextureRectangle(${W},${G},${Y},${K},${O},${H},${j},${L},${V});`),X.tip(`cmd2 = ${N(Q)}, cmd3 = ${N(Z)}`),X.tip(`st0 = (${H}, ${j}) st1 = (${M}, ${k})`)}this.renderer.texRect(z,W,G,Y,K,H,j,M,k,!1)}executeTexRectFlip(J,q,Q){this.state.nextCommand();const Z=this.state.cmd1;this.state.nextCommand();const X=this.state.cmd1;this.rdpTexRectFlip(J,q,Z,X,Q)}rdpTexRectFlip(J,q,Q,Z,X){let Y=(J>>>12&4095)/4,K=(J>>>0&4095)/4;const z=q>>>24&7,W=(q>>>12&4095)/4,G=(q>>>0&4095)/4;let H=(Q>>>16&65535)/32,j=(Q>>>0&65535)/32,L=((Z|0)>>16)/1024;const V=(Z<<16>>16)/1024,P=this.state.getCycleType();if(P===N0.G_CYC_COPY)L*=0.25;if(P===N0.G_CYC_COPY||P===N0.G_CYC_FILL)Y+=1,K+=1;if(L<0)H++;if(V<0)j++;const M=H+L*(K-G),k=j+V*(Y-W);if(X){const O=p0(z);X.text(`gsSPTextureRectangleFlip(${W},${G},${Y},${K},${O},${H},${j},${L},${V});`),X.tip(`cmd2 = ${N(Q)}, cmd3 = ${N(Z)}`),X.tip(`st0 = (${H}, ${j}) st1 = (${M}, ${k})`)}this.renderer.texRect(z,W,G,Y,K,H,j,M,k,!0)}executeCullDL(J,q,Q){const Z=(J&65535)>>>1,X=(q&65535)>>>1,Y=this.testClipFlags(Z,X);if(Q)Q.text(`gSPCullDisplayList(${Z}, ${X}); // ${Y?"continue":"end"}`);if(!Y)this.state.endDisplayList()}testClipFlags(J,q){if(q<=J)return this.warn("begin and end vertices for testClipFlags are inverted or empty"),!0;if(q>=this.state.projectedVertices.length)return this.warn("end vertex for testClipFlags is out of bounds"),!0;let Q=~0;for(let Z=J;Z<=q;Z++)Q&=this.state.projectedVertices[Z].clipFlags;return Q==0}calcTextureScale(J){if(J===0||J===65535)return 1;return J/65536}}var sQ=!1;class A8 extends q9{constructor(J,q){super(J,q);this.vertexStride=2,this.gbi1Commands=new Map([[0,this.executeSpNoop.bind(this)],[1,this.executeMatrix.bind(this)],[3,this.executeMoveMem.bind(this)],[4,this.executeVertex.bind(this)],[6,this.executeDL.bind(this)],[9,this.executeSprite2DBase.bind(this)],[175,this.executeLoadUcode.bind(this)],[176,this.executeBranchZ.bind(this)],[177,this.executeTri2.bind(this)],[178,this.executeModifyVertex.bind(this)],[179,this.executeRDPHalf2.bind(this)],[180,this.executeRDPHalf1.bind(this)],[181,this.executeLine3D.bind(this)],[182,this.executeClearGeometryMode.bind(this)],[183,this.executeSetGeometryMode.bind(this)],[184,this.executeEndDL.bind(this)],[185,this.executeSetOtherModeL.bind(this)],[186,this.executeSetOtherModeH.bind(this)],[187,this.executeTexture.bind(this)],[188,this.executeMoveWord.bind(this)],[189,this.executePopMatrix.bind(this)],[190,this.executeCullDL.bind(this)],[191,this.executeTri1.bind(this)],[192,this.executeNoop.bind(this)]])}getHandler(J){const q=this.gbi1Commands.get(J);if(q)return q;return super.getHandler(J)}executeDL(J,q,Q){const Z=J>>>16&255,X=this.state.rdpSegmentAddress(q);if(Q){const Y=Z===uJ?"gsSPDisplayList":"gsSPBranchList";Q.text(`${Y}(${N(X)});`)}if(Z===uJ)this.state.pushDisplayList(X);else this.state.branchDisplayList(X)}executeEndDL(J,q,Q){if(Q)Q.text("gsSPEndDisplayList();");this.state.endDisplayList()}executeBranchZ(J,q,Q){const Z=this.state.rdpSegmentAddress(this.state.rdpHalf1Cmd1);if(this.warnUnimplemented("BranchLessZ"),Q)Q.text("gsSPBranchLessZ(/* TODO */);");this.state.branchDisplayList(Z)}executeClearGeometryMode(J,q,Q){if(Q)Q.text(`gsSPClearGeometryMode(${pJ(C6,q)});`);this.state.geometryModeBits&=~q,this.state.updateGeometryModeFromBits(C6)}executeSetGeometryMode(J,q,Q){if(Q)Q.text(`gsSPSetGeometryMode(${pJ(C6,q)});`);this.state.geometryModeBits|=q,this.state.updateGeometryModeFromBits(C6)}executeSetOtherModeL(J,q,Q){const Z=J>>>8&255,X=J>>>0&255,Y=q,K=(1<>>0;if(Q)_Q(Q,K,Y);this.state.rdpOtherModeL=this.state.rdpOtherModeL&~K|Y}executeSetOtherModeH(J,q,Q){const Z=J>>>8&255,X=J>>>0&255,Y=q,K=(1<>>0;if(Q)bQ(Q,K,X,Z,Y);this.state.rdpOtherModeH=this.state.rdpOtherModeH&~K|Y}executeTexture(J,q,Q){const Z=J>>>16&255,X=J>>>11&3,Y=J>>>8&7,K=J>>>0&255,z=this.calcTextureScale(q>>>16&65535),W=this.calcTextureScale(q>>>0&65535);if(Q){const G=z.toString(),H=W.toString(),j=p0(Y),L=K?"G_ON":"G_OFF";if(Z!==0)Q.text(`gsSPTextureL(${G}, ${H}, ${X}, ${Z}, ${j}, ${L});`);else Q.text(`gsSPTexture(${G}, ${H}, ${X}, ${j}, ${L});`)}if(this.state.setTexture(z,W,X,Y),K)this.state.geometryModeBits|=C6.G_TEXTURE_ENABLE;else this.state.geometryModeBits&=~C6.G_TEXTURE_ENABLE;this.state.updateGeometryModeFromBits(C6)}executeMatrix(J,q,Q){const Z=J>>>16&255,X=J>>>0&65535,Y=this.state.rdpSegmentAddress(q);let K=this.loadMatrix(Y,X);if(Q){let W="";W+=Z&NQ?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",W+=Z&Q7?"|G_MTX_LOAD":"|G_MTX_MUL",W+=Z&Z7?"|G_MTX_PUSH":"",Q.text(`gsSPMatrix(${N(Y)}, ${W});`),Q.tip(this.previewMatrix(K))}const z=Z&NQ?this.state.projection:this.state.modelview;if((Z&Q7)==0)K=z[z.length-1].multiply(K);if(Z&Z7)z.push(K);else z[z.length-1]=K}executePopMatrix(J,q,Q){const Z=q>>>0&255;if(Q){let X="";X+=Z&NQ?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",Q.text(`gsSPPopMatrix(${X});`)}if(this.state.modelview.length>0)this.state.modelview.pop()}executeVertex(J,q,Q){const Z=(J>>>16&255)/this.vertexStride,X=J>>>10&63,Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(Y)}, ${Z}, ${X});`);this.loadVertices(Z,X,Y,Q)}executeModifyVertex(J,q,Q){if(this.warnUnimplemented("ModifyVertex"),Q)Q.text("gsSPModifyVertex(???);")}executeSprite2DBase(J,q,Q){if(this.warnUnimplemented("Sprite2DBase"),Q)Q.text("gsSPSprite2DBase(/* TODO */);")}executeMoveMem(J,q,Q){const Z=J>>>16&255,X=J>>>0&65535,Y=this.state.rdpSegmentAddress(q);if(Q){const K=N(Y),z=M0.nameOf(Z);let W=`gsDma1p(G_MOVEMEM, ${K}, ${X}, ${z});`;switch(Z){case M0.G_MV_VIEWPORT:if(X===16)W=`gsSPViewport(${K});`;break}Q.text(W),this.previewMoveMem(Z,X,Y,Q)}switch(Z){case M0.G_MV_VIEWPORT:this.loadViewport(Y);break;case M0.G_MV_L0:case M0.G_MV_L1:case M0.G_MV_L2:case M0.G_MV_L3:case M0.G_MV_L4:case M0.G_MV_L5:case M0.G_MV_L6:case M0.G_MV_L7:{const K=(Z-M0.G_MV_L0)/2;this.loadLight(K,Y)}break}}previewMoveMem(J,q,Q,Z){let X="";for(let Y=0;Y>>8&65535,Y=q;let K="";switch(Z){case B0.G_MW_MATRIX:this.warnUnimplemented("MoveWord Matrix");break;case B0.G_MW_NUMLIGHT:{let z=(Y-2147483648>>>5)-1;if(Q){if(X===DW)K=`gsSPNumLights(${DQ.nameOf(z)});`}this.state.numLights=z}break;case B0.G_MW_CLIP:if(Q)K=`gSPClipRatio(${LQ.nameOf(X)}, ${IQ.nameOf(Y)});`;break;case B0.G_MW_SEGMENT:{const z=X>>>2&15;if(Q)K=`gsSPSegment(${OQ.nameOf(z)}, ${N(Y)});`;this.state.segments[z]=Y}break;case B0.G_MW_FOG:{const z=q>>16,W=q&65535;if(Q)K=`gSPFogPosition(${z}, ${W});`;this.state.fogParameters.set(z,W)}break;case B0.G_MW_LIGHTCOL:this.warnUnimplemented("MoveWord LightCol");break;case B0.G_MW_POINTS:this.warnUnimplemented("MoveWord Points");break;case B0.G_MW_PERSPNORM:if(Q)K=`gSPPerspNormalize(${Y});`;break;default:this.warnUnimplemented("MoveWord Unknown");break}if(Q){if(!K)K=`gMoveWd(${B0.nameOf(Z)}, ${q0(X)}, ${N(Y)});`;Q.text(K)}}executeTri1(J,q,Q){const Z=this.vertexStride,X=this.state.projectedVertices,Y=this.triangleBuffer;Y.reset();let K=Q?1:0,z=this.state.executeBatch(K,(W,G)=>{const H=G>>>24&255,j=(G>>>16&255)/Z,L=(G>>>8&255)/Z,V=(G>>>0&255)/Z;if(Q)Q.text(`gsSP1Triangle(${j}, ${L}, ${V}, ${H});`);return Y.pushTri(X[j],X[L],X[V]),Y.hasCapacity(1)});this.debugController.currentOp+=z-1,this.renderer.flushTris(Y)}executeTri2(J,q,Q){const Z=this.vertexStride,X=this.state.projectedVertices,Y=this.triangleBuffer;Y.reset();let K=Q?1:0,z=this.state.executeBatch(K,(W,G)=>{const H=(W>>>16&255)/Z,j=(W>>>8&255)/Z,L=(W>>>0&255)/Z,V=(G>>>16&255)/Z,P=(G>>>8&255)/Z,M=(G>>>0&255)/Z;if(Q)Q.text(`gsSP1Triangle2(${H},${j},${L}, ${V},${P},${M});`);return Y.pushTri(X[H],X[j],X[L]),Y.pushTri(X[V],X[P],X[M]),Y.hasCapacity(2)});this.debugController.currentOp+=z-1,this.renderer.flushTris(Y)}executeLine3D(J,q,Q){const Z=this.vertexStride,X=this.state.projectedVertices,Y=this.triangleBuffer;Y.reset();let K=Q?1:0,z=this.state.executeBatch(K,(W,G)=>{const H=(G>>>24&255)/Z,j=(G>>>16&255)/Z,L=(G>>>8&255)/Z,V=(G>>>0&255)/Z;if(Q)Q.text(`gsSPLine3D(${j}, ${L}, ${V}, ${H});`);if(j>>20&15)+1,X=J>>>16&15,Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(Y)}, ${X}, ${Z});`);this.loadVertices(X,Z,Y,Q)}executeRDPHalf_Cont(J,q,Q){if(this.warnUnimplemented("RDPHalf_Cont"),Q)Q.text("gsDPHalf_Cont(/* TODO */);")}pushRDPCommandU32(J){const q=this.rdpCommandBuffer.byteLength;this.rdpCommandBuffer.resize(q+4),this.rdpCommandDV.setUint32(q,J,!1)}executeRDPCommandHalf1(J,q,Q){if(Q)Q.text(`gsSPRDPCommandHalf1(${N(q)});`);this.pushRDPCommandU32(q)}executeRDPCommandHalf2(J,q,Q){if(Q)Q.text(`gsSPRDPCommandHalf2(${N(q)});`);this.pushRDPCommandU32(q)}executeRDPCommandHalf22Final(J,q,Q){if(this.warnUnimplemented("executeRDPCommandHalf22Final"),Q)Q.text(`gsSPRDPCommandHalf2Final(${N(q)});`);this.pushRDPCommandU32(q);const Z=new qJ(this.rdpCommandDV,0,this.rdpCommandDV.byteLength);this.rdpTriangle.load(Z);const X=this.rdpTriangle,Y=X.tile,K=X.yh,z=X.ym,W=X.interpolateX(X.yh),G=X.interpolateX(X.ym),H=Math.min(W[0],G[0]),j=Math.max(W[1],G[1]),L=this.renderer.calculateRectVertices(H,K/4,j,z/4),V=X.calculateRectUVs(),P=[4294967295,4294967295,4294967295,4294967295];if(this.renderer.lleRect(Y,L,V,P),Q){let M=`lleRect(${Y}, [${L}], [${V}], [${P}])`;const k=P7(Z);if(k)M+=k.disassembly;Q.tip(M)}this.rdpCommandBuffer.resize(0)}executeTri4(J,q,Q){const Z=this.state.projectedVertices,X=this.triangleBuffer;X.reset();let Y=Q?1:0,K=this.state.executeBatch(Y,(z,W)=>{const G=z>>>12&15,H=z>>>8&15,j=z>>>4&15,L=z>>>0&15,V=W>>>28&15,P=W>>>24&15,M=W>>>20&15,k=W>>>16&15,O=W>>>12&15,R=W>>>8&15,S=W>>>4&15,T=W>>>0&15;if(Q)Q.text(`gsSP1Triangle4(${L},${T},${S}, ${j},${R},${O}, ${H},${k},${M}, ${G},${P},${V});`);if(L!==T)X.pushTri(Z[L],Z[T],Z[S]);if(j!==R)X.pushTri(Z[j],Z[R],Z[O]);if(H!==k)X.pushTri(Z[H],Z[k],Z[M]);if(G!==P)X.pushTri(Z[G],Z[P],Z[V]);return X.hasCapacity(4)});this.debugController.currentOp+=K-1,this.renderer.flushTris(X)}}class k7 extends c6{constructor(J,q){super(J,q);this.vertexStride=10,this.geCommands=new Map([[178,this.executeRDPCommandHalf2.bind(this)],[179,this.executeRDPCommandHalf22Final.bind(this)],[180,this.executeRDPCommandHalf1.bind(this)]])}getHandler(J){const q=this.geCommands.get(J);if(q)return q;return super.getHandler(J)}}class I7 extends c6{constructor(J,q){super(J,q);this.vertexStride=10,this.auxAddress=0,this.pdCommands=new Map([[7,this.executeSetVertexColorIndex.bind(this)],[178,this.executeRDPCommandHalf2.bind(this)],[179,this.executeRDPCommandHalf22Final.bind(this)],[180,this.executeRDPCommandHalf1.bind(this)]])}getHandler(J){const q=this.pdCommands.get(J);if(q)return q;return super.getHandler(J)}executeSetVertexColorIndex(J,q,Q){const Z=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPSetVertexColorIndex(${N(Z)});`);this.auxAddress=Z}loadVertices(J,q,Q,Z){const X=this.state.geometryMode.lighting,Y=this.state.geometryMode.textureGen,K=this.state.geometryMode.textureGenLinear,z=new DataView(this.ramDV.buffer,Q),W=new DataView(this.ramDV.buffer,this.auxAddress);if(Z)this.previewVertex(J,q,z,Z,X);if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const G=12,H=this.state.modelview[this.state.modelview.length-1],L=this.state.projection[this.state.projection.length-1].multiply(H),V=this.state.texture.scaleS/32,P=this.state.texture.scaleT/32,M=new h0,k=new h0,O=new h0,R=this.renderer.nativeTransform.viTransform,S=this.state.viewport.transform;for(let T=0;T>>9&127,X=(J>>>16&255)/5,Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(Y)}, ${X}, ${Z});`);this.loadVertices(X,Z,Y,Q)}}class D7 extends c6{constructor(J,q){super(J,q);this.vertexStride=5}executeVertex(J,q,Q){const Z=(J>>>4&4095)/33+1,Y=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(Y)}, 0, ${Z});`);this.loadVertices(0,Z,Y,Q)}}class w7 extends c6{constructor(J,q){super(J,q);this.vertexStride=10,this.matrixAddress=0,this.matrixIndex=0,this.matrixArray=[r0.identity(),r0.identity(),r0.identity(),r0.identity()],this.vertexAddress=0,this.vertexOffset=0,this.billboardMode=!1,this.dkrCommands=new Map([[5,this.executeTriDMA.bind(this)],[7,this.executeDisplayListLen.bind(this)],[191,this.executeSetAddresses.bind(this)]])}getHandler(J){const q=this.dkrCommands.get(J);if(q)return q;return super.getHandler(J)}executeDisplayListLen(J,q,Q){const Z=J>>>16&255,X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPDisplayListLen(${N(X)}, ${Z});`);this.state.pushDisplayList(X,Z)}executeSetAddresses(J,q,Q){if(this.matrixAddress=this.state.rdpSegmentAddress(J),this.vertexAddress=this.state.rdpSegmentAddress(q),this.vertexOffset=0,Q)Q.text(`gsSPSetAddress(${N(this.matrixAddress)}, ${N(this.vertexAddress)};`)}executeMoveWord(J,q,Q){const Z=J&255;if(Z==2){if(this.billboardMode=(q&1)!=0,Q)Q.text(`gSetBillboardMode(${this.billboardMode});`)}else if(Z==10){if(this.matrixIndex=q>>6&3,Q)Q.text(`gSetMatrixIndex(${this.matrixIndex});`)}else super.executeMoveWord(J,q,Q)}executeTexture(J,q,Q){const Z=J>>>16&255,X=J>>>11&3,Y=J>>>8&7,z=this.calcTextureScale(q>>>16&65535),W=this.calcTextureScale(q>>>0&65535);if(Q){const G=z.toString(),H=W.toString(),j=p0(Y);if(Z!==0)Q.text(`gsSPTextureL(${G}, ${H}, ${X}, ${Z}, ${j}, G_ON);`);else Q.text(`gsSPTexture(${G}, ${H}, ${X}, ${j}, G_ON);`)}this.state.setTexture(z,W,X,Y),this.state.geometryModeBits|=C6.G_TEXTURE_ENABLE,this.state.updateGeometryModeFromBits(C6)}executeMatrix(J,q,Q){const Z=this.matrixAddress+q,X=J>>22&3,Y=J&65535,K=this.loadMatrix(Z,Y);if(Q)Q.text(`gsSPMatrix(${N(Z)}, ${X});`),Q.tip(this.previewMatrix(K));this.matrixArray[X]=K,this.matrixIndex=X}executeVertex(J,q,Q){const Z=this.vertexAddress+q,X=(J>>>19&31)+1,Y=J&65536,K=J>>>9&31;if(this.billboardMode)this.vertexOffset=Y?1:0;else if(!Y)this.vertexOffset=0;const z=this.vertexOffset+K;if(Q)Q.text(`gsSPVertex(${N(Z)}, ${z}, ${X});`);this.loadVertices(z,X,Z,Q),this.vertexOffset+=X}loadVertices(J,q,Q,Z){if(J+q>=this.state.projectedVertices.length){this.warn("Too many verts");return}const X=10,Y=new DataView(this.ramDV.buffer,Q);let K=this.matrixArray[this.matrixIndex];const z=this.renderer.nativeTransform.viTransform,W=this.state.viewport.transform,G=new h0;if(this.billboardMode){K=K.copy();const j=this.state.projectedVertices[0].pos;K.elems[3]+=j.x,K.elems[7]+=j.y,K.elems[11]+=j.z,K.elems[15]+=j.w}let H="";if(Z){const j=["#","x","y","z","rgba"];H+='',H+=`\n`}for(let j=0,L=0;j\n`}}if(Z)H+="
${j.join("")}
${P.join("")}
",Z.tip(H)}executeTriDMA(J,q,Q){const Z=J>>>4&31,X=this.state.rdpSegmentAddress(q),Y=new DataView(this.ramDV.buffer,X),K=this.state.projectedVertices,z=this.triangleBuffer;if(z.reset(),Q)Q.text(`gsSPTriDMA(${N(X)}, ${Z});`);let W="";if(Z>z.maxTris)this.warn(`Too many triangles for buffer: ${Z} > ${z.maxTris}`);const G=16;for(let H=0;H>>16&255,X=this.state.rdpSegmentAddress(q);if(Q){const Y=Z===uJ?"gsSPDisplayList":"gsSPBranchList";Q.text(`${Y}(${N(X)});`)}if(Z===uJ)this.state.pushDisplayList(X);else this.state.branchDisplayList(X)}executeEndDL(J,q,Q){if(Q)Q.text("gsSPEndDisplayList();");this.state.endDisplayList()}executeSetOtherModeL(J,q,Q){const Z=J>>>8&255,X=J>>>0&255,Y=q,K=2147483648>>X>>>Z;if(Q)_Q(Q,K,Y);this.state.rdpOtherModeL=this.state.rdpOtherModeL&~K|Y}executeSetOtherModeH(J,q,Q){const Z=J>>>8&255,X=J>>>0&255,Y=q,K=2147483648>>X>>>Z;if(Q)bQ(Q,K,X,Z,Y);this.state.rdpOtherModeH=this.state.rdpOtherModeH&~K|Y}executeMatrix(J,q,Q){const Z=this.state.rdpSegmentAddress(q),X=(J&1)===0,Y=J>>>1&1,K=J>>>2&1;let z=this.loadMatrix(Z,64);if(Q){let G="";G+=K?"G_MTX_PROJECTION":"G_MTX_MODELVIEW",G+=Y?"|G_MTX_LOAD":"|G_MTX_MUL",G+=X?"|G_MTX_PUSH":"",Q.text(`gsSPMatrix(${N(Z)}, ${G});`),Q.tip(this.previewMatrix(z))}const W=K?this.state.projection:this.state.modelview;if(!Y)z=W[W.length-1].multiply(z);if(X)W.push(z);else W[W.length-1]=z}executeVertex(J,q,Q){const Z=(J&255)>>1,X=J>>>12&255,Y=Z-X,K=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gsSPVertex(${N(K)}, ${Y}, ${X});`);this.loadVertices(Y,X,K,Q)}executeBranchZ(J,q,Q){if(this.warnUnimplemented("BranchZ"),Q)Q.text("gsSPBranchZ(/* TODO */);")}executeLine3D(J,q,Q){if(this.warnUnimplemented("Line3D"),Q)Q.text("gsSPLine3D(/* TODO */);")}executeBgRect1Cyc(J,q,Q){if(this.warnUnimplemented("BgRect1Cyc"),Q)Q.text("gsSPBgRect1Cyc(/* TODO */);")}executeBgRectCopy(J,q,Q){if(this.warnUnimplemented("BgRectCopy"),Q)Q.text("gsSPBgRectCopy(/* TODO */);")}executeObjRenderMode(J,q,Q){if(this.warnUnimplemented("ObjRenderMode"),Q)Q.text("gsSPObjRenderMode(/* TODO */);")}executeDmaIo(J,q,Q){if(Q)Q.text("DmaIo(/* TODO */);")}executeTri1(J,q,Q){const Z=this.state.projectedVertices,X=this.triangleBuffer;X.reset();let Y=Q?1:0,K=this.state.executeBatch(Y,(z,W)=>{const G=z>>>1&127,H=z>>>9&127,j=z>>>17&127,L=W>>>24&255;if(Q)Q.text(`gsSP1Triangle(${G},${H},${j}, ${L});`);return X.pushTri(Z[G],Z[H],Z[j]),X.hasCapacity(1)});this.debugController.currentOp+=K-1,this.renderer.flushTris(X)}executeTri2(J,q,Q){const Z=this.state.projectedVertices,X=this.triangleBuffer;X.reset();let Y=Q?1:0,K=this.state.executeBatch(Y,(z,W)=>{const G=W>>>1&127,H=W>>>9&127,j=W>>>17&127,L=z>>>1&127,V=z>>>9&127,P=z>>>17&127;if(Q)Q.text(`gsSP2Triangles(${G},${H},${j}, ${L},${V},${P});`);return X.pushTri(Z[G],Z[H],Z[j]),X.pushTri(Z[L],Z[V],Z[P]),X.hasCapacity(2)});this.debugController.currentOp+=K-1,this.renderer.flushTris(X)}executeQuad(J,q,Q){const Z=this.state.projectedVertices,X=this.triangleBuffer;X.reset();let Y=Q?1:0,K=this.state.executeBatch(Y,(z,W)=>{const G=W>>>1&127,H=W>>>9&127,j=W>>>17&127,L=z>>>1&127,V=z>>>9&127,P=z>>>17&127;if(Q)Q.text(`gSP1Quadrangle(${G},${H},${j}, ${L},${V},${P});`);return X.pushTri(Z[G],Z[H],Z[j]),X.pushTri(Z[L],Z[V],Z[P]),X.hasCapacity(2)});this.debugController.currentOp+=K-1,this.renderer.flushTris(X)}executeModifyVtx(J,q,Q){const Z=J>>>1&32767,X=J>>>16&255,Y=q;if(Q)Q.text(`gsSPModifyVertex(${Z},${gJ.nameOf(X)},${N(Y)});`);if(Z>=this.state.projectedVertices.length){this.warn("crazy vertex index",Z);return}const K=this.state.projectedVertices[Z];switch(X){case gJ.G_MWO_POINT_RGBA:this.warnUnimplemented("modifyVtx RGBA");break;case gJ.G_MWO_POINT_ST:{const z=Y>>16,W=(Y&65535)<<16>>16;K.set=!0,K.u=z*this.state.texture.scaleS/32,K.v=W*this.state.texture.scaleT/32}break;case gJ.G_MWO_POINT_XYSCREEN:this.warnUnimplemented("modifyVtx XYSCREEN");break;case gJ.G_MWO_POINT_ZSCREEN:this.warnUnimplemented("modifyVtx ZSCREEN");break;default:this.warnUnimplemented("modifyVtx");break}}executeTexture(J,q,Q){const Z=J>>>16&255,X=J>>>11&3,Y=J>>>8&7,K=J>>>1&1,z=this.calcTextureScale(q>>>16&65535),W=this.calcTextureScale(q>>>0&65535);if(Q){const G=z.toString(),H=W.toString(),j=p0(Y);if(Z!==0)Q.text(`gsSPTextureL(${G}, ${H}, ${X}, ${Z}, ${j}, ${K});`);else Q.text(`gsSPTexture(${G}, ${H}, ${X}, ${j}, ${K});`)}if(this.state.setTexture(z,W,X,Y),K)this.state.geometryModeBits|=Q8.G_TEXTURE_ENABLE;else this.state.geometryModeBits&=~Q8.G_TEXTURE_ENABLE;this.state.updateGeometryModeFromBits(Q8)}executeGeometryMode(J,q,Q){const Z=J&16777215,X=q;if(Q){const Y=pJ(Q8,~Z),K=pJ(Q8,X);Q.text(`gsSPGeometryMode(~(${Y}),${K});`)}this.state.geometryModeBits&=Z|Q8.G_TEXTURE_ENABLE,this.state.geometryModeBits|=X&~Q8.G_TEXTURE_ENABLE,this.state.updateGeometryModeFromBits(Q8)}executePopMatrix(J,q,Q){if(Q)Q.text("gsSPPopMatrix(G_MTX_MODELVIEW);");const X=this.state.modelview;if(X.length>0)X.pop()}executeMoveWord(J,q,Q){const Z=J>>>16&255,X=J&65535,Y=q;let K="";switch(Z){case B0.G_MW_MATRIX:this.warnUnimplemented("MoveWord Matrix");break;case B0.G_MW_NUMLIGHT:{let z=Math.floor(Y/24);if(Q)K=`gsSPNumLights(${DQ.nameOf(z)});`;this.state.numLights=z}break;case B0.G_MW_CLIP:if(Q)K=`gSPClipRatio(${LQ.nameOf(X)}, ${IQ.nameOf(Y)});`;break;case B0.G_MW_SEGMENT:{const z=X>>>2&15;if(Q)K=`gsSPSegment(${OQ.nameOf(z)}, ${N(Y)});`;this.state.segments[z]=Y}break;case B0.G_MW_FOG:{const z=q>>16,W=q&65535;if(Q)K=`gSPFogPosition(${z}, ${W});`;this.state.fogParameters.set(z,W)}break;case B0.G_MW_LIGHTCOL:this.warnUnimplemented("MoveWord LightCol");break;case B0.G_MW_POINTS:this.warnUnimplemented("MoveWord Points");break;case B0.G_MW_PERSPNORM:if(Q)K=`gSPPerspNormalize(${Y});`;break;default:this.warnUnimplemented("MoveWord Unknown");break}if(Q){if(!K)K=`gMoveWd(${B0.nameOf(Z)}, ${q0(X)}, ${N(Y)});`;Q.text(K)}}executeMoveMem(J,q,Q){const Z=this.state.rdpSegmentAddress(q),X=(J>>>16&255)<<1,Y=(J>>>8&255)<<3,K=J&254;let z;if(Q)z=`gsDma1p(G_MOVEMEM, ${N(Z)}, ${X}, ${Y}, ${G6.nameOf(K)});`;switch(K){case G6.G_GBI2_MV_VIEWPORT:if(Q)z=`gsSPViewport(${N(Z)});`;this.loadViewport(Z);break;case G6.G_GBI2_MV_LIGHT:if(Y==G6.G_GBI2_MVO_LOOKATX){if(Q)z=`gSPLookAtX(${N(Z)});`}else if(Y==G6.G_GBI2_MVO_LOOKATY){if(Q)z=`gSPLookAtY(${N(Z)});`}else if(Y>=G6.G_GBI2_MVO_L0&&Y<=G6.G_GBI2_MVO_L7){let W=(Y-G6.G_GBI2_MVO_L0)/24>>>0;if(Q)z=`gsSPLight(${N(Z)}, ${W})`;if(this.loadLight(W,Z),X!=16)console.log(`unexpected gsSPLight length ${X}. Is this setting multiple lights?`)}else if(Q)z+=` // (unknown offset ${q0(Y)})`;break;case G6.G_GBI2_MV_POINT:this.warnUnimplemented("MoveMem G_GBI2_MV_POINT");break;case G6.G_GBI2_MV_MATRIX:this.warnUnimplemented("MoveMem G_GBI2_MV_MATRIX");break;default:this.warnUnimplemented(`MoveMem ${K.toString(16)}`)}if(Q)Q.text(z),this.previewMoveMem(K,X,Z,Q)}previewMoveMem(J,q,Q,Z){let X="";for(let Y=0;Y>>8&255,Y=X>>>5&7,K=X>>>3&3,z=J.type<<8>>24,W=(J.texLoadSize+1&z)>>>2,G=0;q.set(Y,K,W,J.tileTMEM,G,0,0,0,0,0,0);const H=2,j=J.texLoadSize<>>0&255){case IN:this.state.tmem.loadBlock(Z,q,0,0,j,J.texLoadRows);break;case ON:this.state.tmem.loadTile(Z,q,0,0,j,J.texLoadRows);break;case kN:this.state.tmem.loadTLUT(Z,q,0,0,j,J.texLoadRows);break;default:this.gbi.warnUnimplemented(`load texture type ${J.type}`);break}this.state.invalidateTileHashes()}renderSprite(J){const q=this.sprite,Q=this.matrix,X=q.objX,Y=q.objY,K=q.objW+X,z=q.objH+Y,W=this.state.tiles[0];W.set(q.imageFmt,q.imageSiz,q.imageStride,q.imageAdrs,q.imagePal,k8,0,0,k8,0,0),W.setSize(0,0,q.imageW-1<<2,q.imageH-1<<2);const G=q.imageFlags&1,H=q.imageFlags&16;if(G||H)this.gbi.warnUnimplemented("swapX/Y");const j=0,L=0,V=q.imageW,P=q.imageH;if(J==A7){const M=Q.x+Q.a*X+Q.b*Y,k=Q.y+Q.c*X+Q.d*Y,O=Q.x+Q.a*K+Q.b*Y,R=Q.y+Q.c*K+Q.d*Y,S=Q.x+Q.a*X+Q.b*z,T=Q.y+Q.c*X+Q.d*z,b=Q.x+Q.a*K+Q.b*z,p=Q.y+Q.c*K+Q.d*z;this.gbi.renderer.texRectRot(0,M,k,O,R,S,T,b,p,j,L,V,P)}else if(J==R7){const M=Q.x+X/Q.sx,k=Q.y+Y/Q.sy,O=Q.x+K/Q.sx,R=Q.y+z/Q.sy;this.gbi.renderer.texRect(0,M,k,O,R,j,L,V,P,!1)}else if(J==y7){const M=X,k=K,O=Y,R=z;this.gbi.renderer.texRect(0,M,O,k,R,j,L,V,P,!1)}}}class T7 extends A8{constructor(J,q){super(J,q);this.vertexStride=2,this.s2dex=new E7(J,q,this),this.sdexCommands=new Map([[1,this.s2dex.executeBg1cyc.bind(this.s2dex)],[2,this.s2dex.executeBgCopy.bind(this.s2dex)],[3,this.s2dex.executeObjRectangle.bind(this.s2dex)],[4,this.s2dex.executeObjSprite.bind(this.s2dex)],[5,this.s2dex.executeObjMoveMem.bind(this.s2dex)],[176,this.s2dex.executeSelectDL.bind(this.s2dex)],[177,this.s2dex.executeObjRendermode.bind(this.s2dex)],[178,this.s2dex.executeObjRectangleR.bind(this.s2dex)],[193,this.s2dex.executeObjLoadTxtr.bind(this.s2dex)],[194,this.s2dex.executeObjLoadTxSprite.bind(this.s2dex)],[195,this.s2dex.executeObjLoadTxRect.bind(this.s2dex)],[196,this.s2dex.executeObjLoadTxRectR.bind(this.s2dex)],[200,this.s2dex.executeTriRSP.bind(this.s2dex)],[201,this.s2dex.executeTriRSP.bind(this.s2dex)],[202,this.s2dex.executeTriRSP.bind(this.s2dex)],[203,this.s2dex.executeTriRSP.bind(this.s2dex)],[204,this.s2dex.executeTriRSP.bind(this.s2dex)],[205,this.s2dex.executeTriRSP.bind(this.s2dex)],[206,this.s2dex.executeTriRSP.bind(this.s2dex)],[207,this.s2dex.executeTriRSP.bind(this.s2dex)],[228,this.executeRDPHalf0.bind(this.s2dex)]])}getHandler(J){const q=this.sdexCommands.get(J);if(q)return q;return super.getHandler(J)}executeRDPHalf0(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_0, ${N(J)}, ${N(q)});`);this.state.rdpHalf0Cmd0=J,this.state.rdpHalf0Cmd1=q}executeRDPHalf2(J,q,Q){if(Q)Q.text(`gsImmp1(G_RDPHALF_2, ${N(q)});`);this.rdpTexRect(this.state.rdpHalf0Cmd0,this.state.rdpHalf0Cmd1,this.state.rdpHalf1Cmd1,q,Q)}}class _7 extends sJ{constructor(J,q){super(J,q);this.vertexStride=2,this.s2dex=new E7(J,q,this),this.sdexCommands=new Map([[1,this.s2dex.executeObjRectangle.bind(this.s2dex)],[2,this.s2dex.executeObjSprite.bind(this.s2dex)],[4,this.s2dex.executeSelectDL.bind(this.s2dex)],[5,this.s2dex.executeObjLoadTxtr.bind(this.s2dex)],[6,this.s2dex.executeObjLoadTxSprite.bind(this.s2dex)],[7,this.s2dex.executeObjLoadTxRect.bind(this.s2dex)],[8,this.s2dex.executeObjLoadTxRectR.bind(this.s2dex)],[9,this.s2dex.executeBg1cyc.bind(this.s2dex)],[10,this.s2dex.executeBgCopy.bind(this.s2dex)],[11,this.s2dex.executeObjRendermode.bind(this.s2dex)],[200,this.s2dex.executeTriRSP.bind(this.s2dex)],[201,this.s2dex.executeTriRSP.bind(this.s2dex)],[202,this.s2dex.executeTriRSP.bind(this.s2dex)],[203,this.s2dex.executeTriRSP.bind(this.s2dex)],[204,this.s2dex.executeTriRSP.bind(this.s2dex)],[205,this.s2dex.executeTriRSP.bind(this.s2dex)],[206,this.s2dex.executeTriRSP.bind(this.s2dex)],[207,this.s2dex.executeTriRSP.bind(this.s2dex)],[213,this.executeDLCount.bind(this)],[218,this.s2dex.executeObjRectangleR.bind(this.s2dex)]])}getHandler(J){const q=this.sdexCommands.get(J);if(q)return q;return super.getHandler(J)}executeDLCount(J,q,Q){if(this.warnUnimplemented("executeDL_Count"),Q)Q.text("executeDL_Count(/* TODO */);")}executeMoveMem(J,q,Q){const Z=J&254;if(Z==0){const X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gSPObjMatrix(${N(X)});`);this.s2dex.setObjMatrix(X,Q);return}else if(Z==2){const X=this.state.rdpSegmentAddress(q);if(Q)Q.text(`gSPObjSubMatrix(${N(X)});`);this.s2dex.setObjSubMatrix(X,Q);return}super.executeMoveMem(J,q,Q)}}function GF(J,q,Q){const Z=J.detectVersionString(),X=C0.dumpMicrocodeSubstring;if(C0.dumpMicrocode&&(X==""||Z.includes(X)))J.dumpCode(),C0.dumpMicrocode=!1;const Y=J.computeMicrocodeHash(),K=BN(Z,Y),z=wN(K,q,Q);return z.version=Z,z}var wN=function(J,q,Q){switch(J){case eQ:return new c6(q,Q);case iQ:return new w7(q,Q);case WF:return new D7(q,Q);case HF:return new I7(q,Q);case FF:return new k7(q,Q);case zF:return new O7(q,Q);case ZF:return new A8(q,Q);case tQ:return new h7(q,Q);case YF:return new T7(q,Q);case XF:return new sJ(q,Q);case $F:return new B7(q,Q);case KF:return new _7(q,Q)}return h(`unhandled ucode during table init: ${J}`),new c6(q,Q)},BN=function(J,q){let Q=DN.get(q);if(Q===void 0)Q=AN(J);return CN(J,Q),Q},CN=function(J,q){if(QF.get(J))return;QF.set(J,!0),h(`New RSP graphics ucode seen: ${J} = ucode ${q}`)},AN=function(J){const q=["F3","L3","S2DEX"];let Q=-1;for(let Z of q)if(Q=J.indexOf(Z),Q>=0)break;if(Q>=0){if(J.indexOf("fifo",Q)>=0||J.indexOf("xbux",Q)>=0)return J.indexOf("S2DEX")>=0?KF:XF;return J.indexOf("S2DEX")>=0?YF:ZF}return eQ},eQ=0,ZF=1,XF=2,YF=3,KF=4,zF=5,iQ=6,tQ=7,WF=8,FF=9,$F=10,HF=11,DN=new Map([[1613065980,$F],[1837886526,tQ],[202381338,iQ],[1899172316,iQ],[603530562,FF],[379440285,iQ],[651856460,tQ],[3401874884,HF],[1824215581,WF],[3713401635,tQ],[1691120285,zF],[3610907332,eQ],[826213259,eQ]]),QF=new Map;class j6{constructor(J,q,Q,Z){if(Z!==void 0)this.elems=new Float32Array(4),this.elems[0]=J,this.elems[1]=q,this.elems[2]=Q,this.elems[3]=Z;else this.elems=J||new Float32Array(4)}get x(){return this.elems[0]}get y(){return this.elems[1]}get z(){return this.elems[2]}get w(){return this.elems[3]}set x(J){this.elems[0]=J}set y(J){this.elems[1]=J}set z(J){this.elems[2]=J}set w(J){this.elems[3]=J}set(J,q,Q,Z){return this.x=J,this.y=q,this.z=Q,this.w=Z,this}setV3(J,q){return this.x=J.x,this.y=J.y,this.z=J.z,this.w=q,this}dot(J){let q=0;for(let Q=0;Q0)return this.scaleInPlace(1/J);return this}static create(J){const q=new j6;return q.elems[0]=J[0],q.elems[1]=J[1],q.elems[2]=J[2],q.elems[3]=J[3],q}}class b7{constructor(){this.pos=new j6,this.color=0,this.u=0,this.v=0,this.clipFlags=0,this.set=!1}calculateLinearUV(J){this.u=0.5*(1+J.x),this.v=0.5*(1+J.y)}calculateSphericalUV(J){this.u=Math.acos(J.x)/Math.PI,this.v=Math.acos(J.y)/Math.PI}}class Q9{constructor(J,q){this.scale=J||new j6(1,1,1,1),this.trans=q||new j6(0,0,0,0)}transformInPlace(J){J.vecScaleInPlace(this.scale),J.addInPlace(this.trans)}invTransformInPlace(J){J.subInPlace(this.trans),J.invVecScaleInPlace(this.scale)}}var yN=function(){return n64js.hardware().cachedMemDevice.s32},jF=function(){return n64js.hardware().cachedMemDevice.u8},S7=function(J,q,Q,Z){let X=q>>2;const Y=q+Q>>2;while(X>>0,++X;return Z},NF=function(J,q,Q,Z,X){for(let Y=0;Y>>2,W=Z>>>2,G=J.calcAddress(z,W),H=X-Q+1&4095,j=J.texelsToBytes(H),L=j+7>>>3,V=this.tmemData32;let P=G>>>2,M=q.tmem<<3>>>2;const k=yN(),O=q.size==l.G_IM_SIZ_32b?2:1;if(K)K.tip(`bytes ${j}, qwords ${L}`);if(Y===0)NF(V,M,k,P,L);else{const R=Math.ceil(2048/Y);let S=0;for(let T=0;T>>2,W=Z>>>2,G=X>>>2,H=Y>>>2,j=G+1-z,L=H+1-W,V=J.calcAddress(z,W),P=J.texelsToBytes(j),M=J.stride(),k=this.tmemData;let O=q.tmem<<3,R=V;const S=J.size==l.G_IM_SIZ_32b?q.line<<4:q.line<<3,T=q.size==l.G_IM_SIZ_32b?8:4;if(K)K.tip(`size (${j} x ${L}), rowBytes ${P}, ramStride ${M}, tmemStride ${S}, ramOffset ${N(R)}, tmemOffset ${q0(O)}`);const b=jF();for(let p=0;p>>2,W=Z>>>2,G=J.calcAddress(z,W,l.G_IM_SIZ_16b),H=rJ(X,Q),j=jF(),L=q.tmem<<3;if(K)K.tip(`count ${H}, tmemOffset ${q0(L)}`);bN(this.tmemData,L,j,G,H)}convertTexels(J,q,Q){return AW(Q,this.tmemData,J,q)}calculateCRC(J){if(J.hash)return J.hash;const q=J.height,Q=this.tmemData32,Z=J.tmem<<3;let X=J.line<<3;if(J.format==j0.G_IM_FMT_RGBA&&J.size==l.G_IM_SIZ_32b)X*=2;const Y=q*X;let K=S7(Q,Z,Y,0);if(J.format===j0.G_IM_FMT_CI||J.format===j0.G_IM_FMT_RGBA){if(J.size===l.G_IM_SIZ_8b)K=S7(Q,2048,2048,K);else if(J.size===l.G_IM_SIZ_4b)K=S7(Q,2048+J.palette*16*2,128,K)}return J.hash=K,K}}var x7=function(J,q){return J<>>1};class u7{constructor(){this.ramDV=null,this.pc=0,this.pcEnd=0,this.dlistStack=[],this.cmd0=0,this.cmd1=0,this.segments=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.tiles=new Array(8),this.lights=new Array(8),this.numLights=0,this.geometryModeBits=0,this.geometryMode={zbuffer:0,texture:0,shade:0,shadeSmooth:0,cullFront:0,cullBack:0,fog:0,lighting:0,textureGen:0,textureGenLinear:0,lod:0},this.rdpOtherModeL=0,this.rdpOtherModeH=0,this.rdpHalf0Cmd0=0,this.rdpHalf0Cmd1=0,this.rdpHalf1Cmd1=0,this.rdpHalf2Cmd1=0,this.viewport=new LF,this.projection=[],this.modelview=[],this.projectedVertices=new Array(64),this.scissor={mode:0,x0:0,y0:0,x1:320,y1:240},this.texture={tile:0,level:0,scaleS:1,scaleT:1},this.combine={lo:0,hi:0},this.fillColor=0,this.envColor=0,this.primColor=0,this.blendColor=0,this.fogColor=0,this.primDepth=0,this.fogParameters=new VF,this.colorImage={format:0,size:0,width:0,address:0},this.textureImage=new PF,this.depthImage={address:0},this.tmem=new v7,this.screenContext2d=null}reset(J,q){this.ramDV=J,this.pc=q,this.pcEnd=0,this.dlistStack=[],this.cmd0=0,this.cmd1=0;for(let Q=0;Q=this.pcEnd)this.endDisplayList();if(this.pc==0)return!1;return this.cmd0=this.ramDV.getUint32(this.pc+0),this.cmd1=this.ramDV.getUint32(this.pc+4),this.pc+=8,!0}advanceIfCommand(J){if(this.pc==0||this.pcEnd&&this.pc>this.pcEnd)return!1;const q=this.ramDV.getUint32(this.pc+0);if(q>>>24!==J)return!1;return this.cmd0=q,this.cmd1=this.ramDV.getUint32(this.pc+4),this.pc+=8,!0}executeBatch(J,q){const Q=this.cmd0>>>24,Z=J<=0;let X=0;do if(X++,!q(this.cmd0,this.cmd1))break;while((Z||X>>24&15;return(this.segments[q]&8388607)+(J&8388607)}setTexture(J,q,Q,Z){this.texture.scaleS=J,this.texture.scaleT=q,this.texture.level=Q,this.texture.tile=Z}updateGeometryModeFromBits(J){const q=this.geometryMode,Q=this.geometryModeBits;q.zbuffer=Q&J.G_ZBUFFER?1:0,q.texture=Q&J.G_TEXTURE_ENABLE?1:0,q.shade=Q&J.G_SHADE?1:0,q.shadeSmooth=Q&J.G_SHADING_SMOOTH?1:0,q.cullFront=Q&J.G_CULL_FRONT?1:0,q.cullBack=Q&J.G_CULL_BACK?1:0,q.fog=Q&J.G_FOG?1:0,q.lighting=Q&J.G_LIGHTING?1:0,q.textureGen=Q&J.G_TEXTURE_GEN?1:0,q.textureGenLinear=Q&J.G_TEXTURE_GEN_LINEAR?1:0,q.lod=Q&J.G_LOD?1:0}getCycleType(){return this.rdpOtherModeH&SJ}getTextureFilterType(){return this.rdpOtherModeH&xJ}getTextureLUTType(){return this.rdpOtherModeH&vJ}getAlphaCompareType(){return this.rdpOtherModeL&bJ}getAntiAliasEnabled(){return(this.rdpOtherModeL&P0.AA_EN)!==0}getCoverageTimesAlpha(){return(this.rdpOtherModeL&P0.CVG_X_ALPHA)!==0}getAlphaCoverageSelect(){return(this.rdpOtherModeL&P0.ALPHA_CVG_SEL)!==0}}class LF{constructor(){this.reset()}reset(){const J=new h0(160,-120,1),q=new h0(160,120,0);this.set(J,q)}set(J,q){this.scale=J,this.trans=q;const Q=new j6().setV3(J,1),Z=new j6().setV3(q,0);this.transform=new Q9(Q,Z)}}class VF{constructor(){this.reset()}reset(){this.multiplier=0,this.offset=0}set(J,q){this.multiplier=J,this.offset=q}}class PF{constructor(){this.format=0,this.size=0,this.width=0,this.address=0}set(J,q,Q,Z){this.format=J,this.size=q,this.width=Q,this.address=Z}calcAddress(J,q,Q){const Z=Q===void 0?this.size:Q;return this.address+q*x7(this.width,Z)+x7(J,Z)}texelsToBytes(J){return x7(J,this.size)}stride(){return this.texelsToBytes(this.width)}}class R0{constructor(J,q){this.x=J,this.y=q}dot(J){return this.x*J.x+this.y*J.y}lengthSqr(){return this.dot(this)}length(){return Math.sqrt(this.lengthSqr())}add(J){return new R0(this.x+J.x,this.y+J.y)}sub(J){return new R0(this.x-J.x,this.y-J.y)}scale(J){return new R0(this.x*J,this.y*J)}normaliseInPlace(){const J=this.length();if(J>0)this.x/=J,this.y/=J;return this}}class g7{constructor(J,q){this.scale=J||new R0(1,1),this.trans=q||new R0(0,0)}transform(J){const q=this.scale.x*J.x+this.trans.x,Q=this.scale.y*J.y+this.trans.y;return new R0(q,Q)}}class f7{constructor(J,q,Q){this.width=q,this.height=Q,this.$canvas=$(``,{width:q,height:Q}),this.texture=J.createTexture()}createScaledCanvas(J){const q=this.width*J,Q=this.height*J,Z=$('',{width:q,height:Q}),X=this.$canvas[0].getContext("2d"),Y=Z[0].getContext("2d"),K=X.getImageData(0,0,this.width,this.height),z=Y.createImageData(q,Q),W=K.data,G=z.data,H=K.width*4,j=z.width*4;for(let L=0;L>>0&255)/255;else if(V)P=0;const M=this.getCurrentN64Shader();K.useProgram(M.program),M.vertexArray.bind(),M.vertexArray.setPosData(J,K.DYNAMIC_DRAW),M.vertexArray.setColorData(q,K.DYNAMIC_DRAW),M.vertexArray.setUVData(Q,K.DYNAMIC_DRAW),this.bindTexture(0,K.TEXTURE0,W,H,X,M.uSamplerUniform0,M.uTexScaleUniform0,M.uTexOffsetUniform0),this.bindTexture(1,K.TEXTURE1,G,j,X,M.uSamplerUniform1,M.uTexScaleUniform1,M.uTexOffsetUniform1),K.uniform1f(M.uAlphaThresholdUniform,P),K.uniform4f(M.uPrimColorUniform,(this.state.primColor>>>24&255)/255,(this.state.primColor>>>16&255)/255,(this.state.primColor>>>8&255)/255,(this.state.primColor>>>0&255)/255),K.uniform4f(M.uEnvColorUniform,(this.state.envColor>>>24&255)/255,(this.state.envColor>>>16&255)/255,(this.state.envColor>>>8&255)/255,(this.state.envColor>>>0&255)/255)}getCurrentN64Shader(){const J=this.state.combine.hi,q=this.state.combine.lo,Q=this.state.getCycleType(),Z=(this.state.getAlphaCompareType()&e8.G_AC_THRESHOLD)!=0,X=this.state.getAntiAliasEnabled()&&this.state.getCoverageTimesAlpha();return gW(this.gl,J,q,Q,Z||X)}lookupTexture(J){const q=this.state.tiles[J];if(q.line===0)return null;const Q=this.state.tmem.calculateCRC(q),Z=`${N(Q)}_${q.format}_${q.size}_${q.width}_${q.height}_${q.palette}`;if(this.textureCache.has(Z))return this.textureCache.get(Z);const X=this.decodeTexture(q,this.state.getTextureLUTType(),Z);return this.textureCache.set(Z,X),X}decodeTexture(J,q,Q){const Z=this.gl;if(J.width==0||J.height==0)return null;const X=new f7(Z,J.width,J.height);if(!X.$canvas[0].getContext)return null;this.$textureOutput.append(`${Q}: ${j0.nameOf(J.format)}, ${l.nameOf(J.size)},${J.width}x${J.height},
`);const Y=X.$canvas[0].getContext("2d"),K=Y.createImageData(X.width,X.height);if(this.state.tmem.convertTexels(J,q,K))Y.putImageData(K,0,0),this.$textureOutput.append(X.$canvas),this.$textureOutput.append("
");else{const W=`${j0.nameOf(J.format)}/${l.nameOf(J.size)} is unhandled`;this.$textureOutput.append(W),this.hleHalt(W)}return Z.activeTexture(Z.TEXTURE0),Z.bindTexture(Z.TEXTURE_2D,X.texture),Z.texImage2D(Z.TEXTURE_2D,0,Z.RGBA,Z.RGBA,Z.UNSIGNED_BYTE,X.$canvas[0]),Z.generateMipmap(Z.TEXTURE_2D),Z.bindTexture(Z.TEXTURE_2D,null),X}bindTexture(J,q,Q,Z,X,Y,K,z){const W=this.gl;if(W.activeTexture(q),!Z){W.bindTexture(W.TEXTURE_2D,null);return}let{left:G,top:H}=Q,j=1/Z.width,L=1/Z.height;if(Z.width===56&&Z.height===29)j*=0.5,L*=0.5;if(X)j=1,L=1,G=0,H=0;if(j*=OF(Q.shiftS),L*=OF(Q.shiftT),W.bindTexture(W.TEXTURE_2D,Z.texture),W.uniform1i(Y,J),W.uniform2f(K,j,L),W.uniform2f(z,G,H),this.state.getTextureFilterType()==cJ.G_TF_POINT)W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MAG_FILTER,W.NEAREST),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MIN_FILTER,W.NEAREST_MIPMAP_NEAREST);else W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MAG_FILTER,W.LINEAR),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MIN_FILTER,W.LINEAR_MIPMAP_NEAREST);const V=Q.cmS===k8||Q.maskS===0,P=Q.cmT===k8||Q.maskT===0,M=Q.cmS===iq,k=Q.cmT===iq,O=V?W.CLAMP_TO_EDGE:M?W.MIRRORED_REPEAT:W.REPEAT,R=P?W.CLAMP_TO_EDGE:k?W.MIRRORED_REPEAT:W.REPEAT;W.texParameteri(W.TEXTURE_2D,W.TEXTURE_WRAP_S,O),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_WRAP_T,R)}setGLBlendMode(){const J=this.gl,q=this.state.getCoverageTimesAlpha(),Q=this.state.getAlphaCoverageSelect(),Z=this.state.getCycleType();if(Z==N0.G_CYC_FILL||Z==N0.G_CYC_COPY){J.disable(J.BLEND);return}const X=this.state.rdpOtherModeL>>q7,Y=(Z===N0.G_CYC_2CYCLE?X:X>>>2)&13107;let K=UF;switch(Y){case 0:case 770:K=p7;break;case 16:case 17:if(!Q||q)K=MF;break;case 272:K=p7;break;case 784:case 4880:K=hF;break;case 12560:K=kF;break}let z=!1;switch(K){case p7:J.disable(J.BLEND);break;case MF:J.blendFunc(J.SRC_ALPHA,J.ONE_MINUS_SRC_ALPHA),J.blendEquation(J.FUNC_ADD),J.enable(J.BLEND);break;case hF:J.blendFunc(J.ZERO,J.ONE_MINUS_SRC_ALPHA),J.blendEquation(J.FUNC_ADD),J.enable(J.BLEND);break;case kF:z=!0,J.disable(J.BLEND);break;case UF:z=!0,J.disable(J.BLEND);break}if(z)this.logUnhandledBlendMode(Y,Q,q)}logUnhandledBlendMode(J,q,Q){if(IF.get(J))return;IF.set(J,!0),n64js.warn(`Unhandled blend mode: ${q0(J)} = ${ZQ(J)}, alphaCvgSel ${q}, cvgXAlpha ${Q}`)}}class DF{constructor(){this.initDimensions(320,240)}initDimensions(J,q){this.viWidth=J,this.viHeight=q,this.n64FramebufferToDevice=new g7(new R0(2/J,-2/q),new R0(-1,1));const Q=J/2,Z=q/2,X=512,Y=511,K=new j6(Q,-Z,X,1),z=new j6(Q,+Z,Y,0);this.viTransform=new Q9(K,z)}convertN64ToDisplay(J){return this.n64FramebufferToDevice.transform(J)}}function CF(J){i0.initUI();const q=J[0];if(SN(q),!Z8)return;A6=new m7(Z8,s0,640,480),A6.hleHalt=vF,i0.renderer=A6}function AF(){if(A6)A6.reset()}var SN=function(J){if(Z8)return;try{Z8=J.getContext("webgl2")}catch(q){}if(!Z8)alert("Unable to initialize WebGL. Your browser may not support it.")};function RF(){return i0.running}function yF(){return i0.requested}function EF(){i0.toggle()}function TF(){i0.debugDisplayList()}function _F(J){i0.onNewTask(J),bF(J,null,-1)}function JZ(){n64js.onPresent();const J=n64js.hardware(),q=J.viRegDevice;if(J.timeline.addEvent(`Present ${N(q.dramAddrReg)}`),BF!==0){A6.copyBackBufferToFrontBuffer();return}SF(q);const Q=q.renderBackBuffer();if(!Q)return;A6.copyPixelsToFrontBuffer(Q,q.screenWidth,q.screenHeight,q.bitDepth)}var bF=function(J,q,Q){if(BF++,!Z8)return;const Z=n64js.hardware(),X=Z.cachedMemDevice.mem.dataView;s0.reset(X,J.dataPtr);let Y=wF(J,X),K=Y.buildCommandTable();if(Y.onLoadUcode((z,W,G,H)=>{return J.loadUcode(z,W,G,H),Y=wF(J,X),K=Y.buildCommandTable(),Y}),SF(Z.viRegDevice),A6.newFrame(),i0.running)A6.debugClear();if(q){i0.currentOp=0;while(s0.nextCommand())q.begin(s0.cmd0,s0.cmd1,s0.dlistStack.length),K[s0.cmd0>>>24](s0.cmd0,s0.cmd1,q),q.end(),i0.currentOp++}else{i0.currentOp=0;while(s0.nextCommand())if(K[s0.cmd0>>>24](s0.cmd0,s0.cmd1),i0.postOp(Q))break}Z8.bindFramebuffer(Z8.FRAMEBUFFER,null)},SF=function(J){const q=J.computeDimensions();if(!q)return;A6.nativeTransform.initDimensions(q.srcWidth,q.srcHeight);const Q=document.getElementById("display");Q.width=q.screenWidth*C0.canvasScale,Q.height=q.screenHeight*C0.canvasScale},wF=function(J,q){const Q=GF(J,s0,q);return Q.debugController=i0,Q.hleHalt=vF,Q.gl=Z8,Q.renderer=A6,Q},vF=function(J){if(i0.running)return;n64js.ui().displayWarning(J),n64js.breakEmulationForDisplayListDebug(),i0.halt()};window.n64js=window.n64js||{};var BF=0,Z8=null,A6,s0=new u7,i0=new N7(s0,bF);var c7={emulationMode:"LLE"},vN=J6.addFolder("Audio");vN.add(c7,"emulationMode",{LLE:"LLE",Disabled:"Disabled"}).name("Emulation Mode");function uF(){const J=n64js.hardware(),q=J.cachedMemDevice.u8,Q=J.sp_mem.subRegion(xN,uN),Z=new xF(q,Q);let X=!1;switch(Z.type){case gN:if(C0.emulationMode=="HLE"){const Y=J.timeline.startEvent(`HLE Task ${Z.detectVersionString()}`);if(_F(Z),J.miRegDevice.interruptDP(),Y)Y.stop();X=!0}break;case fN:if(c7.emulationMode=="Disabled")X=!0;break;case pN:break;case mN:break}return X}var xN=4032,uN=64,R8=t({type:0,flags:4,ucodeBootPtr:8,ucodeBootSize:12,ucodePtr:16,ucodeSize:20,ucodeDataPtr:24,ucodeDataSize:28,dramStackPtr:32,dramStackSize:36,outputBuffPtr:40,outputBuffSize:44,dataPtr:48,dataSize:52,yieldDataPtr:56,yieldDataSize:60}),gN=1,fN=2,pN=3,mN=4;class xF{constructor(J,q){this.ram_u8=J,this.type=q.getU32(R8.type),this.codeAddr=q.getU32(R8.ucodePtr)&536870911,this.codeSize=this.clampCodeSize(q.getU32(R8.ucodeSize)),this.codeDataAddr=q.getU32(R8.ucodeDataPtr)&536870911,this.codeDataSize=q.getU32(R8.ucodeDataSize),this.dataPtr=q.getU32(R8.dataPtr)}dumpCode(){const J=n64js.hardware().cachedMemDevice.mem,Q=dX(J,4224,this.codeAddr,this.codeSize);let Z=`${this.detectVersionString()}\n`;for(let X of Q)Z+=`${v(X.address,16)} ${X.disassembly}\n`;Z+="\nDMEM\n",Z+=zW(J,0,this.codeDataAddr,this.codeDataSize),console.log(Z)}loadUcode(J,q,Q,Z){this.codeAddr=J&536870911,this.codeSize=this.clampCodeSize(q),this.codeDataAddr=Q&536870911,this.codeDataSize=Z}clampCodeSize(J){if(J==0||J>4096)return 4096;return J}dataByte(J){return this.ram_u8[this.codeDataAddr+J]}codeByte(J){return this.ram_u8[this.codeAddr+J]}detectVersionString(){const J="R".charCodeAt(0),q="S".charCodeAt(0),Q="P".charCodeAt(0);for(let Z=0;Z+2=32)X+=String.fromCharCode(K)}return X}return""}computeMicrocodeHash(){let J=0;for(let q=0;q>>0;return J}}class R6{constructor(J){this.msg=J}toString(){return this.msg}}class o7{constructor(){this.cyclesToFirstEvent=0,this.firstEvent=null}reset(){this.cyclesToFirstEvent=0,this.firstEvent=null}nextEventCountdown(){return this.cyclesToFirstEvent}incrementCount(J){this.cyclesToFirstEvent-=J;while(this.cyclesToFirstEvent<=0){const q=this.firstEvent;if(!q)break;this.unlink(q),q.handler()}}unlink(J){if(J.prev)J.prev.cyclesToNextEvent=J.next?J.prev.cyclesToNextEvent+J.cyclesToNextEvent:0,J.prev.next=J.next;else this.cyclesToFirstEvent=J.next?this.cyclesToFirstEvent+J.cyclesToNextEvent:0,this.firstEvent=J.next;if(J.next)J.next.prev=J.prev;J.prev=null,J.next=null}insertAfter(J,q,Q,Z){const X=J?J.next:this.firstEvent;if(Q.cyclesToNextEvent=X?q-Z:0,J0(Q.cyclesToNextEvent>=0,"cyclesToNextEvent must be positive or zero"),Q.next=X,Q.prev=J,X)X.prev=Q;if(J)J.cyclesToNextEvent=Z,J.next=Q;else this.cyclesToFirstEvent=Z,this.firstEvent=Q}skipToNextEvent(J){if(!this.firstEvent||this.cyclesToFirstEvent0,"cycles must be positive");const Z=new gF(J,Q);let X=null,Y=this.cyclesToFirstEvent;for(let K=this.firstEvent;K;K=K.next){if(q<=Y){this.insertAfter(X,Y,Z,q);return}q-=Y,Y=K.cyclesToNextEvent,X=K}this.insertAfter(X,Y,Z,q)}removeEvent(J){let q=this.cyclesToFirstEvent;for(let Q=this.firstEvent;Q;Q=Q.next){if(Q.type==J)return this.unlink(Q),q;q+=Q.cyclesToNextEvent}return-1}getEvent(J){for(let q=this.firstEvent;q;q=q.next)if(q.type==J)return q;return null}getCyclesUntilEvent(J){let q=this.cyclesToFirstEvent;for(let Q=this.firstEvent;Q;Q=Q.next){if(Q.type==J)return q;q+=Q.cyclesToNextEvent}return-1}hasEvent(J){return Boolean(this.getEvent(J))}}class gF{constructor(J,q){this.type=J,this.cyclesToNextEvent=0,this.handler=q,this.prev=null,this.next=null}getName(){return this.type}}function fF(J,q){q6=J.memMap.getMemoryHandler.bind(J.memMap),P6=J.cachedMemDevice.mem.dataView,X8=q}function qZ(J,q,Q){q6(J).write32masked(J,q,Q)}function QZ(J,q,Q){q6(J).write64masked(J,q,Q)}function d7(J){if(J<-2139095040){const q=J+2147483648|0;return P6.getUint8(q,!1)}return cN(J>>>0)}function l7(J){if(J<-2139095040){const q=J+2147483648|0;return P6.getInt8(q,!1)}return nN(J>>>0)}function n7(J){if((J&1)==0&&J<-2139095040){const q=J+2147483648|0;return P6.getUint16(q,!1)}return oN(J>>>0)}function a7(J){if((J&1)==0&&J<-2139095040){const q=J+2147483648|0;return P6.getInt16(q,!1)}return aN(J>>>0)}function iJ(J){if((J&3)==0&&J<-2139095040){const q=J+2147483648|0;return P6.getUint32(q,!1)}return dN(J>>>0)}function Z9(J){if((J&3)==0&&J<-2139095040){const q=J+2147483648|0;return P6.getInt32(q,!1)}return rN(J>>>0)}function QJ(J){if((J&7)==0&&J<-2139095040){const q=J+2147483648|0;return P6.getBigUint64(q,!1)}return lN(J>>>0)}function r7(J,q){if(J<-2139095040){const Q=J+2147483648|0;P6.setUint8(Q,q,!1);return}sN(J>>>0,q)}function s7(J,q){if((J&1)==0&&J<-2139095040){const Q=J+2147483648|0;P6.setUint16(Q,q,!1);return}iN(J>>>0,q)}function X9(J,q){if((J&3)==0&&J<-2139095040){const Q=J+2147483648|0;P6.setUint32(Q,q,!1);return}tN(J>>>0,q)}function Y9(J,q){if((J&7)==0&&J<-2139095040){const Q=J+2147483648|0;P6.setBigUint64(Q,q,!1);return}eN(J>>>0,q)}var cN=function(J){return q6(J).readU8(J)},oN=function(J){if(J&1)X8.unalignedLoad(J);return q6(J).readU16(J)},dN=function(J){if(J&3)X8.unalignedLoad(J);return q6(J).readU32(J)},lN=function(J){if(J&7)X8.unalignedLoad(J);return q6(J).readU64(J)},nN=function(J){return q6(J).readU8(J)<<24>>24},aN=function(J){if(J&1)X8.unalignedLoad(J);return q6(J).readU16(J)<<16>>16};function rN(J){if(J&3)X8.unalignedLoad(J);return q6(J).readU32(J)>>0}var sN=function(J,q){q6(J).write8(J,q)},iN=function(J,q){if(J&1)X8.unalignedStore(J);q6(J).write16(J,q)},tN=function(J,q){if(J&3)X8.unalignedStore(J);q6(J).write32(J,q)},eN=function(J,q){if(J&7)X8.unalignedStore(J);q6(J).write64(J,q)},q6,P6,X8;var tJ=!0,ZJ=!1;var HL=function(J){return J<0);if(!isFinite(this.tempF32[0]))Z|=K9}break}if(this.raiseException(Z))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_S_W(J,q){this.clearCause();const Q=this.loadS32(this.fsRegIdx32(q));this.tempF32[0]=Q;let Z=0;if(Q!=this.tempF32[0])Z|=y0;if(this.raiseException(Z))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_S_L(J,q){this.clearCause();const Q=this.loadS64(this.fsRegIdx64(q));if(Q>=1n<<55n||Q<-(1n<<55n)){this.raiseUnimplemented();return}this.tempF32[0]=Number(Q);let Z=0;if(Q!=this.tempF32[0])Z|=y0;if(this.raiseException(Z))return;this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}f32UnaryOp(J,q,Q){this.clearCause();const Z=this.loadF32(this.fsRegIdx32(q)),X=y6(this.loadU32(this.fsRegIdx32(q))),Y=W$(Q,X);let K;switch(Y){case w:this.raiseUnimplemented();return;case _:if(!this.raiseException(o6))this.store32ZeroExtend(this.fdRegIdx32(J),PZ);return;case eJ:if(Z<0){if(!this.raiseException(o6))this.store32ZeroExtend(this.fdRegIdx32(J),PZ);return}K=Math.sqrt(Z);break;case YJ:K=Math.abs(Z);break;case KJ:K=-Z;break;default:throw`unhandled op case: ${Y}`}this.tempF32[0]=K;const z=y6(this.tempU32[0]);let W=0;if(K!=this.tempF32[0])W|=y0;if(l6(z)&&!l6(X))W|=y0|K9;if(!this.raiseException(W))this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}f32BinaryOp(J,q,Q,Z){this.clearCause();const X=this.loadF32(this.fsRegIdx32(q)),Y=this.loadF32(this.ftRegIdx32(Q)),K=this.loadU32(this.fsRegIdx32(q)),z=this.loadU32(this.ftRegIdx32(Q)),W=y6(K),G=y6(z),H=G$(Z,W,G);let j;switch(H){case w:this.raiseUnimplemented();return;case _:if(!this.raiseException(o6))this.store32ZeroExtend(this.fdRegIdx32(J),PZ);return;case n6:if(!this.raiseException(iF)){const P=(K&zJ)==(z&zJ);this.store32ZeroExtend(this.fdRegIdx32(J),P?eF:J$)}return;case K0:j=X+Y;break;case Z0:j=X-Y;break;case E0:j=X*Y;break;case N6:j=X/Y;break;default:throw`unhandled op case: ${H}`}this.tempF32[0]=j;const L=y6(this.tempU32[0]);let V=0;if(j!=this.tempF32[0])V|=y0;if(H==K0||H==Z0){if(!XJ(G)&&j==X||!XJ(W)&&j==Y)V|=y0}if(l6(L)&&!l6(W)&&!l6(G))V|=y0|K9;if((L==E6||XJ(L))&&j!=0)V|=y0|VZ,this.tempU32[0]=qY(z$,this.control[31]&LZ,j>0);if(!this.raiseException(V))this.store32ZeroExtend(this.fdRegIdx32(J),this.tempU32[0])}CVT_D_S(J,q){this.clearCause();let Q=0;switch(y6(this.loadU32(this.fsRegIdx32(q)))){case z8:case E6:this.raiseUnimplemented();return;case L6:Q|=o6,this.tempU64[0]=UZ;break;case Y8:this.tempU64[0]=q$;break;case K8:this.tempU64[0]=Q$;break;default:{const X=this.loadF32(this.fsRegIdx32(q));this.tempF64[0]=X}break}if(this.raiseException(Q))return;this.store64(this.fdRegIdx64(J),this.tempU64[0])}CVT_D_W(J,q){this.clearCause(),this.tempF64[0]=this.loadS32(this.fsRegIdx32(q)),this.store64(this.fdRegIdx64(J),this.tempU64[0])}CVT_D_L(J,q){this.clearCause();const Q=this.loadS64(this.fsRegIdx64(q));if(Q>=1n<<55n||Q<-(1n<<55n)){this.raiseUnimplemented();return}let Z=0;if(this.tempF64[0]=Number(Q),this.raiseException(Z))return;this.store64(this.fdRegIdx64(J),this.tempU64[0])}f64UnaryOp(J,q,Q){this.clearCause();const Z=this.loadF64(this.fsRegIdx64(q)),X=d6(this.loadU64(this.fsRegIdx64(q))),Y=W$(Q,X);let K;switch(Y){case w:this.raiseUnimplemented();return;case _:if(!this.raiseException(o6))this.store64(this.fdRegIdx64(J),UZ);return;case eJ:if(Z<0){if(!this.raiseException(o6))this.store64(this.fdRegIdx64(J),UZ);return}K=Math.sqrt(Z);break;case YJ:K=Math.abs(Z);break;case KJ:K=-Z;break;default:throw`unhandled op case: ${Y}`}this.tempF64[0]=K;const z=d6(this.tempU64[0]);let W=0;if(K!=this.tempF64[0])W|=y0;if(l6(z)&&!l6(X))W|=y0|K9;if(!this.raiseException(W))this.store64(this.fdRegIdx64(J),this.tempU64[0])}f64BinaryOp(J,q,Q,Z){this.clearCause();const X=this.loadF64(this.fsRegIdx64(q)),Y=this.loadF64(this.ftRegIdx64(Q)),K=this.loadU64(this.fsRegIdx64(q)),z=this.loadU64(this.ftRegIdx64(Q)),W=d6(K),G=d6(z),H=G$(Z,W,G);let j;switch(H){case w:this.raiseUnimplemented();return;case _:if(!this.raiseException(o6))this.store64(this.fdRegIdx64(J),UZ);return;case n6:if(!this.raiseException(iF)){const P=(K&WJ)==(z&WJ);this.store64(this.fdRegIdx64(J),P?q$:Q$)}return;case K0:j=X+Y;break;case Z0:j=X-Y;break;case E0:j=X*Y;break;case N6:j=X/Y;break;default:throw`unhandled op case: ${H}`}this.tempF64[0]=j;const L=d6(this.tempU64[0]);let V=0;if(H==K0||H==Z0){if(!XJ(G)&&j==X||!XJ(W)&&j==Y)V|=y0}if(l6(L)&&!l6(W)&&!l6(G))V|=y0|K9;if((L==E6||XJ(L))&&j!=0)V|=y0|VZ,this.tempU64[0]=qY(hL,this.control[31]&LZ,j>0);if(!this.raiseException(V))this.store64(this.fdRegIdx64(J),this.tempU64[0])}ConvertSToL(J,q,Q){this.clearCause();let Z=0;switch(y6(this.loadU32(this.fsRegIdx32(q)))){case z8:case L6:case E6:case Y8:case K8:this.raiseUnimplemented();return;default:{const Y=this.loadF32(this.fsRegIdx32(q)),K=this.convertUsingMode(Y,Q);if(K>Z$||KZ$||KY$||KY$||K>P$,Q=(J&tF)>>U$;if(q&Q||J&rF)return this.hardware.cpu0.raiseFPE(),!0;return!1}copRegIdx32(J){return this.regIdx32_cop[J]}fdRegIdx32(J){return this.regIdx32_d[J]}fsRegIdx32(J){return this.regIdx32_s[J]}ftRegIdx32(J){return this.regIdx32_t[J]}copRegIdx64(J){return this.regIdx64_cop[J]}fdRegIdx64(J){return this.regIdx64_d[J]}fsRegIdx64(J){return this.regIdx64_s[J]}ftRegIdx64(J){return this.regIdx64_t[J]}store64(J,q){this.regU64[J]=q}store32ZeroExtend(J,q){this.regU32[J]=q|0,this.regU32[J+1]=0}store32(J,q){this.regU32[J]=q|0}loadS32(J){return this.regS32[J]}loadU32(J){return this.regU32[J]}loadF32(J){return this.regF32[J]}loadU64(J){return this.regU64[J]}loadF64(J){return this.regF64[J]}loadS64(J){return this.regS64[J]}dump(){let J="Regs: ";for(let q=0;q<6;+q++)J+=N(this.regS32[q])+", ";h(J),h(`float32: [${this.regF32[0]}, ${this.regF32[1]}, ${this.regF32[2]}, ${this.regF32[3]}, ${this.regF32[4]}, ${this.regF32[5]}, ...]`),h(`float64: [${this.regF64[0]}, ${this.regF64[1]}, ...]`),console.log("")}}function T$(J){J.needsDelayCheck=J.fragment.needsDelayCheck,J.isTrivial=!1;let q="";if(O$)q=Q6(` if (c.pc != ${N(J.pc)}) { throw 'expected pc ${N(J.pc)}, got ' + c.pc.toString(16); } `);let Q=q+hP(J);if(J.dump)console.log(Q);if(!J.isTrivial&&J.delayedPCUpdate!==0)J.fragment.bodyCode+=`// Applying delayed pc\nc.pc = ${N(J.delayedPCUpdate)};\n`,J.delayedPCUpdate=0;if(J.fragment.needsDelayCheck=J.needsDelayCheck,J.fragment.bailedOut|=J.bailOut,n64js.getSyncFlow())Q=`if (!n64js.checkSyncState(sync, ${N(J.pc)})) { return ${J.fragment.opsCompiled}; }\n${Q}`;const X=mX(J.pc,J.instruction,!1),Y=OL(Q," ");J.fragment.bodyCode+=`// ${X.disassembly} { ${Y} } `}var OL=function(J,q){return Q6(J).split("\n").filter((K)=>K!="").map((K)=>q+K).join("\n")},Q6=function(J){J=J.replace(/^\n/,"");const q=J.match(/^\s+/);if(!q)return J;const Q=q[0];return q?J.replace(new RegExp("^"+Q,"gm"),""):J},FJ=function(J){if(!J.startsWith("\n"))J="\n"+J;if(!J.endsWith("\n"))J+="\n";return J},_$=function(J,q,Q){let Z="";if(Z+=q.genAssert(`c.pc === ${N(q.pc)}`,"pc mismatch"),q.needsDelayCheck)Z+=`if (c.delayPC) { c.nextPC = c.delayPC; c.delayPC = 0; } else { c.nextPC = ${N(q.pc+4)}; }\n`,Z+=FJ(J),Z+="c.pc = c.nextPC;\n";else if(Q)Z+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Z+=`c.nextPC = ${N(q.pc+4)};\n`,Z+=FJ(J),Z+="c.pc = c.nextPC;\n";else Z+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Z+=FJ(J),Z+=`c.pc = ${N(q.pc+4)};\n`;return Z},f=function(J,q){let Q="";if(Q+=q.genAssert(`c.pc === ${N(q.pc)}`,"pc mismatch"),q.needsDelayCheck)Q+=`c.nextPC = c.delayPC || ${N(q.pc+4)};\n`;else Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),Q+=`c.nextPC = ${N(q.pc+4)};\n`;if(Q+="c.branchTarget = 0;\n",Q+=FJ(J),Q+="c.pc = c.nextPC;\n",Q+="c.delayPC = c.branchTarget;\n",q.needsDelayCheck=!0,ZJ)Q+="c.incrementCount(1);\n";if(q.bailOut)Q+=`return ${q.fragment.opsCompiled};\n`;else Q+=`if (c.stuffToDo) { return ${q.fragment.opsCompiled}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;return Q},X0=function(J,q){let Q="";if(Q+=_$(J,q,!0),Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),q.needsDelayCheck=!1,ZJ)Q+="c.incrementCount(1);\n";return J0(!q.bailOut,"Not expecting bailOut to be set for memory access"),Q+=`if (c.stuffToDo) { return ${q.fragment.opsCompiled}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`,Q},l0=function(J,q,Q){let Z="";const X=q.needsDelayCheck||Q||q.postPC!==q.pc+4;if(Z+=_$(J,q,Q),q.needsDelayCheck=!0,ZJ)Z+="c.incrementCount(1);\n";if(Z+=q.genAssert("c.stuffToDo === 0","stuffToDo should be zero"),q.bailOut)Z+=`return ${q.fragment.opsCompiled};\n`;else if(X)Z+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else Z+="// Skipping pc test\n";return Z},m=function(J,q){let Q="";if(Q+=FJ(J),q.isTrivial=!0,ZJ)Q+="c.incrementCount(1);\n";if(q.needsDelayCheck)Q+=`if (c.delayPC) { c.pc = c.delayPC; c.delayPC = 0; } else { c.pc = ${N(q.pc+4)}; }\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else{Q+=q.genAssert("c.delayPC === 0","delay pc should be zero");const Z=q.pc+4;if(q.postPC!==Z)J0("postPC should always be pc+4 for trival ops?"),Q+=`c.pc = ${N(Z)};\n`,Q+=`if (c.pc !== ${N(q.postPC)}) { return ${q.fragment.opsCompiled}; }\n`;else if(Q+="// Delaying pc update\n",q.delayedPCUpdate=Z,O$)Q+=`c.pc = ${N(Z)};\n`}return Q+=q.genAssert("c.delayPC === 0","delay pc should be zero"),q.needsDelayCheck=!1,Q+=q.genAssert("c.stuffToDo === 0","stuffToDo should be zero"),Q},b$=function(J,q){return m(`// ${J}\n`,q)},S$=function(J){if(J===0)return"0";return`c.getRegU32Lo(${J})`},E8=function(J){if(J===0)return"0n";return`c.getRegS64(${J})`},y8=function(J){if(J===0)return"0n";return`c.getRegU64(${J})`},C=function(J){const q=`throw 'unknown op, pc ${N(J.pc)}, instruction: ${N(J.instruction)}'`;return f(q,J)},DL=function(J){if(J.instruction===0)return b$("NOP",J);const q=`c.execSLL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},wL=function(J){const q=`c.execSRL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},BL=function(J){const q=`c.execSRA(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},CL=function(J){const q=`c.execSLLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},AL=function(J){const q=`c.execSRLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},RL=function(J){const q=`c.execSRAV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},yL=function(J){const q=`c.execDSLLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},EL=function(J){const q=`c.execDSRLV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},TL=function(J){const q=`c.execDSRAV(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},_L=function(J){const q=`c.execDSLL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},bL=function(J){const q=`c.execDSLL32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},SL=function(J){const q=`c.execDSRL(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},vL=function(J){const q=`c.execDSRL32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},xL=function(J){const q=`c.execDSRA(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},uL=function(J){const q=`c.execDSRA32(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_sa()});`;return m(q,J)},gL=function(J){return f("c.execRESERVED(0);",J)},fL=function(J){return f("c.execSYSCALL();",J)},pL=function(J){return f("c.execBREAK();",J)},mL=function(J){return f("c.execSYNC();",J)},cL=function(J){const q=`c.execTGE(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},oL=function(J){const q=`c.execTGEU(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},dL=function(J){const q=`c.execTLT(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},lL=function(J){const q=`c.execTLTU(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},nL=function(J){const q=`c.execTEQ(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},aL=function(J){const q=`c.execTNE(${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},rL=function(J){const q=`c.execMFHI(${J.instr_rd()});`;return m(q,J)},sL=function(J){const q=`c.execMFLO(${J.instr_rd()});`;return m(q,J)},iL=function(J){const q=`c.execMTHI(${J.instr_rs()});`;return m(q,J)},tL=function(J){const q=`c.execMTLO(${J.instr_rs()});`;return m(q,J)},eL=function(J){const q=`c.execMULT(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},J2=function(J){const q=`c.execMULTU(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},q2=function(J){const q=`c.execDMULT(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},Q2=function(J){const q=`c.execDMULTU(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},Z2=function(J){const q=`c.execDIV(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},X2=function(J){const q=`c.execDIVU(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},Y2=function(J){const q=`c.execDDIV(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},K2=function(J){const q=`c.execDDIVU(${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},z2=function(J){const q=`c.execADD(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},W2=function(J){const q=`c.execDADD(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},F2=function(J){const q=`c.execADDU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},$2=function(J){const q=`c.execDADDU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},H2=function(J){const q=`c.execSUB(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},G2=function(J){const q=`c.execDSUB(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return f(q,J)},j2=function(J){const q=`c.execSUBU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},N2=function(J){const q=`c.execDSUBU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},L2=function(J){const q=`c.execAND(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},V2=function(J){let q;if(J.instr_rt()===0)if(J.instr_rs()===0)q=`c.execCLEAR(${J.instr_rd()});`;else q=`c.execMOV(${J.instr_rd()}, ${J.instr_rs()});`;else q=`c.execOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},P2=function(J){const q=`c.execXOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},U2=function(J){const q=`c.execNOR(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},M2=function(J){const q=`c.execSLT(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},h2=function(J){const q=`c.execSLTU(${J.instr_rd()}, ${J.instr_rt()}, ${J.instr_rs()});`;return m(q,J)},k2=function(J){const q=`c.execADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},I2=function(J){const q=`c.execDADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},O2=function(J){const q=`c.execADDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return m(q,J)},D2=function(J){const q=`c.execDADDIU(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return m(q,J)},w2=function(J){const q=`c.execMFC0(${J.instr_rt()}, ${J.instr_fs()});`;return f(q,J)},B2=function(J){const q=`c.execDMFC0(${J.instr_rt()}, ${J.instr_fs()});`;return f(q,J)},C2=function(J){if(J.instr_fs()===S0)J.fragment.cop1statusKnown=!1;const q=`c.execMTC0(${J.instr_rt()}, ${J.instr_fs()});`;return f(q,J)},A2=function(J){if(J.instr_fs()===S0)J.fragment.cop1statusKnown=!1;const q=`c.execDMTC0(${J.instr_rt()}, ${J.instr_fs()});`;return f(q,J)},R2=function(J){const q=`c.execTLB(${J.instr_tlbop()});`;return f(q,J)},y2=function(J){const q=`c.execMFC2(${J.instr_rt()});`;return f(q,J)},E2=function(J){const q=`c.execDMFC2(${J.instr_rt()});`;return f(q,J)},T2=function(J){const q=`c.execCFC2(${J.instr_rt()});`;return f(q,J)},_2=function(J){const q=`c.execDCFC2(${J.instr_rt()});`;return f(q,J)},b2=function(J){const q=`c.execMTC2(${J.instr_rt()});`;return f(q,J)},S2=function(J){const q=`c.execDMTC2(${J.instr_rt()});`;return f(q,J)},v2=function(J){const q=`c.execCTC2(${J.instr_rt()});`;return f(q,J)},x2=function(J){const q=`c.execDCTC2(${J.instr_rt()});`;return f(q,J)},u2=function(J){const q=M8(J.pc,J.instruction),Q="c.delayPC = "+N(q)+";";return l0(Q,J,!1)},g2=function(J){const q=M8(J.pc,J.instruction),Q=J.nextPC+4,Z=Q&2147483648?-1:0,X=Q6(` c.delayPC = ${N(q)}; c.setRegS64LoHi(${g6}, ${N(Q)}, ${Z}); `);return l0(X,J,!1)},f2=function(J){const q=J.instr_rs(),Q=J.instr_rd(),Z=J.nextPC+4,X=Z&2147483648?-1:0,Y=Q6(` c.delayPC = ${S$(q)}; c.setRegS64LoHi(${Q}, ${N(Z)}, ${X}); `);return l0(Y,J,!1)},p2=function(J){const q=`c.delayPC = ${S$(J.instr_rs())};`;return l0(q,J,!1)},m2=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Z=J.instr_offset(),X=d0(J.pc,J.instruction);let Y="";if(q===Q){if(tJ&&Z===-1)Y+="c.speedHack();\n",J.bailOut=!0;Y+=`c.delayPC = ${N(X)};\n`}else{if(Y+=`if (${y8(q)} === ${y8(Q)}) {\n`,tJ&&Z===-1)Y+=" c.speedHack();\n",J.bailOut=!0;Y+=` c.delayPC = ${N(X)};\n`,Y+="} else {\n",Y+=` c.delayPC = ${N(J.pc+8)};\n`,Y+="}\n"}return l0(Y,J,!1)},c2=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Z=d0(J.pc,J.instruction),X=Q6(` if (${y8(q)} === ${y8(Q)}) { c.delayPC = ${N(Z)}; } else { c.nextPC += 4; }`);return l0(X,J,!0)},o2=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Z=J.instr_offset(),X=d0(J.pc,J.instruction);let Y="";if(Y+=`if (${y8(q)} !== ${y8(Q)}) {\n`,tJ&&Z===-1)Y+=" c.speedHack();\n",J.bailOut=!0;return Y+=` c.delayPC = ${N(X)};\n`,Y+="} else {\n",Y+=` c.delayPC = ${N(J.pc+8)};\n`,Y+="}\n",l0(Y,J,!1)},d2=function(J){const q=J.instr_rs(),Q=J.instr_rt(),Z=d0(J.pc,J.instruction),X=Q6(` if (${y8(q)} !== ${y8(Q)}) { c.delayPC = ${N(Z)}; } else { c.nextPC += 4; } `);return l0(X,J,!0)},l2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if ( ${E8(q)} <= 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return l0(Z,J,!1)},n2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if ( ${E8(q)} <= 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return l0(Z,J,!0)},a2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} > 0) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return l0(Z,J,!1)},r2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} > 0) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return l0(Z,J,!0)},s2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} < 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return l0(Z,J,!1)},i2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} < 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return l0(Z,J,!0)},t2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} >= 0n) { c.delayPC = ${N(Q)}; } else { c.delayPC = ${N(J.pc+8)}; }`);return l0(Z,J,!1)},e2=function(J){const q=J.instr_rs(),Q=d0(J.pc,J.instruction),Z=Q6(` if (${E8(q)} >= 0n) { c.delayPC = ${N(Q)}; } else { c.nextPC += 4; }`);return l0(Z,J,!0)},JV=function(J){const q=`c.execBLTZAL(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},qV=function(J){const q=`c.execBGEZAL(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},QV=function(J){const q=`c.execBLTZALL(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},ZV=function(J){const q=`c.execBGEZALL(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},XV=function(J){const q=`c.execTGEI(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},YV=function(J){const q=`c.execTGEIU(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},KV=function(J){const q=`c.execTLTI(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},zV=function(J){const q=`c.execTLTIU(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},WV=function(J){const q=`c.execTEQI(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},FV=function(J){const q=`c.execTNEI(${J.instr_rs()}, ${J.instr_imms()});`;return f(q,J)},$V=function(J){const q=`c.execSLTI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return m(q,J)},HV=function(J){const q=`c.execSLTIU(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imms()});`;return m(q,J)},GV=function(J){const q=`c.execANDI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return m(q,J)},jV=function(J){const q=`c.execORI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return m(q,J)},NV=function(J){const q=`c.execXORI(${J.instr_rt()}, ${J.instr_rs()}, ${J.instr_imm()});`;return m(q,J)},LV=function(J){const q=`c.execLUI(${J.instr_rt()}, ${J.instr_imm()});`;return m(q,J)},VV=function(J){const q=`c.execLB(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},PV=function(J){const q=`c.execLBU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},UV=function(J){const q=`c.execLH(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},MV=function(J){const q=`c.execLHU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},hV=function(J){const q=`c.execLW(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},kV=function(J){const q=`c.execLWU(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},IV=function(J){const q=`c.execLD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},OV=function(J){const q=`c.execLWL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},DV=function(J){const q=`c.execLWR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},wV=function(J){const q=`c.execLDL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},BV=function(J){const q=`c.execLDR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},CV=function(J){J.fragment.usesCop1=!0;const q=`c.execLWC1(${J.instr_ft()}, ${J.instr_base()}, ${J.instr_imms()});`;return f(q,J)},AV=function(J){J.fragment.usesCop1=!0;const q=`c.execLDC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return f(q,J)},RV=function(J){const q=`c.execLWC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},yV=function(J){const q=`c.execLWC3(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},EV=function(J){const q=`c.execLDC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},TV=function(J){const q=`c.execSB(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},_V=function(J){const q=`c.execSH(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},bV=function(J){const q=`c.execSW(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},SV=function(J){const q=`c.execSD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},vV=function(J){const q=`c.execSWL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},xV=function(J){const q=`c.execSWR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},uV=function(J){const q=`c.execSDL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},gV=function(J){const q=`c.execSDR(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},fV=function(J){J.fragment.usesCop1=!0;const q=`c.execSWC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return f(q,J)},pV=function(J){J.fragment.usesCop1=!0;const q=`c.execSDC1(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return f(q,J)},mV=function(J){const q=`c.execSWC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},cV=function(J){const q=`c.execSWC3(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},oV=function(J){const q=`c.execSDC2(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},dV=function(J){const q=`c.execLL(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},lV=function(J){const q=`c.execLLD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},nV=function(J){const q=`c.execSC(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},aV=function(J){const q=`c.execSCD(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return X0(q,J)},rV=function(J){if(!n64js.cpu0.ignoreCacheOp(J.instr_rt())){const q=`c.execCACHE(${J.instr_rt()}, ${J.instr_base()}, ${J.instr_imms()});`;return m(q,J)}else return b$("CACHE (ignored)",J)},sV=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execMFC1(${J.instr_rt()}, ${J.instr_fs()});`},iV=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execDMFC1(${J.instr_rt()}, ${J.instr_fs()});`},tV=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execMTC1(${J.instr_rt()}, ${J.instr_fs()});`},eV=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execDMTC1(${J.instr_rt()}, ${J.instr_fs()});`},JP=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execCFC1(${J.instr_rt()}, ${J.instr_fs()});`},qP=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!0,`c.execCTC1(${J.instr_rt()}, ${J.instr_fs()});`},QP=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!1,`c.execDCFC1(${J.instr_rt()}, ${J.instr_fs()});`},ZP=function(J){return J.fragment.usesCop1=!0,J.isTrivial=!1,`c.execDCTC1(${J.instr_rt()}, ${J.instr_fs()});`},XP=function(J){const q=J.instruction;J0((q>>>18&7)===0,"cc bit is not 0");const Q=(q&65536)!==0,Z=(q&131072)!==0,X=d0(J.pc,q);J.fragment.usesCop1=!0,J.isTrivial=!1;let K=`const cond = (cpu1.control[31] & FPCSR_C) ${Q?"!==":"==="} 0;\n`;if(Z)K+="if (cond) {\n",K+=` c.branchTarget = ${N(X)};\n`,K+="} else {\n",K+=" c.nextPC += 4;\n",K+="}\n";else K+="if (cond) {\n",K+=` c.branchTarget = ${N(X)};\n`,K+="} else {\n",K+=` c.branchTarget = ${N(J.pc+8)};\n`,K+="}\n";return K},YP=function(J){const q=J.instr_fs(),Q=J.instr_ft(),Z=J.instr_fd();J.fragment.usesCop1=!0,J.isTrivial=!1;const X=H6(J.instruction);if(X<48){switch(X){case D$:return`cpu1.ADD_S(${Z}, ${q}, ${Q});`;case w$:return`cpu1.SUB_S(${Z}, ${q}, ${Q});`;case B$:return`cpu1.MUL_S(${Z}, ${q}, ${Q});`;case C$:return`cpu1.DIV_S(${Z}, ${q}, ${Q});`;case A$:return`cpu1.SQRT_S(${Z}, ${q});`;case R$:return`cpu1.ABS_S(${Z}, ${q});`;case y$:return`cpu1.MOV_S(${Z}, ${q});`;case E$:return`cpu1.NEG_S(${Z}, ${q});`;case DZ:return`cpu1.ConvertSToL(${Z}, ${q}, ${U6});`;case wZ:return`cpu1.ConvertSToL(${Z}, ${q}, ${T6});`;case BZ:return`cpu1.ConvertSToL(${Z}, ${q}, ${_6});`;case CZ:return`cpu1.ConvertSToL(${Z}, ${q}, ${b6});`;case AZ:return`cpu1.ConvertSToW(${Z}, ${q}, ${U6});`;case RZ:return`cpu1.ConvertSToW(${Z}, ${q}, ${T6});`;case yZ:return`cpu1.ConvertSToW(${Z}, ${q}, ${_6});`;case EZ:return`cpu1.ConvertSToW(${Z}, ${q}, ${b6});`;case TZ:return"cpu1.raiseUnimplemented();";case _Z:return`cpu1.CVT_D_S(${Z}, ${q});`;case bZ:return`cpu1.ConvertSToW(${Z}, ${q}, cpu1.roundingMode);`;case SZ:return`cpu1.ConvertSToL(${Z}, ${q}, cpu1.roundingMode);`}return`unimplemented(${N(J.pc)},${N(J.instruction)});`}return`cpu1.handleFloatCompareSingle(${X}, ${q}, ${Q});`},KP=function(J){const q=J.instr_fs(),Q=J.instr_ft(),Z=J.instr_fd();J.fragment.usesCop1=!0,J.isTrivial=!1;const X=H6(J.instruction);if(X<48){switch(X){case D$:return`cpu1.ADD_D(${Z}, ${q}, ${Q});`;case w$:return`cpu1.SUB_D(${Z}, ${q}, ${Q});`;case B$:return`cpu1.MUL_D(${Z}, ${q}, ${Q});`;case C$:return`cpu1.DIV_D(${Z}, ${q}, ${Q});`;case A$:return`cpu1.SQRT_D(${Z}, ${q});`;case R$:return`cpu1.ABS_D(${Z}, ${q});`;case y$:return`cpu1.MOV_D(${Z}, ${q});`;case E$:return`cpu1.NEG_D(${Z}, ${q});`;case DZ:return`cpu1.ConvertDToL(${Z}, ${q}, ${U6});`;case wZ:return`cpu1.ConvertDToL(${Z}, ${q}, ${T6});`;case BZ:return`cpu1.ConvertDToL(${Z}, ${q}, ${_6});`;case CZ:return`cpu1.ConvertDToL(${Z}, ${q}, ${b6});`;case AZ:return`cpu1.ConvertDToW(${Z}, ${q}, ${U6});`;case RZ:return`cpu1.ConvertDToW(${Z}, ${q}, ${T6});`;case yZ:return`cpu1.ConvertDToW(${Z}, ${q}, ${_6});`;case EZ:return`cpu1.ConvertDToW(${Z}, ${q}, ${b6});`;case TZ:return`cpu1.CVT_S_D(${Z}, ${q});`;case _Z:return"cpu1.raiseUnimplemented();";case bZ:return`cpu1.ConvertDToW(${Z}, ${q}, cpu1.roundingMode);`;case SZ:return`cpu1.ConvertDToL(${Z}, ${q}, cpu1.roundingMode);`}return`unimplemented(${N(J.pc)},${N(J.instruction)});`}return`cpu1.handleFloatCompareDouble(${X}, ${q}, ${Q});`},zP=function(J){const q=J.instr_fs(),Q=J.instr_fd();switch(J.fragment.usesCop1=!0,J.isTrivial=!1,H6(J.instruction)){case DZ:return"cpu1.raiseUnimplemented();";case wZ:return"cpu1.raiseUnimplemented();";case BZ:return"cpu1.raiseUnimplemented();";case CZ:return"cpu1.raiseUnimplemented();";case AZ:return"cpu1.raiseUnimplemented();";case RZ:return"cpu1.raiseUnimplemented();";case yZ:return"cpu1.raiseUnimplemented();";case EZ:return"cpu1.raiseUnimplemented();";case TZ:return`cpu1.CVT_S_W(${Q}, ${q});`;case _Z:return`cpu1.CVT_D_W(${Q}, ${q});`;case bZ:return"cpu1.raiseUnimplemented();";case SZ:return"cpu1.raiseUnimplemented();"}return`unimplemented(${N(J.pc)},${N(J.instruction)});`},WP=function(J){const q=J.instr_fs(),Q=J.instr_fd();switch(J.fragment.usesCop1=!0,J.isTrivial=!1,H6(J.instruction)){case DZ:return"cpu1.raiseUnimplemented();";case wZ:return"cpu1.raiseUnimplemented();";case BZ:return"cpu1.raiseUnimplemented();";case CZ:return"cpu1.raiseUnimplemented();";case AZ:return"cpu1.raiseUnimplemented();";case RZ:return"cpu1.raiseUnimplemented();";case yZ:return"cpu1.raiseUnimplemented();";case EZ:return"cpu1.raiseUnimplemented();";case TZ:return`cpu1.CVT_S_L(${Q}, ${q});`;case _Z:return`cpu1.CVT_D_L(${Q}, ${q});`;case bZ:return"cpu1.raiseUnimplemented();";case SZ:return"cpu1.raiseUnimplemented();"}return`unimplemented(${N(J.pc)},${N(J.instruction)});`},FP=function(J){const q=VP[$6(J.instruction)],Q=q(J);let Z="";if(J.fragment.usesCop1=!0,J.fragment.cop1statusKnown)Z+=J.genAssert("(c.getControlU32(12) & SR_CU1) !== 0","cop1 should be enabled"),Z+=FJ(Q);else return Z+="if( (c.getControlU32(12) & SR_CU1) === 0 ) {\n",Z+=` n64js.executeCop1_disabled(${N(J.instruction)});\n`,Z+="} else {\n",Z+=" "+FJ(Q),Z+="}\n",J.isTrivial=!1,J.fragment.cop1statusKnown=!0,f(Z,J);if(J.isTrivial)return m(Z,J);return f(Z,J)},$P=function(J){return f("c.execBreakpoint();",J)},HP=function(J){if(J.length!=64)throw"Special table is unexpected size.";return J},zY=function(J){if(J.length!=32)throw"Cop table is unexpected size.";return J},GP=function(J){if(J.length!=32)throw"RegImm table is unexpected size.";return J},jP=function(J){if(J.length!=64)throw"Simple table is unexpected size.";return J},hP=function(J){if(IL)return MP[AJ(J.instruction)](J);const q=`n64js.executeOp(${J.instruction});`;return f(q,J)},kP=function(J){return NP[yJ(J.instruction)](J)},IP=function(J){return UP[RJ(J.instruction)](J)},OP=function(J){return LP[$6(J.instruction)](J)},DP=function(J){return PP[$6(J.instruction)](J)},wP=function(J){return f("c.execRESERVED(0);",J)},kL=!1,O$=!1,IL=!0,D$=0,w$=1,B$=2,C$=3,A$=4,R$=5,y$=6,E$=7,DZ=8,wZ=9,BZ=10,CZ=11,AZ=12,RZ=13,yZ=14,EZ=15,TZ=32,_Z=33,bZ=36,SZ=37;class KY{constructor(){this.fragment=void 0,this.pc=0,this.instruction=0,this.postPC=0,this.bailOut=!1,this.nextPC=0,this.needsDelayCheck=!0,this.isTrivial=!1,this.delayedPCUpdate=0,this.dump=!1}genAssert(J,q){if(kL)return"window.n64jsAssert("+J+', "'+q+'");\n';return""}newFragment(){this.delayedPCUpdate=0}set(J,q,Q,Z,X){this.fragment=J,this.pc=q,this.instruction=Q,this.postPC=Z,this.nextPC=X,this.bailOut=!1,this.needsDelayCheck=!0,this.isTrivial=!1,this.dump=!1}instr_rs(){return y(this.instruction)}instr_rt(){return D(this.instruction)}instr_rd(){return u(this.instruction)}instr_sa(){return e0(this.instruction)}instr_fs(){return z0(this.instruction)}instr_ft(){return f6(this.instruction)}instr_fd(){return J8(this.instruction)}instr_base(){return o(this.instruction)}instr_offset(){return H0(this.instruction)}instr_imms(){return g(this.instruction)}instr_imm(){return q8(this.instruction)}instr_tlbop(){return EJ(this.instruction)}}var NP=HP([DL,C,wL,BL,CL,C,AL,RL,p2,f2,C,C,fL,pL,C,mL,rL,iL,sL,tL,yL,C,EL,TL,eL,J2,Z2,X2,q2,Q2,Y2,K2,z2,F2,H2,j2,L2,V2,P2,U2,C,C,M2,h2,W2,$2,G2,N2,cL,oL,dL,lL,nL,C,aL,C,_L,C,SL,xL,bL,C,vL,uL]),LP=zY([w2,B2,C,C,C2,A2,C,C,C,C,C,C,C,C,C,C,R2,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C]),VP=zY([sV,iV,JP,QP,tV,eV,qP,ZP,XP,C,C,C,C,C,C,C,YP,KP,C,C,zP,WP,C,C,C,C,C,C,C,C,C,C]),PP=zY([y2,E2,T2,_2,b2,S2,v2,x2,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C]),UP=GP([s2,t2,i2,e2,C,C,C,C,XV,YV,KV,zV,WV,C,FV,C,JV,qV,QV,ZV,C,C,C,C,C,C,C,C,C,C,C,C]),MP=jP([kP,IP,u2,g2,m2,o2,l2,a2,k2,O2,$V,HV,GV,jV,NV,LV,OP,FP,DP,wP,c2,d2,n2,r2,I2,D2,wV,BV,$P,C,C,gL,VV,UV,OV,hV,PV,MV,DV,kV,TV,_V,vV,bV,uV,gV,xV,rV,dV,CV,RV,yV,lV,AV,EV,IV,nV,fV,mV,cV,aV,pV,oV,SV]);window.n64jsAssert=(J,q)=>{J0(J,q)};var CP=function(J){const q=J<256?BigInt(J)+256n:(BigInt(J)-256n<<1n)+512n;let Q=1n<<17n,Z=512n;while(Z!=0){while(q*(Q+Z)*(Q+Z)<1n<<44n)Q+=Z;Z>>=1n}return Number(Q>>1n&0xffffn)};function WY(J){if(J==-32768)return 4294901760;else if(J==0)return 2147483647;const q=J>>>0>4294934528?J-1:J,Q=q>>31,Z=q^Q,X=Math.clz32(Z)+1,K=Z<>>23;return(65536|BP[K])<<14>>>32-X^Q}function FY(J){if(J==-32768)return 4294901760;else if(J==0)return 2147483647;const q=J>>>0>4294934528?J-1:J,Q=q>>31,Z=q^Q,X=Math.clz32(Z)+1,K=Z<>>24|(X&1)<<8;return(65536|AP[K])<<14>>>(32-X>>1)^Q}var BP=function(){const J=[];J.push(65535);for(let q=1;q<512;q++){const Q=(1n<<34n)/(BigInt(q)+512n);J.push(Number(Q+1n>>8n&0xffffn))}return J}(),AP=function(){const J=[];for(let q=0;q<512;q++)J.push(CP(q));return J}();function e$(J){F=J.rsp}var J4=function(J){return J&63},T8=function(J){return(J&65535)<<16>>16},HY=function(J){return J>>>6&31},G0=function(J){return J>>>11&31},c=function(J){return J>>>16&31},e=function(J){return J>>>21&31},RP=function(J){return J>>>26&63},yP=function(J){return J>>>21&31},m0=function(J){return J>>>16&31},T0=function(J){return J>>>7&15},EP=function(J){return(J&127)<<25>>25},r=function(J){return J>>>21&15},GY=function(J){return J>>>11&31},s=function(J){return J>>>16&31},Q0=function(J){return J>>>11&31},n=function(J){return J>>>6&31},TP=function(J){return J&67108863},vZ=function(J){return J&65535},Jq=function(J){return vZ(J)<<16>>16},_P=function(J){return J>>>21&31},q4=function(J,q){return J&4026531840|TP(q)*4},i$=function(J){return J*4},t$=function(J){return(J-$Y)*4},pP=function(J){return fP[J4(J)](J)},_8=function(J){F.disassembleAll(),n64js.halt(`RSP: unknown op, pc: ${q0(F.pc)}, instruction: ${N(J)}`)},dP=function(J){F.setRegS32(G0(J),F.getRegS32(c(J))<>>HY(J))},nP=function(J){F.setRegS32(G0(J),F.getRegS32(c(J))>>HY(J))},aP=function(J){F.setRegS32(G0(J),F.getRegS32(c(J))<<(F.getRegS32(e(J))&31))},rP=function(J){F.setRegS32(G0(J),F.getRegS32(c(J))>>>(F.getRegS32(e(J))&31))},sP=function(J){F.setRegS32(G0(J),F.getRegS32(c(J))>>(F.getRegS32(e(J))&31))},iP=function(J){F.jump(F.getRegS32(e(J)))},tP=function(J){const q=F.getRegS32(e(J));F.setRegS32(G0(J),F.nextPC+4),F.jump(q)},eP=function(J){F.halt(SP)},JU=function(J){F.setRegS32(G0(J),F.getRegS32(e(J))+F.getRegS32(c(J)))},qU=function(J){F.setRegU32(G0(J),F.getRegU32(e(J))+F.getRegU32(c(J)))},QU=function(J){F.setRegS32(G0(J),F.getRegS32(e(J))-F.getRegS32(c(J)))},ZU=function(J){F.setRegU32(G0(J),F.getRegU32(e(J))-F.getRegU32(c(J)))},XU=function(J){F.setRegU32(G0(J),F.getRegU32(e(J))&F.getRegU32(c(J)))},YU=function(J){F.setRegU32(G0(J),F.getRegU32(e(J))|F.getRegU32(c(J)))},KU=function(J){F.setRegU32(G0(J),F.getRegU32(e(J))^F.getRegU32(c(J)))},zU=function(J){F.setRegU32(G0(J),~(F.getRegU32(e(J))|F.getRegU32(c(J))))},WU=function(J){F.setRegS32(G0(J),F.getRegS32(e(J))=0,T8(J))},GU=function(J){const q=F.getRegS32(e(J))<0;F.setRegS32(jY,F.nextPC+4),F.conditionalBranch(q,T8(J))},jU=function(J){const q=F.getRegS32(e(J))>=0;F.setRegS32(jY,F.nextPC+4),F.conditionalBranch(q,T8(J))},NU=function(J){F.setRegU32(c(J),F.moveFromControl(G0(J)))},LU=function(J){F.moveToControl(G0(J),F.getRegU32(c(J)))},VU=function(J){F.setRegS16SignExtend(c(J),F.getVecU16UnalignedWrap(G0(J),T0(J)))},PU=function(J){F.setVecU16UnalignedNoWrap(G0(J),T0(J),F.getRegU32(c(J)))},UU=function(J){let q;switch(G0(J)&3){case 0:q=F.VCO<<16>>16;break;case 1:q=F.VCC<<16>>16;break;case 2:q=F.VCE;break;case 3:q=F.VCE;break}F.setRegU32(c(J),q)},MU=function(J){const q=F.getRegS32(c(J));switch(G0(J)&3){case 0:F.VCO=q;break;case 1:F.VCC=q;break;case 2:F.VCE=q;break;case 3:F.VCE=q;break}},hU=function(J,q,Q,Z){if(J>=0)return(J&~0x7fff_ffffn)!=0?Z:Number(J>>q);return(~J&~0x7fff_ffffn)!=0?Q:Number(J>>q)},kU=function(J,q,Q,Z){if(J>=0)return(J&~0x7fff_ffffn)!=0?Z:Number(J>>q);return Q},Q4=function(J){if(J<-32768)return-32768;if(J>32767)return 32767;return J},_0=function(J){const q=Q0(J),Q=s(J);for(let Z=0,X=F.vecSelectU32[r(J)];Z<8;Z++,X>>=4){const Y=F.getVecS16(q,Z),K=F.getVecS16(Q,X&7);F.setAccLow(Z,Y+K)}F.setVecZero(n(J))},IU=function(J){_0(J)},OU=function(J){_0(J)},DU=function(J){_0(J)},wU=function(J){_0(J)},BU=function(J){_0(J)},CU=function(J){_0(J)},AU=function(J){_0(J)},RU=function(J){_0(J)},yU=function(J){_0(J)},EU=function(J){_0(J)},TU=function(J){_0(J)},_U=function(J){_0(J)},bU=function(J){_0(J)},SU=function(J){_0(J)},vU=function(J){_0(J)},xU=function(J){_0(J)},uU=function(J){_0(J)},gU=function(J){_0(J)},fU=function(J){_0(J)},pU=function(J){F.vectorMulFractions(Q0(J),s(J),r(J),!1,32768),F.setVecFromAccSignedMid(n(J))},mU=function(J){F.vectorMulFractions(Q0(J),s(J),r(J),!1,32768),F.setVecFromAccUnsignedMid(n(J))},cU=function(J){F.vectorMulFractions(Q0(J),s(J),r(J),!0,0),F.setVecFromAccSignedMid(n(J))},oU=function(J){F.vectorMulFractions(Q0(J),s(J),r(J),!0,0),F.setVecFromAccUnsignedMid(n(J))},dU=function(J){F.vectorRound(Q0(J),s(J),r(J),!1),F.setVecFromAccSignedMid(n(J))},lU=function(J){F.vectorRound(Q0(J),s(J),r(J),!0),F.setVecFromAccSignedMid(n(J))},nU=function(J){F.vectorMulPartialLow(Q0(J),s(J),r(J),!1),F.setVecFromAccLow(n(J))},aU=function(J){F.vectorMulPartialLow(Q0(J),s(J),r(J),!0),F.setVecFromAccSignedLow(n(J))},rU=function(J){F.vectorMulPartialMidM(Q0(J),s(J),r(J),!1),F.setVecFromAccMid(n(J))},sU=function(J){F.vectorMulPartialMidM(Q0(J),s(J),r(J),!0),F.setVecFromAccSignedMid(n(J))},iU=function(J){F.vectorMulPartialMidN(Q0(J),s(J),r(J),!1),F.setVecFromAccLow(n(J))},tU=function(J){F.vectorMulPartialMidN(Q0(J),s(J),r(J),!0),F.setVecFromAccSignedLow(n(J))},eU=function(J){F.vectorMulPartialHigh(Q0(J),s(J),r(J),!1),F.setVecFromAccSignedMid(n(J))},J1=function(J){F.vectorMulPartialHigh(Q0(J),s(J),r(J),!0),F.setVecFromAccSignedMid(n(J))},q1=function(J){const q=Q0(J),Q=s(J);for(let Z=0,X=F.vecSelectU32[r(J)];Z<8;Z++,X>>=4){const Y=F.getVecS16(q,Z),K=F.getVecS16(Q,X&7),z=BigInt(Y*K)<<16n;F.setAccS48(Z,z+(z<0?0x1f0000n:0n))}F.setVecFromAccOddified(n(J))},Q1=function(J){for(let q=0;q<8;q++){const Q=F.getAccS48(q);let Z=0n;if((Q&0x20_0000n)==0){const X=Q>>22n;if(X<0)Z=0x20_0000n;else if(X>0)Z=-0x20_0000n}F.setAccS48(q,Q+Z)}F.setVecFromAccOddified(n(J))},Z1=function(J){const q=Q0(J),Q=s(J),Z=F.VCO,X=F.vecTemp;for(let Y=0,K=F.vecSelectU32[r(J)];Y<8;Y++,K>>=4){const z=F.getVecS16(q,Y),W=F.getVecS16(Q,K&7),G=Z>>Y&1,H=z+W+G;F.setAccLow(Y,H),X.setInt16(Y*2,Q4(H))}F.setVecFromTemp(n(J)),F.VCO=0},X1=function(J){const q=Q0(J),Q=s(J),Z=F.VCO,X=F.vecTemp;for(let Y=0,K=F.vecSelectU32[r(J)];Y<8;Y++,K>>=4){const z=F.getVecS16(q,Y),W=F.getVecS16(Q,K&7),G=Z>>Y&1,H=z-(W+G);F.setAccLow(Y,H),X.setInt16(Y*2,Q4(H))}F.setVecFromTemp(n(J)),F.VCO=0},Y1=function(J,q){if(J<0)return-q;if(J>0)return q;return 0},K1=function(J){const q=Q0(J),Q=s(J),Z=F.vecTemp;for(let X=0,Y=F.vecSelectU32[r(J)];X<8;X++,Y>>=4){const K=F.getVecS16(q,X),z=F.getVecU16(Q,Y&7),W=K<0&&z==32768,G=Y1(K,z);F.setAccLow(X,W?32768:G),Z.setInt16(X*2,W?32767:G)}F.setVecFromTemp(n(J))},z1=function(J){const q=Q0(J),Q=s(J);let Z=0;for(let X=0,Y=F.vecSelectU32[r(J)];X<8;X++,Y>>=4){const K=F.getVecU16(q,X),z=F.getVecU16(Q,Y&7),W=K+z;F.setAccLow(X,W),Z|=W&~65535?1<>=4){const K=F.getVecU16(q,X),z=F.getVecU16(Q,Y&7),W=K-z;F.setAccLow(X,W),Z|=W!=0?1<>=4){const W=F.getVecS16(q,K),G=F.getVecS16(Q,z&7),H=1<>=4){const W=F.getVecS16(q,K),G=F.getVecS16(Q,z&7),H=1<>=4){const W=F.getVecS16(q,K),G=F.getVecS16(Q,z&7),H=1<>=4){const W=F.getVecS16(q,K),G=F.getVecS16(Q,z&7),H=1<G||W==G&&!V,M=P?W:G;X|=P?H:0,F.setAccLow(K,M)}F.setVecFromAccLow(n(J)),F.setVCCHiLo(Y,X),F.VCO=0},P1=function(J){const q=Q0(J),Q=s(J),Z=F.VCCHi,X=F.VCCLo,Y=F.VCE,K=F.VCOHi,z=F.VCOLo;let W=0,G=0;for(let H=0,j=F.vecSelectU32[r(J)];H<8;H++,j>>=4){const L=F.getVecU16(q,H),V=F.getVecU16(Q,j&7);let P=X>>H&1,M=Z>>H&1;const k=Y>>H&1,O=~(K>>H)&1,R=z>>H&1;let S;if(R){if(O){const T=L+V&65535,b=L+V>65535;P=!k&&(!T&&!b)||k&&(!T||!b)}S=P?-V:L}else{if(O)M=L-V>=0;S=M?V:L}F.setAccLow(H,S),W|=M<>=4){const H=F.getVecS16(q,W),j=F.getVecS16(Q,G&7);let L,V,P,M,k;const O=(H^j)<0;if(O){const R=H+j<<16>>16;V=j<0,L=R<=0,P=R==-1,M=R!=0&&H!=~j,k=L?-j:H}else{const R=H-j<<16>>16;L=j<0,V=R>=0,P=0,M=R!=0,k=V?j:H}F.setAccLow(W,k),Z|=V<>=4){const z=F.getVecS16(q,Y),W=F.getVecS16(Q,K&7);let G,H,j;if((z^W)<0)H=W<0,G=z+W+1<=0,j=G?~W:z;else G=W<0,H=z-W>=0,j=H?W:z;X|=G<>=1,Y>>=4){const K=F.getVecU16(q,X),z=F.getVecU16(Q,Y&7),W=Z&1?K:z;F.setAccLow(X,W)}F.setVecFromAccLow(n(J)),F.VCO=0},k1=function(J){qq(J,(q,Q)=>q&Q)},I1=function(J){qq(J,(q,Q)=>~(q&Q))},O1=function(J){qq(J,(q,Q)=>q|Q)},D1=function(J){qq(J,(q,Q)=>~(q|Q))},w1=function(J){qq(J,(q,Q)=>q^Q)},B1=function(J){qq(J,(q,Q)=>~(q^Q))},qq=function(J,q){const Q=Q0(J),Z=s(J);for(let X=0,Y=F.vecSelectU32[r(J)];X<8;X++,Y>>=4){const K=F.getVecU16(Q,X),z=F.getVecU16(Z,Y&7);F.setAccLow(X,q(K,z))}F.setVecFromAccLow(n(J))},C1=function(J){const q=s(J),Q=n(J),Z=GY(J)&7,X=F.vecSelectU32[r(J)];for(let Y=0,K=X;Y<8;Y++,K>>=4){const z=F.getVecS16(q,K&7);F.setAccLow(Y,z)}F.setVecS16(Q,Z&7,F.getVecS16(q,X>>4*Z&7))},Z4=function(J,q){for(let Q=0,Z=F.vecSelectU32[q];Q<8;Q++,Z>>=4){const X=F.getVecS16(J,Z&7);F.setAccLow(Q,X)}},X4=function(J){const q=s(J),Q=r(J);Z4(q,Q),F.divDP=!0,F.divIn=F.getVecS16(q,Q&7),F.setVecS16(n(J),GY(J)&7,F.divOut)},xZ=function(J,q,Q){const Z=s(J),X=r(J),Y=F.getVecS16(Z,X&7),K=Q&&F.divDP?F.divIn<<16|Y&65535:Y;Z4(Z,X);const z=q(K);F.divDP=!1,F.divOut=z>>16,F.setVecS16(n(J),GY(J)&7,z&65535)},A1=function(J){xZ(J,WY,!1)},R1=function(J){xZ(J,WY,!0)},y1=function(J){X4(J)},E1=function(J){xZ(J,FY,!1)},T1=function(J){xZ(J,FY,!0)},_1=function(J){X4(J)},b1=function(J){},S1=function(J){},v1=function(J){F.jump(q4(F.pc,J))},x1=function(J){F.setRegS32(jY,F.nextPC+4),F.jump(q4(F.pc,J))},u1=function(J){F.conditionalBranch(F.getRegS32(e(J))===F.getRegS32(c(J)),T8(J))},g1=function(J){F.conditionalBranch(F.getRegS32(e(J))!==F.getRegS32(c(J)),T8(J))},f1=function(J){F.conditionalBranch(F.getRegS32(e(J))<=0,T8(J))},p1=function(J){F.conditionalBranch(F.getRegS32(e(J))>0,T8(J))},m1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))+Jq(J))},c1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))+Jq(J))},o1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))>>0?1:0)},l1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))&vZ(J))},n1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))|vZ(J))},a1=function(J){F.setRegS32(c(J),F.getRegS32(e(J))^vZ(J))},r1=function(J){F.setRegS32(c(J),Jq(J)<<16)},s1=function(J){F.setRegS32(c(J),F.loadS8(F.calcAddress(J)))},i1=function(J){F.setRegU32(c(J),F.loadU8(F.calcAddress(J)))},t1=function(J){F.setRegS32(c(J),F.loadS16(F.calcAddress(J)))},e1=function(J){F.setRegU32(c(J),F.loadU16(F.calcAddress(J)))},JM=function(J){F.setRegS32(c(J),F.loadS32(F.calcAddress(J)))},qM=function(J){F.setRegU32(c(J),F.loadU32(F.calcAddress(J)))},QM=function(J){F.store8(F.calcAddress(J),F.getRegS32(c(J)))},ZM=function(J){F.store16(F.calcAddress(J),F.getRegS32(c(J)))},XM=function(J){F.store32(F.calcAddress(J),F.getRegS32(c(J)))},uZ=function(J,q){const Q=F.calcVecAddress(J,q),Z=m0(J),X=T0(J),Y=16-X>1,K=q&~7,z=(q&8)+Z;for(let W=0;W<8;W++){const G=Y+W&7;F.setVecS8(X+G,W*2+0,F.loadU8(K+(z+W*2+0&15))),F.setVecS8(X+G,W*2+1,F.loadU8(K+(z+W*2+1&15)))}},PM=function(J){gZ(J,1)},UM=function(J){gZ(J,2)},MM=function(J){gZ(J,4)},hM=function(J){gZ(J,8)},kM=function(J){const q=F.calcVecAddress(J,16),Q=(q&4080)+16,Z=m0(J),X=T0(J);let Y=Q-q;for(let K=0;K>>K;F.store8(q+X,z)}},DM=function(J){const q=F.calcVecAddress(J,8),Q=m0(J),Z=T0(J);for(let X=0;X<8;X++){const Y=Z+X,K=Y&8?8:7,z=F.getVecS16(Q,Y&7)>>>K;F.store8(q+X,z)}},wM=function(J){const q=F.calcVecAddress(J,16),Q=m0(J),Z=T0(J),X=q&7,Y=q-X;for(let K=0;K<8;K++){const z=Z+K*2,W=X+K*2&15,G=F.getVecU16UnalignedWrap(Q,z)>>>7;F.store8(Y+W,G)}},CM=function(J){const q=F.calcVecAddress(J,16),Q=m0(J),Z=T0(J),X=q&7,Y=q-X,K=BM.get(Z);if(K)for(let z=0;z<4;z++){const W=X+z*4&15;F.store8(Y+W,F.getVecU16(Q,K[z])>>>7)}else for(let z=0;z<4;z++){const W=X+z*4&15;F.store8(Y+W,0)}},AM=function(J){const q=F.calcVecAddress(J,16),Q=m0(J),Z=T0(J),X=q&7,Y=q-X;for(let K=0;K<16;K++){const z=Z+K&15,W=X+K&15;F.store8(Y+W,F.getVecS8(Q,z))}},RM=function(J){const q=F.calcVecAddress(J,16),Q=m0(J),Z=T0(J),X=q&4088,Y=q&15,K=q&8,z=Q&~7,W=Z-(q&8)>>1;for(let G=0;G<16;G++){const H=X+(Y+G&15),j=z+(W+(G>>1)&7),L=K+G&15;F.store8(H,F.getVecS8(j,L))}};window.n64js=window.n64js||{};var F,jY=31,v$=0,x$=1,u$=2,g$=3,f$=4,p$=5,m$=6,c$=7,$Y=8,o$=9,d$=10,l$=11,n$=12,a$=13,r$=14,s$=15;var bP=1,SP=2;class NY{constructor(J){this.hardware=J,this.dmem=J.sp_mem.subRegion(0,4096),this.imem=J.sp_mem.subRegion(4096,4096),this.imemDV=this.imem.dataView,this.halted=!0,this.runEvent=null,this.pcDataView=J.sp_ibist_mem.dataView,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0;const q=new ArrayBuffer(128);this.gprU32=new Uint32Array(q),this.gprS32=new Int32Array(q);const Q=new ArrayBuffer(512);this.vpr=new DataView(Q),this.vprS16=new Int16Array(Q),this.vprS8=new Int8Array(Q),this.vprU64=new BigUint64Array(Q);const Z=new ArrayBuffer(64);this.vAcc=new BigInt64Array(Z),this.vAccS32=new Int32Array(Z),this.vAccU32=new Uint32Array(Z),this.vAccS16=new Int16Array(Z),this.vAccU16=new Uint16Array(Z),this.vuVCOReg=new Uint16Array(new ArrayBuffer(2)),this.vuVCCReg=new Uint16Array(new ArrayBuffer(2)),this.vuVCEReg=new Uint8Array(new ArrayBuffer(1)),this.divDP=!1,this.divIn=0,this.divOut=0,this.vecSelectU32=new Uint32Array(new ArrayBuffer(64)),this.vecSelectU32[0]=1985229328,this.vecSelectU32[1]=1985229328,this.vecSelectU32[2]=1715741184,this.vecSelectU32[3]=2002072337,this.vecSelectU32[4]=1145307136,this.vecSelectU32[5]=1431638289,this.vecSelectU32[6]=1717969442,this.vecSelectU32[7]=2004300595,this.vecSelectU32[8]=0,this.vecSelectU32[9]=286331153,this.vecSelectU32[10]=572662306,this.vecSelectU32[11]=858993459,this.vecSelectU32[12]=1145324612,this.vecSelectU32[13]=1431655765,this.vecSelectU32[14]=1717986918,this.vecSelectU32[15]=2004318071;const X=new ArrayBuffer(128);this.vecTemp=new DataView(X),this.vecTempU64=new BigUint64Array(X),this.reset()}reset(){this.halted=!0,this.runEvent=null,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0;for(let J=0;J<32;++J){this.gprS32[J]=0;for(let q=0;q<8;q++)this.vprS16[J*8+q]=0}this.vAcc[0]=0n,this.vuVCOReg[0]=0,this.vuVCCReg[0]=0,this.vuVCEReg[0]=0,this.divDP=!1,this.divIn=0,this.divOut=0}getRegS32(J){return this.gprS32[J]}getRegU32(J){return this.gprU32[J]}setRegS32(J,q){if(J!=0)this.gprS32[J]=q}setRegU32(J,q){if(J!=0)this.gprU32[J]=q}setRegS16SignExtend(J,q){if(J!=0)this.gprS32[J]=q<<16>>16}getAccS48(J){return this.vAcc[J]}setAccS48(J,q){this.vAcc[J]=BigInt.asIntN(48,q)}updateAccLow32(J,q,Q){this.updateAccHiLo(J,0,q,Q)}updateAccMid32(J,q,Q){const Z=q>=0?0:-1,X=q|0;this.updateAccHiLo(J,Z,X,Q)}updateAccHigh32(J,q,Q){this.updateAccHiLo(J,q>>16,q<<16,Q)}updateAccHiLo(J,q,Q,Z){if(Z){const X=this.vAccS32[J*2+1],Y=this.vAccU32[J*2+0],K=Y+Q,z=(Y&Q|(Y|Q)&~K)>>>31,W=X+q+z;this.vAccS32[J*2+1]=W<<16>>16,this.vAccU32[J*2+0]=K}else this.vAccU32[J*2+1]=q,this.vAccU32[J*2+0]=Q}setAccLow(J,q){this.vAccS16[J*4+0]=q}getAccLow(J){return this.vAccS16[J*4+0]}setAccMid(J,q){this.vAccS16[J*4+1]=q}getAccMid(J){return this.vAccS16[J*4+1]}setAccHigh(J,q){this.vAccS16[J*4+2]=q}getAccHigh(J){return this.vAccS16[J*4+2]}getAccHighMid(J){return this.vAccS16[J*4+2]<<16|this.vAccU16[J*4+1]}setVecFromAccSignedMid(J){for(let q=0;q<8;q++){const Q=this.getAccHighMid(q);let Z;if(Q>=0)Z=Q&4294934528?32767:Q;else Z=~Q&4294934528?32768:Q;this.setVecS16(J,q,Z)}}setVecFromAccSignedLow(J){for(let q=0;q<8;q++){const Q=this.getAccHighMid(q),Z=this.getAccLow(q);let X;if(Q>=0)X=Q&4294934528?65535:Z;else X=~Q&4294934528?0:Z;this.setVecS16(J,q,X)}}setVecFromAccOddified(J){for(let q=0;q<8;q++)this.setVecS16(J,q,hU(this.vAcc[q]>>1n,16n,32768,32767)&65520)}setVecFromAccUnsignedMid(J){for(let q=0;q<8;q++)this.setVecS16(J,q,kU(this.vAcc[q],16n,0,65535))}setVecFromAccMid(J){for(let q=0;q<8;q++)this.setVecS16(J,q,this.getAccMid(q))}setVecFromAccLow(J){for(let q=0;q<8;q++)this.setVecS16(J,q,this.getAccLow(q))}vectorMulFractions(J,q,Q,Z,X){for(let Y=0,K=this.vecSelectU32[Q];Y<8;Y++,K>>=4){const z=this.getVecS16(J,Y),W=this.getVecS16(q,K&7),G=z*W*2+X;this.updateAccMid32(Y,G,Z)}}vectorMulPartialLow(J,q,Q,Z){for(let X=0,Y=this.vecSelectU32[Q];X<8;X++,Y>>=4){const K=this.getVecU16(J,X),z=this.getVecU16(q,Y&7),W=K*z>>>16;this.updateAccLow32(X,W,Z)}}vectorMulPartialMidM(J,q,Q,Z){for(let X=0,Y=this.vecSelectU32[Q];X<8;X++,Y>>=4){const K=this.getVecS16(J,X),z=this.getVecU16(q,Y&7);this.updateAccMid32(X,K*z,Z)}}vectorMulPartialMidN(J,q,Q,Z){for(let X=0,Y=this.vecSelectU32[Q];X<8;X++,Y>>=4){const K=this.getVecU16(J,X),z=this.getVecS16(q,Y&7);this.updateAccMid32(X,K*z,Z)}}vectorMulPartialHigh(J,q,Q,Z){for(let X=0,Y=this.vecSelectU32[Q];X<8;X++,Y>>=4){const K=this.getVecS16(J,X),z=this.getVecS16(q,Y&7);this.updateAccHigh32(X,K*z,Z)}}vectorRound(J,q,Q,Z){const X=J&1?16:0;for(let Y=0,K=this.vecSelectU32[Q];Y<8;Y++,K>>=4){const z=this.getAccS48(Y),W=this.getVecS16(q,K&7)<=0:z<0;this.setAccS48(Y,z+(G?BigInt(W):0n))}}get VCO(){return this.vuVCOReg[0]}get VCOHi(){return this.vuVCOReg[0]>>>8&255}get VCOLo(){return this.vuVCOReg[0]>>>0&255}get VCC(){return this.vuVCCReg[0]}get VCCHi(){return this.vuVCCReg[0]>>>8&255}get VCCLo(){return this.vuVCCReg[0]>>>0&255}get VCE(){return this.vuVCEReg[0]}set VCO(J){this.vuVCOReg[0]=J}set VCC(J){this.vuVCCReg[0]=J}set VCE(J){this.vuVCEReg[0]=J}setVCOHiLo(J,q){this.vuVCOReg[0]=J<<8|q}setVCCHiLo(J,q){this.vuVCCReg[0]=J<<8|q}getVecS16(J,q){return this.vpr.getInt16(16*J+q*2,!1)}getVecU16(J,q){return this.vpr.getUint16(16*J+q*2,!1)}getVecS8(J,q){return this.vpr.getInt8(16*J+q,!1)}getVecU8(J,q){return this.vpr.getUint8(16*J+q,!1)}setVecZero(J){this.vprU64[J*2+0]=0n,this.vprU64[J*2+1]=0n}setVecFromTemp(J){this.vprU64[J*2+0]=this.vecTempU64[0],this.vprU64[J*2+1]=this.vecTempU64[1]}setVecS16(J,q,Q){this.vpr.setInt16(16*J+q*2,Q,!1)}setVecS8(J,q,Q){this.vpr.setInt8(16*J+q,Q,!1)}getVecU16UnalignedWrap(J,q){const Q=this.getVecU8(J,q&15),Z=this.getVecU8(J,q+1&15);return Q<<8|Z}setVecU16UnalignedNoWrap(J,q,Q){if(this.setVecS8(J,q+0,Q>>8),q<15)this.setVecS8(J,q+1,Q)}sprintVecReg(J){let q=[];for(let Q=0;Q<8;Q++)q.push(q0(this.getVecS16(J,Q)));return`V${J}: [${q.join(", ")}]`}loadU8(J){return this.dmem.getU8(J&4095)}loadU16(J){return J<=4094?this.dmem.getU16(J):this.loadU16Wrapped(J)}loadU32(J){return J<=4092?this.dmem.getU32(J):this.loadU32Wrapped(J)}loadS8(J){return this.dmem.getS8(J&4095)}loadS16(J){return J<=4094?this.dmem.getS16(J):this.loadS16Wrapped(J)}loadS32(J){return J<=4092?this.dmem.getS32(J):this.loadS32Wrapped(J)}store8(J,q){return this.dmem.set8(J&4095,q)}store16(J,q){return J<=4094?this.dmem.set16(J,q):this.store16Wrapped(J,q)}store32(J,q){return J<=4092?this.dmem.set32(J,q):this.store32Wrapped(J,q)}store32masked(J,q,Q){const X=this.loadU32(J,!1)&~Q|q&Q;this.store32(J,X)}loadU16Wrapped(J){return(this.loadU8(J+0)<<8|this.loadU8(J+1)<<0)>>>0}loadS16Wrapped(J){return this.loadU16Wrapped(J)<<16>>16}loadU32Wrapped(J){return(this.loadU8(J+0)<<24|this.loadU8(J+1)<<16|this.loadU8(J+2)<<8|this.loadU8(J+3)<<0)>>>0}loadS32Wrapped(J){return this.loadU32Wrapped(J)>>0}store16Wrapped(J,q){this.store8(J+0,q>>>8),this.store8(J+1,q>>>0)}store32Wrapped(J,q){this.store8(J+0,q>>>24),this.store8(J+1,q>>>16),this.store8(J+2,q>>>8),this.store8(J+3,q>>>0)}calcDebuggerAddress(J){return this.calcAddress(J)+2751463424}calcAddress(J){return this.getRegS32(_P(J))+Jq(J)&4095}calcVecAddress(J,q){return this.getRegS32(yP(J))+EP(J)*q&4095}conditionalBranch(J,q){const Q=J?q*4:4;this.branchTarget=this.pc+4+Q|4096}jump(J){this.branchTarget=J>>>0|4096}unhalt(){if(this.halted=!1,this.runEvent)this.runEvent.stop();this.runEvent=this.hardware.timeline.startEvent("RSP")}step(){if(this.halted)return;this.nextPC=(this.delayPC||this.pc+4)&4092;const J=this.imemDV.getUint32(this.pc,!1);this.branchTarget=0,this.executeOp(J),this.pc=this.nextPC,this.delayPC=this.branchTarget}halt(J){if(this.hardware.spRegDevice.setStatusBits(J|bP),this.halted=!0,this.runEvent)this.runEvent.stop(),this.runEvent=null}disassembleAll(){const J=s9(this.imem,0,4096);for(let q of J)console.log(`${v(q.address,16)} ${q.disassembly}`)}disassembleOp(J,q){const Q=dq(J,q);console.log(`${v(Q.address,16)} ${Q.disassembly}`)}executeOp(J){oP[RP(J)](J)}moveFromControl(J){switch(J){case v$:case x$:case u$:case g$:case f$:case p$:case m$:case c$:return this.hardware.spRegDevice.readRegU32(i$(J));case $Y:case o$:case d$:case l$:case n$:case a$:case r$:case s$:return this.hardware.dpcDevice.readRegU32(t$(J))}return console.log(`MFC0: ${J} unhandled - returning 0`),0}moveToControl(J,q){switch(J){case v$:case x$:case u$:case g$:case f$:case p$:case m$:case c$:this.hardware.spRegDevice.writeReg32(i$(J),q);break;case $Y:case o$:case d$:case l$:case n$:case a$:case r$:case s$:this.hardware.dpcDevice.writeReg32(t$(J),q);break;default:console.log(`Unhandled RSP MTC0 register: ${J} = ${N(q)}`);break}}}var vP=(()=>{let J=[];for(let q=0;q<64;q++)J[q]=_8;return J[0]=dP,J[2]=lP,J[3]=nP,J[4]=aP,J[6]=rP,J[7]=sP,J[8]=iP,J[9]=tP,J[13]=eP,J[32]=JU,J[33]=qU,J[34]=QU,J[35]=ZU,J[36]=XU,J[37]=YU,J[38]=KU,J[39]=zU,J[42]=WU,J[43]=FU,J})(),xP=(()=>{let J=[];for(let q=0;q<32;q++)J.push(_8);return J[0]=$U,J[1]=HU,J[16]=GU,J[17]=jU,J})(),uP=(()=>{let J=[];for(let q=0;q<32;q++)J.push(_8);return J[0]=NU,J[4]=LU,J})(),gP=(()=>{let J=[];for(let q=0;q<32;q++)J.push(_8);J[0]=VU,J[2]=UU,J[4]=PU,J[6]=MU;for(let q=16;q<32;q++)J[q]=pP;return J})(),fP=(()=>{let J=[];for(let q=0;q<64;q++)J.push(_8);return J[0]=pU,J[1]=mU,J[2]=lU,J[3]=q1,J[4]=nU,J[5]=rU,J[6]=iU,J[7]=eU,J[8]=cU,J[9]=oU,J[10]=dU,J[11]=Q1,J[12]=aU,J[13]=sU,J[14]=tU,J[15]=J1,J[16]=Z1,J[17]=X1,J[18]=IU,J[19]=K1,J[20]=z1,J[21]=W1,J[22]=OU,J[23]=DU,J[24]=wU,J[25]=BU,J[26]=CU,J[27]=AU,J[28]=RU,J[29]=G1,J[30]=yU,J[31]=EU,J[32]=j1,J[33]=N1,J[34]=L1,J[35]=V1,J[36]=P1,J[37]=U1,J[38]=M1,J[39]=h1,J[40]=k1,J[41]=I1,J[42]=O1,J[43]=D1,J[44]=w1,J[45]=B1,J[46]=TU,J[47]=_U,J[48]=A1,J[49]=R1,J[50]=y1,J[51]=C1,J[52]=E1,J[53]=T1,J[54]=_1,J[55]=b1,J[56]=bU,J[57]=SU,J[58]=vU,J[59]=xU,J[60]=uU,J[61]=gU,J[62]=fU,J[63]=S1,J})(),mP=(()=>{let J=[];for(let q=0;q<32;q++)J.push(_8);return J[0]=YM,J[1]=KM,J[2]=zM,J[3]=WM,J[4]=FM,J[5]=$M,J[6]=HM,J[7]=GM,J[8]=jM,J[9]=NM,J[10]=LM,J[11]=VM,J})(),cP=(()=>{let J=[];for(let q=0;q<32;q++)J.push(_8);return J[0]=PM,J[1]=UM,J[2]=MM,J[3]=hM,J[4]=kM,J[5]=IM,J[6]=OM,J[7]=DM,J[8]=wM,J[9]=CM,J[10]=AM,J[11]=RM,J})(),oP=(()=>{let J=[];for(let q=0;q<64;q++)J.push(_8);return J[0]=(q)=>vP[J4(q)](q),J[1]=(q)=>xP[c(q)](q),J[2]=v1,J[3]=x1,J[4]=u1,J[5]=g1,J[6]=f1,J[7]=p1,J[8]=m1,J[9]=c1,J[10]=o1,J[11]=d1,J[12]=l1,J[13]=n1,J[14]=a1,J[15]=r1,J[16]=(q)=>uP[e(q)](q),J[18]=(q)=>gP[e(q)](q),J[32]=s1,J[33]=t1,J[35]=JM,J[36]=i1,J[37]=e1,J[39]=qM,J[40]=QM,J[41]=ZM,J[43]=XM,J[50]=(q)=>mP[G0(q)](q),J[58]=(q)=>cP[G0(q)](q),J})(),F1=8,$1=9,H1=10,BM=new Map([[0,[0,1,2,3]],[1,[6,7,4,5]],[4,[1,2,3,0]],[5,[7,4,5,6]],[8,[4,5,6,7]],[11,[3,0,1,2]],[12,[5,6,7,4]],[15,[0,1,2,3]]]);function N4(J){U=J.cpu0,i=J.cpu1,$J=J.cpu2,fF(J,U),n64js.cpu0=U}var Nh=function(J){return J>>>13},Lh=function(J){return(J&H9)>>pM},Vh=function(J){return(J&hY)>>fM},kY=function(J,q,Q){return(~(J^q)&(Q^J)&V4)!=0},U4=function(J,q,Q){return((J^q)&(Q^J)&V4)!=0},IY=function(J,q,Q){return(~(J^q)&(Q^J)&P4)!=0n},M4=function(J,q,Q){return((J^q)&(Q^J)&P4)!=0n},DY=function(J){return J>>13&4095},Uh=function(J){const Q=DY(J)&2730;return(Q|Q>>1)<<13},Mh=function(J){const q=DY(J);if(q&2048)return 1<<24;if(q&512)return 1<<22;if(q&128)return 1<<20;if(q&32)return 1<<18;if(q&8)return 1<<16;if(q&2)return 1<<14;return 1<<12},hh=function(J){const q=Ph.get(J);if(q)return q;return`Unknown(${DY(J).toString(2)})`},B=function(J){throw`CPU: unknown op, pc: ${N(U.pc)}, instruction: ${N(J)}`},G4=function(){},kh=function(J){return J&~3758096384},j4=function(J){return kh(J>>>0)>>>4},Ih=function(J){J0((J>>>18&7)===0,"cc bit is not 0");const q=(J&65536)!==0,Q=(J&131072)!==0,X=(i.control[31]&L4)!==0===q;if(Q)U.conditionalBranchLikely(X,H0(J));else U.conditionalBranch(X,H0(J))},Oh=function(J){if(J.length!=64)throw"Special table is unexpected size.";return J},wh=function(J){Dh[yJ(J)](J)},CY=function(J){if(J.length!=32)throw"Cop table is unexpected size.";return J},Ch=function(J){Bh[$6(J)](J)},Rh=function(J){Ah[$6(J)](J)},Eh=function(J){yh[$6(J)](J)},Th=function(J){U.raiseRESERVEDException(0)},AY=function(J){J0((U.getControlU32(S0)&OY)===0,"SR_CU1 in inconsistent state"),U.raiseCopXUnusable(1)},_h=function(J){if(J.length!=32)throw"RegImm table is unexpected size.";return J},Sh=function(J){return bh[RJ(J)](J)},vh=function(J){if(J.length!=64)throw"Simple table is unexpected size.";return J},k4=function(J){return I4[AJ(J)](J)},xh=function(J,q,Q){return J-=q,J-=Q,J^=Q>>>13,q-=Q,q-=J,q^=J<<8,Q-=J,Q-=q,Q^=q>>>13,J-=q,J-=Q,J^=Q>>>12,q-=Q,q-=J,q^=J<<16,Q-=J,Q-=q,Q^=q>>>5,J-=q,J-=Q,J^=Q>>>3,q-=Q,q-=J,q^=J<<10,Q-=J,Q-=q,Q^=q>>>15,J},uh=function(J,q){if(!J.sync32(q,"pc"))return!1;{let Q=0;for(let Z=0;Z<32;++Z)Q=xh(Q,U.getRegU32Lo(Z),0);if(Q=Q>>>0,!J.sync32(Q,"regs"))return!1}return!0},gh=function(J,q,Q){if(Q.nextEventCountdown()8&&Z.pc!==q+4||J.opsCompiled>=yM||Z.stuffToDo)ph(J),J=nq(Z.pc);else J.bodyCode+=`// Keep going: ops ${J.opsCompiled}, pc: ${N(Z.pc)}, entry+4: ${N(q+4)}, stuff: ${Z.stuffToDo}\n`;return J},ph=function(J){let q="";if(n64js.getSyncFlow())q+="const sync = n64js.getSyncFlow();\n";if(J.usesCop1)q+=`const SR_CU1 = ${N(OY)};\n`,q+=`const FPCSR_C = ${N(L4)};\n`;if(Qq.delayedPCUpdate!==0)J.bodyCode+=`c.pc = ${N(Qq.delayedPCUpdate)};\n`,Qq.delayedPCUpdate=0;J.bodyCode+=`return ${J.opsCompiled};\n`;const Z=` return function fragment_${N(J.entryPC)}_${J.opsCompiled}() { ${q} ${J.bodyCode} }`;J.bodyCode="",J.func=new Function("c","cpu1","rsp",Z)(U,i,F),J.nextFragments=[];for(let X=0;Xi8;var V4=2147483648,P4=0x8000_0000_0000_0000n,pZ=4294967295,S6=0xffff_ffff_ffff_ffffn,H4=0xffff_ffffn;n64js.s32CheckAddOverflow=kY;n64js.s32CheckSubOverflow=U4;n64js.s64CheckAddOverflow=IY;n64js.s64CheckSubOverflow=M4;class h4{constructor(){this.pagemask=0,this.hi=0n,this.pfne=0,this.pfno=0,this.global=0,this.offsetMask=0,this.vpnmask64=H9,this.vpn2bits=0n,this.physEven=0,this.physOdd=0,this.checkbit=0}update(J,q,Q,Z,X){if(mZ)h(`TLB update: index=${J}, pagemask=${N(q)}, entryhi=${U8(Q)}, entrylo0=${N(Z)}, entrylo1=${N(X)}`),h(` ${hh(q)} Pagesize`);const Y=Z&X&UY;this.pagemask=Uh(q),this.hi=Q,this.pfne=Z&~UY|Y,this.pfno=X&~UY|Y,this.global=Y,this.offsetMask=(this.pagemask|Fh)>>>1,this.vpnmask64=H9&BigInt(~this.pagemask),this.vpn2bits=Q&this.vpnmask64,this.physEven=this.pfne<<6&~this.offsetMask,this.physOdd=this.pfno<<6&~this.offsetMask,this.checkbit=Mh(this.pagemask)}}var Ph=new Map([[Qh,"4k"],[Zh,"16k"],[Xh,"64k"],[Yh,"256k"],[Kh,"1M"],[zh,"4M"],[Wh,"16M"]]);class wY{constructor(J){this.hardware=J,this.opsExecuted=0,this.ramDV=J.cachedMemDevice.mem.dataView;const q=new ArrayBuffer(256);this.gprU32=new Uint32Array(q),this.gprS32=new Int32Array(q),this.gprU64=new BigUint64Array(q),this.gprS64=new BigInt64Array(q);const Q=new ArrayBuffer(256);this.controlRegU32=new Uint32Array(Q),this.controlRegS32=new Int32Array(Q),this.controlRegU64=new BigUint64Array(Q),this.controlRegS64=new BigInt64Array(Q),this.controlCountValue=0,this.lastControlRegWrite=0n,this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0,this.llBit=0,this.stuffToDo=0,this.eventQueue=new o7;const Z=new ArrayBuffer(8);this.multHiU32=new Uint32Array(Z),this.multHiS32=new Int32Array(Z),this.multHiU64=new BigUint64Array(Z),this.multHiS64=new BigInt64Array(Z);const X=new ArrayBuffer(8);this.multLoU32=new Uint32Array(X),this.multLoS32=new Int32Array(X),this.multLoU64=new BigUint64Array(X),this.multLoS64=new BigInt64Array(X),this.tlbEntries=[];for(let Y=0;Y<32;++Y)this.tlbEntries.push(new h4);this.loadU8fast=d7,this.loadU16fast=n7,this.loadU32fast=iJ,this.loadU64fast=QJ,this.loadS8fast=l7,this.loadS16fast=a7,this.loadS32fast=Z9,this.store8fast=r7,this.store16fast=s7,this.store32fast=X9,this.store64fast=Y9,this.store32masked=qZ,this.store64masked=QZ,this.reset()}conditionalBranch(J,q){const Q=J?q*4:4;this.branchTarget=this.pc+4+Q}conditionalBranchLikely(J,q){if(J)this.branchTarget=this.pc+4+q*4;else this.nextPC+=4}jump(J){this.branchTarget=J}getOpsExecuted(){return this.controlCountValue}incrementCount(J){this.controlCountValue+=J}getRegS32Lo(J){return this.gprS32[J*2+0]}getRegU32Lo(J){return this.gprU32[J*2+0]}getRegS64(J){return this.gprS64[J]}getRegU64(J){return this.gprU64[J]}setRegU64(J,q){if(J==0)return;const Q=q&S6;this.gprU64[J]=Q}setRegU64Masked(J,q,Q){if(J==0)return;this.gprU64[J]=this.gprU64[J]&~Q|q&Q}setRegS64LoHi(J,q,Q){if(J==0)return;this.gprS32[J*2+0]=q,this.gprS32[J*2+1]=Q}setRegS32ExtendMasked(J,q,Q){if(J==0)return;const Z=this.gprS32[J*2+0]&~Q|q&Q;this.gprS32[J*2+0]=Z,this.gprS32[J*2+1]=Z>>31}setRegS32Extend(J,q){if(J==0)return;this.gprS32[J*2+0]=q,this.gprS32[J*2+1]=q>>31}setRegU32Extend(J,q){if(J==0)return;this.gprU32[J*2+0]=q,this.gprU32[J*2+1]=0}getMultLoS64(){return this.multLoS64[0]}getMultLoU64(){return this.multLoU64[0]}setMultLoS32Extend(J){this.multLoS64[0]=BigInt.asIntN(32,J)}setMultLoS64(J){this.multLoS64[0]=J}setMultLoU64(J){this.multLoU64[0]=J}getMultHiS64(){return this.multHiS64[0]}getMultHiU64(){return this.multHiU64[0]}setMultHiS32Extend(J){this.multHiS64[0]=BigInt.asIntN(32,J)}setMultHiS64(J){this.multHiS64[0]=J}setMultHiU64(J){this.multHiU64[0]=J}setControlU32(J,q){this.controlRegU32[J*2+0]=q}setControlS32(J,q){this.controlRegS32[J*2+0]=q}getControlU32(J){return this.controlRegU32[J*2+0]}getControlS32(J){return this.controlRegS32[J*2+0]}setControlS32Extend(J,q){this.controlRegS32[J*2+0]=q,this.controlRegS32[J*2+1]=q>>31}setControlU64(J,q){this.controlRegU64[J]=q}setControlS64(J,q){this.controlRegS64[J]=q}getControlU64(J){return this.controlRegU64[J]}getControlS64(J){return this.controlRegS64[J]}maskControlBits32(J,q,Q){const Z=J*2+0;this.controlRegU32[Z]=this.controlRegU32[Z]&~q|Q&q}setControlBits32(J,q){this.controlRegU32[J*2+0]|=q}clearControlBits32(J,q){this.controlRegU32[J*2+0]&=~q}maskControlBits64(J,q,Q){this.controlRegU64[J]=this.controlRegU64[J]&~q|Q&q}setControlBits64(J,q){this.controlRegU64[J]|=q}clearControlBits64(J,q){this.controlRegU64[J]&=~q}reset(){MW();for(let J=0;J<32;++J)this.gprU64[J]=0n,this.controlRegU64[J]=0n;for(let J=0;J<32;++J)this.tlbEntries[J].update(J,0,0x80000000n,0,0);this.pc=0,this.delayPC=0,this.nextPC=0,this.branchTarget=0,this.stuffToDo=0,this.eventQueue.reset(),this.multLoU32[0]=this.multLoU32[1]=0,this.multHiU32[0]=this.multHiU32[1]=0,this.setControlU32(yq,31),this.setControlU32(S0,1883242500),this.setControlU32(vq,1879499875),this.cop1ControlChanged()}cop1ControlChanged(){const J=this.getControlU32(S0),q=(J&OY)!==0;if(I4[17]=q?Rh:AY,this.hardware.cpu1)this.hardware.cpu1.fullMode=(J&EM)!==0}moveToControl(J,q){switch(this.lastControlRegWrite=q,J){case wJ:this.setControlU64(J,q&lM);break;case Eq:case Tq:this.setControlU64(J,q&oM);break;case _q:this.setControlU64(J,q&sM);break;case bq:this.setControlU64(J,q&$h);break;case kX:this.setControlU64(J,q&nM),this.setControlU64(yq,31n);break;case P8:this.setControlU64(J,q&mM);break;case yq:case Sq:case d9:case vz:break;case vq:this.maskControlBits64(J,Hh,q);break;case o0:h(`Setting cause register to ${N(q)}`),n64js.check(q===0,"Should only write 0 to Cause register."),this.maskControlBits64(J,gM,q);break;case S0:this.setControlU64(J,q&_M),this.statusRegisterChanged();break;case s8:this.controlCountValue=Number(q)*2;break;case BJ:this.setCompare(Number(q&0xffff_ffffn));break;case OX:this.maskControlBits64(J,qh,q);break;case t6:case xz:case uz:this.setControlU64(J,q);break;case l9:this.maskControlBits64(J,Gh,q);break;case IX:case DX:case wX:case BX:case CX:case AX:case RX:break;case Sz:this.setControlU64(J,q&jh);break;case xq:this.setControlU64(J,q);break;default:this.setControlU64(J,q),h(`Write to cpu0 control register. ${U8(q)} --> ${TJ[J]}`);break}}moveFromControl(J){if(J===o0)this.checkCauseIP3Consistent();switch(J){case yq:return BigInt(this.getRandom());case IX:case DX:case wX:case BX:case CX:case AX:case RX:return this.lastControlRegWrite;case s8:return BigInt(this.controlCountValue)>>1n;default:return this.getControlU64(J)}}breakExecution(){this.stuffToDo|=MY}run(J){this.stuffToDo&=~MY,this.checkCauseIP3Consistent(),n64js.hardware().checkSIStatusConsistent(),this.addRunForCyclesEvent(J);while(this.hasEvent(W9))try{this.runImpl();break}catch(Q){if(Q instanceof R6)this.handleEmulatedException();else if(Q instanceof G4)n64js.stopForBreakpoint();else{n64js.halt("Exception :"+Q);break}}let q=this.removeEvent(W9);if(q<0)q=0;if(q=0)this.addRunForCyclesEvent(q)}updateCause3(){if(n64js.hardware().miRegDevice.interruptsUnmasked())this.setControlBits32(o0,VY),this.updateStuffToDoForInterrupts();else this.clearControlBits32(o0,VY);this.checkCauseIP3Consistent()}checkCauseIP3Consistent(){const q=n64js.hardware().miRegDevice.interruptsUnmasked(),Q=(this.getControlU32(o0)&VY)!==0;J0(q===Q,`CAUSE_IP3 ${Q} inconsistent with MI_INTR_REG ${q}`)}statusRegisterChanged(){this.cop1ControlChanged(),this.updateStuffToDoForInterrupts()}checkForUnmaskedInterrupts(){const J=this.getControlU32(S0);if((J&(F9|$9|cZ))===cZ){const q=this.getControlU32(o0);if((J&q&uM)!==0)return!0}return!1}updateStuffToDoForInterrupts(){if(this.checkForUnmaskedInterrupts())this.stuffToDo|=fZ;else this.stuffToDo&=~fZ}setBadVAddr(J){this.setControlU64(Sq,J)}setContext(J){const q=Number(J&0xffffffffn),Q=Nh(q)<>0);this.setBadVAddr(Z),this.setContext(Z),this.setXContext(Z),this.maskControlBits64(P8,H9,Z),this.raiseExceptionCopCode(J,0,q)}raiseAddressException(J,q,Q){const Z=BigInt(Q>>0);this.setBadVAddr(Z),this.setContext(Z),this.setXContext(Z),this.raiseExceptionCopCode(J,0,q)}raiseExceptionCopCode(J,q,Q){const Z=W4|bM,X=Q<>0,Q=J-q>>>0;this.removeEvent($4),this.addCompareEvent(Q),this.setControlU32(BJ,J)}}addEvent(J,q,Q){return this.eventQueue.addEvent(J,q,Q)}removeEvent(J){return this.eventQueue.removeEvent(J)}getCyclesUntilEvent(J){return this.eventQueue.getCyclesUntilEvent(J)}hasEvent(J){return this.eventQueue.hasEvent(J)}addCompareEvent(J){const q=this;this.addEvent($4,J,()=>{q.setControlBits32(o0,z4),q.updateStuffToDoForInterrupts()})}addRunForCyclesEvent(J){const q=this;this.addEvent(W9,J,()=>{q.stuffToDo|=F4})}getRandom(){const J=this.getControlU32(kX),q=J>=32?0:J&31,Q=J>=32?64:32;let Z=Math.floor(Math.random()*(Q-q))+q;if(J0(Z>=q&&Z>>0);for(let X=0;X<32;++X){const Y=this.tlbEntries[X];if((Z&Y.vpnmask64)!==Y.vpn2bits)continue;if(!Y.global&&(Y.hi&z9)!==Q)continue;return Y}return null}translateReadInternal(J){const q=this.tlbFindEntry(J);if(!q)return 0;const Q=J&q.checkbit;if(((Q?q.pfno:q.pfne)&PY)===0)return 0;const X=Q?q.physOdd:q.physEven,Y=J&q.offsetMask;return X|Y}translateRead(J){const q=this.tlbFindEntry(J);if(!q)throw this.raiseTLBException(Y4,EX,J),new R6("TLBL UT_VEC");const Q=J&q.checkbit;if(((Q?q.pfno:q.pfne)&PY)===0)throw this.raiseTLBException(Z6,EX,J),new R6("TLBL E_VEC");const X=Q?q.physOdd:q.physEven,Y=J&q.offsetMask;return X|Y}translateWrite(J){const q=this.tlbFindEntry(J);if(!q)throw this.raiseTLBException(Y4,TX,J),new R6("TLBS UT_VEC");const Q=J&q.checkbit,Z=Q?q.pfno:q.pfne;if((Z&PY)===0)throw this.raiseTLBException(Z6,TX,J),new R6("TLBS E_VEC");if((Z&cM)===0)throw this.raiseTLBException(Z6,fz,J),new R6("Mod E_VEC");const X=Q?q.physOdd:q.physEven,Y=J&q.offsetMask;return X|Y}unalignedLoad(J){throw this.raiseAdELException(J),new R6("AdEL load")}unalignedStore(J){throw this.raiseAdESException(J),new R6("AdES store")}execBreakpoint(){throw new G4}execSLL(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)<>>Q)}execSRA(J,q,Q){this.setRegS32Extend(J,Number(this.getRegS64(q)>>BigInt(Q)&0xffff_ffffn))}execSLLV(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)<<(this.getRegS32Lo(Q)&31))}execSRLV(J,q,Q){this.setRegS32Extend(J,this.getRegS32Lo(q)>>>(this.getRegS32Lo(Q)&31))}execSRAV(J,q,Q){this.setRegS32Extend(J,Number(this.getRegS64(q)>>BigInt(this.getRegS32Lo(Q)&31)&0xffff_ffffn))}execDSLLV(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(this.getRegU32Lo(Q)&63))}execDSRAV(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(this.getRegU32Lo(Q)&63))}execDSLL(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(Q))}execDSRA(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(Q))}execDSLL32(J,q,Q){this.setRegU64(J,this.getRegU64(q)<>BigInt(Q+32))}execDSRA32(J,q,Q){this.setRegU64(J,this.getRegS64(q)>>BigInt(Q+32))}execRESERVED(J){this.raiseRESERVEDException(J)}execSYSCALL(){this.raiseSYSCALLException()}execBREAK(){this.raiseBREAKException()}execSYNC(){}execMFHI(J){this.setRegU64(J,this.getMultHiU64())}execMFLO(J){this.setRegU64(J,this.getMultLoU64())}execMTHI(J){this.setMultHiU64(this.getRegU64(J))}execMTLO(J){this.setMultLoU64(this.getRegU64(J))}execMULT(J,q){const Q=BigInt(this.getRegS32Lo(q))*BigInt(this.getRegS32Lo(J));this.setMultLoS32Extend(Q&H4),this.setMultHiS32Extend(Q>>32n)}execDMULT(J,q){const Q=this.getRegS64(q)*this.getRegS64(J);this.setMultLoS64(Q&S6),this.setMultHiS64(Q>>64n)}execMULTU(J,q){const Q=BigInt(this.getRegU32Lo(q))*BigInt(this.getRegU32Lo(J));this.setMultLoS32Extend(Q&H4),this.setMultHiS32Extend(Q>>32n)}execDMULTU(J,q){const Q=this.getRegU64(q)*this.getRegU64(J);this.setMultLoU64(Q&S6),this.setMultHiU64(Q>>64n)}execDIV(J,q){const Q=this.getRegS32Lo(q),Z=this.getRegS32Lo(J);let X,Y;if(Z)X=Q/Z>>0,Y=Q%Z;else X=Q<0?1:-1,Y=Q;this.setMultLoS32Extend(BigInt(X)),this.setMultHiS32Extend(BigInt(Y))}execDDIV(J,q){const Q=this.getRegS64(J),Z=this.getRegS64(q);let X,Y;if(Q)X=Z/Q,Y=Z%Q;else X=Z<0?1n:-1n,Y=Z;this.setMultLoS64(X),this.setMultHiS64(Y)}execDIVU(J,q){const Q=this.getRegU32Lo(q),Z=this.getRegU32Lo(J);let X,Y;if(Z)X=Q/Z>>0,Y=Q%Z;else X=-1,Y=Q;this.setMultLoS32Extend(BigInt(X)),this.setMultHiS32Extend(BigInt(Y))}execDDIVU(J,q){const Q=this.getRegU64(J),Z=this.getRegU64(q);let X,Y;if(Q)X=Z/Q,Y=Z%Q;else X=-1n,Y=Z;this.setMultLoU64(X),this.setMultHiU64(Y)}execADD(J,q,Q){const Z=this.getRegS32Lo(Q),X=this.getRegS32Lo(q),Y=Z+X;if(kY(Z,X,Y)){this.raiseOverflowException();return}this.setRegS32Extend(J,Y)}execDADD(J,q,Q){const Z=this.getRegS64(Q),X=this.getRegS64(q),Y=Z+X;if(IY(Z,X,Y)){this.raiseOverflowException();return}this.setRegU64(J,Y)}execADDU(J,q,Q){const Z=this.getRegS32Lo(Q),X=this.getRegS32Lo(q),Y=Z+X;this.setRegS32Extend(J,Y)}execDADDU(J,q,Q){const Z=this.getRegS64(Q),X=this.getRegS64(q),Y=Z+X;this.setRegU64(J,Y)}execSUB(J,q,Q){const Z=this.getRegS32Lo(Q),X=this.getRegS32Lo(q),Y=Z-X;if(U4(Z,X,Y)){this.raiseOverflowException();return}this.setRegS32Extend(J,Y)}execDSUB(J,q,Q){const Z=this.getRegS64(Q),X=this.getRegS64(q),Y=Z-X;if(M4(Z,X,Y)){this.raiseOverflowException();return}this.setRegU64(J,Y)}execSUBU(J,q,Q){const Z=this.getRegS32Lo(Q),X=this.getRegS32Lo(q),Y=Z-X;this.setRegS32Extend(J,Y)}execDSUBU(J,q,Q){const Z=this.getRegS64(Q),X=this.getRegS64(q),Y=Z-X;this.setRegU64(J,Y)}execAND(J,q,Q){this.setRegU64(J,this.getRegU64(Q)&this.getRegU64(q))}execOR(J,q,Q){this.setRegU64(J,this.getRegU64(Q)|this.getRegU64(q))}execXOR(J,q,Q){this.setRegU64(J,this.getRegU64(Q)^this.getRegU64(q))}execNOR(J,q,Q){this.setRegU64(J,~(this.getRegU64(Q)|this.getRegU64(q)))}execCLEAR(J){this.setRegU64(J,0n)}execMOV(J,q){this.setRegU64(J,this.getRegU64(q))}execSLT(J,q,Q){const Z=this.getRegS64(Q)>0}addrU32(J,q){return this.getRegS32Lo(J)+q>>>0}calcDebuggerAddress(J){return this.addrS32(o(J),g(J))}execLB(J,q,Q){const Z=l7(this.addrS32(q,Q));this.setRegS32Extend(J,Z)}execLBU(J,q,Q){const Z=d7(this.addrS32(q,Q));this.setRegU32Extend(J,Z)}execLH(J,q,Q){const Z=a7(this.addrS32(q,Q));this.setRegS32Extend(J,Z)}execLHU(J,q,Q){const Z=n7(this.addrS32(q,Q));this.setRegU32Extend(J,Z)}execLW(J,q,Q){const Z=Z9(this.addrS32(q,Q));if(J==0){console.log("LW to register 0");return}this.setRegS32Extend(J,Z)}execLWU(J,q,Q){const Z=iJ(this.addrS32(q,Q));this.setRegU32Extend(J,Z)}execLD(J,q,Q){const Z=QJ(this.addrS32(q,Q));this.setRegU64(J,Z)}execLWL(J,q,Q){const Z=this.addrU32(q,Q),X=iJ((Z&~3)>>>0),Y=8*(Z&3);this.setRegS32ExtendMasked(J,X<>>0),Y=8*(3-(Z&3));this.setRegS32ExtendMasked(J,X>>>Y,pZ>>>Y)}execLDL(J,q,Q){const Z=this.addrU32(q,Q),X=BigInt(8*(Z&7)),Y=QJ((Z&~7)>>>0);this.setRegU64Masked(J,Y<>>0);this.setRegU64Masked(J,Y>>X,S6>>X)}execLWC1(J,q,Q){if(!this.checkCopXUsable(1))return;i.store32(i.copRegIdx32(J),Z9(this.addrS32(q,Q)))}execLWC2(J,q,Q){if(!this.checkCopXUsable(2))return;this.unimplemented(this.pc,"LWC2")}execLWC3(J,q,Q){if(!this.checkCopXUsable(3))return;this.unimplemented(this.pc,"LWC3")}execLDC1(J,q,Q){if(!this.checkCopXUsable(1))return;const Z=QJ(this.addrS32(q,Q));i.store64(i.copRegIdx64(J),Z)}execLDC2(J,q,Q){if(!this.checkCopXUsable(2))return;this.unimplemented(this.pc,"LDC2")}execSB(J,q,Q){r7(this.addrS32(q,Q),this.getRegS32Lo(J))}execSH(J,q,Q){s7(this.addrS32(q,Q),this.getRegS32Lo(J))}execSW(J,q,Q){X9(this.addrS32(q,Q),this.getRegS32Lo(J))}execSD(J,q,Q){Y9(this.addrS32(q,Q),this.getRegU64(J))}execSWL(J,q,Q){const Z=this.addrU32(q,Q),X=8*(Z&3),Y=this.getRegU32Lo(J);qZ(Z,Y>>>X,pZ>>>X)}execSWR(J,q,Q){const Z=this.addrU32(q,Q),X=8*(3-(Z&3)),Y=this.getRegU32Lo(J);qZ(Z,Y<>X,S6>>X)}execSDR(J,q,Q){const Z=this.addrU32(q,Q),X=this.getRegU64(J),Y=BigInt(8*(7-(Z&7)));QZ(Z,X<>>2&7;return q!==0||Q!==0&&Q!==4}execTGE(J,q){this.maybeRaiseTRAPException(this.getRegS64(q)>=this.getRegS64(J))}execTGEU(J,q){this.maybeRaiseTRAPException(this.getRegU64(q)>=this.getRegU64(J))}execTLT(J,q){this.maybeRaiseTRAPException(this.getRegS64(q)=BigInt(q))}execTGEIU(J,q){this.maybeRaiseTRAPException(this.getRegU64(J)>=BigInt.asUintN(64,BigInt(q)))}execTLTI(J,q){this.maybeRaiseTRAPException(this.getRegS64(J)=0n,q)}execBGTZ(J,q){this.conditionalBranch(this.getRegS64(J)>0n,q)}execBLEZ(J,q){this.conditionalBranch(this.getRegS64(J)<=0n,q)}execBLTZ(J,q){this.conditionalBranch(this.getRegS64(J)<0n,q)}execBGEZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)>=0n,q)}execBGTZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)>0n,q)}execBLEZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)<=0n,q)}execBLTZL(J,q){this.conditionalBranchLikely(this.getRegS64(J)<0n,q)}execBLTZAL(J,q){const Q=this.getRegS64(J)<0n;this.setRegS32Extend(g6,this.nextPC+4),this.conditionalBranch(Q,q)}execBGEZAL(J,q){const Q=this.getRegS64(J)>=0n;this.setRegS32Extend(g6,this.nextPC+4),this.conditionalBranch(Q,q)}execBLTZALL(J,q){const Q=this.getRegS64(J)<0n;this.setRegS32Extend(g6,this.nextPC+4),this.conditionalBranchLikely(Q,q)}execBGEZALL(J,q){const Q=this.getRegS64(J)>=0n;this.setRegS32Extend(g6,this.nextPC+4),this.conditionalBranchLikely(Q,q)}execMFC0(J,q){this.setRegS32Extend(J,Number(this.moveFromControl(q)&0xffff_ffffn))}execDMFC0(J,q){this.setRegU64(J,this.moveFromControl(q))}execMTC0(J,q){this.moveToControl(q,BigInt(this.getRegS32Lo(J)))}execDMTC0(J,q){this.moveToControl(q,this.getRegU64(J))}execTLB(J){switch(J){case 1:this.tlbRead();return;case 2:this.tlbWriteIndex();return;case 6:this.tlbWriteRandom();return;case 8:this.tlbProbe();return;case 24:this.execERET();return}n64js.warn(`CPU: unknown TLB op, pc: ${N(this.pc)}, op: ${N(J)}`)}execERET(){if(this.getControlU32(S0)&$9)this.nextPC=this.getControlU32(xq),this.clearControlBits32(S0,$9),h(`ERET from error trap - ${N(this.nextPC)}`);else this.nextPC=this.getControlU32(t6),this.clearControlBits32(S0,F9);this.llBit=0}execMFC1(J,q){this.setRegS32Extend(J,i.loadS32(i.copRegIdx32(q)))}execDMFC1(J,q){this.setRegU64(J,i.loadU64(i.copRegIdx64(q)))}execMTC1(J,q){i.store32(i.copRegIdx32(q),this.getRegS32Lo(J))}execDMTC1(J,q){i.store64(i.copRegIdx64(q),this.getRegS64(J))}execCFC1(J,q){switch(q){case 0:case 31:this.setRegS32Extend(J,i.control[q]);break}}execCTC1(J,q){if(q===31)i.setStatus(this.getRegU32Lo(J))}execDCFC1(J,q){i.DCFC1(J,q)}execDCTC1(J,q){i.DCTC1(q,J)}execMFC2(J){if(!this.checkCopXUsable(2))return;this.setRegS32Extend(J,$J.getReg32())}execDMFC2(J){if(!this.checkCopXUsable(2))return;this.setRegU64(J,$J.getReg64())}execCFC2(J){if(!this.checkCopXUsable(2))return;this.setRegS32Extend(J,$J.getReg32())}execDCFC2(J){if(!this.checkCopXUsable(2))return;this.raiseRESERVEDException(2)}execMTC2(J){if(!this.checkCopXUsable(2))return;$J.setReg64(this.getRegU64(J))}execDMTC2(J){if(!this.checkCopXUsable(2))return;$J.setReg64(this.getRegU64(J))}execCTC2(J){if(!this.checkCopXUsable(2))return;$J.setReg64(this.getRegU64(J))}execDCTC2(J){if(!this.checkCopXUsable(2))return;this.raiseRESERVEDException(2)}unimplemented(J,q){n64js.warn(`${J}: ${q} is unimplemented`)}}class BY{constructor(J){this.hardware=J;const q=new ArrayBuffer(8);this.regU32=new Uint32Array(q),this.regU64=new BigUint64Array(q)}reset(){this.regU64[0]=0n}setReg32(J){this.regU32[0]=J,this.regU32[1]=J>>31}setReg64(J){this.regU64[0]=J}getReg32(){return this.regU32[0]}getReg64(){return this.regU64[0]}}var Dh=Oh([(J)=>U.execSLL(u(J),D(J),e0(J)),B,(J)=>U.execSRL(u(J),D(J),e0(J)),(J)=>U.execSRA(u(J),D(J),e0(J)),(J)=>U.execSLLV(u(J),D(J),y(J)),B,(J)=>U.execSRLV(u(J),D(J),y(J)),(J)=>U.execSRAV(u(J),D(J),y(J)),(J)=>U.execJR(y(J)),(J)=>U.execJALR(u(J),y(J)),B,B,(J)=>U.execSYSCALL(),(J)=>U.execBREAK(),B,(J)=>U.execSYNC(),(J)=>U.execMFHI(u(J)),(J)=>U.execMTHI(y(J)),(J)=>U.execMFLO(u(J)),(J)=>U.execMTLO(y(J)),(J)=>U.execDSLLV(u(J),D(J),y(J)),B,(J)=>U.execDSRLV(u(J),D(J),y(J)),(J)=>U.execDSRAV(u(J),D(J),y(J)),(J)=>U.execMULT(D(J),y(J)),(J)=>U.execMULTU(D(J),y(J)),(J)=>U.execDIV(D(J),y(J)),(J)=>U.execDIVU(D(J),y(J)),(J)=>U.execDMULT(D(J),y(J)),(J)=>U.execDMULTU(D(J),y(J)),(J)=>U.execDDIV(D(J),y(J)),(J)=>U.execDDIVU(D(J),y(J)),(J)=>U.execADD(u(J),D(J),y(J)),(J)=>U.execADDU(u(J),D(J),y(J)),(J)=>U.execSUB(u(J),D(J),y(J)),(J)=>U.execSUBU(u(J),D(J),y(J)),(J)=>U.execAND(u(J),D(J),y(J)),(J)=>U.execOR(u(J),D(J),y(J)),(J)=>U.execXOR(u(J),D(J),y(J)),(J)=>U.execNOR(u(J),D(J),y(J)),B,B,(J)=>U.execSLT(u(J),D(J),y(J)),(J)=>U.execSLTU(u(J),D(J),y(J)),(J)=>U.execDADD(u(J),D(J),y(J)),(J)=>U.execDADDU(u(J),D(J),y(J)),(J)=>U.execDSUB(u(J),D(J),y(J)),(J)=>U.execDSUBU(u(J),D(J),y(J)),(J)=>U.execTGE(D(J),y(J)),(J)=>U.execTGEU(D(J),y(J)),(J)=>U.execTLT(D(J),y(J)),(J)=>U.execTLTU(D(J),y(J)),(J)=>U.execTEQ(D(J),y(J)),B,(J)=>U.execTNE(D(J),y(J)),B,(J)=>U.execDSLL(u(J),D(J),e0(J)),B,(J)=>U.execDSRL(u(J),D(J),e0(J)),(J)=>U.execDSRA(u(J),D(J),e0(J)),(J)=>U.execDSLL32(u(J),D(J),e0(J)),B,(J)=>U.execDSRL32(u(J),D(J),e0(J)),(J)=>U.execDSRA32(u(J),D(J),e0(J))]);n64js.executeUnknown=B;var Bh=CY([(J)=>U.execMFC0(D(J),z0(J)),(J)=>U.execDMFC0(D(J),z0(J)),B,B,(J)=>U.execMTC0(D(J),z0(J)),(J)=>U.execDMTC0(D(J),z0(J)),B,B,B,B,B,B,B,B,B,B,(J)=>U.execTLB(EJ(J)),B,B,B,B,B,B,B,B,B,B,B,B,B,B,B]),Ah=CY([(J)=>U.execMFC1(D(J),z0(J)),(J)=>U.execDMFC1(D(J),z0(J)),(J)=>U.execCFC1(D(J),z0(J)),(J)=>U.execDCFC1(D(J),z0(J)),(J)=>U.execMTC1(D(J),z0(J)),(J)=>U.execDMTC1(D(J),z0(J)),(J)=>U.execCTC1(D(J),z0(J)),(J)=>U.execDCTC1(D(J),z0(J)),Ih,B,B,B,B,B,B,B,(J)=>i.execSInstr(H6(J),J8(J),z0(J),f6(J)),(J)=>i.execDInstr(H6(J),J8(J),z0(J),f6(J)),B,B,(J)=>i.execWInstr(H6(J),J8(J),z0(J),f6(J)),(J)=>i.execLInstr(H6(J),J8(J),z0(J),f6(J)),B,B,B,B,B,B,B,B,B,B]),yh=CY([(J)=>U.execMFC2(D(J)),(J)=>U.execDMFC2(D(J)),(J)=>U.execCFC2(D(J)),(J)=>U.execDCFC2(D(J)),(J)=>U.execMTC2(D(J)),(J)=>U.execDMTC2(D(J)),(J)=>U.execCTC2(D(J)),(J)=>U.execDCTC2(D(J)),B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B]);n64js.executeCop1_disabled=AY;var bh=_h([(J)=>U.execBLTZ(y(J),H0(J)),(J)=>U.execBGEZ(y(J),H0(J)),(J)=>U.execBLTZL(y(J),H0(J)),(J)=>U.execBGEZL(y(J),H0(J)),B,B,B,B,(J)=>U.execTGEI(y(J),g(J)),(J)=>U.execTGEIU(y(J),g(J)),(J)=>U.execTLTI(y(J),g(J)),(J)=>U.execTLTIU(y(J),g(J)),(J)=>U.execTEQI(y(J),g(J)),B,(J)=>U.execTNEI(y(J),g(J)),B,(J)=>U.execBLTZAL(y(J),H0(J)),(J)=>U.execBGEZAL(y(J),H0(J)),(J)=>U.execBLTZALL(y(J),H0(J)),(J)=>U.execBGEZALL(y(J),H0(J)),B,B,B,B,B,B,B,B,B,B,B,B]),I4=vh([wh,Sh,(J)=>U.execJ(M8(U.pc,J)),(J)=>U.execJAL(M8(U.pc,J)),(J)=>U.execBEQ(D(J),y(J),H0(J)),(J)=>U.execBNE(D(J),y(J),H0(J)),(J)=>U.execBLEZ(y(J),H0(J)),(J)=>U.execBGTZ(y(J),H0(J)),(J)=>U.execADDI(D(J),y(J),g(J)),(J)=>U.execADDIU(D(J),y(J),g(J)),(J)=>U.execSLTI(D(J),y(J),g(J)),(J)=>U.execSLTIU(D(J),y(J),g(J)),(J)=>U.execANDI(D(J),y(J),q8(J)),(J)=>U.execORI(D(J),y(J),q8(J)),(J)=>U.execXORI(D(J),y(J),q8(J)),(J)=>U.execLUI(D(J),q8(J)),Ch,AY,Eh,Th,(J)=>U.execBEQL(D(J),y(J),H0(J)),(J)=>U.execBNEL(D(J),y(J),H0(J)),(J)=>U.execBLEZL(y(J),H0(J)),(J)=>U.execBGTZL(y(J),H0(J)),(J)=>U.execDADDI(D(J),y(J),g(J)),(J)=>U.execDADDIU(D(J),y(J),g(J)),(J)=>U.execLDL(D(J),o(J),g(J)),(J)=>U.execLDR(D(J),o(J),g(J)),(J)=>U.execBreakpoint(),B,B,(J)=>U.execRESERVED(0),(J)=>U.execLB(D(J),o(J),g(J)),(J)=>U.execLH(D(J),o(J),g(J)),(J)=>U.execLWL(D(J),o(J),g(J)),(J)=>U.execLW(D(J),o(J),g(J)),(J)=>U.execLBU(D(J),o(J),g(J)),(J)=>U.execLHU(D(J),o(J),g(J)),(J)=>U.execLWR(D(J),o(J),g(J)),(J)=>U.execLWU(D(J),o(J),g(J)),(J)=>U.execSB(D(J),o(J),g(J)),(J)=>U.execSH(D(J),o(J),g(J)),(J)=>U.execSWL(D(J),o(J),g(J)),(J)=>U.execSW(D(J),o(J),g(J)),(J)=>U.execSDL(D(J),o(J),g(J)),(J)=>U.execSDR(D(J),o(J),g(J)),(J)=>U.execSWR(D(J),o(J),g(J)),(J)=>U.execCACHE(D(J),o(J),g(J)),(J)=>U.execLL(D(J),o(J),g(J)),(J)=>U.execLWC1(D(J),o(J),g(J)),(J)=>U.execLWC2(D(J),o(J),g(J)),(J)=>U.execLWC3(D(J),o(J),g(J)),(J)=>U.execLLD(D(J),o(J),g(J)),(J)=>U.execLDC1(D(J),o(J),g(J)),(J)=>U.execLDC2(D(J),o(J),g(J)),(J)=>U.execLD(D(J),o(J),g(J)),(J)=>U.execSC(D(J),o(J),g(J)),(J)=>U.execSWC1(D(J),o(J),g(J)),(J)=>U.execSWC2(D(J),o(J),g(J)),(J)=>U.execSWC3(D(J),o(J),g(J)),(J)=>U.execSCD(D(J),o(J),g(J)),(J)=>U.execSDC1(D(J),o(J),g(J)),(J)=>U.execSDC2(D(J),o(J),g(J)),(J)=>U.execSD(D(J),o(J),g(J))]);n64js.singleStep=function(){const J=n64js.breakpoints();let q=0;if(J.isBreakpoint(U.pc))q=U.pc,J.toggle(q);if(U.run(1),q)J.toggle(q)};class O4{constructor(){this.kNumEntries=16384,this.entries=[];for(let J=0;J>>5)}addressToCacheLineRoundUp(J){return Math.floor(J+31>>>5)}lookupEntry(J){const Q=this.addressToCacheLine(J)%this.entries.length;return this.entries[Q]}addInstructionToFragment(J,q){J.updateMinMax(q),this.lookupEntry(q).add(J)}invalidateEntry(J){const q=this.lookupEntry(J),Q=this.addressToCacheLine(J);for(let[Z,X]of q.entries())if(this.addressToCacheLine(Z.minPC)<=Q&&this.addressToCacheLineRoundUp(Z.maxPC)>=Q)Z.invalidate(),q.delete(Z)}}var D4=new O4,Qq=new KY;n64js.checkSyncState=uh;n64js.executeOp=k4;class a{constructor(J,q,Q,Z,X){this.name=J,this.hardware=q,this.mem=Q,this.u8=Q?Q.u8:null,this.rangeStart=Z,this.rangeEnd=X,this.quiet=!0}setMem(J){this.mem=J,this.u8=J.u8}reset(){}calcEA(J){return J-this.rangeStart}calcInternalEA(J){return this.calcEA(J)}calcReadEA(J){return this.calcEA(J)}calcWriteEA(J){return this.calcEA(J)}readInternal32(J){const q=this.calcInternalEA(J);if(q+4<=this.u8.length)return this.mem.getU32(q);return 3722304989}writeInternal32(J,q){const Q=this.calcInternalEA(J);if(Q+4<=this.u8.length)this.mem.set32(Q,q)}logRead(J){}logWrite(J,q,Q){}readU64(J){const q=this.calcReadEA(J);if(q+8>this.u8.length)return 0;return this.mem.getU64(q)}readU32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)return 0;return this.mem.getU32(q)}readU16(J){const q=this.calcReadEA(J);if(q+2>this.u8.length)return 0;return this.mem.getU16(q)}readU8(J){const q=this.calcReadEA(J);if(q+1>this.u8.length)return 0;return this.mem.getU8(q)}write64masked(J,q,Q){const Z=this.calcWriteEA(J)&~7;if(Z+8>this.u8.length)return;this.mem.set64masked(Z,q,Q)}write32masked(J,q,Q){const Z=this.calcWriteEA(J)&~3;if(Z+4>this.u8.length)return;this.mem.set32masked(Z,q,Q)}write64(J,q){const Q=this.calcWriteEA(J);if(Q+8>this.u8.length)return;this.mem.set64(Q,q)}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)return;this.mem.set32(Q,q)}write16(J,q){const Q=this.calcWriteEA(J);if(Q+2>this.u8.length)return;this.mem.set16(Q,q)}write8(J,q){const Q=this.calcWriteEA(J);if(Q+1>this.u8.length)return;this.mem.set8(Q,q)}}var RY=0,w4=4,W0=8,G9=12,ch=128,oh=256,dh=512,lh=1024,nh=2048,ah=4096,rh=8192,B4=128,C4=256,A4=512,sh=1,ih=2,th=4,eh=8,Jk=16,qk=32,Qk=64,Zk=128,Xk=256,Yk=512,Kk=1024,zk=2048;var Xq=1,W8=2,j9=4,N9=8,L9=16,Zq=32;class yY extends a{constructor(J,q,Q){super("MIReg",J,J.mi_reg,q,Q)}reset(){this.mem.set32(w4,33685762)}interruptsUnmasked(){return(this.mem.getU32(G9)&this.mem.getU32(W0))!==0}intrReg(){return this.mem.getU32(W0)}intrMaskReg(){return this.mem.getU32(G9)}setInterruptBit(J){this.mem.setBits32(W0,J),n64js.cpu0.updateCause3()}interruptSP(){this.setInterruptBit(Xq)}interruptDP(){this.setInterruptBit(Zq)}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case RY:if(!this.quiet)h(`Wrote to MI mode register: ${N(q)}`);this.writeModeReg(q);break;case G9:if(!this.quiet)h(`Wrote to MI interrupt mask register: ${N(q)}`);this.writeIntrMaskReg(q);break;case w4:case W0:break;default:h(`Unhandled write to MIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}writeModeReg(J){let q=this.mem.getU32(RY);if(J&rh)q|=A4;if(J&ah)q&=~A4;if(J&oh)q|=B4;if(J&ch)q&=~B4;if(J&lh)q|=C4;if(J&dh)q&=~C4;if(this.mem.set32(RY,q),J&nh)this.mem.clearBits32(W0,Zq),n64js.cpu0.updateCause3()}writeIntrMaskReg(J){let q=0,Q=0;q|=(J&sh)>>>0,q|=(J&th)>>>1,q|=(J&Jk)>>>2,q|=(J&Qk)>>>3,q|=(J&Xk)>>>4,q|=(J&Kk)>>>5,Q|=(J&ih)>>>1,Q|=(J&eh)>>>2,Q|=(J&qk)>>>3,Q|=(J&Zk)>>>4,Q|=(J&Yk)>>>5,Q|=(J&zk)>>>6;let Z=this.mem.getU32(G9);Z&=~q,Z|=Q,this.mem.set32(G9,Z),n64js.cpu0.updateCause3()}}var R4=function(J,q){return J&~(q-1)},x0=function(J,q){const Q=document.querySelector(J);if(Q)Q.textContent=q};window.n64js=window.n64js||{};class EY{constructor(){this.active=!1,this.$cpuContent=$("#cpu-content"),this.cpuTabs=[$("#cpu0-content"),$("#cpu1-content")],this.$cpu0Disassembly=$("#cpu-disasm"),this.$rspContent=$("#rsp-content"),this.rspTabs=[$("#rsp-scalar-content"),$("#rsp-vector-content"),$("#rsp-task-content")],this.$rspDisassembly=$("#rsp-disasm"),this.$dynarecContent=$("#dynarec-content"),this.$memoryContent=$("#memory-content"),this.$timelineContent=$("#timeline-content"),this.cpu0State=new y4,this.rspState=new E4,this.lastOpExecuted=0,this.recentMemoryAccesses=[],this.lastMemoryAccessAddress=0,this.lastStore=null,this.labelMap=new Map,this.debugCycles=Math.pow(10,0),M5($(".output"),()=>{return N(U.pc)}),n64js.addResetCallback(this.onReset.bind(this)),$("#output").find("#clear").click(function(){h5()});const J=this;$("#cpu-speed").change(function(){J.debugCycles=Math.pow(10,$(this).val()|0),h("Speed is now "+J.debugCycles)}),$("#cpu").find("#address").change(function(){J.disasmAddress=parseInt($(this).val(),16),J.updateCPU()}),this.refreshLabelSelect(),this.$memoryContent.find("input").change(function(){J.lastMemoryAccessAddress=parseInt($(this).val(),16),J.updateMemoryView()}),this.updateMemoryView(),$("body").keydown(function(q){let Q=!1;switch(q.key){case"ArrowDown":Q=!0,J.disassemblerDown();break;case"ArrowUp":Q=!0,J.disassemblerUp();break;case"PageDown":Q=!0,J.disassemblerPageDown();break;case"PageUp":Q=!0,J.disassemblerPageUp();break;case"F8":Q=!0,n64js.toggleRun();break;case"F9":Q=!0,EF();break;case"F10":Q=!0,n64js.step();break}if(Q)q.preventDefault()}),document.querySelector("#cpu-tab").addEventListener("click",()=>{this.updateCPU()}),document.querySelector("#rsp-tab").addEventListener("click",()=>{this.updateRSP()}),document.querySelector("#memory-tab").addEventListener("click",()=>{this.updateMemoryView()}),document.querySelector("#dynarec-tab").addEventListener("click",()=>{this.updateDynarec()}),document.querySelector("#timeline-tab").addEventListener("click",()=>{this.updateTimeline()})}visible(){return this.active}show(){this.setVisible(!0)}hide(){this.setVisible(!1)}toggle(){this.setVisible(!this.active)}setVisible(J){this.active=J,document.querySelectorAll(".debug").forEach((q)=>{q.classList.toggle("hidden",!J)}),VW(J)}showTimeline(){this.updateTimeline(),this.show(),$("#timeline-tab").tab("show")}updateMemoryView(){const J=this.lastMemoryAccessAddress||2147483648;this.$memoryContent.find("pre").empty().append(this.makeMemoryAccessRow(J,1024))}refreshLabelSelect(){const J=$("#cpu").find("#labels"),q=Array.from(this.labelMap.keys()),Q=this;q.sort((Z,X)=>{const Y=Q.labelMap.get(Z),K=Q.labelMap.get(X);return Y.localeCompare(K)}),J.html("");for(let Z of q){const X=this.labelMap.get(Z),Y=$(``);Y.data("address",Z),J.append(Y)}J.change(()=>{let Z=J.find("option:selected").data("address");Q.cpu0State.disasmAddress=Z>>>0,Q.updateCPU()})}onReset(){this.restoreLabelMap(),this.updateCPU(),this.updateRSP()}restoreLabelMap(){this.labelMap=n64js.getLocalStorageItem("debugLabelMap")||new Map,this.refreshLabelSelect()}storeLabelMap(){n64js.setLocalStorageItem("debugLabelMap",this.labelMap)}makeMemoryAccessRow(J,q,Q=64,Z=null){let X=R4(J,Q)-R4(q/2,Q),Y=X+q,K="";for(let z=X;z>>0,j=n64js.hardware().memMap.readMemoryInternal32(H),L="";if(Z&&Z.has(H))L=` style="background-color: ${Z.get(H)}"`;W+=` ${v(j,32)}`}W+="\n",K+=W}return $(`${K}`)}makeRecentMemoryAccessRow(J,q){let Q=q==="store"?"#faa":"#ffa";if(q==="update")Q="#afa";let Z=new Map,X=(J&~3)>>>0;return Z.set(X,Q),this.makeMemoryAccessRow(J,32,32,Z)}makeLabelColor(J){let q=J>>>2,Q=q>>>16^(q&65535)*2803,Z=Q&31,X=Q>>>5&31,Y=Q>>>10&31,K=Q>>>15&3;switch(Z*=4,X*=4,Y*=4,K){case 0:Z*=2,X*=2;break;case 1:X*=2,Y*=2;break;case 2:Y*=2,Z*=2;break;default:Z*=2,X*=2,Y*=2;break}return"#"+v(Z,8)+v(X,8)+v(Y,8)}setLabelText(J,q){if(this.labelMap.has(q))J.append(` (${this.labelMap.get(q)})`)}setLabelColor(J,q){J.css("color",this.makeLabelColor(q))}makeLabelText(J){let q=this.labelMap.get(J)||"";while(q.length<20)q+=" ";return q}onLabelClicked(J){let q=$(J.delegateTarget),Q=q.data("address")>>>0,Z=this.labelMap.get(Q)||"",X=$(``);const Y=this;X.keypress((K)=>{if(K.which==13){const z=X.val();if(z)Y.labelMap.set(Q,z.toString());else Y.labelMap.delete(Q);Y.storeLabelMap(),Y.refreshLabelSelect(),this.updateCPU()}}),X.blur(()=>{q.html(Y.makeLabelText(Q))}),q.empty().append(X),X.focus()}onFragmentClicked(J){let Q=$(J.delegateTarget).data("fragment");h(`
${Q.func.toString()}
`)}onClickBreakpoint(J){let Q=$(J.delegateTarget).data("address")>>>0;n64js.breakpoints().toggle(Q),this.updateCPU()}updateCPU(){this.cpu0State.setPC(U.pc);let J=U.getOpsExecuted(),q=this.lastOpExecuted===J-1;this.lastOpExecuted=J;let Q=rX(),Z=this.cpu0State.disassembleRange(),X=$("
"),Y=$("
"),K;for(let W=0;W':'')+v(H,32)+":",V=`${this.makeLabelText(H)}`,P=`${L}  ${v(G.instruction.opcode,32)}  ${V}${G.disassembly}`,M=Q.get(H);if(M){const S=` frag - ops=${M.opsCompiled} hit=${M.executionCount}`;P+=S}let k=$(`${P}`);if(k.find(".dis-label").data("address",H).css("color",this.makeLabelColor(H)).click(this.onLabelClicked.bind(this)),M)k.find(".dis-fragment-link").data("fragment",M).click(this.onFragmentClicked.bind(this));if(H===U.pc)K=G.instruction,k.addClass("dis-line-cur");if(j)k.addClass("dis-line-target"),this.setLabelColor(k.find(".dis-address-target"),H);Y.append(k),Y.append("
");let O=" ";if(n64js.breakpoints().isBreakpoint(H))O="•";let R=$(`${O}`).data("address",H).click(this.onClickBreakpoint.bind(this));X.append(R),X.append("
")}Y.find(".dis-address-jump").each(function(){let W=parseInt($(this).text(),16);this.setLabelText($(this),W),this.setLabelColor($(this),W),$(this).click(function(){this.cpu0state.disasmAddress=W,this.redraw()})}.bind(this));let z=this.makeRegisterColours(K);for(let[W,G]of z)Y.find(".dis-reg-"+W).css("background-color",G);this.$cpu0Disassembly.find(".dis-recent-memory").html(this.makeRecentMemoryAccesses(q,K,U.calcDebuggerAddress.bind(U))),this.$cpu0Disassembly.find(".dis-gutter").empty().append(X),this.$cpu0Disassembly.find(".dis-view").empty().append(Y),this.cpu0State.updateStatusTable(),this.cpuTabs[0].empty().append(this.cpu0State.makeCop0RegistersTable(z)),this.cpuTabs[1].empty().append(this.cpu0State.makeCop1RegistersTable(z))}updateRSP(){this.rspState.setPC(F.pc);const J=!0;let q=this.rspState.disassembleRange(),Q=$("
"),Z=$("
");for(let z=0;z':'')+v(G,32)+":",L=`${this.makeLabelText(G)}`,V=`${j}  ${v(W.instruction.opcode,32)}  ${L}${W.disassembly}`,P=$(`${V}`);if(P.find(".dis-label").data("address",G).css("color",this.makeLabelColor(G)).click(this.onLabelClicked.bind(this)),G===F.pc)P.addClass("dis-line-cur");if(H)P.addClass("dis-line-target"),this.setLabelColor(P.find(".dis-address-target"),G);Z.append(P),Z.append("
");let M=" ";if(n64js.breakpoints().isBreakpoint(G))M="•";let k=$(`${M}`).data("address",G).click(this.onClickBreakpoint.bind(this));Q.append(k),Q.append("
")}Z.find(".dis-address-jump").each(function(){let z=parseInt($(this).text(),16);this.setLabelText($(this),z),this.setLabelColor($(this),z),$(this).click(function(){this.rspstate.disasmAddress=z,this.redraw()})}.bind(this));const Y=dq(F.pc,F.imem.getU32(F.pc)).instruction;let K=this.makeRegisterColours(Y);for(let[z,W]of K)Z.find(".dis-reg-"+z).css("background-color",W);this.$rspDisassembly.find(".dis-recent-memory").html(this.makeRecentMemoryAccesses(J,Y,F.calcDebuggerAddress.bind(F))),this.$rspDisassembly.find(".dis-gutter").empty().append(Q),this.$rspDisassembly.find(".dis-view").empty().append(Z),this.rspState.updateStatusTable(),this.rspTabs[0].empty().append(this.rspState.makeScalarRegistersTable(K)),this.rspTabs[1].empty().append(this.rspState.makeVectorRegistersTable(K)),this.rspTabs[2].empty().append(this.rspState.makeTaskTable())}makeRegisterColours(J){const q=["#fd7e14","#198754","#0d6efd"];let Q=new Map;if(J){let Z=0;for(let X in J.srcRegs)if(!Object.prototype.hasOwnProperty.call(Q,X))Q.set(X,q[Z++]);for(let X in J.dstRegs)if(!Object.prototype.hasOwnProperty.call(Q,X))Q.set(X,q[Z++])}return Q}makeRecentMemoryAccesses(J,q,Q){const Z=U.opsExecuted;if(J){if(this.lastStore){if(this.lastStore.cycle+1===Z){let K=this.makeRecentMemoryAccessRow(this.lastStore.address,"update");this.lastStore.element.append(K)}this.lastStore=null}const Y=q.memory;if(Y){const K=Q(q.opcode);let z=this.makeRecentMemoryAccessRow(K,Y.mode);if(Y.mode==="store")this.lastStore={address:K,cycle:Z,element:z};if(this.recentMemoryAccesses.push({element:z}),this.recentMemoryAccesses.length>4)this.recentMemoryAccesses.splice(0,1);this.lastMemoryAccessAddress=K}}else this.recentMemoryAccesses=[],this.lastStore=null;let X=$("
");if(this.recentMemoryAccesses.length>0){const Y=["#bbb","#999","#666","#333"];for(let K=0;K{let z=K.executionCount>0?Math.floor(Math.log10(K.executionCount)):0;J.set(z,(J.get(z)||0)+1),Q.push(K),q=Math.max(q,z)}),Q.sort((K,z)=>{return z.opsCompiled*z.executionCount-K.opsCompiled*K.executionCount});let Z=$('
'),X="";X+='
',X+='';for(let K=0;K<=q;K++){let z=J.get(K)||0,W=`< ${Math.pow(10,K+1)}`;X+=``}X+="
Execution CountFrequency
${W}${z}
",X+="
",Z.append(X),X="",X+='
',X+='
',X+='
',X+="
";let Y=$(X);this.createHotFragmentsTable(Y,Q),Z.append(Y),this.$dynarecContent.empty().append(Z)}createHotFragmentsTable(J,q){let Q=J.find("#fragment-code"),Z=$(''),X=["Address","Execution Count","Length","ExecCount * Length"];Z.append(``);for(let Y=0;Y`);this.initFragmentRow(W,K,Q),Z.append(W)}if(J.find("#fragments").append(Z),q.length>0)Q.append(`
${q[0].func.toString()}
`)}initFragmentRow(J,q,Q){J.click(()=>{Q.html(`
${q.func.toString()}
`)})}updateTimeline(){const J=n64js.hardware().timeline,q=this.$timelineContent.find(".timeline-panel");q.empty();let Q=Number.MAX_VALUE,Z=0;J.tracks.forEach((W)=>{W.events.forEach((G)=>{if(G.startZ)Z=G.end})});const X=Z-Q;if(X<=0)return;const Y=4000,K=30;let z=0;J.tracks.forEach((W)=>{let G=0;W.events.forEach((H)=>{const j=Y*(H.start-Q)/X,L=Y*(H.end-H.start)/X,V=L<1?1:L,P=(z+H.depth)*K,M=K,k=H.name;let O="";if(O+=`
`,O+=`
${k}
`,O+="
",q.append(O),H.depth>G)G=H.depth}),z+=G+1})}disassemblerDown(){this.scrollActiveDisassemblyWindow(1),this.redraw()}disassemblerUp(){this.scrollActiveDisassemblyWindow(-1),this.redraw()}disassemblerPageDown(){this.scrollActiveDisassemblyWindow(16),this.redraw()}disassemblerPageUp(){this.scrollActiveDisassemblyWindow(-16),this.redraw()}scrollActiveDisassemblyWindow(J){const q=this.activeDisassemblyWindow();if(q)q.scroll(J)}activeDisassemblyWindow(){if(this.$cpuContent.hasClass("active"))return this.cpu0State;if(this.$rspContent.hasClass("active"))return this.rspState;return null}redraw(){if(!this.active)return;if(this.$cpuContent.hasClass("active"))this.updateCPU();if(this.$rspContent.hasClass("active"))this.updateRSP();if(this.$memoryContent.hasClass("active"))this.updateMemoryView();if(this.$dynarecContent.hasClass("active"))this.updateDynarec()}}class TY{constructor(){this.disasmAddress=0,this.lastPC=-1}setPC(J){if(J!==this.lastPC)this.disasmAddress=J,this.lastPC=J}scroll(J){this.disasmAddress+=J*4}}class y4 extends TY{disassembleRange(){return i5(this.disasmAddress-64,this.disasmAddress+64,!0)}updateStatusTable(){x0("#cpu0-status-opsexecuted",U.opsExecuted),x0("#cpu0-status-pc",N(U.pc)),x0("#cpu0-status-delaypc",N(U.delayPC)),x0("#cpu0-status-epc",N(U.getControlU32(t6))),x0("#cpu0-status-cause",N(Number(U.moveFromControl(o0)&0xffff_ffffn))),x0("#cpu0-status-count",N(Number(U.moveFromControl(s8)&0xffff_ffffn))),x0("#cpu0-status-compare",N(U.getControlU32(BJ))),x0("#cpu0-status-multhi",U8(U.getMultHiU64())),x0("#cpu0-status-multlo",U8(U.getMultLoU64())),this.updateStatusRegisterRow(),this.updateMipsInterruptsRow();let J=$("#cpu0-status-events").find("tbody");J.empty(),J.append("
"),J.append("");const q=U.eventQueue;let Q=q.cyclesToFirstEvent;for(let Z=q.firstEvent;Z;Z=Z.next)J.append(``),Q+=Z.cyclesToNextEvent}updateStatusRegisterRow(){const J=U.getControlU32(S0);x0("#cpu0-status-sr",N(J));const q={"#cpu0-status-sr-ie":cZ,"#cpu0-status-sr-exl":F9,"#cpu0-status-sr-erl":$9};for(let[Q,Z]of Object.entries(q)){const X=document.querySelector(Q);if(!X)continue;const Y=(J&Z)!==0;X.classList.toggle("cpu0-status-bit-set",Y)}}updateMipsInterruptsRow(){const J=n64js.hardware().miRegDevice,q=J.intrReg(),Q=J.intrMaskReg(),Z={"#cpu0-status-mi-sp":Xq,"#cpu0-status-mi-si":W8,"#cpu0-status-mi-ai":j9,"#cpu0-status-mi-vi":N9,"#cpu0-status-mi-pi":L9,"#cpu0-status-mi-dp":Zq};for(let[X,Y]of Object.entries(Z)){const K=document.querySelector(X);if(!K)continue;const z=(q&Y)!==0,W=(Q&Y)!==0;K.classList.toggle("cpu0-status-bit-enabled",W),K.classList.toggle("cpu0-status-bit-set",z)}}makeCop0RegistersTable(J){let q=$('
${X.join("")}
${z.join("")}
 
Events
${Z.getName()}${Q}
'),Q=q.find("tbody");const Z=2;for(let X=0;X<32;X+=Z){let Y=$("");for(let K=0;K${z}${U8(U.getRegU64(X+K))}`);if(J.has(z))W.attr("bgcolor",J.get(z));Y.append(W)}Q.append(Y)}return q}makeCop1RegistersTable(J){let q=$('
'),Q=q.find("tbody");for(let Z=0;Z<32;++Z){let X=pX[Z],Y;if((Z&1)===0)Y=$(`${X} ${N(i.regU32[Z])} ${i.regF32[Z]} ${i.regF64[Z/2]}`);else Y=$(`${X} ${N(i.regU32[Z])} ${i.regF32[Z]} `);let K=$("");if(K.append(Y),J.has(X))K.attr("bgcolor",J.get(X));else if(J.has(X+"-w"))K.find(".fp-w").attr("bgcolor",J.get(X+"-w"));else if(J.has(X+"-s"))K.find(".fp-s").attr("bgcolor",J.get(X+"-s"));else if(J.has(X+"-d"))K.find(".fp-d").attr("bgcolor",J.get(X+"-d"));Q.append(K)}return q}}class E4 extends TY{disassembleRange(){return s9(F.imem,this.disasmAddress-64,this.disasmAddress+64,!0)}updateStatusTable(){x0("#rsp-status-halted",F.halted),x0("#rsp-status-pc",N(F.pc)),x0("#rsp-status-delaypc",N(F.delayPC)),x0("#rsp-status-nextpc",N(F.nextPC)),x0("#rsp-status-branchtarget",N(F.branchTarget)),x0("#rsp-status-vco",q0(F.VCO)),x0("#rsp-status-vcc",q0(F.VCC)),x0("#rsp-status-vce",v0(F.VCE))}makeScalarRegistersTable(J){let q=$('
'),Q=q.find("tbody");const Z=2;for(let X=0;X<32;X+=Z){let Y=$("");for(let K=0;K${z}${N(F.getRegU32(X+K))}`);if(J.has(z))W.attr("bgcolor",J.get(z));Y.append(W)}Q.append(Y)}return q}makeVectorRegistersTable(J){let q=$('
'),Q=q.find("tbody");for(let Z=0;Z<32;Z++){let X=$("");const Y=`V${Z}`;X.append($(`${Y}`));for(let K=0;K<8;++K){let z=$(`${v(F.getVecU16(Z,K),16)}`);if(J.has(Y))z.attr("bgcolor",J.get(Y));X.append(z)}Q.append(X)}return q}makeTaskTable(){const Q=n64js.hardware().sp_mem.subRegion(4032,64);let Z=$('
'),X=Z.find("tbody");for(let Y=0;Y<64;Y+=4){const K=$(`${R8.nameOf(Y)}${v(Q.getU32(Y),32)}`);X.append(K)}return Z}}function T4(J){const q=new DataView(J);switch(q.getUint32(0)){case 2151092800:break;case 1074935680:_Y(J,3,2,1,0);break;case 306217015:_Y(J,2,3,0,1);break;case 931151890:_Y(J,1,0,3,2);break;default:throw"Unhandled byteswapping: "+q.getUint32(0).toString(16)}}var _Y=function(J,q,Q,Z,X){const Y=new Uint8Array(J);for(let K=0;KQ.codePointAt(0))}var b4=0;class vY{constructor(J){this.getOpsExecuted=J,this.recording=!1,this.tracks=[new SY(this,"Default"),new SY(this,"Audio")],this.eventCount=0,this.curFrameEvent=0,this.frameCount=0}startRecording(){this.recording=!0;for(let J=0;J=1e4||this.frameCount>=10)this.recording=!1,this.curFrameEvent=null,n64js.debugger().showTimeline()}addEvent(J,q){if(!this.curFrameEvent)return null;const Q=this.startEventInternal(J,q);if(Q)Q.stop()}startEvent(J,q){if(!this.curFrameEvent)return null;return this.startEventInternal(J,q)}startEventInternal(J,q){const Q=q==null?1:q,Z=this.tracks[Q];return this.eventCount++,Z.startEvent(J)}}class SY{constructor(J,q){this.timeline=J,this.name=q,this.events=[],this.curEvent=null}reset(){this.events=[],this.curEvent=null}startEvent(J){const q=this.timeline.getOpsExecuted(),Q=new S4(this,this.curEvent,J,q);return this.events.push(Q),this.curEvent=Q,Q}stopEvent(J){if(J.end=this.timeline.getOpsExecuted(),this.curEvent==J)this.curEvent=J.parent}}class S4{constructor(J,q,Q,Z){this.track=J,this.parent=q,this.depth=q?q.depth+1:0,this.name=Q,this.start=Z,this.end=Z}stop(){this.track.stopEvent(this)}}var Ik=function(J){if(Jf4)return f4;return J},Fk=0,$k=4,Hk=8,v4=12,Gk=16,jk=20,Nk=1,Lk=17825792,Vk=33554432,Pk=1073741824,Uk=2147483648,Mk=16777208,hk=262136,x4="AI DMA",u4=0.005,g4=3000,f4=96000,kk=0.1,p4=5;class xY extends a{constructor(J,q,Q){super("AIReg",J,J.ai_reg,q,Q);this.audioContext=new window.AudioContext,this.pendingAddress=0,this.dmaAddresses=new Uint32Array(2),this.dmaLengths=new Uint32Array(2),this.dmaDurations=new Uint32Array(2),this.dmaCount=0,this.dmaEnable=!1,this.dacRate=0,this.bitRate=15,this.precision=16,this.frequency=32000,this.time=0,this.dynamicRate=1,this.lastLogTime=0}readU32(J){const q=this.calcWriteEA(J);if(q+4>this.u8.length)throw"Write is out of range";if(!this.quiet)h(`Read from ${N(q)}`);if(q==v4){let Q=Lk;return Q|=this.dmaEnable?Vk:0,Q|=this.dmaCount>0?Pk:0,Q|=this.dmaCount>1?Uk:0,Q|=this.dmaCount>1?Nk:0,Q}return this.dmaLengthRemaining()>>>0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case Fk:if(!this.quiet)h(`Wrote to AI_DRAM_ADDR_REG: ${N(q)}`);this.pendingAddress=q&Mk;break;case $k:if(!this.quiet)h(`Wrote to AI_LEN_REG: ${N(q)}`);this.pushDMA(q&hk);break;case Hk:if(!this.quiet)h(`Wrote to AI_CONTROL_REG: ${N(q)}`);this.dmaEnable=(q&1)!=0;break;case v4:this.clearAI();break;case Gk:if(this.dacRate=q&16383,this.frequency=Math.max(1,this.viClock/(this.dacRate+1))>>0,!this.quiet)h(`AI dacrate changed to ${this.dacRate}, vi clock is ${this.viClock}, freq ${this.frequency}`);break;case jk:if(!this.quiet)h(`Wrote to AI_BITRATE_REG: ${N(q)}`);this.bitRate=q&15,this.precision=this.bitRate+1;break;default:h(`Unhandled write to AIReg: ${N(q)} -> [${N(J)}]`);break}}get viClock(){return this.hardware.viRegDevice.videoClock}pushDMA(J){if(!J){n64js.warn("AI received zero length write");return}if(this.dmaCount>=2){n64js.warn("AI DMA FIFO is full");return}if(this.dmaAddresses[this.dmaCount]=this.pendingAddress,this.dmaLengths[this.dmaCount]=J,this.dmaDurations[this.dmaCount]=this.estimateDMACyclesFromLength(J),this.dmaCount++,this.dmaCount==1)this.startPlayback()}popDMA(){if(this.dmaCount<=0){n64js.warn("AI DMA underflow");return}if(this.dmaCount==2)this.dmaAddresses[0]=this.dmaAddresses[1],this.dmaLengths[0]=this.dmaLengths[1],this.dmaDurations[0]=this.dmaDurations[1];if(this.dmaCount--,this.dmaCount==1)this.startPlayback()}estimateDMACyclesFromLength(J){const Q=(this.bitRate+1<<1)/8*this.frequency;return J*this.viClock/Q>>>0}startPlayback(){const J=this.dmaAddresses[0],q=this.dmaLengths[0],Q=this.dmaDurations[0],Z=q/4,X=new Float32Array(Z),Y=new Float32Array(Z),K=this.hardware.cachedMemDevice.u8,z=new DataView(K.buffer,J,q);for(let V=0;V0?+u4:-u4;const H=Ik(this.frequency*(1+this.dynamicRate));if(p4>0&&W-this.lastLogTime>p4){const V=G>0?"leading":"lagging";console.log(`AI sync: timeDelta ${G}, ${V}, dynamic ${this.dynamicRate}, ${this.frequency} -> ${H}`),this.lastLogTime=W}const j=new AudioBuffer({length:Z,sampleRate:H,numberOfChannels:2});j.copyToChannel(X,0),j.copyToChannel(Y,1);const L=new AudioBufferSourceNode(this.audioContext,{buffer:j});if(L.connect(this.audioContext.destination),L.start(this.time),G<0)this.time=W;this.time+=j.duration,this.raiseAI(),this.addAIDMAEvent(Q)}shouldSkipFrame(){return this.time-this.audioContext.currentTime>kk}dmaLengthRemaining(){if(this.dmaCount==0||this.dmaDurations[0]==0)return 0;const J=n64js.cpu0.getCyclesUntilEvent(x4);if(J<=0)return 0;return J*this.dmaLengths[0]/this.dmaDurations[0]&~7}addAIDMAEvent(J){const q=n64js.hardware().timeline.startEvent("AI DMA",b4),Q=this;n64js.cpu0.addEvent(x4,J,()=>{if(Q.dmaComplete(),q)q.stop()})}dmaComplete(){this.popDMA()}raiseAI(){this.hardware.mi_reg.setBits32(W0,j9),n64js.cpu0.updateCause3()}clearAI(){this.hardware.mi_reg.clearBits32(W0,j9),n64js.cpu0.updateCause3()}}var uY=0,gY=4,fY=8,Yq=12,Ok=16,Dk=20,wk=24,Bk=28,Ck=1,Ak=2,Rk=4,yk=8,Ek=16,Tk=32;var pY=1,m4=2,c4=4,o4=8;var d4=32;var _k=128;var l4=1024,mY=16777208,bk=2047;class cY extends a{constructor(J,q,Q){super("DPC",J,J.dpc_mem,q,Q)}get startReg(){return this.mem.getU32(uY)}get endReg(){return this.mem.getU32(gY)}get currentReg(){return this.mem.getU32(fY)}get statusReg(){return this.mem.getU32(Yq)}set startReg(J){this.mem.set32(uY,J&mY)}set endReg(J){this.mem.set32(gY,J&mY)}set currentReg(J){this.mem.set32(fY,J&mY)}set statusReg(J){this.mem.set32(Yq,J&bk)}setStatusBits(J,q){this.mem.set32masked(Yq,q?J:0,J)}get xbusDmemDMA(){return(this.statusReg&pY)!=0}get startValid(){return(this.statusReg&l4)!=0}set startValid(J){this.setStatusBits(l4,J)}write32(J,q){this.writeReg32(this.calcWriteEA(J),q)}writeReg32(J,q){if(J+4>this.u8.length)throw"Write is out of range";switch(J){case uY:if(!this.quiet)h(`DPC start set to: ${N(q)}`);if(this.startValid);else this.startReg=q,this.startValid=!0;break;case gY:if(!this.quiet)h(`DPC end set to: ${N(q)}`);if(this.currentReg=this.startReg,this.endReg=q,this.startValid);this.startValid=!1,this.setStatusBits(_k|d4|o4,!0),this.processBuffer();break;case Yq:this.updateStatus(q);break;case fY:case Ok:case Dk:case wk:case Bk:h("Wrote to read only DPC reg");break;default:this.mem.set32(J,q);break}}readU32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))}readRegU32(J){if(J+4>this.u8.length)throw"Read is out of range";return this.mem.getU32(J)}updateStatus(J){let q=this.mem.getU32(Yq);if(J&Ck)q&=~pY;if(J&Ak)q|=pY;if(J&Rk)q&=~m4;if(J&yk)q|=m4;if(J&Ek)q&=~c4;if(J&Tk)q|=c4;this.mem.set32(Yq,q)}processBuffer(){let J;if(this.xbusDmemDMA){const q=this.hardware.sp_mem.subRegion(0,4096).dataView;J=new qJ(q,this.currentReg,this.endReg,4095)}else{const q=this.hardware.cachedMemDevice.mem.dataView;J=new qJ(q,this.currentReg,this.endReg)}if(C0.dumpRDP)console.log(`Processing RDP buffer: start ${N(this.startReg)}, current ${N(this.currentReg)}, end ${N(this.endReg)}, xbus ${this.xbusDmemDMA}`),nW(J).forEach((Q)=>{console.log(`${v(Q.address,24)}: ${Q.disassembly}`)}),C0.dumpRDP=!1;this.hardware.rdp.run(J),this.currentReg=J.curAddr}syncFull(){this.setStatusBits(d4|o4,!1),this.hardware.mi_reg.setBits32(W0,Zq),n64js.cpu0.updateCause3()}}class oY extends a{constructor(J,q,Q){super("DPS",J,J.dps_mem,q,Q)}write32(J,q){if(this.calcWriteEA(J)+4>this.u8.length)throw"Write is out of range";throw"DPS writes are unhandled"}readU32(J){if(this.logRead(J),this.calcReadEA(J)+4>this.u8.length)throw"Read is out of range";throw"DPS reads are unhandled"}}function sk(J){return J>=lk&&J=nY&&J=V9&&J=aY&&J<=ak}function ek(J){return J>=i4&&J<=rk}var r4=function(J){return J>=V9&&J<=nk},Kq=0,zq=4,dY=8,lY=12,a6=16,Sk=20,vk=24,xk=28,uk=32,gk=36,fk=40,pk=44,mk=48,oZ=1;var ck=4,n4=8,ok=1,dk=2,lk=83886080,nY=100663296,V9=134217728,nk=134348799,aY=268435456,ak=532676607,i4=533725184,rk=2147483647,s4="PI Interrupt";class rY extends a{constructor(J,q,Q){super("PIReg",J,J.pi_reg,q,Q);this.haveSetMemorySize=!1}reset(){this.haveSetMemorySize=!1}setMemorySize(){if(!this.haveSetMemorySize){const J=this.hardware.rominfo.cic==="6105"?2147484656:2147484440;this.hardware.ram.set32(J-2147483648,8388608),h("Setting memory size"),this.haveSetMemorySize=!0}}readU32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";let Q=this.mem.getS32(q);switch(q){case Kq:Q&=16777214;break;case zq:Q&=4294967294;break;case dY:case lY:Q=127;break}if(!this.quiet)h(`Reading from PIReg: [${N(J)}] -> ${N(Q)}`);return Q>>>0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";if(!this.quiet)h(`Writing to PIReg: ${N(q)} -> [${N(J)}]`);if(this.busy()&&Q!=a6){n64js.warn("Write to PI registers while DMA or IO busy"),this.mem.setBits32(a6,ck);return}switch(Q){case Kq:case zq:this.mem.set32(Q,q);break;case dY:this.mem.set32(Q,q),this.copyFromRDRAM();break;case lY:this.mem.set32(Q,q),this.copyToRDRAM();break;case a6:if(q&ok){if(!this.quiet)h("PI_STATUS_REG reset");this.mem.set32(a6,0),this.removePIInterrupt()}if(q&dk){if(!this.quiet)h("PI interrupt cleared");this.mem.clearBits32(a6,n4),this.hardware.mi_reg.clearBits32(W0,L9),n64js.cpu0.updateCause3()}break;case Sk:case vk:case xk:case uk:case gk:case fk:case pk:case mk:this.mem.set32(Q,q);break;default:h(`Unhandled write to PIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}busy(){return this.mem.getBits32(a6,oZ)!=0}copyFromRDRAM(){const J=this.mem.getU32(Kq)&16777214,q=this.mem.getU32(zq)&4294967294;let Q=(this.mem.getU32(dY)&16777215)+1,Z,X=0,Y=4096;if(Q>=127&&Q&1)Q++;if(a4(q))if(r4(q))switch(this.hardware.saveType){case"SRAM":Z=this.hardware.saveMem,X=q-V9,this.hardware.saveDirty=!0;break;case"FlashRam":if(Z=this.hardware.romD2A2Device.flashBuffer,X=0,Q>Z.length)n64js.warn(`PI DMA to FlashRam exceeds buffer length (${Q} > ${Z.length})`),Q=Z.length;break}else n64js.halt(`PI: unknown dom2addr2 address for ram->cart DMA: ${N(q)}`);else n64js.halt(`PI: unknown cart address for ram->cart DMA: ${N(q)}`);if(Z)Z.copy(X,this.hardware.ram,J,Q);this.mem.setBits32(a6,oZ),this.addPIInterrupt(Y)}copyToRDRAM(){const J=this.mem.getU32(Kq)&16777214,q=this.mem.getU32(zq)&4294967294;let Q=(this.mem.getU32(lY)&16777215)+1;if(!this.quiet)h(`PI: copying ${Q} bytes of data from ${N(q)} to ${N(J)}`);if(Q>=127&&Q&1)Q++;if(Q<=128)Q-=J&7;let Z,X=0,Y=this.estimateDMACyclesFromLength(Q);if(ik(q))Z=this.hardware.rom,X=q-nY;else if(tk(q))Z=this.hardware.rom,X=q-aY;else if(ek(q))Z=this.hardware.rom,X=q-i4;else if(sk(q))n64js.halt("PI: dom2addr1 transfer is unhandled (save)");else if(a4(q))if(r4(q)){switch(X=q-V9,this.hardware.saveType){case"SRAM":Z=this.hardware.saveMem;break;case"FlashRam":Z=this.hardware.romD2A2Device.flashDMASource();break}Y=4096}else n64js.halt(`PI: unknown dom2addr2 address for cart->ram DMA: ${N(q)}`);else n64js.halt(`PI: unknown cart address for cart->ram DMA: ${N(q)}`);if(Z)this.hardware.ram.copy(J,Z,X,Q);this.setMemorySize(),this.mem.setBits32(a6,oZ),this.mem.set32(Kq,this.mem.getU32(Kq)+Q+7&~7),this.mem.set32(zq,this.mem.getU32(zq)+Q+1&~1),this.addPIInterrupt(Y)}estimateDMACyclesFromLength(J){const q=J>>>3;if(q)return q;return 16}removePIInterrupt(){n64js.cpu0.removeEvent(s4)}addPIInterrupt(J){const q=n64js.hardware().timeline.startEvent("PI DMA"),Q=this;n64js.cpu0.addEvent(s4,J,()=>{if(Q.dmaComplete(),q)q.stop()})}dmaComplete(){this.mem.clearBits32(a6,oZ),this.mem.setBits32(a6,n4),this.hardware.mi_reg.setBits32(W0,L9),n64js.cpu0.updateCause3()}}var sY=0,JI=4,qI=16,S8=24;var Wq=4096;class iY extends a{constructor(J,q,Q){super("SIReg",J,J.si_reg,q,Q)}readU32(J){this.logRead(J);const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";if(q===S8)this.checkStatusConsistent();return this.mem.getU32(q)}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case sY:if(!this.quiet)h(`Writing to SI dram address reigster: ${N(q)}`);this.mem.set32(Q,q);break;case JI:this.mem.set32(Q,q),this.copyToRDRAM();break;case qI:this.mem.set32(Q,q),this.copyFromRDRAM();break;case S8:if(!this.quiet)h("SI interrupt cleared");this.mem.clearBits32(S8,Wq),this.hardware.mi_reg.clearBits32(W0,W8),n64js.cpu0.updateCause3();break;default:h(`Unhandled write to SIReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(Q,q);break}}checkStatusConsistent(){const J=this.hardware.mi_reg.getBits32(W0,W8)!==0,q=this.mem.getBits32(S8,Wq)!==0;if(J!==q)n64js.halt("SI_STATUS register is in an inconsistent state")}copyFromRDRAM(){const J=this.mem.getU32(sY)&536870911;if(!this.quiet)h(`SI: copying from ${N(J)} to PIF RAM`);n64js.joybus().dmaWrite(this.hardware.ram,J),this.mem.setBits32(S8,Wq),this.hardware.mi_reg.setBits32(W0,W8),n64js.cpu0.updateCause3()}copyToRDRAM(){const J=this.mem.getU32(sY)&536870911;if(!this.quiet)h(`SI: copying from PIF RAM to ${N(J)}`);n64js.joybus().dmaRead(this.hardware.ram,J),this.mem.setBits32(S8,Wq),this.hardware.mi_reg.setBits32(W0,W8),n64js.cpu0.updateCause3()}}class tY extends a{constructor(J,q,Q){super("PIFMEM",J,J.pif_mem,q,Q)}readU32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";const Q=this.mem.getU32(q);if(q<1984)h(`Reading from PIF rom (${N(J)}). Got ${N(Q)}`);else{const Z=q-1984;switch(Z){case 36:h(`Reading PIF CIC values: ${N(Q)}`);break;case 60:h(`Reading PIF Control byte: ${N(Q)}`);break;default:h(`Reading from PIF ram [${N(J)}]. Got ${N(Q)}`);break}n64js.joybus().cpuRead(Z)}return Q}readU8(J){const q=this.calcReadEA(J),Q=this.mem.getU8(q);if(q<1984)h(`Reading from PIF rom (${N(J)}). Got ${v0(Q)}`);else{const Z=q-1984;switch(Z){case 36:h(`Reading PIF CIC values: ${v0(Q)}`);break;case 60:h(`Reading PIF Control byte: ${v0(Q)}`);break;default:h(`Reading from PIF ram [${N(J)}]. Got ${v0(Q)}`);break}n64js.joybus().cpuRead(Z)}return Q}write32(J,q){const Q=this.calcWriteEA(J);if(Q<1984){h("Attempting to write to PIF ROM");return}this.mem.set32(Q,q);const Z=Q-1984;switch(Z){case 36:h(`Writing PIF CIC values: ${N(q)}`);break;case 60:h(`Writing PIF Control byte: ${N(q)}`),this.updateControl();break;default:h(`Writing directly to PIF ram [${N(J)}] <-- ${N(q)}`);break}n64js.joybus().cpuWrite(Z)}write16(J,q){const Q=this.calcWriteEA(J);if(Q<1984){h("Attempting to write to PIF ROM");return}const Z=Q&~3,X=8*(2-(Q&2));this.mem.set32(Z,q<>>0}readU16(J){return this.read(J)&65535}readU8(J){return this.read(J)&255}write32(J,q){this.write(J,q)}write16(J,q){this.write(J,q)}write8(J,q){this.write(J,q)}}class qK extends a{constructor(J,q,Q){super("RDRAMReg",J,J.rdram_reg,q,Q)}calcEA(J){return J&255}}var ZI=12;class QK extends a{constructor(J,q,Q){super("RIReg",J,J.ri_reg,q,Q)}reset(){this.mem.set32(ZI,1)}}class F8{constructor(J,q,Q){if(q===void 0)q=0;if(Q===void 0)Q=J.byteLength-q;this.arrayBuffer=J,this.offset=q,this.length=Q,this.u8=new Uint8Array(J,q,Q),this.dataView=new DataView(J,q,Q)}clear(){for(let J=0;Jthis.length)throw"end is out of bounds";return new F8(this.arrayBuffer,this.offset+J,q)}s32Array(){return new Int32Array(this.arrayBuffer,this.offset,this.length/4)}copy(J,q,Q,Z){if(J+Z>this.u8.length)throw"overflow dst";if(Q+Z>q.u8.length)throw"overflow src";for(let X=0;X>>0},XI=3019833364,ZK=3019833376,lZ=512,YI=ZK+lZ,KI=75,zI=120,WI=165,FI=180,$I=210,HI=225,GI=240,t4=0,e4=1,JH=2,qH=3,QH=4;class XK extends a{constructor(J,q,Q){super("ROMd1a1",J,J.rom,q,Q)}write32(J,q){throw`Writing to rom d1a1 ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom d1a1 ${q0(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom d1a1 ${v0(q)} -> [${N(J)}]`}}class YK extends a{constructor(J,q,Q){super("ROMd1a2",J,J.rom,q,Q);this.lastWrite=0,this.hasLastWrite=!1,this.debugBuffer=new ArrayBuffer(lZ),this.debugBufferU32=new Uint32Array(this.debugBuffer),this.debugBufferU8=new Uint8Array(this.debugBuffer),this.output=""}calcEA(J){return J-this.rangeStart+2&~2}write64(J,q){this.cacheLastWrite(Number(q>>32n))}write32(J,q){if(J==XI)return this.writeDebugBufferLen(q);if(J>=ZK&&J>>0)}write16(J,q){const Q=8*(2-(J&2));this.cacheLastWrite(q<>>0;return super.readU32(J)}readU16(J){if(this.hasLastWrite)return this.consumeLastWrite()>>>16;return super.readU16(J)}readU8(J){if(this.hasLastWrite)return this.consumeLastWrite()>>>24;return super.readU8(J)}cacheLastWrite(J){if(!this.hasLastWrite)this.lastWrite=J,this.hasLastWrite=!0}consumeLastWrite(){return this.hasLastWrite=!1,this.lastWrite}writeDebugBufferLen(J){if(J>lZ)console.log(`debug buffer value too long (${J}), truncating`),J=lZ;for(let q=0;q>>2;this.debugBufferU32[Q]=q}flushDebugOutput(){const J=this.output.lastIndexOf("\n");if(J>=0)console.log(this.output.substring(0,J+1)),this.output=this.output.substring(J+1)}}class KK extends a{constructor(J,q,Q){super("ROMd1a3",J,J.rom,q,Q)}write32(J,q){throw`Writing to rom d1a3 ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom d1a3 ${q0(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom d1a3 ${v0(q)} -> [${N(J)}]`}}class zK extends a{constructor(J,q,Q){super("ROMd2a1",J,null,q,Q)}read(J){if(J==2768241928)return h("Reading from ROMd2a1 0xa5000508 - spoofing ~0 value"),~0;return h(`Reading from invalid ROMd2a1 address ${N(J)}`),0}readU32(J){return this.read(J)>>>0}readU16(J){return this.read(J)&65535}readU8(J){return this.read(J)&255}write32(J,q){throw`Writing to rom ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing to rom ${q0(q)} -> [${N(J)}]`}write8(J,q){throw`Writing to rom ${v0(q)} -> [${N(J)}]`}}class WK extends a{constructor(J,q,Q){super("ROMd2a2",J,null,q,Q);this.flashMode=t4,this.flashStatus=new F8(new ArrayBuffer(8)),this.flashBuffer=new F8(new ArrayBuffer(128)),this.flashOffset=0}hasFlashRam(){return this.hardware.saveType=="FlashRam"}readU32(J){const q=this.calcWriteEA(J);if(q>=557056)return jI(J);if(this.hasFlashRam()){const Q=q&4;return this.flashStatus.getU32(Q)}throw`Reading s32 from rom d2a2 [${N(J)}]`}readU16(J){throw`Reading 16 bits from rom d2a2 [${N(J)}]`}readU8(J){throw`Reading 8 bits from rom d2a2 [${N(J)}]`}write32(J,q){const Q=this.calcWriteEA(J);if(this.hasFlashRam()){if(Q!=0)this.flashCommand(q);return}throw`Writing s32 to rom ${N(q)} -> [${N(J)}]`}write16(J,q){throw`Writing s16 to rom ${q0(q)} -> [${N(J)}]`}write8(J,q){throw`Writing s8 to rom ${v0(q)} -> [${N(J)}]`}flashDMASource(){switch(this.flashMode){case qH:return this.hardware.saveMem;case QH:return this.flashStatus}return n64js.warn(`Unexpected mode for flash DMA: ${this.flashMode}`),null}flashCommand(J){const q=J>>>24&255;switch(q){case KI:if(this.flashOffset=(J&65535)*128,!this.quiet)h(`set erase offset: ${N(this.flashOffset)}`);break;case zI:if(!this.quiet)h("set mode ERASE");this.flashMode=e4,this.flashStatus.set64(0,0x1111_8008_00c2_001dn);break;case WI:if(this.flashOffset=(J&65535)*128,!this.quiet)h(`set write offset: ${N(this.flashOffset)}`);this.flashStatus.set64(0,0x1111_8004_00c2_001dn);break;case FI:if(!this.quiet)h("setting mode WRITE");this.flashMode=JH;break;case $I:switch(this.flashMode){case t4:if(!this.quiet)h("execute IDLE (ignored)");break;case e4:if(!this.quiet)h(`execute ERASE flash @ ${N(this.flashOffset)} (set saveMem to 0xff)`);this.hardware.saveMem.set(this.flashOffset,128,255),this.hardware.saveDirty=!0;break;case JH:if(!this.quiet)h(`execute WRITE flash @ ${N(this.flashOffset)} (copy flashBuffer to saveMem)`);this.hardware.saveMem.copy(this.flashOffset,this.flashBuffer,0,128),this.hardware.saveDirty=!0;break;default:h(`execute (${N(J)}) with unhandled mode: ${this.flashMode}`);break}break;case HI:if(!this.quiet)h("setting mode STATUS");this.flashMode=QH,this.flashStatus.set64(0,0x1111_8001_00c2_001dn);break;case GI:if(!this.quiet)h("setting mode READ");this.flashMode=qH,this.flashStatus.set64(0,0x1111_8004_f000_001dn);break;default:if(!this.quiet)h(`execute with unknown command ${N(q)}`)}}}var NI=!0,FK=0,$K=4,HK=8,GK=12,U9=16,ZH=20,XH=24,YH=28,LI=4294967288,VI=4294967288,KH=4287627256,zH=4287627256,WH=4096,FH=4293918720,$H=20,Fq=1044480,HH=12,$q=4095,Hq=0,jK=1,NK=2,GH=4,LK=8,VK=16,jH=32,NH=64,LH=128,VH=256,PH=512,UH=1024,MH=2048,hH=4096,kH=8192,IH=16384,OH=32768,DH=65536,wH=131072,BH=262144,CH=524288,AH=1048576,RH=2097152,yH=4194304,EH=8388608,TH=16777216,PK=1,_H=2,bH=4,SH=8;var PI=32,vH=64,UI=128,MI=256,gH=512,hI=1024,kI=2048,II=4096,OI=8192,DI=16384;var wI=gH,xH=0,BI=4092,CI="SP DMA",uH=1,AI=2;class fH{constructor(J,q,Q,Z){this.isRead=J,this.spMemAddr=q,this.rdRamAddr=Q,this.len=Z}}class UK extends a{constructor(J,q,Q){super("SPMem",J,J.sp_mem,q,Q);this.pendingSPMemAddr=0,this.pendingDRAMAddr=0}calcEA(J){return(J-this.rangeStart)%8192}write64(J,q){const Q=this.calcWriteEA(J);this.mem.set32(Q,Number(q>>32n))}write16(J,q){const Q=this.calcWriteEA(J),Z=Q&~3,X=8*(2-(Q&2));this.mem.set32(Z,q< [${N(J)}]`)}}readU32(J){const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";let Q=0;switch(q){case xH:Q=this.hardware.rsp.pc,console.log(`value is ${N(Q)}`);break;default:h(`Unhandled read from SPIBISTReg: [${N(J)}]`)}return Q}}class hK extends a{constructor(J,q,Q){super("SPReg",J,J.sp_reg,q,Q);this.dmaQueue=[]}write32(J,q){this.writeReg32(this.calcWriteEA(J),q)}writeReg32(J,q){if(J+4>this.u8.length)throw"Write is out of range";switch(J){case FK:this.pendingSPMemAddr=q&LI;break;case $K:this.pendingDRAMAddr=q&VI;break;case HK:this.mem.set32(J,q&KH),this.pushDMA(uH,q&KH);break;case GK:this.mem.set32(J,q&zH),this.pushDMA(AI,q&zH);break;case U9:this.spUpdateStatus(q);break;case ZH:case XH:break;case YH:this.mem.set32(J,0);break;default:h(`Unhandled write to SPReg: ${N(q)} -> [${N(J)}]`),this.mem.set32(J,q)}}readU32(J){return this.logRead(J),this.readRegU32(this.calcReadEA(J))}readRegU32(J){if(J+4>this.u8.length)throw"Read is out of range";const q=this.mem.getU32(J);if(J==YH)this.mem.set32(J,1);return q}setStatusBits(J){if(this.mem.setBits32(U9,J)&vH)this.hardware.miRegDevice.interruptSP()}spUpdateStatus(J){if(!this.quiet){if(J&jK)h("SP: Clearing Halt");if(J&NK)h("SP: Setting Halt");if(J&GH)h("SP: Clearing Broke");if(J&LK)h("SP: Clearing Interrupt");if(J&VK)h("SP: Setting Interrupt");if(J&jH)h("SP: Clearing Single Step");if(J&NH)h("SP: Setting Single Step");if(J&LH)h("SP: Clearing Interrupt on break");if(J&VH)h("SP: Setting Interrupt on break");if(J&PH)h("SP: Clearing Sig0 (Yield)");if(J&UH)h("SP: Setting Sig0 (Yield)");if(J&MH)h("SP: Clearing Sig1 (Yielded)");if(J&hH)h("SP: Setting Sig1 (Yielded)");if(J&kH)h("SP: Clearing Sig2 (TaskDone)");if(J&IH)h("SP: Setting Sig2 (TaskDone)");if(J&OH)h("SP: Clearing Sig3");if(J&DH)h("SP: Setting Sig3");if(J&wH)h("SP: Clearing Sig4");if(J&BH)h("SP: Setting Sig4");if(J&CH)h("SP: Clearing Sig5");if(J&AH)h("SP: Setting Sig5");if(J&RH)h("SP: Clearing Sig6");if(J&yH)h("SP: Setting Sig6");if(J&EH)h("SP: Clearing Sig7");if(J&TH)h("SP: Setting Sig7")}function q(Y,K,z,W,G){const H=K&W,j=K&z;if(H&&!j)return Y|G;else if(j&&!H)return Y&~G;return Y}let Q=this.mem.getU32(U9),Z=!1,X=!1;if(J&NK&&J&jK);else if(J&NK)Q|=PK,X=!0;else if(J&jK)Q&=~PK,Z=!0;if(J&VK&&J&LK);else if(J&VK)this.hardware.mi_reg.setBits32(W0,Xq),n64js.cpu0.updateCause3();else if(J&LK)this.hardware.mi_reg.clearBits32(W0,Xq),n64js.cpu0.updateCause3();if(Q=q(Q,J,GH,0,_H),Q=q(Q,J,jH,NH,PI),Q=q(Q,J,LH,VH,vH),Q=q(Q,J,PH,UH,UI),Q=q(Q,J,MH,hH,MI),Q=q(Q,J,kH,IH,gH),Q=q(Q,J,OH,DH,hI),Q=q(Q,J,wH,BH,kI),Q=q(Q,J,CH,AH,II),Q=q(Q,J,RH,yH,OI),Q=q(Q,J,EH,TH,DI),this.mem.set32(U9,Q),Z)if(uF()||!NI)this.hardware.spRegDevice.setStatusBits(wI|_H|PK);else F.unhalt();else if(X)F.halt(0)}pushDMA(J,q){if(this.dmaQueue.length>=2){n64js.warn("RSP DMA FIFO is full");return}const Q=J==uH,Z=new fH(Q,this.pendingSPMemAddr,this.pendingDRAMAddr,q);if(this.dmaQueue.push(Z),this.setDMAStatus(),this.dmaQueue.length==1)this.startDMA(Z)}startDMA(J){if(J.isRead)this.spCopyFromRDRAM(J.spMemAddr,J.rdRamAddr,J.len);else this.spCopyToRDRAM(J.spMemAddr,J.rdRamAddr,J.len)}dmaComplete(){if(this.dmaQueue.shift(),this.dmaQueue.length>0)this.startDMA(this.dmaQueue[0]);this.setDMAStatus()}setDMAStatus(){const J=this.dmaQueue.length>=2?SH:0,q=this.dmaQueue.length>=1?bH:0;this.mem.set32(ZH,J?1:0),this.mem.set32(XH,q?1:0),this.mem.set32masked(U9,J|q,SH|bH)}spCopyFromRDRAM(J,q,Q){const Z=J&8191,X=q&16777215,Y=((Q&$q)>>>Hq|7)+1,K=((Q&Fq)>>>HH)+1,z=(Q&FH)>>>$H,W=Z&WH;if(!this.quiet)h(`SP: copying ${Y} bytes from ram ${N(X)} to sp ${q0(Z)}, count ${K}, skip ${z}`);let G=Z,H=X;for(let L=0;L>>Hq|7)+1,K=((Q&Fq)>>>HH)+1,z=(Q&FH)>>>$H,W=Z&WH;if(!this.quiet)h(`SP: copying ${Y} bytes from sp ${q0(Z)} to ram ${N(X)}, count ${K}, skip ${z}`);let G=X,H=Z;for(let L=0;L>>3;if(Z)return Z;return 16}addSPDMAEvent(J){const q=this;n64js.cpu0.addEvent(CI,J,()=>{q.dmaComplete()})}}var pI=function(J){switch(J){case CJ:return gI;case gq:return lH;case sz:return fI}return lH},mI=function(J){return J==CJ?50:60},pH=0,mH=4,cH=8,kK=12,IK=16,RI=20,nZ=24,yI=28,EI=32,TI=36,_I=40,bI=44,SI=48,vI=52,oH=2,dH=3;var xI=64;var uI=3,gI=49656530,lH=48681812,fI=48628316,OK="VI Interrupt";class DK extends a{constructor(J,q,Q){super("VIReg",J,J.vi_reg,q,Q);this.field=0,this.videoClock=0,this.refreshRate=0,this.countPerScanline=0,this.countPerVbl=0,this.reset()}reset(){const J=this.hardware.rominfo.tvType==gq;this.videoClock=pI(J),this.refreshRate=mI(J),this.countPerScanline=0,this.countPerVbl=0,this.screenWidth=640,this.screenHeight=J?480:576,this.hScanMin=J?108:128,this.hScanMax=this.hScanMin+this.screenWidth,this.vScanMin=J?34:44,this.vScanMax=this.vScanMin+this.screenHeight,this.dims=new nH(this.screenWidth,this.screenHeight)}get controlReg(){return this.mem.getU32(pH)}get dramAddrReg(){return this.mem.getU32(mH)}get hWidthReg(){return this.mem.getU32(cH)}get vIntrReg(){return this.mem.getU32(kK)}get vCurrentLineReg(){return this.mem.getU32(IK)}get timingReg(){return this.mem.getU32(RI)}get vSyncReg(){return this.mem.getU32(nZ)}get hSyncReg(){return this.mem.getU32(yI)}get hSyncLeapReg(){return this.mem.getU32(EI)}get hVideoReg(){return this.mem.getU32(TI)}get vVideoReg(){return this.mem.getU32(_I)}get vBurstReg(){return this.mem.getU32(bI)}get xScaleReg(){return this.mem.getU32(SI)}get yScaleReg(){return this.mem.getU32(vI)}get interlaced(){return(this.controlReg&xI)!=0}get modeType(){return this.controlReg&uI}get is32BitMode(){return this.modeType==dH}get is16BitMode(){return this.modeType==oH}get xScale(){return(this.xScaleReg&4095)/1024}get yScale(){return(this.yScaleReg&4095)/1024}get bitDepth(){switch(this.modeType){case dH:return 32;case oH:return 16}return 0}dump(){console.log(`VI_CONTROL = ${N(this.controlReg)}`),console.log(`VI_DRAM_ADDR = ${N(this.dramAddrReg)}`),console.log(`VI_H_WIDTH = ${N(this.hWidthReg)}`),console.log(`VI_V_INTR = ${N(this.vIntrReg)}`),console.log(`VI_V_CURRENT_LINE = ${N(this.vCurrentLineReg)}`),console.log(`VI_TIMING = ${N(this.timingReg)}`),console.log(`VI_V_SYNC = ${N(this.vSyncReg)}`),console.log(`VI_H_SYNC = ${N(this.hSyncReg)}`),console.log(`VI_H_SYNC_LEAP = ${N(this.hSyncLeapReg)}`),console.log(`VI_H_VIDEO = ${N(this.hVideoReg)}`),console.log(`VI_V_VIDEO = ${N(this.vVideoReg)}`),console.log(`VI_V_BURST = ${N(this.vBurstReg)}`),console.log(`VI_X_SCALE = ${N(this.xScaleReg)} = ${this.xScale}`),console.log(`VI_Y_SCALE = ${N(this.yScaleReg)} = ${this.yScale}`)}verticalBlank(){this.hardware.verticalBlank(),this.field^=this.interlaced?1:0,this.addInterruptEvent(),this.hardware.mi_reg.setBits32(W0,N9),n64js.cpu0.updateCause3(),JZ(),n64js.returnControlToSystem()}initInterrupt(){if(n64js.cpu0.hasEvent(OK))return;const J=this.mem.getU32(kK),q=this.mem.getU32(nZ);if(J>=q){h(`not setting VI interrupt - intr ${J} >= sync ${q}`);return}this.addInterruptEvent()}addInterruptEvent(){n64js.cpu0.addEvent(OK,this.countPerVbl,()=>{this.verticalBlank()})}getVblCount(){const J=n64js.cpu0.getCyclesUntilEvent(OK);return J>=0?J:0}write32(J,q){const Q=this.calcWriteEA(J);if(Q+4>this.u8.length)throw"Write is out of range";switch(Q){case mH:this.mem.set32(Q,q);break;case pH:if(!this.quiet)h(`VI control set to: ${N(q)}`);this.mem.set32(Q,q);break;case cH:if(!this.quiet)h(`VI width set to: ${q}`);this.mem.set32(Q,q);break;case kK:if(!this.quiet)h(`VI intr set to: ${q}`);this.mem.set32(Q,q),this.initInterrupt();break;case IK:if(!this.quiet)h(`VI current set to: ${N(q)}`);if(!this.quiet)h("VI interrupt cleared");this.hardware.mi_reg.clearBits32(W0,N9),n64js.cpu0.updateCause3();break;case nZ:if(this.mem.getU32(Q)!=q){const X=q+1;this.countPerScanline=this.hardware.systemFrequency/this.refreshRate/X>>0,this.countPerVbl=X*this.countPerScanline,h(`VI_V_SYNC_REG set to ${q}, cycles per scanline = ${this.countPerScanline}, cycles per vbl = ${this.countPerVbl}`),this.mem.set32(Q,q),this.initInterrupt()}break;default:this.mem.set32(Q,q);break}}readU32(J){this.logRead(J);const q=this.calcReadEA(J);if(q+4>this.u8.length)throw"Read is out of range";if(q===IK){const Q=this.getVblCount(),X=(this.countPerVbl-Q)/this.countPerScanline>>0,Y=this.mem.getU32(nZ);let K=X;if(K>=Y)K-=Y;K=K&~1|this.field,this.mem.set32(q,K)}return this.mem.getU32(q)}computeDimensions(){if(this.modeType==0)return h("mode type is 0 - not rendering"),null;const J=this.hVideoReg,q=J>>16&1023,Q=J&1023;let Z=Math.max(q,this.hScanMin),X=Math.min(Q,this.hScanMax);const Y=this.vVideoReg,K=Y>>16&1023,z=Y&1023;let W=Math.max(K,this.vScanMin),G=z=this.hScanMin)Z+=8;if(X>16&4095,H.ySubpixel=this.yScaleReg>>16&4095,H.xScale=this.xScaleReg&4095,H.yScale=this.yScaleReg&4095,H.sx0=Z-q,H.sy0=W-K,H.dx0=Z-this.hScanMin,H.dy0=W-this.vScanMin,H.dstWidth=X-Z,H.dstHeight=G-W,H.srcPitch=this.hWidthReg;const j=(H.sx0+H.dstWidth)*H.xScale>>10,L=(H.sy0+H.dstHeight)*H.yScale>>11,V=H.srcPitch>768||H.srcPitch>=j*2?2:1;return H.srcWidth=j,H.srcHeight=L*V,H}renderBackBuffer(){const J=this.computeDimensions();if(!J)return null;const q=this.dramAddrReg&16777214;if(!q)return null;const Q=this.hardware.cachedMemDevice.mem.dataView;if(this.is32BitMode)return J.renderBackBuffer32(Q,q);if(this.is16BitMode)return J.renderBackBuffer16(Q,q);return null}}class nH{constructor(J,q){this.screenWidth=640,this.screenHeight=480,this.pixels32bpp=new Uint8Array(J*q*4),this.pixels16bpp=new Uint16Array(J*q),this.interlaced=!1,this.field=0,this.dstWidth=640,this.dstHeight=480,this.srcPitch=320,this.srcWidth=320,this.srcHeight=240,this.xSubpixel=0,this.ySubpixel=0,this.xScale=512,this.yScale=1024,this.sx0=0,this.sy0=0,this.dx0=0,this.dy0=0}renderBackBuffer32(J,q){const Q=this.pixels32bpp,Z=-this.screenWidth;let X=(this.screenHeight-1-this.dy0)*this.screenWidth;const Y=255;let K=this.sy0*this.yScale+this.ySubpixel;for(let z=0;z>>11)*this.srcPitch*4;let G=X+this.dx0,H=this.sx0*this.xScale+this.xSubpixel;for(let j=0;j>>10)*4,!1);Q[G*4+0]=L>>>24,Q[G*4+1]=L>>>16,Q[G*4+2]=L>>>8,Q[G*4+3]=Y,G++,H+=this.xScale}}K+=this.yScale,X+=Z}return Q}renderBackBuffer16(J,q){const Q=this.pixels16bpp,Z=-this.screenWidth;let X=(this.screenHeight-1-this.dy0)*this.screenWidth;const Y=1;let K=this.sy0*this.yScale+this.ySubpixel;for(let z=0;z>>11)*this.srcPitch*2;let G=X+this.dx0,H=this.sx0*this.xScale+this.xSubpixel;for(let j=0;j>>10)*2,!1)|Y,H+=this.xScale}K+=this.yScale,X+=Z}return Q}}class wK{constructor(J){this.map=this.createMemMap(J)}createMemMap(J){const q=[];for(let Q=0;Q<16384;++Q)q.push(void 0);if(J.map((Q)=>{const Z=Q.rangeStart>>>18,X=Q.rangeEnd-1>>>18;for(let Y=Z;Y<=X;++Y)q[Y]=Q}),q.length!==16384)throw"initialisation error";return q}getMemoryHandler(J){const q=this.map[J>>>18];if(q)return q;throw h(`accessing unhandled location ${N(J)}`),`unhandled access ${N(J)}`}readMemoryInternal32(J){const q=this.map[J>>>18];if(q)return q.readInternal32(J);return 3722304989}writeMemoryInternal32(J,q){const Q=this.map[J>>>18];if(Q)Q.writeInternal32(J,q)}}var X6=function(J){return new F8(new ArrayBuffer(J))},BK=64,cI=4096,oI=93750000;class M9{constructor(){this.data=new Uint8Array(32768),this.dirty=!1}init(J){this.dirty=!1;for(let q=0;qJSON.stringify(J,dI),aH=(J)=>JSON.parse(J,lI);var rH=function(J){return J>>24&255|J>>8&65280|J<<8&16711680|J<<24&4278190080};function sH(J,q){return v(rH(J),32)+v(rH(q),32)}function iH(J){let q=0;for(let Q=0;Q<4032;Q++)q=q+J[64+Q];switch(q){case 211495:return"6101";case 213534:return"6101";case 213060:return"6102";case 219088:return"6103";case 293505:return"6105";case 225740:return"6106";case 213961:return"6106";default:return h("Unknown CIC Code "+N(q)),"6102"}}function tH(J,q,Q){let Z="";for(let X=0;X{{return zG}},viewport:()=>{{return k9}},variationPlacements:()=>{{return aZ}},top:()=>{{return U0}},start:()=>{{return r6}},right:()=>{{return D0}},reference:()=>{{return yK}},read:()=>{{return qG}},preventOverflow:()=>{{return mK}},popperOffsets:()=>{{return T9}},popperGenerator:()=>{{return Vq}},popper:()=>{{return HJ}},placements:()=>{{return I9}},offset:()=>{{return fK}},modifierPhases:()=>{{return EK}},main:()=>{{return XG}},left:()=>{{return k0}},hide:()=>{{return gK}},flip:()=>{{return uK}},eventListeners:()=>{{return y9}},end:()=>{{return v8}},detectOverflow:()=>{{return Y6}},createPopperLite:()=>{{return MO}},createPopperBase:()=>{{return PO}},createPopper:()=>{{return _9}},computeStyles:()=>{{return R9}},clippingParents:()=>{{return RK}},bottom:()=>{{return A0}},beforeWrite:()=>{{return KG}},beforeRead:()=>{{return JG}},beforeMain:()=>{{return ZG}},basePlacements:()=>{{return $8}},auto:()=>{{return h9}},arrow:()=>{{return _K}},applyStyles:()=>{{return O9}},afterWrite:()=>{{return WG}},afterRead:()=>{{return QG}},afterMain:()=>{{return YG}}});var U0="top",A0="bottom",D0="right",k0="left",h9="auto",$8=[U0,A0,D0,k0],r6="start",v8="end",RK="clippingParents",k9="viewport",HJ="popper",yK="reference",aZ=$8.reduce(function(J,q){return J.concat([q+"-"+r6,q+"-"+v8])},[]),I9=[].concat($8,[h9]).reduce(function(J,q){return J.concat([q,q+"-"+r6,q+"-"+v8])},[]),JG="beforeRead",qG="read",QG="afterRead",ZG="beforeMain",XG="main",YG="afterMain",KG="beforeWrite",zG="write",WG="afterWrite",EK=[JG,qG,QG,ZG,XG,YG,KG,zG,WG];function u0(J){return J?(J.nodeName||"").toLowerCase():null}function L0(J){if(J==null)return window;if(J.toString()!=="[object Window]"){var q=J.ownerDocument;return q?q.defaultView||window:window}return J}var M6=function(J){var q=L0(J).Element;return J instanceof q||J instanceof Element},b0=function(J){var q=L0(J).HTMLElement;return J instanceof q||J instanceof HTMLElement},Gq=function(J){if(typeof ShadowRoot==="undefined")return!1;var q=L0(J).ShadowRoot;return J instanceof q||J instanceof ShadowRoot};var aI=function(J){var q=J.state;Object.keys(q.elements).forEach(function(Q){var Z=q.styles[Q]||{},X=q.attributes[Q]||{},Y=q.elements[Q];if(!b0(Y)||!u0(Y))return;Object.assign(Y.style,Z),Object.keys(X).forEach(function(K){var z=X[K];if(z===!1)Y.removeAttribute(K);else Y.setAttribute(K,z===!0?"":z)})})},rI=function(J){var q=J.state,Q={popper:{position:q.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};if(Object.assign(q.elements.popper.style,Q.popper),q.styles=Q,q.elements.arrow)Object.assign(q.elements.arrow.style,Q.arrow);return function(){Object.keys(q.elements).forEach(function(Z){var X=q.elements[Z],Y=q.attributes[Z]||{},K=Object.keys(q.styles.hasOwnProperty(Z)?q.styles[Z]:Q[Z]),z=K.reduce(function(W,G){return W[G]="",W},{});if(!b0(X)||!u0(X))return;Object.assign(X.style,z),Object.keys(Y).forEach(function(W){X.removeAttribute(W)})})}},O9={name:"applyStyles",enabled:!0,phase:"write",fn:aI,effect:rI,requires:["computeStyles"]};function g0(J){return J.split("-")[0]}var{max:v6,min:GJ,round:H8}=Math;function jq(){var J=navigator.userAgentData;if(J!=null&&J.brands&&Array.isArray(J.brands))return J.brands.map(function(q){return q.brand+"/"+q.version}).join(" ");return navigator.userAgent}function D9(){return!/^((?!chrome|android).)*safari/i.test(jq())}function h6(J,q,Q){if(q===void 0)q=!1;if(Q===void 0)Q=!1;var Z=J.getBoundingClientRect(),X=1,Y=1;if(q&&b0(J))X=J.offsetWidth>0?H8(Z.width)/J.offsetWidth||1:1,Y=J.offsetHeight>0?H8(Z.height)/J.offsetHeight||1:1;var K=M6(J)?L0(J):window,z=K.visualViewport,W=!D9()&&Q,G=(Z.left+(W&&z?z.offsetLeft:0))/X,H=(Z.top+(W&&z?z.offsetTop:0))/Y,j=Z.width/X,L=Z.height/Y;return{width:j,height:L,top:H,right:G+j,bottom:H+L,left:G,x:G,y:H}}function jJ(J){var q=h6(J),Q=J.offsetWidth,Z=J.offsetHeight;if(Math.abs(q.width-Q)<=1)Q=q.width;if(Math.abs(q.height-Z)<=1)Z=q.height;return{x:J.offsetLeft,y:J.offsetTop,width:Q,height:Z}}function w9(J,q){var Q=q.getRootNode&&q.getRootNode();if(J.contains(q))return!0;else if(Q&&Gq(Q)){var Z=q;do{if(Z&&J.isSameNode(Z))return!0;Z=Z.parentNode||Z.host}while(Z)}return!1}function t0(J){return L0(J).getComputedStyle(J)}function TK(J){return["table","td","th"].indexOf(u0(J))>=0}function c0(J){return((M6(J)?J.ownerDocument:J.document)||window.document).documentElement}function G8(J){if(u0(J)==="html")return J;return J.assignedSlot||J.parentNode||(Gq(J)?J.host:null)||c0(J)}var FG=function(J){if(!b0(J)||t0(J).position==="fixed")return null;return J.offsetParent},sI=function(J){var q=/firefox/i.test(jq()),Q=/Trident/i.test(jq());if(Q&&b0(J)){var Z=t0(J);if(Z.position==="fixed")return null}var X=G8(J);if(Gq(X))X=X.host;while(b0(X)&&["html","body"].indexOf(u0(X))<0){var Y=t0(X);if(Y.transform!=="none"||Y.perspective!=="none"||Y.contain==="paint"||["transform","perspective"].indexOf(Y.willChange)!==-1||q&&Y.willChange==="filter"||q&&Y.filter&&Y.filter!=="none")return X;else X=X.parentNode}return null};function x6(J){var q=L0(J),Q=FG(J);while(Q&&TK(Q)&&t0(Q).position==="static")Q=FG(Q);if(Q&&(u0(Q)==="html"||u0(Q)==="body"&&t0(Q).position==="static"))return q;return Q||sI(J)||q}function NJ(J){return["top","bottom"].indexOf(J)>=0?"x":"y"}function LJ(J,q,Q){return v6(J,GJ(q,Q))}function $G(J,q,Q){var Z=LJ(J,q,Q);return Z>Q?Q:Z}function B9(){return{top:0,right:0,bottom:0,left:0}}function C9(J){return Object.assign({},B9(),J)}function A9(J,q){return q.reduce(function(Q,Z){return Q[Z]=J,Q},{})}var tI=function(J){var q,Q=J.state,Z=J.name,X=J.options,Y=Q.elements.arrow,K=Q.modifiersData.popperOffsets,z=g0(Q.placement),W=NJ(z),G=[k0,D0].indexOf(z)>=0,H=G?"height":"width";if(!Y||!K)return;var j=iI(X.padding,Q),L=jJ(Y),V=W==="y"?U0:k0,P=W==="y"?A0:D0,M=Q.rects.reference[H]+Q.rects.reference[W]-K[W]-Q.rects.popper[H],k=K[W]-Q.rects.reference[W],O=x6(Y),R=O?W==="y"?O.clientHeight||0:O.clientWidth||0:0,S=M/2-k/2,T=j[V],b=R-L[H]-j[P],p=R/2-L[H]/2+S,d=LJ(T,p,b),V0=W;Q.modifiersData[Z]=(q={},q[V0]=d,q.centerOffset=d-p,q)},eI=function(J){var{state:q,options:Q}=J,Z=Q.element,X=Z===void 0?"[data-popper-arrow]":Z;if(X==null)return;if(typeof X==="string"){if(X=q.elements.popper.querySelector(X),!X)return}if(!w9(q.elements.popper,X))return;q.elements.arrow=X},iI=function J(q,Q){return q=typeof q==="function"?q(Object.assign({},Q.rects,{placement:Q.placement})):q,C9(typeof q!=="number"?q:A9(q,$8))},_K={name:"arrow",enabled:!0,phase:"main",fn:tI,effect:eI,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function k6(J){return J.split("-")[1]}var qO=function(J,q){var{x:Q,y:Z}=J,X=q.devicePixelRatio||1;return{x:H8(Q*X)/X||0,y:H8(Z*X)/X||0}};function HG(J){var q,Q=J.popper,Z=J.popperRect,X=J.placement,Y=J.variation,K=J.offsets,z=J.position,W=J.gpuAcceleration,G=J.adaptive,H=J.roundOffsets,j=J.isFixed,L=K.x,V=L===void 0?0:L,P=K.y,M=P===void 0?0:P,k=typeof H==="function"?H({x:V,y:M}):{x:V,y:M};V=k.x,M=k.y;var O=K.hasOwnProperty("x"),R=K.hasOwnProperty("y"),S=k0,T=U0,b=window;if(G){var p=x6(Q),d="clientHeight",V0="clientWidth";if(p===L0(Q)){if(p=c0(Q),t0(p).position!=="static"&&z==="absolute")d="scrollHeight",V0="scrollWidth"}if(p=p,X===U0||(X===k0||X===D0)&&Y===v8){T=A0;var I0=j&&p===b&&b.visualViewport?b.visualViewport.height:p[d];M-=I0-Z.height,M*=W?1:-1}if(X===k0||(X===U0||X===A0)&&Y===v8){S=D0;var F0=j&&p===b&&b.visualViewport?b.visualViewport.width:p[V0];V-=F0-Z.width,V*=W?1:-1}}var $0=Object.assign({position:z},G&&JO),z6=H===!0?qO({x:V,y:M},L0(Q)):{x:V,y:M};if(V=z6.x,M=z6.y,W){var n0;return Object.assign({},$0,(n0={},n0[T]=R?"0":"",n0[S]=O?"0":"",n0.transform=(b.devicePixelRatio||1)<=1?"translate("+V+"px, "+M+"px)":"translate3d("+V+"px, "+M+"px, 0)",n0))}return Object.assign({},$0,(q={},q[T]=R?M+"px":"",q[S]=O?V+"px":"",q.transform="",q))}var QO=function(J){var{state:q,options:Q}=J,Z=Q.gpuAcceleration,X=Z===void 0?!0:Z,Y=Q.adaptive,K=Y===void 0?!0:Y,z=Q.roundOffsets,W=z===void 0?!0:z,G={placement:g0(q.placement),variation:k6(q.placement),popper:q.elements.popper,popperRect:q.rects.popper,gpuAcceleration:X,isFixed:q.options.strategy==="fixed"};if(q.modifiersData.popperOffsets!=null)q.styles.popper=Object.assign({},q.styles.popper,HG(Object.assign({},G,{offsets:q.modifiersData.popperOffsets,position:q.options.strategy,adaptive:K,roundOffsets:W})));if(q.modifiersData.arrow!=null)q.styles.arrow=Object.assign({},q.styles.arrow,HG(Object.assign({},G,{offsets:q.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:W})));q.attributes.popper=Object.assign({},q.attributes.popper,{"data-popper-placement":q.placement})},JO={top:"auto",right:"auto",bottom:"auto",left:"auto"},R9={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:QO,data:{}};var ZO=function(J){var{state:q,instance:Q,options:Z}=J,X=Z.scroll,Y=X===void 0?!0:X,K=Z.resize,z=K===void 0?!0:K,W=L0(q.elements.popper),G=[].concat(q.scrollParents.reference,q.scrollParents.popper);if(Y)G.forEach(function(H){H.addEventListener("scroll",Q.update,rZ)});if(z)W.addEventListener("resize",Q.update,rZ);return function(){if(Y)G.forEach(function(H){H.removeEventListener("scroll",Q.update,rZ)});if(z)W.removeEventListener("resize",Q.update,rZ)}},rZ={passive:!0},y9={name:"eventListeners",enabled:!0,phase:"write",fn:function J(){},effect:ZO,data:{}};var XO={left:"right",right:"left",bottom:"top",top:"bottom"};function Nq(J){return J.replace(/left|right|bottom|top/g,function(q){return XO[q]})}var YO={start:"end",end:"start"};function sZ(J){return J.replace(/start|end/g,function(q){return YO[q]})}function VJ(J){var q=L0(J),Q=q.pageXOffset,Z=q.pageYOffset;return{scrollLeft:Q,scrollTop:Z}}function PJ(J){return h6(c0(J)).left+VJ(J).scrollLeft}function bK(J,q){var Q=L0(J),Z=c0(J),X=Q.visualViewport,Y=Z.clientWidth,K=Z.clientHeight,z=0,W=0;if(X){Y=X.width,K=X.height;var G=D9();if(G||!G&&q==="fixed")z=X.offsetLeft,W=X.offsetTop}return{width:Y,height:K,x:z+PJ(J),y:W}}function SK(J){var q,Q=c0(J),Z=VJ(J),X=(q=J.ownerDocument)==null?void 0:q.body,Y=v6(Q.scrollWidth,Q.clientWidth,X?X.scrollWidth:0,X?X.clientWidth:0),K=v6(Q.scrollHeight,Q.clientHeight,X?X.scrollHeight:0,X?X.clientHeight:0),z=-Z.scrollLeft+PJ(J),W=-Z.scrollTop;if(t0(X||Q).direction==="rtl")z+=v6(Q.clientWidth,X?X.clientWidth:0)-Y;return{width:Y,height:K,x:z,y:W}}function UJ(J){var q=t0(J),Q=q.overflow,Z=q.overflowX,X=q.overflowY;return/auto|scroll|overlay|hidden/.test(Q+X+Z)}function iZ(J){if(["html","body","#document"].indexOf(u0(J))>=0)return J.ownerDocument.body;if(b0(J)&&UJ(J))return J;return iZ(G8(J))}function x8(J,q){var Q;if(q===void 0)q=[];var Z=iZ(J),X=Z===((Q=J.ownerDocument)==null?void 0:Q.body),Y=L0(Z),K=X?[Y].concat(Y.visualViewport||[],UJ(Z)?Z:[]):Z,z=q.concat(K);return X?z:z.concat(x8(G8(K)))}function Lq(J){return Object.assign({},J,{left:J.x,top:J.y,right:J.x+J.width,bottom:J.y+J.height})}var KO=function(J,q){var Q=h6(J,!1,q==="fixed");return Q.top=Q.top+J.clientTop,Q.left=Q.left+J.clientLeft,Q.bottom=Q.top+J.clientHeight,Q.right=Q.left+J.clientWidth,Q.width=J.clientWidth,Q.height=J.clientHeight,Q.x=Q.left,Q.y=Q.top,Q},GG=function(J,q,Q){return q===k9?Lq(bK(J,Q)):M6(q)?KO(q,Q):Lq(SK(c0(J)))},zO=function(J){var q=x8(G8(J)),Q=["absolute","fixed"].indexOf(t0(J).position)>=0,Z=Q&&b0(J)?x6(J):J;if(!M6(Z))return[];return q.filter(function(X){return M6(X)&&w9(X,Z)&&u0(X)!=="body"})};function vK(J,q,Q,Z){var X=q==="clippingParents"?zO(J):[].concat(q),Y=[].concat(X,[Q]),K=Y[0],z=Y.reduce(function(W,G){var H=GG(J,G,Z);return W.top=v6(H.top,W.top),W.right=GJ(H.right,W.right),W.bottom=GJ(H.bottom,W.bottom),W.left=v6(H.left,W.left),W},GG(J,K,Z));return z.width=z.right-z.left,z.height=z.bottom-z.top,z.x=z.left,z.y=z.top,z}function E9(J){var{reference:q,element:Q,placement:Z}=J,X=Z?g0(Z):null,Y=Z?k6(Z):null,K=q.x+q.width/2-Q.width/2,z=q.y+q.height/2-Q.height/2,W;switch(X){case U0:W={x:K,y:q.y-Q.height};break;case A0:W={x:K,y:q.y+q.height};break;case D0:W={x:q.x+q.width,y:z};break;case k0:W={x:q.x-Q.width,y:z};break;default:W={x:q.x,y:q.y}}var G=X?NJ(X):null;if(G!=null){var H=G==="y"?"height":"width";switch(Y){case r6:W[G]=W[G]-(q[H]/2-Q[H]/2);break;case v8:W[G]=W[G]+(q[H]/2-Q[H]/2);break;default:}}return W}function Y6(J,q){if(q===void 0)q={};var Q=q,Z=Q.placement,X=Z===void 0?J.placement:Z,Y=Q.strategy,K=Y===void 0?J.strategy:Y,z=Q.boundary,W=z===void 0?RK:z,G=Q.rootBoundary,H=G===void 0?k9:G,j=Q.elementContext,L=j===void 0?HJ:j,V=Q.altBoundary,P=V===void 0?!1:V,M=Q.padding,k=M===void 0?0:M,O=C9(typeof k!=="number"?k:A9(k,$8)),R=L===HJ?yK:HJ,S=J.rects.popper,T=J.elements[P?R:L],b=vK(M6(T)?T:T.contextElement||c0(J.elements.popper),W,H,K),p=h6(J.elements.reference),d=E9({reference:p,element:S,strategy:"absolute",placement:X}),V0=Lq(Object.assign({},S,d)),I0=L===HJ?V0:p,F0={top:b.top-I0.top+O.top,bottom:I0.bottom-b.bottom+O.bottom,left:b.left-I0.left+O.left,right:I0.right-b.right+O.right},$0=J.modifiersData.offset;if(L===HJ&&$0){var z6=$0[X];Object.keys(F0).forEach(function(n0){var d8=[D0,A0].indexOf(n0)>=0?1:-1,l8=[U0,A0].indexOf(n0)>=0?"y":"x";F0[n0]+=z6[l8]*d8})}return F0}function xK(J,q){if(q===void 0)q={};var Q=q,Z=Q.placement,X=Q.boundary,Y=Q.rootBoundary,K=Q.padding,z=Q.flipVariations,W=Q.allowedAutoPlacements,G=W===void 0?I9:W,H=k6(Z),j=H?z?aZ:aZ.filter(function(P){return k6(P)===H}):$8,L=j.filter(function(P){return G.indexOf(P)>=0});if(L.length===0)L=j;var V=L.reduce(function(P,M){return P[M]=Y6(J,{placement:M,boundary:X,rootBoundary:Y,padding:K})[g0(M)],P},{});return Object.keys(V).sort(function(P,M){return V[P]-V[M]})}var WO=function(J){if(g0(J)===h9)return[];var q=Nq(J);return[sZ(J),q,sZ(q)]},FO=function(J){var{state:q,options:Q,name:Z}=J;if(q.modifiersData[Z]._skip)return;var X=Q.mainAxis,Y=X===void 0?!0:X,K=Q.altAxis,z=K===void 0?!0:K,W=Q.fallbackPlacements,G=Q.padding,H=Q.boundary,j=Q.rootBoundary,L=Q.altBoundary,V=Q.flipVariations,P=V===void 0?!0:V,M=Q.allowedAutoPlacements,k=q.options.placement,O=g0(k),R=O===k,S=W||(R||!P?[Nq(k)]:WO(k)),T=[k].concat(S).reduce(function(DJ,V8){return DJ.concat(g0(V8)===h9?xK(q,{placement:V8,boundary:H,rootBoundary:j,padding:G,flipVariations:P,allowedAutoPlacements:M}):V8)},[]),b=q.rects.reference,p=q.rects.popper,d=new Map,V0=!0,I0=T[0];for(var F0=0;F0=0,l8=d8?"width":"height",W6=Y6(q,{placement:$0,boundary:H,rootBoundary:j,altBoundary:L,padding:G}),B6=d8?n0?D0:k0:n0?A0:U0;if(b[l8]>p[l8])B6=Nq(B6);var f9=Nq(B6),n8=[];if(Y)n8.push(W6[z6]<=0);if(z)n8.push(W6[B6]<=0,W6[f9]<=0);if(n8.every(function(DJ){return DJ})){I0=$0,V0=!1;break}d.set($0,n8)}if(V0){var p9=P?3:1,PX=function DJ(V8){var Rq=T.find(function(c9){var a8=d.get(c9);if(a8)return a8.slice(0,V8).every(function(UX){return UX})});if(Rq)return I0=Rq,"break"};for(var Aq=p9;Aq>0;Aq--){var m9=PX(Aq);if(m9==="break")break}}if(q.placement!==I0)q.modifiersData[Z]._skip=!0,q.placement=I0,q.reset=!0},uK={name:"flip",enabled:!0,phase:"main",fn:FO,requiresIfExists:["offset"],data:{_skip:!1}};var jG=function(J,q,Q){if(Q===void 0)Q={x:0,y:0};return{top:J.top-q.height-Q.y,right:J.right-q.width+Q.x,bottom:J.bottom-q.height+Q.y,left:J.left-q.width-Q.x}},NG=function(J){return[U0,D0,A0,k0].some(function(q){return J[q]>=0})},$O=function(J){var{state:q,name:Q}=J,Z=q.rects.reference,X=q.rects.popper,Y=q.modifiersData.preventOverflow,K=Y6(q,{elementContext:"reference"}),z=Y6(q,{altBoundary:!0}),W=jG(K,Z),G=jG(z,X,Y),H=NG(W),j=NG(G);q.modifiersData[Q]={referenceClippingOffsets:W,popperEscapeOffsets:G,isReferenceHidden:H,hasPopperEscaped:j},q.attributes.popper=Object.assign({},q.attributes.popper,{"data-popper-reference-hidden":H,"data-popper-escaped":j})},gK={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:$O};function HO(J,q,Q){var Z=g0(J),X=[k0,U0].indexOf(Z)>=0?-1:1,Y=typeof Q==="function"?Q(Object.assign({},q,{placement:J})):Q,K=Y[0],z=Y[1];return K=K||0,z=(z||0)*X,[k0,D0].indexOf(Z)>=0?{x:z,y:K}:{x:K,y:z}}var GO=function(J){var{state:q,options:Q,name:Z}=J,X=Q.offset,Y=X===void 0?[0,0]:X,K=I9.reduce(function(H,j){return H[j]=HO(j,q.rects,Y),H},{}),z=K[q.placement],W=z.x,G=z.y;if(q.modifiersData.popperOffsets!=null)q.modifiersData.popperOffsets.x+=W,q.modifiersData.popperOffsets.y+=G;q.modifiersData[Z]=K},fK={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:GO};var jO=function(J){var{state:q,name:Q}=J;q.modifiersData[Q]=E9({reference:q.rects.reference,element:q.rects.popper,strategy:"absolute",placement:q.placement})},T9={name:"popperOffsets",enabled:!0,phase:"read",fn:jO,data:{}};function pK(J){return J==="x"?"y":"x"}var NO=function(J){var{state:q,options:Q,name:Z}=J,X=Q.mainAxis,Y=X===void 0?!0:X,K=Q.altAxis,z=K===void 0?!1:K,W=Q.boundary,G=Q.rootBoundary,H=Q.altBoundary,j=Q.padding,L=Q.tether,V=L===void 0?!0:L,P=Q.tetherOffset,M=P===void 0?0:P,k=Y6(q,{boundary:W,rootBoundary:G,padding:j,altBoundary:H}),O=g0(q.placement),R=k6(q.placement),S=!R,T=NJ(O),b=pK(T),p=q.modifiersData.popperOffsets,d=q.rects.reference,V0=q.rects.popper,I0=typeof M==="function"?M(Object.assign({},q.rects,{placement:q.placement})):M,F0=typeof I0==="number"?{mainAxis:I0,altAxis:I0}:Object.assign({mainAxis:0,altAxis:0},I0),$0=q.modifiersData.offset?q.modifiersData.offset[q.placement]:null,z6={x:0,y:0};if(!p)return;if(Y){var n0,d8=T==="y"?U0:k0,l8=T==="y"?A0:D0,W6=T==="y"?"height":"width",B6=p[T],f9=B6+k[d8],n8=B6-k[l8],p9=V?-V0[W6]/2:0,PX=R===r6?d[W6]:V0[W6],Aq=R===r6?-V0[W6]:-d[W6],m9=q.elements.arrow,DJ=V&&m9?jJ(m9):{width:0,height:0},V8=q.modifiersData["arrow#persistent"]?q.modifiersData["arrow#persistent"].padding:B9(),Rq=V8[d8],c9=V8[l8],a8=LJ(0,d[W6],DJ[W6]),UX=S?d[W6]/2-p9-a8-Rq-F0.mainAxis:PX-a8-Rq-F0.mainAxis,wj=S?-d[W6]/2+p9+a8+c9+F0.mainAxis:Aq+a8+c9+F0.mainAxis,MX=q.elements.arrow&&x6(q.elements.arrow),Bj=MX?T==="y"?MX.clientTop||0:MX.clientLeft||0:0,Bz=(n0=$0==null?void 0:$0[T])!=null?n0:0,Cj=B6+UX-Bz-Bj,Aj=B6+wj-Bz,Cz=LJ(V?GJ(f9,Cj):f9,B6,V?v6(n8,Aj):n8);p[T]=Cz,z6[T]=Cz-B6}if(z){var Az,Rj=T==="x"?U0:k0,yj=T==="x"?A0:D0,r8=p[b],o9=b==="y"?"height":"width",Rz=r8+k[Rj],yz=r8-k[yj],hX=[U0,k0].indexOf(O)!==-1,Ez=(Az=$0==null?void 0:$0[b])!=null?Az:0,Tz=hX?Rz:r8-d[o9]-V0[o9]-Ez+F0.altAxis,_z=hX?r8+d[o9]+V0[o9]-Ez-F0.altAxis:yz,bz=V&&hX?$G(Tz,r8,_z):LJ(V?Tz:Rz,r8,V?_z:yz);p[b]=bz,z6[b]=bz-r8}q.modifiersData[Z]=z6},mK={name:"preventOverflow",enabled:!0,phase:"main",fn:NO,requiresIfExists:["offset"]};function cK(J){return{scrollLeft:J.scrollLeft,scrollTop:J.scrollTop}}function oK(J){if(J===L0(J)||!b0(J))return VJ(J);else return cK(J)}var LO=function(J){var q=J.getBoundingClientRect(),Q=H8(q.width)/J.offsetWidth||1,Z=H8(q.height)/J.offsetHeight||1;return Q!==1||Z!==1};function dK(J,q,Q){if(Q===void 0)Q=!1;var Z=b0(q),X=b0(q)&&LO(q),Y=c0(q),K=h6(J,X,Q),z={scrollLeft:0,scrollTop:0},W={x:0,y:0};if(Z||!Z&&!Q){if(u0(q)!=="body"||UJ(Y))z=oK(q);if(b0(q))W=h6(q,!0),W.x+=q.clientLeft,W.y+=q.clientTop;else if(Y)W.x=PJ(Y)}return{x:K.left+z.scrollLeft-W.x,y:K.top+z.scrollTop-W.y,width:K.width,height:K.height}}var VO=function(J){var q=new Map,Q=new Set,Z=[];J.forEach(function(Y){q.set(Y.name,Y)});function X(Y){Q.add(Y.name);var K=[].concat(Y.requires||[],Y.requiresIfExists||[]);K.forEach(function(z){if(!Q.has(z)){var W=q.get(z);if(W)X(W)}}),Z.push(Y)}return J.forEach(function(Y){if(!Q.has(Y.name))X(Y)}),Z};function lK(J){var q=VO(J);return EK.reduce(function(Q,Z){return Q.concat(q.filter(function(X){return X.phase===Z}))},[])}function nK(J){var q;return function(){if(!q)q=new Promise(function(Q){Promise.resolve().then(function(){q=void 0,Q(J())})});return q}}function aK(J){var q=J.reduce(function(Q,Z){var X=Q[Z.name];return Q[Z.name]=X?Object.assign({},X,Z,{options:Object.assign({},X.options,Z.options),data:Object.assign({},X.data,Z.data)}):Z,Q},{});return Object.keys(q).map(function(Q){return q[Q]})}var VG=function(){for(var J=arguments.length,q=new Array(J),Q=0;QZ.callable===q&&Z.delegationSelector===Q)},Jj=function(J,q,Q){const Z=typeof q==="string",X=Z?Q:q||Q;let Y=qj(J);if(!yO.has(Y))Y=J;return[Z,X,Y]},UG=function(J,q,Q,Z,X){if(typeof q!=="string"||!J)return;let[Y,K,z]=Jj(q,Q,Z);if(q in sG)K=((P)=>{return function(M){if(!M.relatedTarget||M.relatedTarget!==M.delegateTarget&&!M.delegateTarget.contains(M.relatedTarget))return P.call(this,M)}})(K);const W=tG(J),G=W[z]||(W[z]={}),H=eG(G,K,Y?Q:null);if(H){H.oneOff=H.oneOff&&X;return}const j=iG(K,q.replace(CO,"")),L=Y?TO(J,Q,K):EO(J,K);L.delegationSelector=Y?Q:null,L.callable=K,L.oneOff=X,L.uidEvent=j,G[j]=L,J.addEventListener(z,L,Y)},Hz=function(J,q,Q,Z,X){const Y=eG(q[Q],Z,X);if(!Y)return;J.removeEventListener(Q,Y,Boolean(X)),delete q[Q][Y.uidEvent]},_O=function(J,q,Q,Z){const X=q[Q]||{};for(let[Y,K]of Object.entries(X))if(Y.includes(Z))Hz(J,q,Q,K.callable,K.delegationSelector)},qj=function(J){return J=J.replace(AO,""),sG[J]||J},Nz=function(J,q={}){for(let[Q,Z]of Object.entries(q))try{J[Q]=Z}catch(X){Object.defineProperty(J,Q,{configurable:!0,get(){return Z}})}return J},MG=function(J){if(J==="true")return!0;if(J==="false")return!1;if(J===Number(J).toString())return Number(J);if(J===""||J==="null")return null;if(typeof J!=="string")return J;try{return JSON.parse(decodeURIComponent(J))}catch(q){return J}},tK=function(J){return J.replace(/[A-Z]/g,(q)=>`-${q.toLowerCase()}`)},NB=function(J,q,Q){if(!J.length)return J;if(Q&&typeof Q==="function")return Q(J);const X=new window.DOMParser().parseFromString(J,"text/html"),Y=[].concat(...X.body.querySelectorAll("*"));for(let K of Y){const z=K.nodeName.toLowerCase();if(!Object.keys(q).includes(z)){K.remove();continue}const W=[].concat(...K.attributes),G=[].concat(q["*"]||[],q[z]||[]);for(let H of W)if(!jB(H,G))K.removeAttribute(H.nodeName)}return X.body.innerHTML};/*! * Bootstrap v5.3.2 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */var u8=new Map,rK={set(J,q,Q){if(!u8.has(J))u8.set(J,new Map);const Z=u8.get(J);if(!Z.has(q)&&Z.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(Z.keys())[0]}.`);return}Z.set(q,Q)},get(J,q){if(u8.has(J))return u8.get(J).get(q)||null;return null},remove(J,q){if(!u8.has(J))return;const Q=u8.get(J);if(Q.delete(q),Q.size===0)u8.delete(J)}},kO=1e6,IO=1000,$z="transitionend",dG=(J)=>{if(J&&window.CSS&&window.CSS.escape)J=J.replace(/#([^\s"#']+)/g,(q,Q)=>`#${CSS.escape(Q)}`);return J},OO=(J)=>{if(J===null||J===void 0)return`${J}`;return Object.prototype.toString.call(J).match(/\s([a-z]+)/i)[1].toLowerCase()},DO=(J)=>{do J+=Math.floor(Math.random()*kO);while(document.getElementById(J));return J},wO=(J)=>{if(!J)return 0;let{transitionDuration:q,transitionDelay:Q}=window.getComputedStyle(J);const Z=Number.parseFloat(q),X=Number.parseFloat(Q);if(!Z&&!X)return 0;return q=q.split(",")[0],Q=Q.split(",")[0],(Number.parseFloat(q)+Number.parseFloat(Q))*IO},lG=(J)=>{J.dispatchEvent(new Event($z))},j8=(J)=>{if(!J||typeof J!=="object")return!1;if(typeof J.jquery!=="undefined")J=J[0];return typeof J.nodeType!=="undefined"},g8=(J)=>{if(j8(J))return J.jquery?J[0]:J;if(typeof J==="string"&&J.length>0)return document.querySelector(dG(J));return null},Oq=(J)=>{if(!j8(J)||J.getClientRects().length===0)return!1;const q=getComputedStyle(J).getPropertyValue("visibility")==="visible",Q=J.closest("details:not([open])");if(!Q)return q;if(Q!==J){const Z=J.closest("summary");if(Z&&Z.parentNode!==Q)return!1;if(Z===null)return!1}return q},f8=(J)=>{if(!J||J.nodeType!==Node.ELEMENT_NODE)return!0;if(J.classList.contains("disabled"))return!0;if(typeof J.disabled!=="undefined")return J.disabled;return J.hasAttribute("disabled")&&J.getAttribute("disabled")!=="false"},nG=(J)=>{if(!document.documentElement.attachShadow)return null;if(typeof J.getRootNode==="function"){const q=J.getRootNode();return q instanceof ShadowRoot?q:null}if(J instanceof ShadowRoot)return J;if(!J.parentNode)return null;return nG(J.parentNode)},zX=()=>{},x9=(J)=>{J.offsetHeight},aG=()=>{if(window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery"))return window.jQuery;return null},sK=[],BO=(J)=>{if(document.readyState==="loading"){if(!sK.length)document.addEventListener("DOMContentLoaded",()=>{for(let q of sK)q()});sK.push(J)}else J()},I6=()=>document.documentElement.dir==="rtl",D6=(J)=>{BO(()=>{const q=aG();if(q){const Q=J.NAME,Z=q.fn[Q];q.fn[Q]=J.jQueryInterface,q.fn[Q].Constructor=J,q.fn[Q].noConflict=()=>{return q.fn[Q]=Z,J.jQueryInterface}}})},K6=(J,q=[],Q=J)=>{return typeof J==="function"?J(...q):Q},rG=(J,q,Q=!0)=>{if(!Q){K6(J);return}const Z=5,X=wO(q)+Z;let Y=!1;const K=({target:z})=>{if(z!==q)return;Y=!0,q.removeEventListener($z,K),K6(J)};q.addEventListener($z,K),setTimeout(()=>{if(!Y)lG(q)},X)},jz=(J,q,Q,Z)=>{const X=J.length;let Y=J.indexOf(q);if(Y===-1)return!Q&&Z?J[X-1]:J[0];if(Y+=Q?1:-1,Z)Y=(Y+X)%X;return J[Math.max(0,Math.min(Y,X-1))]},CO=/[^.]*(?=\..*)\.|.*/,AO=/\..*/,RO=/::\d+$/,iK={},PG=1,sG={mouseenter:"mouseover",mouseleave:"mouseout"},yO=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]),A={on(J,q,Q,Z){UG(J,q,Q,Z,!1)},one(J,q,Q,Z){UG(J,q,Q,Z,!0)},off(J,q,Q,Z){if(typeof q!=="string"||!J)return;const[X,Y,K]=Jj(q,Q,Z),z=K!==q,W=tG(J),G=W[K]||{},H=q.startsWith(".");if(typeof Y!=="undefined"){if(!Object.keys(G).length)return;Hz(J,W,K,Y,X?Q:null);return}if(H)for(let j of Object.keys(W))_O(J,W,j,q.slice(1));for(let[j,L]of Object.entries(G)){const V=j.replace(RO,"");if(!z||q.includes(V))Hz(J,W,K,L.callable,L.delegationSelector)}},trigger(J,q,Q){if(typeof q!=="string"||!J)return null;const Z=aG(),X=qj(q),Y=q!==X;let K=null,z=!0,W=!0,G=!1;if(Y&&Z)K=Z.Event(q,Q),Z(J).trigger(K),z=!K.isPropagationStopped(),W=!K.isImmediatePropagationStopped(),G=K.isDefaultPrevented();const H=Nz(new Event(q,{bubbles:z,cancelable:!0}),Q);if(G)H.preventDefault();if(W)J.dispatchEvent(H);if(H.defaultPrevented&&K)K.preventDefault();return H}},N8={setDataAttribute(J,q,Q){J.setAttribute(`data-bs-${tK(q)}`,Q)},removeDataAttribute(J,q){J.removeAttribute(`data-bs-${tK(q)}`)},getDataAttributes(J){if(!J)return{};const q={},Q=Object.keys(J.dataset).filter((Z)=>Z.startsWith("bs")&&!Z.startsWith("bsConfig"));for(let Z of Q){let X=Z.replace(/^bs/,"");X=X.charAt(0).toLowerCase()+X.slice(1,X.length),q[X]=MG(J.dataset[Z])}return q},getDataAttribute(J,q){return MG(J.getAttribute(`data-bs-${tK(q)}`))}};class Dq{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(J){return J=this._mergeConfigObj(J),J=this._configAfterMerge(J),this._typeCheckConfig(J),J}_configAfterMerge(J){return J}_mergeConfigObj(J,q){const Q=j8(q)?N8.getDataAttribute(q,"config"):{};return{...this.constructor.Default,...typeof Q==="object"?Q:{},...j8(q)?N8.getDataAttributes(q):{},...typeof J==="object"?J:{}}}_typeCheckConfig(J,q=this.constructor.DefaultType){for(let[Q,Z]of Object.entries(q)){const X=J[Q],Y=j8(X)?"element":OO(X);if(!new RegExp(Z).test(Y))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${Q}" provided type "${Y}" but expected type "${Z}".`)}}}var bO="5.3.2";class w6 extends Dq{constructor(J,q){super();if(J=g8(J),!J)return;this._element=J,this._config=this._getConfig(q),rK.set(this._element,this.constructor.DATA_KEY,this)}dispose(){rK.remove(this._element,this.constructor.DATA_KEY),A.off(this._element,this.constructor.EVENT_KEY);for(let J of Object.getOwnPropertyNames(this))this[J]=null}_queueCallback(J,q,Q=!0){rG(J,q,Q)}_getConfig(J){return J=this._mergeConfigObj(J,this._element),J=this._configAfterMerge(J),this._typeCheckConfig(J),J}static getInstance(J){return rK.get(g8(J),this.DATA_KEY)}static getOrCreateInstance(J,q={}){return this.getInstance(J)||new this(J,typeof q==="object"?q:null)}static get VERSION(){return bO}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(J){return`${J}${this.EVENT_KEY}`}}var eK=(J)=>{let q=J.getAttribute("data-bs-target");if(!q||q==="#"){let Q=J.getAttribute("href");if(!Q||!Q.includes("#")&&!Q.startsWith("."))return null;if(Q.includes("#")&&!Q.startsWith("#"))Q=`#${Q.split("#")[1]}`;q=Q&&Q!=="#"?dG(Q.trim()):null}return q},x={find(J,q=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(q,J))},findOne(J,q=document.documentElement){return Element.prototype.querySelector.call(q,J)},children(J,q){return[].concat(...J.children).filter((Q)=>Q.matches(q))},parents(J,q){const Q=[];let Z=J.parentNode.closest(q);while(Z)Q.push(Z),Z=Z.parentNode.closest(q);return Q},prev(J,q){let Q=J.previousElementSibling;while(Q){if(Q.matches(q))return[Q];Q=Q.previousElementSibling}return[]},next(J,q){let Q=J.nextElementSibling;while(Q){if(Q.matches(q))return[Q];Q=Q.nextElementSibling}return[]},focusableChildren(J){const q=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((Q)=>`${Q}:not([tabindex^="-"])`).join(",");return this.find(q,J).filter((Q)=>!f8(Q)&&Oq(Q))},getSelectorFromElement(J){const q=eK(J);if(q)return x.findOne(q)?q:null;return null},getElementFromSelector(J){const q=eK(J);return q?x.findOne(q):null},getMultipleElementsFromSelector(J){const q=eK(J);return q?x.find(q):[]}},HX=(J,q="hide")=>{const Q=`click.dismiss${J.EVENT_KEY}`,Z=J.NAME;A.on(document,Q,`[data-bs-dismiss="${Z}"]`,function(X){if(["A","AREA"].includes(this.tagName))X.preventDefault();if(f8(this))return;const Y=x.getElementFromSelector(this)||this.closest(`.${Z}`);J.getOrCreateInstance(Y)[q]()})},SO="alert",vO="bs.alert",Qj=`.${vO}`,xO=`close${Qj}`,uO=`closed${Qj}`,gO="fade",fO="show";class GX extends w6{static get NAME(){return SO}close(){if(A.trigger(this._element,xO).defaultPrevented)return;this._element.classList.remove(fO);const q=this._element.classList.contains(gO);this._queueCallback(()=>this._destroyElement(),this._element,q)}_destroyElement(){this._element.remove(),A.trigger(this._element,uO),this.dispose()}static jQueryInterface(J){return this.each(function(){const q=GX.getOrCreateInstance(this);if(typeof J!=="string")return;if(q[J]===void 0||J.startsWith("_")||J==="constructor")throw new TypeError(`No method named "${J}"`);q[J](this)})}}HX(GX,"close");D6(GX);var pO="button",mO="bs.button",cO=`.${mO}`,oO=".data-api",dO="active",hG='[data-bs-toggle="button"]',lO=`click${cO}${oO}`;class jX extends w6{static get NAME(){return pO}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(dO))}static jQueryInterface(J){return this.each(function(){const q=jX.getOrCreateInstance(this);if(J==="toggle")q[J]()})}}A.on(document,lO,hG,(J)=>{J.preventDefault();const q=J.target.closest(hG);jX.getOrCreateInstance(q).toggle()});D6(jX);var nO="swipe",wq=".bs.swipe",aO=`touchstart${wq}`,rO=`touchmove${wq}`,sO=`touchend${wq}`,iO=`pointerdown${wq}`,tO=`pointerup${wq}`,eO="touch",JD="pen",qD="pointer-event",QD=40,ZD={endCallback:null,leftCallback:null,rightCallback:null},XD={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class WX extends Dq{constructor(J,q){super();if(this._element=J,!J||!WX.isSupported())return;this._config=this._getConfig(q),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return ZD}static get DefaultType(){return XD}static get NAME(){return nO}dispose(){A.off(this._element,wq)}_start(J){if(!this._supportPointerEvents){this._deltaX=J.touches[0].clientX;return}if(this._eventIsPointerPenTouch(J))this._deltaX=J.clientX}_end(J){if(this._eventIsPointerPenTouch(J))this._deltaX=J.clientX-this._deltaX;this._handleSwipe(),K6(this._config.endCallback)}_move(J){this._deltaX=J.touches&&J.touches.length>1?0:J.touches[0].clientX-this._deltaX}_handleSwipe(){const J=Math.abs(this._deltaX);if(J<=QD)return;const q=J/this._deltaX;if(this._deltaX=0,!q)return;K6(q>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){if(this._supportPointerEvents)A.on(this._element,iO,(J)=>this._start(J)),A.on(this._element,tO,(J)=>this._end(J)),this._element.classList.add(qD);else A.on(this._element,aO,(J)=>this._start(J)),A.on(this._element,rO,(J)=>this._move(J)),A.on(this._element,sO,(J)=>this._end(J))}_eventIsPointerPenTouch(J){return this._supportPointerEvents&&(J.pointerType===JD||J.pointerType===eO)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}var YD="carousel",KD="bs.carousel",c8=`.${KD}`,Zj=".data-api",zD="ArrowLeft",WD="ArrowRight",FD=500,b9="next",Pq="prev",Mq="left",YX="right",$D=`slide${c8}`,Jz=`slid${c8}`,HD=`keydown${c8}`,GD=`mouseenter${c8}`,jD=`mouseleave${c8}`,ND=`dragstart${c8}`,LD=`load${c8}${Zj}`,VD=`click${c8}${Zj}`,Xj="carousel",eZ="active",PD="slide",UD="carousel-item-end",MD="carousel-item-start",hD="carousel-item-next",kD="carousel-item-prev",Yj=".active",Kj=".carousel-item",ID=Yj+Kj,OD=".carousel-item img",DD=".carousel-indicators",wD="[data-bs-slide], [data-bs-slide-to]",BD='[data-bs-ride="carousel"]',CD={[zD]:YX,[WD]:Mq},AD={interval:5000,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},RD={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class u9 extends w6{constructor(J,q){super(J,q);if(this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=x.findOne(DD,this._element),this._addEventListeners(),this._config.ride===Xj)this.cycle()}static get Default(){return AD}static get DefaultType(){return RD}static get NAME(){return YD}next(){this._slide(b9)}nextWhenVisible(){if(!document.hidden&&Oq(this._element))this.next()}prev(){this._slide(Pq)}pause(){if(this._isSliding)lG(this._element);this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){A.one(this._element,Jz,()=>this.cycle());return}this.cycle()}to(J){const q=this._getItems();if(J>q.length-1||J<0)return;if(this._isSliding){A.one(this._element,Jz,()=>this.to(J));return}const Q=this._getItemIndex(this._getActive());if(Q===J)return;const Z=J>Q?b9:Pq;this._slide(Z,q[J])}dispose(){if(this._swipeHelper)this._swipeHelper.dispose();super.dispose()}_configAfterMerge(J){return J.defaultInterval=J.interval,J}_addEventListeners(){if(this._config.keyboard)A.on(this._element,HD,(J)=>this._keydown(J));if(this._config.pause==="hover")A.on(this._element,GD,()=>this.pause()),A.on(this._element,jD,()=>this._maybeEnableCycle());if(this._config.touch&&WX.isSupported())this._addTouchEventListeners()}_addTouchEventListeners(){for(let Q of x.find(OD,this._element))A.on(Q,ND,(Z)=>Z.preventDefault());const q={leftCallback:()=>this._slide(this._directionToOrder(Mq)),rightCallback:()=>this._slide(this._directionToOrder(YX)),endCallback:()=>{if(this._config.pause!=="hover")return;if(this.pause(),this.touchTimeout)clearTimeout(this.touchTimeout);this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),FD+this._config.interval)}};this._swipeHelper=new WX(this._element,q)}_keydown(J){if(/input|textarea/i.test(J.target.tagName))return;const q=CD[J.key];if(q)J.preventDefault(),this._slide(this._directionToOrder(q))}_getItemIndex(J){return this._getItems().indexOf(J)}_setActiveIndicatorElement(J){if(!this._indicatorsElement)return;const q=x.findOne(Yj,this._indicatorsElement);q.classList.remove(eZ),q.removeAttribute("aria-current");const Q=x.findOne(`[data-bs-slide-to="${J}"]`,this._indicatorsElement);if(Q)Q.classList.add(eZ),Q.setAttribute("aria-current","true")}_updateInterval(){const J=this._activeElement||this._getActive();if(!J)return;const q=Number.parseInt(J.getAttribute("data-bs-interval"),10);this._config.interval=q||this._config.defaultInterval}_slide(J,q=null){if(this._isSliding)return;const Q=this._getActive(),Z=J===b9,X=q||jz(this._getItems(),Q,Z,this._config.wrap);if(X===Q)return;const Y=this._getItemIndex(X),K=(L)=>{return A.trigger(this._element,L,{relatedTarget:X,direction:this._orderToDirection(J),from:this._getItemIndex(Q),to:Y})};if(K($D).defaultPrevented)return;if(!Q||!X)return;const W=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(Y),this._activeElement=X;const G=Z?MD:UD,H=Z?hD:kD;X.classList.add(H),x9(X),Q.classList.add(G),X.classList.add(G);const j=()=>{X.classList.remove(G,H),X.classList.add(eZ),Q.classList.remove(eZ,H,G),this._isSliding=!1,K(Jz)};if(this._queueCallback(j,Q,this._isAnimated()),W)this.cycle()}_isAnimated(){return this._element.classList.contains(PD)}_getActive(){return x.findOne(ID,this._element)}_getItems(){return x.find(Kj,this._element)}_clearInterval(){if(this._interval)clearInterval(this._interval),this._interval=null}_directionToOrder(J){if(I6())return J===Mq?Pq:b9;return J===Mq?b9:Pq}_orderToDirection(J){if(I6())return J===Pq?Mq:YX;return J===Pq?YX:Mq}static jQueryInterface(J){return this.each(function(){const q=u9.getOrCreateInstance(this,J);if(typeof J==="number"){q.to(J);return}if(typeof J==="string"){if(q[J]===void 0||J.startsWith("_")||J==="constructor")throw new TypeError(`No method named "${J}"`);q[J]()}})}}A.on(document,VD,wD,function(J){const q=x.getElementFromSelector(this);if(!q||!q.classList.contains(Xj))return;J.preventDefault();const Q=u9.getOrCreateInstance(q),Z=this.getAttribute("data-bs-slide-to");if(Z){Q.to(Z),Q._maybeEnableCycle();return}if(N8.getDataAttribute(this,"slide")==="next"){Q.next(),Q._maybeEnableCycle();return}Q.prev(),Q._maybeEnableCycle()});A.on(window,LD,()=>{const J=x.find(BD);for(let q of J)u9.getOrCreateInstance(q)});D6(u9);var yD="collapse",ED="bs.collapse",g9=`.${ED}`,TD=".data-api",_D=`show${g9}`,bD=`shown${g9}`,SD=`hide${g9}`,vD=`hidden${g9}`,xD=`click${g9}${TD}`,qz="show",kq="collapse",JX="collapsing",uD="collapsed",gD=`:scope .${kq} .${kq}`,fD="collapse-horizontal",pD="width",mD="height",cD=".collapse.show, .collapse.collapsing",Gz='[data-bs-toggle="collapse"]',oD={parent:null,toggle:!0},dD={parent:"(null|element)",toggle:"boolean"};class v9 extends w6{constructor(J,q){super(J,q);this._isTransitioning=!1,this._triggerArray=[];const Q=x.find(Gz);for(let Z of Q){const X=x.getSelectorFromElement(Z),Y=x.find(X).filter((K)=>K===this._element);if(X!==null&&Y.length)this._triggerArray.push(Z)}if(this._initializeChildren(),!this._config.parent)this._addAriaAndCollapsedClass(this._triggerArray,this._isShown());if(this._config.toggle)this.toggle()}static get Default(){return oD}static get DefaultType(){return dD}static get NAME(){return yD}toggle(){if(this._isShown())this.hide();else this.show()}show(){if(this._isTransitioning||this._isShown())return;let J=[];if(this._config.parent)J=this._getFirstLevelChildren(cD).filter((K)=>K!==this._element).map((K)=>v9.getOrCreateInstance(K,{toggle:!1}));if(J.length&&J[0]._isTransitioning)return;if(A.trigger(this._element,_D).defaultPrevented)return;for(let K of J)K.hide();const Q=this._getDimension();this._element.classList.remove(kq),this._element.classList.add(JX),this._element.style[Q]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const Z=()=>{this._isTransitioning=!1,this._element.classList.remove(JX),this._element.classList.add(kq,qz),this._element.style[Q]="",A.trigger(this._element,bD)},Y=`scroll${Q[0].toUpperCase()+Q.slice(1)}`;this._queueCallback(Z,this._element,!0),this._element.style[Q]=`${this._element[Y]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(A.trigger(this._element,SD).defaultPrevented)return;const q=this._getDimension();this._element.style[q]=`${this._element.getBoundingClientRect()[q]}px`,x9(this._element),this._element.classList.add(JX),this._element.classList.remove(kq,qz);for(let Z of this._triggerArray){const X=x.getElementFromSelector(Z);if(X&&!this._isShown(X))this._addAriaAndCollapsedClass([Z],!1)}this._isTransitioning=!0;const Q=()=>{this._isTransitioning=!1,this._element.classList.remove(JX),this._element.classList.add(kq),A.trigger(this._element,vD)};this._element.style[q]="",this._queueCallback(Q,this._element,!0)}_isShown(J=this._element){return J.classList.contains(qz)}_configAfterMerge(J){return J.toggle=Boolean(J.toggle),J.parent=g8(J.parent),J}_getDimension(){return this._element.classList.contains(fD)?pD:mD}_initializeChildren(){if(!this._config.parent)return;const J=this._getFirstLevelChildren(Gz);for(let q of J){const Q=x.getElementFromSelector(q);if(Q)this._addAriaAndCollapsedClass([q],this._isShown(Q))}}_getFirstLevelChildren(J){const q=x.find(gD,this._config.parent);return x.find(J,this._config.parent).filter((Q)=>!q.includes(Q))}_addAriaAndCollapsedClass(J,q){if(!J.length)return;for(let Q of J)Q.classList.toggle(uD,!q),Q.setAttribute("aria-expanded",q)}static jQueryInterface(J){const q={};if(typeof J==="string"&&/show|hide/.test(J))q.toggle=!1;return this.each(function(){const Q=v9.getOrCreateInstance(this,q);if(typeof J==="string"){if(typeof Q[J]==="undefined")throw new TypeError(`No method named "${J}"`);Q[J]()}})}}A.on(document,xD,Gz,function(J){if(J.target.tagName==="A"||J.delegateTarget&&J.delegateTarget.tagName==="A")J.preventDefault();for(let q of x.getMultipleElementsFromSelector(this))v9.getOrCreateInstance(q,{toggle:!1}).toggle()});D6(v9);var kG="dropdown",lD="bs.dropdown",kJ=`.${lD}`,Lz=".data-api",nD="Escape",IG="Tab",aD="ArrowUp",OG="ArrowDown",rD=2,sD=`hide${kJ}`,iD=`hidden${kJ}`,tD=`show${kJ}`,eD=`shown${kJ}`,zj=`click${kJ}${Lz}`,Wj=`keydown${kJ}${Lz}`,Jw=`keyup${kJ}${Lz}`,hq="show",qw="dropup",Qw="dropend",Zw="dropstart",Xw="dropup-center",Yw="dropdown-center",MJ='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Kw=`${MJ}.${hq}`,KX=".dropdown-menu",zw=".navbar",Ww=".navbar-nav",Fw=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",$w=I6()?"top-end":"top-start",Hw=I6()?"top-start":"top-end",Gw=I6()?"bottom-end":"bottom-start",jw=I6()?"bottom-start":"bottom-end",Nw=I6()?"left-start":"right-start",Lw=I6()?"right-start":"left-start",Vw="top",Pw="bottom",Uw={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Mw={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class s6 extends w6{constructor(J,q){super(J,q);this._popper=null,this._parent=this._element.parentNode,this._menu=x.next(this._element,KX)[0]||x.prev(this._element,KX)[0]||x.findOne(KX,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Uw}static get DefaultType(){return Mw}static get NAME(){return kG}toggle(){return this._isShown()?this.hide():this.show()}show(){if(f8(this._element)||this._isShown())return;const J={relatedTarget:this._element};if(A.trigger(this._element,tD,J).defaultPrevented)return;if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(Ww))for(let Q of[].concat(...document.body.children))A.on(Q,"mouseover",zX);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(hq),this._element.classList.add(hq),A.trigger(this._element,eD,J)}hide(){if(f8(this._element)||!this._isShown())return;const J={relatedTarget:this._element};this._completeHide(J)}dispose(){if(this._popper)this._popper.destroy();super.dispose()}update(){if(this._inNavbar=this._detectNavbar(),this._popper)this._popper.update()}_completeHide(J){if(A.trigger(this._element,sD,J).defaultPrevented)return;if("ontouchstart"in document.documentElement)for(let Q of[].concat(...document.body.children))A.off(Q,"mouseover",zX);if(this._popper)this._popper.destroy();this._menu.classList.remove(hq),this._element.classList.remove(hq),this._element.setAttribute("aria-expanded","false"),N8.removeDataAttribute(this._menu,"popper"),A.trigger(this._element,iD,J)}_getConfig(J){if(J=super._getConfig(J),typeof J.reference==="object"&&!j8(J.reference)&&typeof J.reference.getBoundingClientRect!=="function")throw new TypeError(`${kG.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return J}_createPopper(){if(typeof tZ==="undefined")throw new TypeError("Bootstrap\'s dropdowns require Popper (https://popper.js.org)");let J=this._element;if(this._config.reference==="parent")J=this._parent;else if(j8(this._config.reference))J=g8(this._config.reference);else if(typeof this._config.reference==="object")J=this._config.reference;const q=this._getPopperConfig();this._popper=_9(J,this._menu,q)}_isShown(){return this._menu.classList.contains(hq)}_getPlacement(){const J=this._parent;if(J.classList.contains(Qw))return Nw;if(J.classList.contains(Zw))return Lw;if(J.classList.contains(Xw))return Vw;if(J.classList.contains(Yw))return Pw;const q=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";if(J.classList.contains(qw))return q?Hw:$w;return q?jw:Gw}_detectNavbar(){return this._element.closest(zw)!==null}_getOffset(){const{offset:J}=this._config;if(typeof J==="string")return J.split(",").map((q)=>Number.parseInt(q,10));if(typeof J==="function")return(q)=>J(q,this._element);return J}_getPopperConfig(){const J={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};if(this._inNavbar||this._config.display==="static")N8.setDataAttribute(this._menu,"popper","static"),J.modifiers=[{name:"applyStyles",enabled:!1}];return{...J,...K6(this._config.popperConfig,[J])}}_selectMenuItem({key:J,target:q}){const Q=x.find(Fw,this._menu).filter((Z)=>Oq(Z));if(!Q.length)return;jz(Q,q,J===OG,!Q.includes(q)).focus()}static jQueryInterface(J){return this.each(function(){const q=s6.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(typeof q[J]==="undefined")throw new TypeError(`No method named "${J}"`);q[J]()})}static clearMenus(J){if(J.button===rD||J.type==="keyup"&&J.key!==IG)return;const q=x.find(Kw);for(let Q of q){const Z=s6.getInstance(Q);if(!Z||Z._config.autoClose===!1)continue;const X=J.composedPath(),Y=X.includes(Z._menu);if(X.includes(Z._element)||Z._config.autoClose==="inside"&&!Y||Z._config.autoClose==="outside"&&Y)continue;if(Z._menu.contains(J.target)&&(J.type==="keyup"&&J.key===IG||/input|select|option|textarea|form/i.test(J.target.tagName)))continue;const K={relatedTarget:Z._element};if(J.type==="click")K.clickEvent=J;Z._completeHide(K)}}static dataApiKeydownHandler(J){const q=/input|textarea/i.test(J.target.tagName),Q=J.key===nD,Z=[aD,OG].includes(J.key);if(!Z&&!Q)return;if(q&&!Q)return;J.preventDefault();const X=this.matches(MJ)?this:x.prev(this,MJ)[0]||x.next(this,MJ)[0]||x.findOne(MJ,J.delegateTarget.parentNode),Y=s6.getOrCreateInstance(X);if(Z){J.stopPropagation(),Y.show(),Y._selectMenuItem(J);return}if(Y._isShown())J.stopPropagation(),Y.hide(),X.focus()}}A.on(document,Wj,MJ,s6.dataApiKeydownHandler);A.on(document,Wj,KX,s6.dataApiKeydownHandler);A.on(document,zj,s6.clearMenus);A.on(document,Jw,s6.clearMenus);A.on(document,zj,MJ,function(J){J.preventDefault(),s6.getOrCreateInstance(this).toggle()});D6(s6);var Fj="backdrop",hw="fade",DG="show",wG=`mousedown.bs.${Fj}`,kw={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Iw={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Vz extends Dq{constructor(J){super();this._config=this._getConfig(J),this._isAppended=!1,this._element=null}static get Default(){return kw}static get DefaultType(){return Iw}static get NAME(){return Fj}show(J){if(!this._config.isVisible){K6(J);return}this._append();const q=this._getElement();if(this._config.isAnimated)x9(q);q.classList.add(DG),this._emulateAnimation(()=>{K6(J)})}hide(J){if(!this._config.isVisible){K6(J);return}this._getElement().classList.remove(DG),this._emulateAnimation(()=>{this.dispose(),K6(J)})}dispose(){if(!this._isAppended)return;A.off(this._element,wG),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const J=document.createElement("div");if(J.className=this._config.className,this._config.isAnimated)J.classList.add(hw);this._element=J}return this._element}_configAfterMerge(J){return J.rootElement=g8(J.rootElement),J}_append(){if(this._isAppended)return;const J=this._getElement();this._config.rootElement.append(J),A.on(J,wG,()=>{K6(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(J){rG(J,this._getElement(),this._config.isAnimated)}}var Ow="focustrap",Dw="bs.focustrap",FX=`.${Dw}`,ww=`focusin${FX}`,Bw=`keydown.tab${FX}`,Cw="Tab",Aw="forward",BG="backward",Rw={autofocus:!0,trapElement:null},yw={autofocus:"boolean",trapElement:"element"};class Pz extends Dq{constructor(J){super();this._config=this._getConfig(J),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Rw}static get DefaultType(){return yw}static get NAME(){return Ow}activate(){if(this._isActive)return;if(this._config.autofocus)this._config.trapElement.focus();A.off(document,FX),A.on(document,ww,(J)=>this._handleFocusin(J)),A.on(document,Bw,(J)=>this._handleKeydown(J)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,A.off(document,FX)}_handleFocusin(J){const{trapElement:q}=this._config;if(J.target===document||J.target===q||q.contains(J.target))return;const Q=x.focusableChildren(q);if(Q.length===0)q.focus();else if(this._lastTabNavDirection===BG)Q[Q.length-1].focus();else Q[0].focus()}_handleKeydown(J){if(J.key!==Cw)return;this._lastTabNavDirection=J.shiftKey?BG:Aw}}var CG=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",AG=".sticky-top",qX="padding-right",RG="margin-right";class $X{constructor(){this._element=document.body}getWidth(){const J=document.documentElement.clientWidth;return Math.abs(window.innerWidth-J)}hide(){const J=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,qX,(q)=>q+J),this._setElementAttributes(CG,qX,(q)=>q+J),this._setElementAttributes(AG,RG,(q)=>q-J)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,qX),this._resetElementAttributes(CG,qX),this._resetElementAttributes(AG,RG)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(J,q,Q){const Z=this.getWidth(),X=(Y)=>{if(Y!==this._element&&window.innerWidth>Y.clientWidth+Z)return;this._saveInitialAttribute(Y,q);const K=window.getComputedStyle(Y).getPropertyValue(q);Y.style.setProperty(q,`${Q(Number.parseFloat(K))}px`)};this._applyManipulationCallback(J,X)}_saveInitialAttribute(J,q){const Q=J.style.getPropertyValue(q);if(Q)N8.setDataAttribute(J,q,Q)}_resetElementAttributes(J,q){const Q=(Z)=>{const X=N8.getDataAttribute(Z,q);if(X===null){Z.style.removeProperty(q);return}N8.removeDataAttribute(Z,q),Z.style.setProperty(q,X)};this._applyManipulationCallback(J,Q)}_applyManipulationCallback(J,q){if(j8(J)){q(J);return}for(let Q of x.find(J,this._element))q(Q)}}var Ew="modal",Tw="bs.modal",O6=`.${Tw}`,_w=".data-api",bw="Escape",Sw=`hide${O6}`,vw=`hidePrevented${O6}`,$j=`hidden${O6}`,Hj=`show${O6}`,xw=`shown${O6}`,uw=`resize${O6}`,gw=`click.dismiss${O6}`,fw=`mousedown.dismiss${O6}`,pw=`keydown.dismiss${O6}`,mw=`click${O6}${_w}`,yG="modal-open",cw="fade",EG="show",Qz="modal-static",ow=".modal.show",dw=".modal-dialog",lw=".modal-body",nw='[data-bs-toggle="modal"]',aw={backdrop:!0,focus:!0,keyboard:!0},rw={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class p8 extends w6{constructor(J,q){super(J,q);this._dialog=x.findOne(dw,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new $X,this._addEventListeners()}static get Default(){return aw}static get DefaultType(){return rw}static get NAME(){return Ew}toggle(J){return this._isShown?this.hide():this.show(J)}show(J){if(this._isShown||this._isTransitioning)return;if(A.trigger(this._element,Hj,{relatedTarget:J}).defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(yG),this._adjustDialog(),this._backdrop.show(()=>this._showElement(J))}hide(){if(!this._isShown||this._isTransitioning)return;if(A.trigger(this._element,Sw).defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(EG),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){A.off(window,O6),A.off(this._dialog,O6),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Vz({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Pz({trapElement:this._element})}_showElement(J){if(!document.body.contains(this._element))document.body.append(this._element);this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const q=x.findOne(lw,this._dialog);if(q)q.scrollTop=0;x9(this._element),this._element.classList.add(EG);const Q=()=>{if(this._config.focus)this._focustrap.activate();this._isTransitioning=!1,A.trigger(this._element,xw,{relatedTarget:J})};this._queueCallback(Q,this._dialog,this._isAnimated())}_addEventListeners(){A.on(this._element,pw,(J)=>{if(J.key!==bw)return;if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}),A.on(window,uw,()=>{if(this._isShown&&!this._isTransitioning)this._adjustDialog()}),A.on(this._element,fw,(J)=>{A.one(this._element,gw,(q)=>{if(this._element!==J.target||this._element!==q.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}if(this._config.backdrop)this.hide()})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(yG),this._resetAdjustments(),this._scrollBar.reset(),A.trigger(this._element,$j)})}_isAnimated(){return this._element.classList.contains(cw)}_triggerBackdropTransition(){if(A.trigger(this._element,vw).defaultPrevented)return;const q=this._element.scrollHeight>document.documentElement.clientHeight,Q=this._element.style.overflowY;if(Q==="hidden"||this._element.classList.contains(Qz))return;if(!q)this._element.style.overflowY="hidden";this._element.classList.add(Qz),this._queueCallback(()=>{this._element.classList.remove(Qz),this._queueCallback(()=>{this._element.style.overflowY=Q},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const J=this._element.scrollHeight>document.documentElement.clientHeight,q=this._scrollBar.getWidth(),Q=q>0;if(Q&&!J){const Z=I6()?"paddingLeft":"paddingRight";this._element.style[Z]=`${q}px`}if(!Q&&J){const Z=I6()?"paddingRight":"paddingLeft";this._element.style[Z]=`${q}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(J,q){return this.each(function(){const Q=p8.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(typeof Q[J]==="undefined")throw new TypeError(`No method named "${J}"`);Q[J](q)})}}A.on(document,mw,nw,function(J){const q=x.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName))J.preventDefault();A.one(q,Hj,(X)=>{if(X.defaultPrevented)return;A.one(q,$j,()=>{if(Oq(this))this.focus()})});const Q=x.findOne(ow);if(Q)p8.getInstance(Q).hide();p8.getOrCreateInstance(q).toggle(this)});HX(p8);D6(p8);var sw="offcanvas",iw="bs.offcanvas",L8=`.${iw}`,Gj=".data-api",tw=`load${L8}${Gj}`,ew="Escape",TG="show",_G="showing",bG="hiding",JB="offcanvas-backdrop",jj=".offcanvas.show",qB=`show${L8}`,QB=`shown${L8}`,ZB=`hide${L8}`,SG=`hidePrevented${L8}`,Nj=`hidden${L8}`,XB=`resize${L8}`,YB=`click${L8}${Gj}`,KB=`keydown.dismiss${L8}`,zB='[data-bs-toggle="offcanvas"]',WB={backdrop:!0,keyboard:!0,scroll:!1},FB={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class m8 extends w6{constructor(J,q){super(J,q);this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return WB}static get DefaultType(){return FB}static get NAME(){return sw}toggle(J){return this._isShown?this.hide():this.show(J)}show(J){if(this._isShown)return;if(A.trigger(this._element,qB,{relatedTarget:J}).defaultPrevented)return;if(this._isShown=!0,this._backdrop.show(),!this._config.scroll)new $X().hide();this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(_G);const Q=()=>{if(!this._config.scroll||this._config.backdrop)this._focustrap.activate();this._element.classList.add(TG),this._element.classList.remove(_G),A.trigger(this._element,QB,{relatedTarget:J})};this._queueCallback(Q,this._element,!0)}hide(){if(!this._isShown)return;if(A.trigger(this._element,ZB).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(bG),this._backdrop.hide();const q=()=>{if(this._element.classList.remove(TG,bG),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),!this._config.scroll)new $X().reset();A.trigger(this._element,Nj)};this._queueCallback(q,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const J=()=>{if(this._config.backdrop==="static"){A.trigger(this._element,SG);return}this.hide()},q=Boolean(this._config.backdrop);return new Vz({className:JB,isVisible:q,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:q?J:null})}_initializeFocusTrap(){return new Pz({trapElement:this._element})}_addEventListeners(){A.on(this._element,KB,(J)=>{if(J.key!==ew)return;if(this._config.keyboard){this.hide();return}A.trigger(this._element,SG)})}static jQueryInterface(J){return this.each(function(){const q=m8.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(q[J]===void 0||J.startsWith("_")||J==="constructor")throw new TypeError(`No method named "${J}"`);q[J](this)})}}A.on(document,YB,zB,function(J){const q=x.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName))J.preventDefault();if(f8(this))return;A.one(q,Nj,()=>{if(Oq(this))this.focus()});const Q=x.findOne(jj);if(Q&&Q!==q)m8.getInstance(Q).hide();m8.getOrCreateInstance(q).toggle(this)});A.on(window,tw,()=>{for(let J of x.find(jj))m8.getOrCreateInstance(J).show()});A.on(window,XB,()=>{for(let J of x.find("[aria-modal][class*=show][class*=offcanvas-]"))if(getComputedStyle(J).position!=="fixed")m8.getOrCreateInstance(J).hide()});HX(m8);D6(m8);var $B=/^aria-[\w-]*$/i,Lj={"*":["class","dir","id","lang","role",$B],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},HB=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),GB=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,jB=(J,q)=>{const Q=J.nodeName.toLowerCase();if(q.includes(Q)){if(HB.has(Q))return Boolean(GB.test(J.nodeValue));return!0}return q.filter((Z)=>Z instanceof RegExp).some((Z)=>Z.test(Q))},LB="TemplateFactory",VB={allowList:Lj,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},PB={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},UB={entry:"(string|element|function|null)",selector:"(string|element)"};class Vj extends Dq{constructor(J){super();this._config=this._getConfig(J)}static get Default(){return VB}static get DefaultType(){return PB}static get NAME(){return LB}getContent(){return Object.values(this._config.content).map((J)=>this._resolvePossibleFunction(J)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(J){return this._checkContent(J),this._config.content={...this._config.content,...J},this}toHtml(){const J=document.createElement("div");J.innerHTML=this._maybeSanitize(this._config.template);for(let[Z,X]of Object.entries(this._config.content))this._setContent(J,X,Z);const q=J.children[0],Q=this._resolvePossibleFunction(this._config.extraClass);if(Q)q.classList.add(...Q.split(" "));return q}_typeCheckConfig(J){super._typeCheckConfig(J),this._checkContent(J.content)}_checkContent(J){for(let[q,Q]of Object.entries(J))super._typeCheckConfig({selector:q,entry:Q},UB)}_setContent(J,q,Q){const Z=x.findOne(Q,J);if(!Z)return;if(q=this._resolvePossibleFunction(q),!q){Z.remove();return}if(j8(q)){this._putElementInTemplate(g8(q),Z);return}if(this._config.html){Z.innerHTML=this._maybeSanitize(q);return}Z.textContent=q}_maybeSanitize(J){return this._config.sanitize?NB(J,this._config.allowList,this._config.sanitizeFn):J}_resolvePossibleFunction(J){return K6(J,[this])}_putElementInTemplate(J,q){if(this._config.html){q.innerHTML="",q.append(J);return}q.textContent=J.textContent}}var MB="tooltip",hB=new Set(["sanitize","allowList","sanitizeFn"]),Zz="fade",kB="modal",QX="show",IB=".tooltip-inner",vG=`.${kB}`,xG="hide.bs.modal",S9="hover",Xz="focus",OB="click",DB="manual",wB="hide",BB="hidden",CB="show",AB="shown",RB="inserted",yB="click",EB="focusin",TB="focusout",_B="mouseenter",bB="mouseleave",SB={AUTO:"auto",TOP:"top",RIGHT:I6()?"left":"right",BOTTOM:"bottom",LEFT:I6()?"right":"left"},vB={allowList:Lj,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},xB={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Bq extends w6{constructor(J,q){if(typeof tZ==="undefined")throw new TypeError("Bootstrap\'s tooltips require Popper (https://popper.js.org)");super(J,q);if(this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),!this._config.selector)this._fixTitle()}static get Default(){return vB}static get DefaultType(){return xB}static get NAME(){return MB}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){if(clearTimeout(this._timeout),A.off(this._element.closest(vG),xG,this._hideModalHandler),this._element.getAttribute("data-bs-original-title"))this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title"));this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;const J=A.trigger(this._element,this.constructor.eventName(CB)),Q=(nG(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(J.defaultPrevented||!Q)return;this._disposePopper();const Z=this._getTipElement();this._element.setAttribute("aria-describedby",Z.getAttribute("id"));const{container:X}=this._config;if(!this._element.ownerDocument.documentElement.contains(this.tip))X.append(Z),A.trigger(this._element,this.constructor.eventName(RB));if(this._popper=this._createPopper(Z),Z.classList.add(QX),"ontouchstart"in document.documentElement)for(let K of[].concat(...document.body.children))A.on(K,"mouseover",zX);const Y=()=>{if(A.trigger(this._element,this.constructor.eventName(AB)),this._isHovered===!1)this._leave();this._isHovered=!1};this._queueCallback(Y,this.tip,this._isAnimated())}hide(){if(!this._isShown())return;if(A.trigger(this._element,this.constructor.eventName(wB)).defaultPrevented)return;if(this._getTipElement().classList.remove(QX),"ontouchstart"in document.documentElement)for(let Z of[].concat(...document.body.children))A.off(Z,"mouseover",zX);this._activeTrigger[OB]=!1,this._activeTrigger[Xz]=!1,this._activeTrigger[S9]=!1,this._isHovered=null;const Q=()=>{if(this._isWithActiveTrigger())return;if(!this._isHovered)this._disposePopper();this._element.removeAttribute("aria-describedby"),A.trigger(this._element,this.constructor.eventName(BB))};this._queueCallback(Q,this.tip,this._isAnimated())}update(){if(this._popper)this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){if(!this.tip)this.tip=this._createTipElement(this._newContent||this._getContentForTemplate());return this.tip}_createTipElement(J){const q=this._getTemplateFactory(J).toHtml();if(!q)return null;q.classList.remove(Zz,QX),q.classList.add(`bs-${this.constructor.NAME}-auto`);const Q=DO(this.constructor.NAME).toString();if(q.setAttribute("id",Q),this._isAnimated())q.classList.add(Zz);return q}setContent(J){if(this._newContent=J,this._isShown())this._disposePopper(),this.show()}_getTemplateFactory(J){if(this._templateFactory)this._templateFactory.changeContent(J);else this._templateFactory=new Vj({...this._config,content:J,extraClass:this._resolvePossibleFunction(this._config.customClass)});return this._templateFactory}_getContentForTemplate(){return{[IB]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(J){return this.constructor.getOrCreateInstance(J.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Zz)}_isShown(){return this.tip&&this.tip.classList.contains(QX)}_createPopper(J){const q=K6(this._config.placement,[this,J,this._element]),Q=SB[q.toUpperCase()];return _9(this._element,J,this._getPopperConfig(Q))}_getOffset(){const{offset:J}=this._config;if(typeof J==="string")return J.split(",").map((q)=>Number.parseInt(q,10));if(typeof J==="function")return(q)=>J(q,this._element);return J}_resolvePossibleFunction(J){return K6(J,[this._element])}_getPopperConfig(J){const q={placement:J,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:(Q)=>{this._getTipElement().setAttribute("data-popper-placement",Q.state.placement)}}]};return{...q,...K6(this._config.popperConfig,[q])}}_setListeners(){const J=this._config.trigger.split(" ");for(let q of J)if(q==="click")A.on(this._element,this.constructor.eventName(yB),this._config.selector,(Q)=>{this._initializeOnDelegatedTarget(Q).toggle()});else if(q!==DB){const Q=q===S9?this.constructor.eventName(_B):this.constructor.eventName(EB),Z=q===S9?this.constructor.eventName(bB):this.constructor.eventName(TB);A.on(this._element,Q,this._config.selector,(X)=>{const Y=this._initializeOnDelegatedTarget(X);Y._activeTrigger[X.type==="focusin"?Xz:S9]=!0,Y._enter()}),A.on(this._element,Z,this._config.selector,(X)=>{const Y=this._initializeOnDelegatedTarget(X);Y._activeTrigger[X.type==="focusout"?Xz:S9]=Y._element.contains(X.relatedTarget),Y._leave()})}this._hideModalHandler=()=>{if(this._element)this.hide()},A.on(this._element.closest(vG),xG,this._hideModalHandler)}_fixTitle(){const J=this._element.getAttribute("title");if(!J)return;if(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim())this._element.setAttribute("aria-label",J);this._element.setAttribute("data-bs-original-title",J),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{if(this._isHovered)this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{if(!this._isHovered)this.hide()},this._config.delay.hide)}_setTimeout(J,q){clearTimeout(this._timeout),this._timeout=setTimeout(J,q)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(J){const q=N8.getDataAttributes(this._element);for(let Q of Object.keys(q))if(hB.has(Q))delete q[Q];return J={...q,...typeof J==="object"&&J?J:{}},J=this._mergeConfigObj(J),J=this._configAfterMerge(J),this._typeCheckConfig(J),J}_configAfterMerge(J){if(J.container=J.container===!1?document.body:g8(J.container),typeof J.delay==="number")J.delay={show:J.delay,hide:J.delay};if(typeof J.title==="number")J.title=J.title.toString();if(typeof J.content==="number")J.content=J.content.toString();return J}_getDelegateConfig(){const J={};for(let[q,Q]of Object.entries(this._config))if(this.constructor.Default[q]!==Q)J[q]=Q;return J.selector=!1,J.trigger="manual",J}_disposePopper(){if(this._popper)this._popper.destroy(),this._popper=null;if(this.tip)this.tip.remove(),this.tip=null}static jQueryInterface(J){return this.each(function(){const q=Bq.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(typeof q[J]==="undefined")throw new TypeError(`No method named "${J}"`);q[J]()})}}D6(Bq);var uB="popover",gB=".popover-header",fB=".popover-body",pB={...Bq.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},mB={...Bq.DefaultType,content:"(null|string|element|function)"};class Uz extends Bq{static get Default(){return pB}static get DefaultType(){return mB}static get NAME(){return uB}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[gB]:this._getTitle(),[fB]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(J){return this.each(function(){const q=Uz.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(typeof q[J]==="undefined")throw new TypeError(`No method named "${J}"`);q[J]()})}}D6(Uz);var cB="scrollspy",oB="bs.scrollspy",Mz=`.${oB}`,dB=".data-api",lB=`activate${Mz}`,uG=`click${Mz}`,nB=`load${Mz}${dB}`,aB="dropdown-item",Uq="active",rB='[data-bs-spy="scroll"]',Yz="[href]",sB=".nav, .list-group",gG=".nav-link",iB=".nav-item",tB=".list-group-item",eB=`${gG}, ${iB} > ${gG}, ${tB}`,JC=".dropdown",qC=".dropdown-toggle",QC={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[0.1,0.5,1]},ZC={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class NX extends w6{constructor(J,q){super(J,q);this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return QC}static get DefaultType(){return ZC}static get NAME(){return cB}refresh(){if(this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer)this._observer.disconnect();else this._observer=this._getNewObserver();for(let J of this._observableSections.values())this._observer.observe(J)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(J){if(J.target=g8(J.target)||document.body,J.rootMargin=J.offset?`${J.offset}px 0px -30%`:J.rootMargin,typeof J.threshold==="string")J.threshold=J.threshold.split(",").map((q)=>Number.parseFloat(q));return J}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;A.off(this._config.target,uG),A.on(this._config.target,uG,Yz,(J)=>{const q=this._observableSections.get(J.target.hash);if(q){J.preventDefault();const Q=this._rootElement||window,Z=q.offsetTop-this._element.offsetTop;if(Q.scrollTo){Q.scrollTo({top:Z,behavior:"smooth"});return}Q.scrollTop=Z}})}_getNewObserver(){const J={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((q)=>this._observerCallback(q),J)}_observerCallback(J){const q=(Y)=>this._targetLinks.get(`#${Y.target.id}`),Q=(Y)=>{this._previousScrollData.visibleEntryTop=Y.target.offsetTop,this._process(q(Y))},Z=(this._rootElement||document.documentElement).scrollTop,X=Z>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=Z;for(let Y of J){if(!Y.isIntersecting){this._activeTarget=null,this._clearActiveClass(q(Y));continue}const K=Y.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(X&&K){if(Q(Y),!Z)return;continue}if(!X&&!K)Q(Y)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const J=x.find(Yz,this._config.target);for(let q of J){if(!q.hash||f8(q))continue;const Q=x.findOne(decodeURI(q.hash),this._element);if(Oq(Q))this._targetLinks.set(decodeURI(q.hash),q),this._observableSections.set(q.hash,Q)}}_process(J){if(this._activeTarget===J)return;this._clearActiveClass(this._config.target),this._activeTarget=J,J.classList.add(Uq),this._activateParents(J),A.trigger(this._element,lB,{relatedTarget:J})}_activateParents(J){if(J.classList.contains(aB)){x.findOne(qC,J.closest(JC)).classList.add(Uq);return}for(let q of x.parents(J,sB))for(let Q of x.prev(q,eB))Q.classList.add(Uq)}_clearActiveClass(J){J.classList.remove(Uq);const q=x.find(`${Yz}.${Uq}`,J);for(let Q of q)Q.classList.remove(Uq)}static jQueryInterface(J){return this.each(function(){const q=NX.getOrCreateInstance(this,J);if(typeof J!=="string")return;if(q[J]===void 0||J.startsWith("_")||J==="constructor")throw new TypeError(`No method named "${J}"`);q[J]()})}}A.on(window,nB,()=>{for(let J of x.find(rB))NX.getOrCreateInstance(J)});D6(NX);var XC="tab",YC="bs.tab",IJ=`.${YC}`,KC=`hide${IJ}`,zC=`hidden${IJ}`,WC=`show${IJ}`,FC=`shown${IJ}`,$C=`click${IJ}`,HC=`keydown${IJ}`,GC=`load${IJ}`,jC="ArrowLeft",fG="ArrowRight",NC="ArrowUp",pG="ArrowDown",Kz="Home",mG="End",hJ="active",cG="fade",zz="show",LC="dropdown",Pj=".dropdown-toggle",VC=".dropdown-menu",Wz=`:not(${Pj})`,PC='.list-group, .nav, [role="tablist"]',UC=".nav-item, .list-group-item",MC=`.nav-link${Wz}, .list-group-item${Wz}, [role="tab"]${Wz}`,Uj='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Fz=`${MC}, ${Uj}`,hC=`.${hJ}[data-bs-toggle="tab"], .${hJ}[data-bs-toggle="pill"], .${hJ}[data-bs-toggle="list"]`;class Iq extends w6{constructor(J){super(J);if(this._parent=this._element.closest(PC),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),A.on(this._element,HC,(q)=>this._keydown(q))}static get NAME(){return XC}show(){const J=this._element;if(this._elemIsActive(J))return;const q=this._getActiveElem(),Q=q?A.trigger(q,KC,{relatedTarget:J}):null;if(A.trigger(J,WC,{relatedTarget:q}).defaultPrevented||Q&&Q.defaultPrevented)return;this._deactivate(q,J),this._activate(J,q)}_activate(J,q){if(!J)return;J.classList.add(hJ),this._activate(x.getElementFromSelector(J));const Q=()=>{if(J.getAttribute("role")!=="tab"){J.classList.add(zz);return}J.removeAttribute("tabindex"),J.setAttribute("aria-selected",!0),this._toggleDropDown(J,!0),A.trigger(J,FC,{relatedTarget:q})};this._queueCallback(Q,J,J.classList.contains(cG))}_deactivate(J,q){if(!J)return;J.classList.remove(hJ),J.blur(),this._deactivate(x.getElementFromSelector(J));const Q=()=>{if(J.getAttribute("role")!=="tab"){J.classList.remove(zz);return}J.setAttribute("aria-selected",!1),J.setAttribute("tabindex","-1"),this._toggleDropDown(J,!1),A.trigger(J,zC,{relatedTarget:q})};this._queueCallback(Q,J,J.classList.contains(cG))}_keydown(J){if(![jC,fG,NC,pG,Kz,mG].includes(J.key))return;J.stopPropagation(),J.preventDefault();const q=this._getChildren().filter((Z)=>!f8(Z));let Q;if([Kz,mG].includes(J.key))Q=q[J.key===Kz?0:q.length-1];else{const Z=[fG,pG].includes(J.key);Q=jz(q,J.target,Z,!0)}if(Q)Q.focus({preventScroll:!0}),Iq.getOrCreateInstance(Q).show()}_getChildren(){return x.find(Fz,this._parent)}_getActiveElem(){return this._getChildren().find((J)=>this._elemIsActive(J))||null}_setInitialAttributes(J,q){this._setAttributeIfNotExists(J,"role","tablist");for(let Q of q)this._setInitialAttributesOnChild(Q)}_setInitialAttributesOnChild(J){J=this._getInnerElement(J);const q=this._elemIsActive(J),Q=this._getOuterElement(J);if(J.setAttribute("aria-selected",q),Q!==J)this._setAttributeIfNotExists(Q,"role","presentation");if(!q)J.setAttribute("tabindex","-1");this._setAttributeIfNotExists(J,"role","tab"),this._setInitialAttributesOnTargetPanel(J)}_setInitialAttributesOnTargetPanel(J){const q=x.getElementFromSelector(J);if(!q)return;if(this._setAttributeIfNotExists(q,"role","tabpanel"),J.id)this._setAttributeIfNotExists(q,"aria-labelledby",`${J.id}`)}_toggleDropDown(J,q){const Q=this._getOuterElement(J);if(!Q.classList.contains(LC))return;const Z=(X,Y)=>{const K=x.findOne(X,Q);if(K)K.classList.toggle(Y,q)};Z(Pj,hJ),Z(VC,zz),Q.setAttribute("aria-expanded",q)}_setAttributeIfNotExists(J,q,Q){if(!J.hasAttribute(q))J.setAttribute(q,Q)}_elemIsActive(J){return J.classList.contains(hJ)}_getInnerElement(J){return J.matches(Fz)?J:x.findOne(Fz,J)}_getOuterElement(J){return J.closest(UC)||J}static jQueryInterface(J){return this.each(function(){const q=Iq.getOrCreateInstance(this);if(typeof J!=="string")return;if(q[J]===void 0||J.startsWith("_")||J==="constructor")throw new TypeError(`No method named "${J}"`);q[J]()})}}A.on(document,$C,Uj,function(J){if(["A","AREA"].includes(this.tagName))J.preventDefault();if(f8(this))return;Iq.getOrCreateInstance(this).show()});A.on(window,GC,()=>{for(let J of x.find(hC))Iq.getOrCreateInstance(J)});D6(Iq);var kC="toast",IC="bs.toast",o8=`.${IC}`,OC=`mouseover${o8}`,DC=`mouseout${o8}`,wC=`focusin${o8}`,BC=`focusout${o8}`,CC=`hide${o8}`,AC=`hidden${o8}`,RC=`show${o8}`,yC=`shown${o8}`,EC="fade",oG="hide",ZX="show",XX="showing",TC={animation:"boolean",autohide:"boolean",delay:"number"},_C={animation:!0,autohide:!0,delay:5000};class LX extends w6{constructor(J,q){super(J,q);this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return _C}static get DefaultType(){return TC}static get NAME(){return kC}show(){if(A.trigger(this._element,RC).defaultPrevented)return;if(this._clearTimeout(),this._config.animation)this._element.classList.add(EC);const q=()=>{this._element.classList.remove(XX),A.trigger(this._element,yC),this._maybeScheduleHide()};this._element.classList.remove(oG),x9(this._element),this._element.classList.add(ZX,XX),this._queueCallback(q,this._element,this._config.animation)}hide(){if(!this.isShown())return;if(A.trigger(this._element,CC).defaultPrevented)return;const q=()=>{this._element.classList.add(oG),this._element.classList.remove(XX,ZX),A.trigger(this._element,AC)};this._element.classList.add(XX),this._queueCallback(q,this._element,this._config.animation)}dispose(){if(this._clearTimeout(),this.isShown())this._element.classList.remove(ZX);super.dispose()}isShown(){return this._element.classList.contains(ZX)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(J,q){switch(J.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=q;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=q;break}}if(q){this._clearTimeout();return}const Q=J.relatedTarget;if(this._element===Q||this._element.contains(Q))return;this._maybeScheduleHide()}_setListeners(){A.on(this._element,OC,(J)=>this._onInteraction(J,!0)),A.on(this._element,DC,(J)=>this._onInteraction(J,!1)),A.on(this._element,wC,(J)=>this._onInteraction(J,!0)),A.on(this._element,BC,(J)=>this._onInteraction(J,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(J){return this.each(function(){const q=LX.getOrCreateInstance(this,J);if(typeof J==="string"){if(typeof q[J]==="undefined")throw new TypeError(`No method named "${J}"`);q[J](this)}})}}HX(LX);D6(LX);class hz{constructor(){this.modal=new p8("#controller",{}),this.initKeyInputs()}show(){this.modal.show()}initKeyInputs(){document.querySelectorAll(".control-input").forEach((q)=>{q.addEventListener("keydown",(Q)=>{if(this.handleKeyDown(q,Q))return Q.preventDefault(),!1}),q.addEventListener("input",()=>{})})}handleKeyDown(J,q){if(q.key.length==1&&!q.metaKey&&!q.ctrlKey)return J.value=q.key.toLowerCase(),!0}}class kz{constructor(){this.controllerConfig=null}domLoaded(){this.controllerConfig=new hz;const J=n64js.debugger();$(".tabbable a").on("shown.bs.tab",()=>{J.redraw()}),J.redraw()}toggleControllerConfig(){this.controllerConfig.show()}triggerLoad(){const J=document.getElementById("fileInput");J.value="",J.click()}loadFile(){const J=document.getElementById("fileInput");if(J&&J.files.length>0){const q=J.files[0],Q=new FileReader;Q.onerror=()=>{this.displayError("loading file")},Q.onload=(Z)=>{n64js.loadRomAndStartRunning(Z.target.result)},Q.readAsArrayBuffer(q)}}displayWarning(J){this.displayAlert("Warning",J)}displayError(J){this.displayAlert("Error",J)}displayAlert(J,q){const Z=document.getElementById("alert").content.cloneNode(!0),X=Z.querySelector(".alert-type"),Y=Z.querySelector(".alert-message");X.textContent=J+"!",Y.textContent=q,$("#alerts").append(Z)}setRunning(J){const q=J?' Pause':' Run';$("#runbutton").html(q)}}var Dz=function(J){Cq=J,Oz.setRunning(J)},xC=function(J){const q=md5(J);h(`hash is ${q}`)},uC=function(J){T4(J),xC(J);const q=i6.createROM(J),Q={header:q.getU32(0),clock:q.getU32(4),bootAddress:q.getU32(8),release:q.getU32(12),crclo:q.getU32(16),crchi:q.getU32(20),unk0:q.getU32(24),unk1:q.getU32(28),name:tH(q.u8,32,20),unk2:q.getU32(52),unk3:q.getU16(56),unk4:q.getU8(58),categoryCode:ez(q.getU8(59)),cartId:q.getU16(60),countryId:q.getU8(62),romVersion:q.getU8(63)};console.log(Q);const Z=$('
'),X=Z.find("tbody");for(let K in Q){const z=typeof Q[K]==="string"?Q[K]:N(Q[K]);X.append(`${K}${z}`)}I5(Z),f0.cic=iH(q.u8),f0.id=sH(Q.crclo,Q.crchi),f0.country=Q.countryId,f0.tvType=tz(Q.countryId);const Y=eH[f0.id];if(Y)h(`Loaded info for ${f0.id} from db`),f0.name=Y.name,f0.save=Y.save;else h(`No info for ${f0.id} in db`),f0.name=Q.name,f0.save="Eeprom4k";h(`rominfo is ${AK(f0)}`),$("#title").text(`n64js - ${f0.name}`)},gC=function(){const J=[],q=new XMLHttpRequest;if(q.open("GET","roms/n64-systemtest-all.z64",!0),q.responseType="arraybuffer",q.onload=()=>{const Q=q.response;if(Q)n64js.loadRomAndStartRunning(Q)},q.send(null),q.status!=200)return;for(let Q=0;Q0)n64js.cpu0.run(J),OJ.redraw()}else if(RF())requestAnimationFrame(Iz),TF(),JZ();if(u6)u6.end()},Oj=function(J){return J+"-"+f0.id},pC=function(J){const q=f0.name?`n64js - ${f0.name} - ${J}mspf`:`n64js - ${J}mspf`;$("#title").text(q)},Dj=function(J,q){if(Dz(!1),wz(),h(''+J+""),q)n64js.ui().displayError(J)},wz=function(){n64js.cpu0.breakExecution()};window.n64js=window.n64js||{};var SC=1e8,u6=null,Cq=!1,Mj=[],hj={runTest:gC,recordTimeline:fC};J6.add(hj,"runTest").name("Run n64-systemtest");J6.add(hj,"recordTimeline").name("Record Timeline");var f0={id:"",name:"",cic:"6101",country:iz,tvType:gq,save:"Eeprom4k"},i6=new CK(f0),kj=new bX(i6),Ij=new vX,vC=new uX(i6,Ij.inputs),Oz=new kz,OJ=null;n64js.hardware=()=>i6;n64js.joybus=()=>vC;n64js.ui=()=>Oz;n64js.debugger=()=>OJ;n64js.loadRomAndStartRunning=(J)=>{uC(J),n64js.reset(),OJ.hide(),Dz(!1),n64js.toggleRun()};n64js.toggleRun=()=>{if(Dz(!Cq),Cq)Iz()};n64js.toggleFullscreen=()=>{document.getElementById("display").requestFullscreen().catch((q)=>{console.log(`Error attempting to enable fullscreen mode: ${q.message} (${q.name})`)})};n64js.breakEmulationForDisplayListDebug=()=>{if(Cq)n64js.toggleRun(),wz()};n64js.step=()=>{if(!Cq)n64js.singleStep(),OJ.redraw()};n64js.breakpoints=()=>{return kj};n64js.getLocalStorageItem=(J)=>{const q=Oj(J),Q=localStorage.getItem(q);return Q?aH(Q):void 0};n64js.setLocalStorageItem=(J,q)=>{const Q=Oj(J),Z=AK(q);localStorage.setItem(Q,Z)};var VX;n64js.onPresent=()=>{const J=new Date;if(VX){const q=J.getTime()-VX.getTime();pC(q)}VX=J};n64js.addResetCallback=(J)=>{Mj.push(J)};n64js.reset=()=>{kj.reset(),O5(),i6.reset(),N4(i6),e$(i6),AF(),i6.loadROM(),J5(n64js.cpu0,i6,f0),VX=void 0;for(let J of Mj)J()};n64js.check=(J,q)=>{if(!J)h(q)};n64js.warn=(J)=>{k5(J)};n64js.stopForBreakpoint=()=>{Dj("Breakpoint",!1)};n64js.halt=(J)=>{Dj(J,!0)};n64js.returnControlToSystem=()=>{wz()};n64js.init=()=>{n64js.reset(),OJ=new EY,CF($("#display")),Oz.domLoaded()};n64js.togglePerformance=()=>{const J=document.getElementById("performance");if(u6)J.removeChild(u6.dom),u6=null;else u6=new Stats,u6.showPanel(1),u6.dom.style.position="relative",J.appendChild(u6.dom)};