diff --git a/package.json b/package.json index a4f4ffa3..70e55739 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "history": "^5.1.0", "jsonwebtoken": "^9.0.0", "material-design-icons": "^3.0.1", + "openpgp": "^5.9.0", "plotly.js": "^2.12.1", "react": "^18.2.0", "react-app-rewired": "^2.2.1", @@ -60,6 +61,7 @@ "react-select": "^5.7.0", "react-syntax-highlighter": "15.5.0", "react-twitch-embed": "^3.0.1", + "react-unity-webgl": "^9.4.0", "react-use-websocket": "^4.3.1", "reactstrap": "^9.1.1", "seedrandom": "^3.0.5", @@ -88,5 +90,9 @@ "not dead", "not op_mini all" ] + }, + "devDependencies": { + "@openpgp/web-stream-tools": "^0.0.13", + "@types/crypto-js": "^4.1.1" } } diff --git a/public/unitybuild/LevelEditor.data b/public/unitybuild/LevelEditor.data new file mode 100755 index 00000000..3b01af6e Binary files /dev/null and b/public/unitybuild/LevelEditor.data differ diff --git a/public/unitybuild/LevelEditor.framework.js b/public/unitybuild/LevelEditor.framework.js new file mode 100755 index 00000000..d2ab92b9 --- /dev/null +++ b/public/unitybuild/LevelEditor.framework.js @@ -0,0 +1,5 @@ +function unityFramework(Module) { +var Module=typeof Module!=="undefined"?Module:{}; +var stackTraceReference="(^|\\n)(\\s+at\\s+|)jsStackTrace(\\s+\\(|@)([^\\n]+):\\d+:\\d+(\\)|)(\\n|$)";var stackTraceReferenceMatch=jsStackTrace().match(new RegExp(stackTraceReference));if(stackTraceReferenceMatch)Module.stackTraceRegExp=new RegExp(stackTraceReference.replace("([^\\n]+)",stackTraceReferenceMatch[4].replace(/[\\^${}[\]().*+?|]/g,"\\$&")).replace("jsStackTrace","[^\\n]+"));var abort=function(what){if(ABORT)return;ABORT=true;EXITSTATUS=1;if(typeof ENVIRONMENT_IS_PTHREAD!=="undefined"&&ENVIRONMENT_IS_PTHREAD)console.error("Pthread aborting at "+(new Error).stack);if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}var message="abort("+what+") at "+stackTrace();if(Module.abortHandler&&Module.abortHandler(message))return;throw message};Module["SetFullscreen"]=function(fullscreen){if(typeof runtimeInitialized==="undefined"||!runtimeInitialized){console.log("Runtime not initialized yet.")}else if(typeof JSEvents==="undefined"){console.log("Player not loaded yet.")}else{var tmp=JSEvents.canPerformEventHandlerRequests;JSEvents.canPerformEventHandlerRequests=function(){return 1};Module.ccall("SetFullscreen",null,["number"],[fullscreen]);JSEvents.canPerformEventHandlerRequests=tmp}};var videoInputDevices=[];var videoInputDevicesEnumerated=false;var removeEnumerateMediaDevicesRunDependency;var enumerateWatchdog=null;function matchToOldDevice(newDevice){var oldDevices=Object.keys(videoInputDevices);for(var i=0;i1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);PIPEFS.root=FS.mount(PIPEFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile="build.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["gi"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["Fi"];addOnInit(Module["asm"]["hi"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={4570008:function(){return Module.webglContextAttributes.premultipliedAlpha},4570069:function(){return Module.webglContextAttributes.preserveDrawingBuffer},4570133:function(){return Module.webglContextAttributes.powerPreference}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){(function(){dynCall_v.call(null,func)})()}else{(function(a1){dynCall_vi.apply(null,[func,a1])})(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){return dynCallLegacy(sig,ptr,args)}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var JS_Accelerometer=null;var JS_Accelerometer_callback=0;function _JS_Accelerometer_IsRunning(){return JS_Accelerometer&&JS_Accelerometer.activated||JS_Accelerometer_callback!=0}var JS_Accelerometer_multiplier=1;var JS_Accelerometer_lastValue={x:0,y:0,z:0};function JS_Accelerometer_eventHandler(){JS_Accelerometer_lastValue={x:JS_Accelerometer.x*JS_Accelerometer_multiplier,y:JS_Accelerometer.y*JS_Accelerometer_multiplier,z:JS_Accelerometer.z*JS_Accelerometer_multiplier};if(JS_Accelerometer_callback!=0)dynCall_vfff(JS_Accelerometer_callback,JS_Accelerometer_lastValue.x,JS_Accelerometer_lastValue.y,JS_Accelerometer_lastValue.z)}var JS_Accelerometer_frequencyRequest=0;var JS_Accelerometer_frequency=0;var JS_LinearAccelerationSensor_callback=0;var JS_GravitySensor_callback=0;var JS_Gyroscope_callback=0;function JS_ComputeGravity(accelerometerValue,linearAccelerationValue){var difference={x:accelerometerValue.x-linearAccelerationValue.x,y:accelerometerValue.y-linearAccelerationValue.y,z:accelerometerValue.z-linearAccelerationValue.z};var differenceMagnitudeSq=difference.x*difference.x+difference.y*difference.y+difference.z*difference.z;var sum={x:accelerometerValue.x+linearAccelerationValue.x,y:accelerometerValue.y+linearAccelerationValue.y,z:accelerometerValue.z+linearAccelerationValue.z};var sumMagnitudeSq=sum.x*sum.x+sum.y*sum.y+sum.z*sum.z;return differenceMagnitudeSq<=sumMagnitudeSq?difference:sum}function JS_DeviceMotion_eventHandler(event){var accelerometerValue={x:event.accelerationIncludingGravity.x*JS_Accelerometer_multiplier,y:event.accelerationIncludingGravity.y*JS_Accelerometer_multiplier,z:event.accelerationIncludingGravity.z*JS_Accelerometer_multiplier};if(JS_Accelerometer_callback!=0)dynCall_vfff(JS_Accelerometer_callback,accelerometerValue.x,accelerometerValue.y,accelerometerValue.z);var linearAccelerationValue={x:event.acceleration.x*JS_Accelerometer_multiplier,y:event.acceleration.y*JS_Accelerometer_multiplier,z:event.acceleration.z*JS_Accelerometer_multiplier};if(JS_LinearAccelerationSensor_callback!=0)dynCall_vfff(JS_LinearAccelerationSensor_callback,linearAccelerationValue.x,linearAccelerationValue.y,linearAccelerationValue.z);if(JS_GravitySensor_callback!=0){var gravityValue=JS_ComputeGravity(accelerometerValue,linearAccelerationValue);dynCall_vfff(JS_GravitySensor_callback,gravityValue.x,gravityValue.y,gravityValue.z)}if(JS_Gyroscope_callback!=0){var degToRad=Math.PI/180;dynCall_vfff(JS_Gyroscope_callback,event.rotationRate.alpha*degToRad,event.rotationRate.beta*degToRad,event.rotationRate.gamma*degToRad)}}var JS_DeviceSensorPermissions=0;function JS_RequestDeviceSensorPermissions(permissions){if(permissions&1){if(typeof DeviceOrientationEvent.requestPermission==="function"){DeviceOrientationEvent.requestPermission().then(function(permissionState){if(permissionState==="granted"){JS_DeviceSensorPermissions&=~1}else{warnOnce("DeviceOrientationEvent permission not granted")}}).catch(function(err){warnOnce(err);JS_DeviceSensorPermissions|=1})}}if(permissions&2){if(typeof DeviceMotionEvent.requestPermission==="function"){DeviceMotionEvent.requestPermission().then(function(permissionState){if(permissionState==="granted"){JS_DeviceSensorPermissions&=~2}else{warnOnce("DeviceMotionEvent permission not granted")}}).catch(function(err){warnOnce(err);JS_DeviceSensorPermissions|=2})}}}function JS_DeviceMotion_add(){if(JS_Accelerometer_callback==0&&JS_LinearAccelerationSensor_callback==0&&JS_GravitySensor_callback==0&&JS_Gyroscope_callback==0){JS_RequestDeviceSensorPermissions(2);window.addEventListener("devicemotion",JS_DeviceMotion_eventHandler)}}function JS_DefineAccelerometerMultiplier(){var g=9.80665;JS_Accelerometer_multiplier=/(iPhone|iPad|Macintosh)/i.test(navigator.userAgent)?1/g:-1/g}function _JS_Accelerometer_Start(callback,frequency){JS_DefineAccelerometerMultiplier();if(typeof Accelerometer==="undefined"){JS_DeviceMotion_add();if(callback!=0)JS_Accelerometer_callback=callback;return}if(callback!=0)JS_Accelerometer_callback=callback;function InitializeAccelerometer(frequency){JS_Accelerometer=new Accelerometer({frequency:frequency,referenceFrame:"device"});JS_Accelerometer.addEventListener("reading",JS_Accelerometer_eventHandler);JS_Accelerometer.addEventListener("error",function(e){warnOnce(e.error?e.error:e)});JS_Accelerometer.start();JS_Accelerometer_frequency=frequency}if(JS_Accelerometer){if(JS_Accelerometer_frequency!=frequency){JS_Accelerometer.stop();JS_Accelerometer.removeEventListener("reading",JS_Accelerometer_eventHandler);InitializeAccelerometer(frequency)}}else if(JS_Accelerometer_frequencyRequest!=0){JS_Accelerometer_frequencyRequest=frequency}else{JS_Accelerometer_frequencyRequest=frequency;navigator.permissions.query({name:"accelerometer"}).then(function(result){if(result.state==="granted"){InitializeAccelerometer(JS_Accelerometer_frequencyRequest)}else{warnOnce("No permission to use Accelerometer.")}JS_Accelerometer_frequencyRequest=0})}}function JS_DeviceMotion_remove(){if(JS_Accelerometer_callback==0&&JS_LinearAccelerationSensor_callback==0&&JS_GravitySensor_callback==0&&JS_Gyroscope_callback==0){window.removeEventListener("devicemotion",JS_DeviceOrientation_eventHandler)}}function _JS_Accelerometer_Stop(){if(JS_Accelerometer){if(typeof GravitySensor!=="undefined"||JS_GravitySensor_callback==0){JS_Accelerometer.stop();JS_Accelerometer.removeEventListener("reading",JS_Accelerometer_eventHandler);JS_Accelerometer=null}JS_Accelerometer_callback=0;JS_Accelerometer_frequency=0}else if(JS_Accelerometer_callback!=0){JS_Accelerometer_callback=0;JS_DeviceMotion_remove()}}function _JS_Cursor_SetImage(ptr,length){var binary="";for(var i=0;i>2]=viewportX-rect.left;HEAPU32[targetY>>2]=viewportY-rect.top}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _JS_DOM_UnityCanvasSelector(){if(!_JS_DOM_UnityCanvasSelector.ptr){var canvasId=Module["canvas"]?Module["canvas"].id:"unity-canvas";var canvasSelector="#"+jsDomCssEscapeId(canvasId);_JS_DOM_UnityCanvasSelector.ptr=stringToNewUTF8(canvasSelector)}return _JS_DOM_UnityCanvasSelector.ptr}function _JS_Eval_OpenURL(ptr){var str=UTF8ToString(ptr);window.open(str,"_blank","")}var fs={numPendingSync:0,syncInternal:1e3,syncInProgress:false,sync:function(onlyPendingSync){if(onlyPendingSync){if(fs.numPendingSync==0)return}else if(fs.syncInProgress){fs.numPendingSync++;return}fs.syncInProgress=true;FS.syncfs(false,function(err){fs.syncInProgress=false});fs.numPendingSync=0}};function _JS_FileSystem_Initialize(){Module.setInterval(function(){fs.sync(true)},fs.syncInternal)}function _JS_FileSystem_Sync(){fs.sync(false)}var JS_GravitySensor=null;function _JS_GravitySensor_IsRunning(){return typeof GravitySensor!=="undefined"?JS_GravitySensor&&JS_GravitySensor.activated:JS_GravitySensor_callback!=0}function JS_GravitySensor_eventHandler(){if(JS_GravitySensor_callback!=0)dynCall_vfff(JS_GravitySensor_callback,JS_GravitySensor.x*JS_Accelerometer_multiplier,JS_GravitySensor.y*JS_Accelerometer_multiplier,JS_GravitySensor.z*JS_Accelerometer_multiplier)}var JS_GravitySensor_frequencyRequest=0;var JS_LinearAccelerationSensor=null;function JS_LinearAccelerationSensor_eventHandler(){var linearAccelerationValue={x:JS_LinearAccelerationSensor.x*JS_Accelerometer_multiplier,y:JS_LinearAccelerationSensor.y*JS_Accelerometer_multiplier,z:JS_LinearAccelerationSensor.z*JS_Accelerometer_multiplier};if(JS_LinearAccelerationSensor_callback!=0)dynCall_vfff(JS_LinearAccelerationSensor_callback,linearAccelerationValue.x,linearAccelerationValue.y,linearAccelerationValue.z);if(JS_GravitySensor_callback!=0&&typeof GravitySensor==="undefined"){var gravityValue=JS_ComputeGravity(JS_Accelerometer_lastValue,linearAccelerationValue);dynCall_vfff(JS_GravitySensor_callback,gravityValue.x,gravityValue.y,gravityValue.z)}}var JS_LinearAccelerationSensor_frequencyRequest=0;var JS_LinearAccelerationSensor_frequency=0;function _JS_LinearAccelerationSensor_Start(callback,frequency){JS_DefineAccelerometerMultiplier();if(typeof LinearAccelerationSensor==="undefined"){JS_DeviceMotion_add();if(callback!=0)JS_LinearAccelerationSensor_callback=callback;return}if(callback!=0)JS_LinearAccelerationSensor_callback=callback;function InitializeLinearAccelerationSensor(frequency){JS_LinearAccelerationSensor=new LinearAccelerationSensor({frequency:frequency,referenceFrame:"device"});JS_LinearAccelerationSensor.addEventListener("reading",JS_LinearAccelerationSensor_eventHandler);JS_LinearAccelerationSensor.addEventListener("error",function(e){warnOnce(e.error?e.error:e)});JS_LinearAccelerationSensor.start();JS_LinearAccelerationSensor_frequency=frequency}if(JS_LinearAccelerationSensor){if(JS_LinearAccelerationSensor_frequency!=frequency){JS_LinearAccelerationSensor.stop();JS_LinearAccelerationSensor.removeEventListener("reading",JS_LinearAccelerationSensor_eventHandler);InitializeLinearAccelerationSensor(frequency)}}else if(JS_LinearAccelerationSensor_frequencyRequest!=0){JS_LinearAccelerationSensor_frequencyRequest=frequency}else{JS_LinearAccelerationSensor_frequencyRequest=frequency;navigator.permissions.query({name:"accelerometer"}).then(function(result){if(result.state==="granted"){InitializeLinearAccelerationSensor(JS_LinearAccelerationSensor_frequencyRequest)}else{warnOnce("No permission to use LinearAccelerationSensor.")}JS_LinearAccelerationSensor_frequencyRequest=0})}}function _JS_GravitySensor_Start(callback,frequency){if(typeof GravitySensor==="undefined"){_JS_Accelerometer_Start(0,Math.max(frequency,JS_Accelerometer_frequency));_JS_LinearAccelerationSensor_Start(0,Math.max(frequency,JS_LinearAccelerationSensor_frequency));JS_GravitySensor_callback=callback;return}JS_DefineAccelerometerMultiplier();JS_GravitySensor_callback=callback;function InitializeGravitySensor(frequency){JS_GravitySensor=new GravitySensor({frequency:frequency,referenceFrame:"device"});JS_GravitySensor.addEventListener("reading",JS_GravitySensor_eventHandler);JS_GravitySensor.addEventListener("error",function(e){warnOnce(e.error?e.error:e)});JS_GravitySensor.start()}if(JS_GravitySensor){JS_GravitySensor.stop();JS_GravitySensor.removeEventListener("reading",JS_GravitySensor_eventHandler);InitializeGravitySensor(frequency)}else if(JS_GravitySensor_frequencyRequest!=0){JS_GravitySensor_frequencyRequest=frequency}else{JS_GravitySensor_frequencyRequest=frequency;navigator.permissions.query({name:"accelerometer"}).then(function(result){if(result.state==="granted"){InitializeGravitySensor(JS_GravitySensor_frequencyRequest)}else{warnOnce("No permission to use GravitySensor.")}JS_GravitySensor_frequencyRequest=0})}}function _JS_LinearAccelerationSensor_Stop(){if(JS_LinearAccelerationSensor){if(typeof GravitySensor!=="undefined"||JS_GravitySensor_callback==0){JS_LinearAccelerationSensor.stop();JS_LinearAccelerationSensor.removeEventListener("reading",JS_LinearAccelerationSensor_eventHandler);JS_LinearAccelerationSensor=null}JS_LinearAccelerationSensor_callback=0;JS_LinearAccelerationSensor_frequency=0}else if(JS_LinearAccelerationSensor_callback!=0){JS_LinearAccelerationSensor_callback=0;JS_DeviceMotion_remove()}}function _JS_GravitySensor_Stop(){JS_GravitySensor_callback=0;if(typeof GravitySensor==="undefined"){if(JS_Accelerometer_callback==0)_JS_Accelerometer_Stop();if(JS_LinearAccelerationSensor_callback==0)_JS_LinearAccelerationSensor_Stop();return}if(JS_GravitySensor){JS_GravitySensor.stop();JS_GravitySensor.removeEventListener("reading",JS_GravitySensor_eventHandler);JS_GravitySensor=null}}var JS_Gyroscope=null;function _JS_Gyroscope_IsRunning(){return JS_Gyroscope&&JS_Gyroscope.activated||JS_Gyroscope_callback!=0}function JS_Gyroscope_eventHandler(){if(JS_Gyroscope_callback!=0)dynCall_vfff(JS_Gyroscope_callback,JS_Gyroscope.x,JS_Gyroscope.y,JS_Gyroscope.z)}var JS_Gyroscope_frequencyRequest=0;function _JS_Gyroscope_Start(callback,frequency){if(typeof Gyroscope==="undefined"){JS_DeviceMotion_add();JS_Gyroscope_callback=callback;return}JS_Gyroscope_callback=callback;function InitializeGyroscope(frequency){JS_Gyroscope=new Gyroscope({frequency:frequency,referenceFrame:"device"});JS_Gyroscope.addEventListener("reading",JS_Gyroscope_eventHandler);JS_Gyroscope.addEventListener("error",function(e){warnOnce(e.error?e.error:e)});JS_Gyroscope.start()}if(JS_Gyroscope){JS_Gyroscope.stop();JS_Gyroscope.removeEventListener("reading",JS_Gyroscope_eventHandler);InitializeGyroscope(frequency)}else if(JS_Gyroscope_frequencyRequest!=0){JS_Gyroscope_frequencyRequest=frequency}else{JS_Gyroscope_frequencyRequest=frequency;navigator.permissions.query({name:"gyroscope"}).then(function(result){if(result.state==="granted"){InitializeGyroscope(JS_Gyroscope_frequencyRequest)}else{warnOnce("No permission to use Gyroscope.")}JS_Gyroscope_frequencyRequest=0})}}function _JS_Gyroscope_Stop(){if(JS_Gyroscope){JS_Gyroscope.stop();JS_Gyroscope.removeEventListener("reading",JS_Gyroscope_eventHandler);JS_Gyroscope=null;JS_Gyroscope_callback=0}else if(JS_Gyroscope_callback!=0){JS_Gyroscope_callback=0;JS_DeviceMotion_remove()}}function _JS_LinearAccelerationSensor_IsRunning(){return JS_LinearAccelerationSensor&&JS_LinearAccelerationSensor.activated||JS_LinearAccelerationSensor_callback!=0}function _JS_Log_Dump(ptr,type){var str=UTF8ToString(ptr);if(typeof dump=="function")dump(str);switch(type){case 0:case 1:case 4:console.error(str);return;case 2:console.warn(str);return;case 3:case 5:console.log(str);return;default:console.error("Unknown console message type!");console.error(str)}}function _JS_Log_StackTrace(buffer,bufferSize){var trace=stackTrace();if(buffer)stringToUTF8(trace,buffer,bufferSize);return lengthBytesUTF8(trace)}var JS_OrientationSensor=null;var JS_OrientationSensor_callback=0;function _JS_OrientationSensor_IsRunning(){return JS_OrientationSensor&&JS_OrientationSensor.activated||JS_OrientationSensor_callback!=0}function JS_OrientationSensor_eventHandler(){if(JS_OrientationSensor_callback!=0)dynCall_vffff(JS_OrientationSensor_callback,JS_OrientationSensor.quaternion[0],JS_OrientationSensor.quaternion[1],JS_OrientationSensor.quaternion[2],JS_OrientationSensor.quaternion[3])}var JS_OrientationSensor_frequencyRequest=0;function JS_DeviceOrientation_eventHandler(event){if(JS_OrientationSensor_callback){var degToRad=Math.PI/180;var x=event.beta*degToRad;var y=event.gamma*degToRad;var z=event.alpha*degToRad;var cx=Math.cos(x/2);var sx=Math.sin(x/2);var cy=Math.cos(y/2);var sy=Math.sin(y/2);var cz=Math.cos(z/2);var sz=Math.sin(z/2);var qx=sx*cy*cz-cx*sy*sz;var qy=cx*sy*cz+sx*cy*sz;var qz=cx*cy*sz+sx*sy*cz;var qw=cx*cy*cz-sx*sy*sz;dynCall_vffff(JS_OrientationSensor_callback,qx,qy,qz,qw)}}function _JS_OrientationSensor_Start(callback,frequency){if(typeof RelativeOrientationSensor==="undefined"){if(JS_OrientationSensor_callback==0){JS_OrientationSensor_callback=callback;JS_RequestDeviceSensorPermissions(1);window.addEventListener("deviceorientation",JS_DeviceOrientation_eventHandler)}return}JS_OrientationSensor_callback=callback;function InitializeOrientationSensor(frequency){JS_OrientationSensor=new RelativeOrientationSensor({frequency:frequency,referenceFrame:"device"});JS_OrientationSensor.addEventListener("reading",JS_OrientationSensor_eventHandler);JS_OrientationSensor.addEventListener("error",function(e){warnOnce(e.error?e.error:e)});JS_OrientationSensor.start()}if(JS_OrientationSensor){JS_OrientationSensor.stop();JS_OrientationSensor.removeEventListener("reading",JS_OrientationSensor_eventHandler);InitializeOrientationSensor(frequency)}else if(JS_OrientationSensor_frequencyRequest!=0){JS_OrientationSensor_frequencyRequest=frequency}else{JS_OrientationSensor_frequencyRequest=frequency;Promise.all([navigator.permissions.query({name:"accelerometer"}),navigator.permissions.query({name:"gyroscope"})]).then(function(results){if(results.every(function(result){return result.state==="granted"})){InitializeOrientationSensor(JS_OrientationSensor_frequencyRequest)}else{warnOnce("No permissions to use RelativeOrientationSensor.")}JS_OrientationSensor_frequencyRequest=0})}}function _JS_OrientationSensor_Stop(){if(JS_OrientationSensor){JS_OrientationSensor.stop();JS_OrientationSensor.removeEventListener("reading",JS_OrientationSensor_eventHandler);JS_OrientationSensor=null}else if(JS_OrientationSensor_callback!=0){window.removeEventListener("deviceorientation",JS_DeviceOrientation_eventHandler)}JS_OrientationSensor_callback=0}function _JS_RequestDeviceSensorPermissionsOnTouch(){if(JS_DeviceSensorPermissions==0)return;JS_RequestDeviceSensorPermissions(JS_DeviceSensorPermissions)}function _JS_RunQuitCallbacks(){Module.QuitCleanup()}var JS_ScreenOrientation_callback=0;function JS_ScreenOrientation_eventHandler(){if(JS_ScreenOrientation_callback)dynCall_viii(JS_ScreenOrientation_callback,window.innerWidth,window.innerHeight,screen.orientation?screen.orientation.angle:window.orientation)}function _JS_ScreenOrientation_DeInit(){JS_ScreenOrientation_callback=0;window.removeEventListener("resize",JS_ScreenOrientation_eventHandler);if(screen.orientation){screen.orientation.removeEventListener("change",JS_ScreenOrientation_eventHandler)}}function _JS_ScreenOrientation_Init(callback){if(!JS_ScreenOrientation_callback){if(screen.orientation){screen.orientation.addEventListener("change",JS_ScreenOrientation_eventHandler)}window.addEventListener("resize",JS_ScreenOrientation_eventHandler);JS_ScreenOrientation_callback=callback;setTimeout(JS_ScreenOrientation_eventHandler,0)}}var JS_ScreenOrientation_requestedLockType=-1;var JS_ScreenOrientation_appliedLockType=-1;var JS_ScreenOrientation_timeoutID=-1;function _JS_ScreenOrientation_Lock(orientationLockType){if(!screen.orientation){return}function applyLock(){JS_ScreenOrientation_appliedLockType=JS_ScreenOrientation_requestedLockType;var screenOrientations=["any",0,"landscape","portrait","portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"];var type=screenOrientations[JS_ScreenOrientation_appliedLockType];screen.orientation.lock(type).then(function(){if(JS_ScreenOrientation_requestedLockType!=JS_ScreenOrientation_appliedLockType){JS_ScreenOrientation_timeoutID=setTimeout(applyLock,0)}else{JS_ScreenOrientation_timeoutID=-1}}).catch(function(err){warnOnce(err);JS_ScreenOrientation_timeoutID=-1})}JS_ScreenOrientation_requestedLockType=orientationLockType;if(JS_ScreenOrientation_timeoutID==-1&&orientationLockType!=JS_ScreenOrientation_appliedLockType){JS_ScreenOrientation_timeoutID=setTimeout(applyLock,0)}}var WEBAudio={audioInstanceIdCounter:0,audioInstances:{},audioContext:null,audioWebEnabled:0,audioCache:[],pendingAudioSources:{}};function jsAudioMixinSetPitch(source){source.estimatePlaybackPosition=function(){var t=(WEBAudio.audioContext.currentTime-source.playbackStartTime)*source.playbackRate.value;if(source.loop&&t>=source.loopStart){t=(t-source.loopStart)%(source.loopEnd-source.loopStart)+source.loopStart}return t};source.setPitch=function(newPitch){var curPosition=source.estimatePlaybackPosition();if(curPosition>=0){source.playbackStartTime=WEBAudio.audioContext.currentTime-curPosition/newPitch}if(source.playbackRate.value!==newPitch)source.playbackRate.value=newPitch}}function jsAudioCreateUncompressedSoundClip(buffer,error){var soundClip={buffer:buffer,error:error};soundClip.release=function(){};soundClip.getLength=function(){if(!this.buffer){console.log("Trying to get length of sound which is not loaded.");return 0}var sampleRateRatio=44100/this.buffer.sampleRate;return this.buffer.length*sampleRateRatio};soundClip.getData=function(ptr,length){if(!this.buffer){console.log("Trying to get data of sound which is not loaded.");return 0}var startOutputBuffer=ptr>>2;var output=HEAPF32.subarray(startOutputBuffer,startOutputBuffer+(length>>2));var numMaxSamples=Math.floor((length>>2)/this.buffer.numberOfChannels);var numReadSamples=Math.min(this.buffer.length,numMaxSamples);for(var i=0;istartDelayThresholdMS){source.playTimeout=setTimeout(function(){source.playTimeout=null;source._startPlayback(offset)},startDelayMS)}else{source._startPlayback(offset)}};source.stop=function(stopTime){if(typeof stopTime==="undefined"){stopTime=WEBAudio.audioContext.currentTime}var stopDelayThresholdMS=4;var stopDelayMS=(stopTime-WEBAudio.audioContext.currentTime)*1e3;if(stopDelayMS>stopDelayThresholdMS){setTimeout(function(){source._pauseMediaElement();source.isStopped=true},stopDelayMS)}else{source._pauseMediaElement();source.isStopped=true}};jsAudioMixinSetPitch(source);return source};return soundClip}function _JS_Sound_Load(ptr,length,decompress){if(WEBAudio.audioWebEnabled==0)return 0;var audioData=HEAPU8.buffer.slice(ptr,ptr+length);if(length<131072)decompress=1;var sound;if(decompress){sound=jsAudioCreateUncompressedSoundClipFromCompressedAudio(audioData)}else{sound=jsAudioCreateCompressedSoundClip(audioData)}WEBAudio.audioInstances[++WEBAudio.audioInstanceIdCounter]=sound;return WEBAudio.audioInstanceIdCounter}function jsAudioCreateUncompressedSoundClipFromPCM(channels,length,sampleRate,ptr){var buffer=WEBAudio.audioContext.createBuffer(channels,length,sampleRate);for(var i=0;i>2)+length*i;var copyToChannel=buffer["copyToChannel"]||function(source,channelNumber,startInChannel){var clipped=source.subarray(0,Math.min(source.length,this.length-(startInChannel|0)));this.getChannelData(channelNumber|0).set(clipped,startInChannel|0)};copyToChannel.apply(buffer,[HEAPF32.subarray(offs,offs+length),i,0])}return jsAudioCreateUncompressedSoundClip(buffer,false)}function _JS_Sound_Load_PCM(channels,length,sampleRate,ptr){if(WEBAudio.audioWebEnabled==0)return 0;var sound=jsAudioCreateUncompressedSoundClipFromPCM(channels,length,sampleRate,ptr);WEBAudio.audioInstances[++WEBAudio.audioInstanceIdCounter]=sound;return WEBAudio.audioInstanceIdCounter}function _JS_Sound_Play(bufferInstance,channelInstance,offset,delay){if(WEBAudio.audioWebEnabled==0)return;_JS_Sound_Stop(channelInstance,0);var soundClip=WEBAudio.audioInstances[bufferInstance];var channel=WEBAudio.audioInstances[channelInstance];if(!soundClip){console.log("Trying to play sound which is not loaded.");return}try{channel.playSoundClip(soundClip,WEBAudio.audioContext.currentTime+delay,offset)}catch(error){console.error("playSoundClip error. Exception: "+e)}}function _JS_Sound_ReleaseInstance(instance){var object=WEBAudio.audioInstances[instance];if(object){object.release()}delete WEBAudio.audioInstances[instance]}function _JS_Sound_ResumeIfNeeded(){if(WEBAudio.audioWebEnabled==0)return;if(WEBAudio.audioContext.state==="suspended")WEBAudio.audioContext.resume().catch(function(error){console.warn("Could not resume audio context. Exception: "+error)})}function _JS_Sound_Set3D(channelInstance,threeD){var channel=WEBAudio.audioInstances[channelInstance];channel.set3D(threeD)}function _JS_Sound_SetListenerOrientation(x,y,z,xUp,yUp,zUp){if(WEBAudio.audioWebEnabled==0)return;x=-x;y=-y;z=-z;var l=WEBAudio.audioContext.listener;if(l.forwardX){if(l.forwardX.value!==x)l.forwardX.value=x;if(l.forwardY.value!==y)l.forwardY.value=y;if(l.forwardZ.value!==z)l.forwardZ.value=z;if(l.upX.value!==xUp)l.upX.value=xUp;if(l.upY.value!==yUp)l.upY.value=yUp;if(l.upZ.value!==zUp)l.upZ.value=zUp}else if(l._forwardX!==x||l._forwardY!==y||l._forwardZ!==z||l._upX!==xUp||l._upY!==yUp||l._upZ!==zUp){l.setOrientation(x,y,z,xUp,yUp,zUp);l._forwardX=x;l._forwardY=y;l._forwardZ=z;l._upX=xUp;l._upY=yUp;l._upZ=zUp}}function _JS_Sound_SetListenerPosition(x,y,z){if(WEBAudio.audioWebEnabled==0)return;var l=WEBAudio.audioContext.listener;if(l.positionX){if(l.positionX.value!==x)l.positionX.value=x;if(l.positionY.value!==y)l.positionY.value=y;if(l.positionZ.value!==z)l.positionZ.value=z}else if(l._positionX!==x||l._positionY!==y||l._positionZ!==z){l.setPosition(x,y,z);l._positionX=x;l._positionY=y;l._positionZ=z}}function _JS_Sound_SetLoop(channelInstance,loop){if(WEBAudio.audioWebEnabled==0)return;var channel=WEBAudio.audioInstances[channelInstance];channel.setLoop(loop)}function _JS_Sound_SetLoopPoints(channelInstance,loopStart,loopEnd){if(WEBAudio.audioWebEnabled==0)return;var channel=WEBAudio.audioInstances[channelInstance];channel.setLoopPoints(loopStart,loopEnd)}function _JS_Sound_SetPaused(channelInstance,paused){if(WEBAudio.audioWebEnabled==0)return;var channel=WEBAudio.audioInstances[channelInstance];if(paused!=channel.isPaused()){if(paused)channel.pause();else channel.resume()}}function _JS_Sound_SetPitch(channelInstance,v){if(WEBAudio.audioWebEnabled==0)return;try{var channel=WEBAudio.audioInstances[channelInstance];channel.setPitch(v)}catch(e){console.error("JS_Sound_SetPitch(channel="+channelInstance+", pitch="+v+") threw an exception: "+e)}}function _JS_Sound_SetPosition(channelInstance,x,y,z){if(WEBAudio.audioWebEnabled==0)return;var channel=WEBAudio.audioInstances[channelInstance];channel.setPosition(x,y,z)}function _JS_Sound_SetVolume(channelInstance,v){if(WEBAudio.audioWebEnabled==0)return;try{var channel=WEBAudio.audioInstances[channelInstance];channel.setVolume(v)}catch(e){console.error("JS_Sound_SetVolume(channel="+channelInstance+", volume="+v+") threw an exception: "+e)}}function _JS_Sound_Stop(channelInstance,delay){if(WEBAudio.audioWebEnabled==0)return;var channel=WEBAudio.audioInstances[channelInstance];channel.stop(delay)}function _JS_SystemInfo_GetCanvasClientSize(domElementSelector,outWidth,outHeight){var selector=UTF8ToString(domElementSelector);var canvas=selector=="#canvas"?Module["canvas"]:document.querySelector(selector);var w=0,h=0;if(canvas){var size=canvas.getBoundingClientRect();w=size.width;h=size.height}HEAPF64[outWidth>>3]=w;HEAPF64[outHeight>>3]=h}function _JS_SystemInfo_GetDocumentURL(buffer,bufferSize){if(buffer)stringToUTF8(document.URL,buffer,bufferSize);return lengthBytesUTF8(document.URL)}function _JS_SystemInfo_GetGPUInfo(buffer,bufferSize){var gpuinfo=Module.SystemInfo.gpu;if(buffer)stringToUTF8(gpuinfo,buffer,bufferSize);return lengthBytesUTF8(gpuinfo)}function _JS_SystemInfo_GetMatchWebGLToCanvasSize(){return Module.matchWebGLToCanvasSize||Module.matchWebGLToCanvasSize===undefined}function _JS_SystemInfo_GetMemory(){return HEAPU8.length/(1024*1024)}function _JS_SystemInfo_GetOS(buffer,bufferSize){var browser=Module.SystemInfo.os+" "+Module.SystemInfo.osVersion;if(buffer)stringToUTF8(browser,buffer,bufferSize);return lengthBytesUTF8(browser)}function _JS_SystemInfo_GetPreferredDevicePixelRatio(){return Module.matchWebGLToCanvasSize==false?1:Module.devicePixelRatio||window.devicePixelRatio||1}function _JS_SystemInfo_GetScreenSize(outWidth,outHeight){HEAPF64[outWidth>>3]=Module.SystemInfo.width;HEAPF64[outHeight>>3]=Module.SystemInfo.height}function _JS_SystemInfo_HasAstcHdr(){var ext=GLctx.getExtension("WEBGL_compressed_texture_astc");if(ext&&ext.getSupportedProfiles){return ext.getSupportedProfiles().includes("hdr")}return false}function _JS_SystemInfo_HasCursorLock(){return Module.SystemInfo.hasCursorLock}function _JS_SystemInfo_HasFullscreen(){return Module.SystemInfo.hasFullscreen}function _JS_SystemInfo_HasWebGL(){return Module.SystemInfo.hasWebGL}function _JS_SystemInfo_IsMobile(){return Module.SystemInfo.mobile}function _JS_UnityEngineShouldQuit(){return!!Module.shouldQuit}var wr={requests:{},responses:{},abortControllers:{},timer:{},nextRequestId:1};function _JS_WebRequest_Abort(requestId){var abortController=wr.abortControllers[requestId];if(!abortController||abortController.signal.aborted){return}abortController.abort()}function _JS_WebRequest_Create(url,method){var _url=UTF8ToString(url);var _method=UTF8ToString(method);var abortController=new AbortController;var requestOptions={url:_url,init:{method:_method,signal:abortController.signal,headers:{},enableStreamingDownload:true},tempBuffer:null,tempBufferSize:0};wr.abortControllers[wr.nextRequestId]=abortController;wr.requests[wr.nextRequestId]=requestOptions;return wr.nextRequestId++}function jsWebRequestGetResponseHeaderString(requestId){var response=wr.responses[requestId];if(!response){return""}if(response.headerString){return response.headerString}var headers="";var entries=response.headers.entries();for(var result=entries.next();!result.done;result=entries.next()){headers+=result.value[0]+": "+result.value[1]+"\r\n"}response.headerString=headers;return headers}function _JS_WebRequest_GetResponseMetaData(requestId,headerBuffer,headerSize,responseUrlBuffer,responseUrlSize){var response=wr.responses[requestId];if(!response){stringToUTF8("",headerBuffer,headerSize);stringToUTF8("",responseUrlBuffer,responseUrlSize);return}if(headerBuffer){var headers=jsWebRequestGetResponseHeaderString(requestId);stringToUTF8(headers,headerBuffer,headerSize)}if(responseUrlBuffer){stringToUTF8(response.url,responseUrlBuffer,responseUrlSize)}}function _JS_WebRequest_GetResponseMetaDataLengths(requestId,buffer){var response=wr.responses[requestId];if(!response){HEAPU32[buffer>>2]=0;HEAPU32[(buffer>>2)+1]=0;return}var headers=jsWebRequestGetResponseHeaderString(requestId);HEAPU32[buffer>>2]=lengthBytesUTF8(headers);HEAPU32[(buffer>>2)+1]=lengthBytesUTF8(response.url)}function _JS_WebRequest_Release(requestId){if(wr.timer[requestId]){clearTimeout(wr.timer[requestId])}delete wr.requests[requestId];delete wr.responses[requestId];delete wr.abortControllers[requestId];delete wr.timer[requestId]}function _JS_WebRequest_Send(requestId,ptr,length,arg,onresponse,onprogress){var requestOptions=wr.requests[requestId];var abortController=wr.abortControllers[requestId];function getTempBuffer(size){if(!requestOptions.tempBuffer){const initialSize=Math.max(size,1024);requestOptions.tempBuffer=_malloc(initialSize);requestOptions.tempBufferSize=initialSize}if(requestOptions.tempBufferSize0){var postData=HEAPU8.subarray(ptr,ptr+length);requestOptions.init.body=new Blob([postData])}if(requestOptions.timeout){wr.timer[requestId]=setTimeout(function(){requestOptions.isTimedOut=true;abortController.abort()},requestOptions.timeout)}var fetchImpl=Module.fetchWithProgress;requestOptions.init.onProgress=HandleProgress;if(Module.companyName&&Module.productName&&Module.cachedFetch){fetchImpl=Module.cachedFetch;requestOptions.init.companyName=Module.companyName;requestOptions.init.productName=Module.productName;requestOptions.control=Module.cacheControl(requestOptions.url)}fetchImpl(requestOptions.url,requestOptions.init).then(function(response){wr.responses[requestId]=response;HandleSuccess(response,response.parsedBody)}).catch(function(error){var kWebErrorUnknown=2;var kWebErrorAborted=17;var kWebErrorTimeout=14;if(requestOptions.isTimedOut){HandleError("Connection timed out.",kWebErrorTimeout)}else if(abortController.signal.aborted){HandleError("Aborted.",kWebErrorAborted)}else{HandleError(error.message,kWebErrorUnknown)}})}catch(error){var kWebErrorUnknown=2;HandleError(error.message,kWebErrorUnknown)}}function _JS_WebRequest_SetRedirectLimit(request,redirectLimit){var requestOptions=wr.requests[request];if(!requestOptions){return}requestOptions.init.redirect=redirectLimit===0?"error":"follow"}function _JS_WebRequest_SetRequestHeader(requestId,header,value){var requestOptions=wr.requests[requestId];if(!requestOptions){return}var _header=UTF8ToString(header);var _value=UTF8ToString(value);requestOptions.init.headers[_header]=_value}function _JS_WebRequest_SetTimeout(requestId,timeout){var requestOptions=wr.requests[requestId];if(!requestOptions){return}requestOptions.timeout=timeout}function _SendAccountInfo(account_info){try{window.dispatchReactUnityEvent("SendAccountInfo",UTF8ToString(account_info))}catch(e){console.warn("Failed to dispatch event")}}function _TransferLOOT(amount){try{window.dispatchReactUnityEvent("TransferLOOT",UTF8ToString(amount))}catch(e){console.warn("Failed to dispatch event")}}function _TransferSOL(amount){try{window.dispatchReactUnityEvent("TransferSOL",UTF8ToString(amount))}catch(e){console.warn("Failed to dispatch event")}}var ExceptionInfoAttrs={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16};function ___cxa_allocate_exception(size){return _malloc(size+ExceptionInfoAttrs.SIZE)+ExceptionInfoAttrs.SIZE}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-ExceptionInfoAttrs.SIZE;this.set_type=function(type){HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]=type};this.get_type=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]};this.set_destructor=function(destructor){HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]=destructor};this.get_destructor=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]!=0};this.init=function(type,destructor){this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=prev-1;return prev===1}}function CatchInfo(ptr){this.free=function(){_free(this.ptr);this.ptr=0};this.set_base_ptr=function(basePtr){HEAP32[this.ptr>>2]=basePtr};this.get_base_ptr=function(){return HEAP32[this.ptr>>2]};this.set_adjusted_ptr=function(adjustedPtr){var ptrSize=4;HEAP32[this.ptr+ptrSize>>2]=adjustedPtr};this.get_adjusted_ptr=function(){var ptrSize=4;return HEAP32[this.ptr+ptrSize>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_exception_info().get_type());if(isPointer){return HEAP32[this.get_base_ptr()>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.get_base_ptr()};this.get_exception_info=function(){return new ExceptionInfo(this.get_base_ptr())};if(ptr===undefined){this.ptr=_malloc(8);this.set_adjusted_ptr(0)}else{this.ptr=ptr}}var exceptionCaught=[];function exception_addRef(info){info.add_ref()}var uncaughtExceptionCount=0;function ___cxa_begin_catch(ptr){var catchInfo=new CatchInfo(ptr);var info=catchInfo.get_exception_info();if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(catchInfo);exception_addRef(info);return catchInfo.get_exception_ptr()}var exceptionLast=0;function ___cxa_free_exception(ptr){return _free(new ExceptionInfo(ptr).ptr)}function exception_decRef(info){if(info.release_ref()&&!info.get_rethrown()){var destructor=info.get_destructor();if(destructor){(function(a1){return dynCall_ii.apply(null,[destructor,a1])})(info.excPtr)}___cxa_free_exception(info.excPtr)}}function ___cxa_end_catch(){_setThrew(0);var catchInfo=exceptionCaught.pop();exception_decRef(catchInfo.get_exception_info());catchInfo.free();exceptionLast=0}function ___resumeException(catchInfoPtr){var catchInfo=new CatchInfo(catchInfoPtr);var ptr=catchInfo.get_base_ptr();if(!exceptionLast){exceptionLast=ptr}catchInfo.free();throw ptr}function ___cxa_find_matching_catch_2(){var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0|0}var info=new ExceptionInfo(thrown);var thrownType=info.get_type();var catchInfo=new CatchInfo;catchInfo.set_base_ptr(thrown);if(!thrownType){setTempRet0(0);return catchInfo.ptr|0}var typeArray=Array.prototype.slice.call(arguments);var stackTop=stackSave();var exceptionThrowBuf=stackAlloc(4);HEAP32[exceptionThrowBuf>>2]=thrown;for(var i=0;i>2];if(thrown!==adjusted){catchInfo.set_adjusted_ptr(adjusted)}setTempRet0(caughtType);return catchInfo.ptr|0}}stackRestore(stackTop);setTempRet0(thrownType);return catchInfo.ptr|0}function ___cxa_find_matching_catch_3(){var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0|0}var info=new ExceptionInfo(thrown);var thrownType=info.get_type();var catchInfo=new CatchInfo;catchInfo.set_base_ptr(thrown);if(!thrownType){setTempRet0(0);return catchInfo.ptr|0}var typeArray=Array.prototype.slice.call(arguments);var stackTop=stackSave();var exceptionThrowBuf=stackAlloc(4);HEAP32[exceptionThrowBuf>>2]=thrown;for(var i=0;i>2];if(thrown!==adjusted){catchInfo.set_adjusted_ptr(adjusted)}setTempRet0(caughtType);return catchInfo.ptr|0}}stackRestore(stackTop);setTempRet0(thrownType);return catchInfo.ptr|0}function ___cxa_find_matching_catch_4(){var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0|0}var info=new ExceptionInfo(thrown);var thrownType=info.get_type();var catchInfo=new CatchInfo;catchInfo.set_base_ptr(thrown);if(!thrownType){setTempRet0(0);return catchInfo.ptr|0}var typeArray=Array.prototype.slice.call(arguments);var stackTop=stackSave();var exceptionThrowBuf=stackAlloc(4);HEAP32[exceptionThrowBuf>>2]=thrown;for(var i=0;i>2];if(thrown!==adjusted){catchInfo.set_adjusted_ptr(adjusted)}setTempRet0(caughtType);return catchInfo.ptr|0}}stackRestore(stackTop);setTempRet0(thrownType);return catchInfo.ptr|0}function ___cxa_rethrow(){var catchInfo=exceptionCaught.pop();if(!catchInfo){abort("no exception to throw")}var info=catchInfo.get_exception_info();var ptr=catchInfo.get_base_ptr();if(!info.get_rethrown()){exceptionCaught.push(catchInfo);info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++}else{catchInfo.free()}exceptionLast=ptr;throw ptr}function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;if(!_gmtime_r.GMTString)_gmtime_r.GMTString=allocateUTF8("GMT");HEAP32[tmPtr+40>>2]=_gmtime_r.GMTString;return tmPtr}function ___gmtime_r(a0,a1){return _gmtime_r(a0,a1)}function _tzset(){if(_tzset.called)return;_tzset.called=true;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[__get_timezone()>>2]=stdTimezoneOffset*60;HEAP32[__get_daylight()>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function ___localtime_r(a0,a1){return _localtime_r(a0,a1)}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,65536);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(protocol){assert(streaming==(protocol==6))}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr==="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=ENVIRONMENT_IS_NODE?{"protocol":subProtocols.toString()}:subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!=="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data==="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,flags){if(!flags.binary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return ERRNO_CODES.EINVAL}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);tempI64=[0>>>0,(tempDouble=0,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[sa+8>>2]=tempI64[0],HEAP32[sa+12>>2]=tempI64[1];break;case 10:addr=inetPton6(addr);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);HEAP32[sa+4>>2]=0;HEAP32[sa+24>>2]=0;break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___sys_accept4(fd,addr,addrlen,flags){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_access(path,amode){try{path=SYSCALLS.getStr(path);return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___sys_bind(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_dup2(oldfd,suggestFD){try{var old=SYSCALLS.getStreamFromFD(oldfd);if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd);if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getegid32(){return 0}function ___sys_geteuid32(){return ___sys_getegid32()}function ___sys_getpeername(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getpid(){return 42}function ___sys_getrusage(who,usage){try{_memset(usage,0,136);HEAP32[usage>>2]=1;HEAP32[usage+4>>2]=2;HEAP32[usage+8>>2]=3;HEAP32[usage+12>>2]=4;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getsockname(fd,addr,addrlen){try{err("__sys_getsockname "+fd);var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getsockopt(fd,level,optname,optval,optlen){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_getuid32(){return ___sys_getegid32()}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_mkdir(path,mode){try{path=SYSCALLS.getStr(path);return SYSCALLS.doMkdir(path,mode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMmap2(addr,len,prot,flags,fd,off){off<<=12;var ptr;var allocated=false;if((flags&16)!==0&&addr%65536!==0){return-28}if((flags&32)!==0){ptr=_memalign(65536,len);if(!ptr)return-48;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-8;var res=FS.mmap(info,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,prot:prot,flags:flags,offset:off};return ptr}function ___sys_mmap2(addr,len,prot,flags,fd,off){try{return syscallMmap2(addr,len,prot,flags,fd,off)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(stream){if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream)}SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount:function(mount){return FS.createNode(null,"/",16384|511,0)},createPipe:function(){var pipe={buckets:[]};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:0,seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:1,seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll:function(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}else{if(pipe.buckets.length>0){for(var i=0;i0){return 64|1}}}}return 0},ioctl:function(stream,request,varargs){return ERRNO_CODES.EINVAL},fsync:function(stream){return ERRNO_CODES.EINVAL},read:function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close:function(stream){var pipe=stream.node.pipe;pipe.buckets=null}},nextname:function(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};function ___sys_pipe(fdPtr){try{if(fdPtr==0){throw new FS.ErrnoError(21)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_readlink(path,buf,bufsize){try{path=SYSCALLS.getStr(path);return SYSCALLS.doReadlink(path,buf,bufsize)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_recvmsg(fd,message,flags){try{var sock=getSocketFromFD(fd);var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var total=0;for(var i=0;i>2]}var msg=sock.sock_ops.recvmsg(sock,total);if(!msg)return 0;var name=HEAP32[message>>2];if(name){var errno=writeSockaddr(name,sock.family,DNS.lookup_name(msg.addr),msg.port)}var bytesRead=0;var bytesRemaining=msg.buffer.byteLength;for(var i=0;bytesRemaining>0&&i>2];var iovlen=HEAP32[iov+(8*i+4)>>2];if(!iovlen){continue}var length=Math.min(iovlen,bytesRemaining);var buf=msg.buffer.subarray(bytesRead,bytesRead+length);HEAPU8.set(buf,iovbase+bytesRead);bytesRead+=length;bytesRemaining-=length}return bytesRead}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_sendmsg(fd,message,flags){try{var sock=getSocketFromFD(fd);var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var addr,port;var name=HEAP32[message>>2];var namelen=HEAP32[message+4>>2];if(name){var info=readSockaddr(name,namelen);if(info.errno)return-info.errno;port=info.port;addr=DNS.lookup_addr(info.addr)||info.addr}var total=0;for(var i=0;i>2]}var view=new Uint8Array(total);var offset=0;for(var i=0;i>2];var iovlen=HEAP32[iov+(8*i+4)>>2];for(var j=0;j>0]}}return sock.sock_ops.sendmsg(sock,view,0,total,addr,port)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_setsockopt(fd){try{return-50}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_shutdown(fd,how){try{getSocketFromFD(fd);return-52}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_truncate64(path,zero,low,high){try{path=SYSCALLS.getStr(path);var length=SYSCALLS.get64(low,high);FS.truncate(path,length);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_uname(buf){try{if(!buf)return-21;var layout={"__size__":390,"domainname":325,"machine":260,"nodename":65,"release":130,"sysname":0,"version":195};var copyString=function(element,value){var offset=layout[element];writeAsciiToMemory(value,buf+offset)};copyString("sysname","Emscripten");copyString("nodename","emscripten");copyString("release","1.0");copyString("version","#1");copyString("machine","wasm32");return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _emscripten_get_now_res(){if(ENVIRONMENT_IS_NODE){return 1}else if(typeof dateNow!=="undefined"){return 1e3}else return 1e3}var _emscripten_get_now_is_monotonic=true;function _clock_getres(clk_id,res){var nsec;if(clk_id===0){nsec=1e3*1e3}else if(clk_id===1&&_emscripten_get_now_is_monotonic){nsec=_emscripten_get_now_res()}else{setErrNo(28);return-1}HEAP32[res>>2]=nsec/1e9|0;HEAP32[res+4>>2]=nsec;return 0}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _difftime(time1,time0){return time1-time0}function _dlclose(handle){}function _dlerror(){return 0}function _dlopen(filename,flag){}function _dlsym(handle,symbol){return 0}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function mainThreadEM_ASM(code,sigPtr,argbuf,sync){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_int_sync_on_main_thread(code,sigPtr,argbuf){return mainThreadEM_ASM(code,sigPtr,argbuf,1)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _exit(status){exit(status)}function maybeExit(){if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){if(e instanceof ExitStatus){return}throw e}}}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}GL.newRenderingFrameStarted();Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func,synchronous){if(ABORT){return}if(synchronous){func();return}try{func()}catch(e){if(e instanceof ExitStatus){return}else if(e!=="unwind"){if(e&&typeof e==="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!=="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!=="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame==="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame(function(){callUserCallback(func)})},safeSetTimeout:function(func,timeout){return setTimeout(function(){callUserCallback(func)},timeout)},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},asyncLoad:function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";readAsync(url,function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_get_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;HEAP32[width>>2]=canvas.width;HEAP32[height>>2]=canvas.height}function getCanvasElementSize(target){var stackTop=stackSave();var w=stackAlloc(8);var h=w+4;var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);var ret=_emscripten_get_canvas_element_size(targetInt,w,h);var size=[HEAP32[w>>2],HEAP32[h>>2]];stackRestore(stackTop);return size}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0}function setCanvasElementSize(target,width,height){if(!target.controlTransferredOffscreen){target.width=width;target.height=height}else{var stackTop=stackSave();var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);_emscripten_set_canvas_element_size(targetInt,width,height);stackRestore(stackTop)}}function registerRestoreOldStyle(canvas){var canvasSize=getCanvasElementSize(canvas);var oldWidth=canvasSize[0];var oldHeight=canvasSize[1];var oldCssWidth=canvas.style.width;var oldCssHeight=canvas.style.height;var oldBackgroundColor=canvas.style.backgroundColor;var oldDocumentBackgroundColor=document.body.style.backgroundColor;var oldPaddingLeft=canvas.style.paddingLeft;var oldPaddingRight=canvas.style.paddingRight;var oldPaddingTop=canvas.style.paddingTop;var oldPaddingBottom=canvas.style.paddingBottom;var oldMarginLeft=canvas.style.marginLeft;var oldMarginRight=canvas.style.marginRight;var oldMarginTop=canvas.style.marginTop;var oldMarginBottom=canvas.style.marginBottom;var oldDocumentBodyMargin=document.body.style.margin;var oldDocumentOverflow=document.documentElement.style.overflow;var oldDocumentScroll=document.body.scroll;var oldImageRendering=canvas.style.imageRendering;function restoreOldStyle(){var fullscreenElement=document.fullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(!fullscreenElement){document.removeEventListener("fullscreenchange",restoreOldStyle);document.removeEventListener("webkitfullscreenchange",restoreOldStyle);setCanvasElementSize(canvas,oldWidth,oldHeight);canvas.style.width=oldCssWidth;canvas.style.height=oldCssHeight;canvas.style.backgroundColor=oldBackgroundColor;if(!oldDocumentBackgroundColor)document.body.style.backgroundColor="white";document.body.style.backgroundColor=oldDocumentBackgroundColor;canvas.style.paddingLeft=oldPaddingLeft;canvas.style.paddingRight=oldPaddingRight;canvas.style.paddingTop=oldPaddingTop;canvas.style.paddingBottom=oldPaddingBottom;canvas.style.marginLeft=oldMarginLeft;canvas.style.marginRight=oldMarginRight;canvas.style.marginTop=oldMarginTop;canvas.style.marginBottom=oldMarginBottom;document.body.style.margin=oldDocumentBodyMargin;document.documentElement.style.overflow=oldDocumentOverflow;document.body.scroll=oldDocumentScroll;canvas.style.imageRendering=oldImageRendering;if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,oldWidth,oldHeight);if(currentFullscreenStrategy.canvasResizedCallback){(function(a1,a2,a3){return dynCall_iiii.apply(null,[currentFullscreenStrategy.canvasResizedCallback,a1,a2,a3])})(37,0,currentFullscreenStrategy.canvasResizedCallbackUserData)}}}document.addEventListener("fullscreenchange",restoreOldStyle);document.addEventListener("webkitfullscreenchange",restoreOldStyle);return restoreOldStyle}function setLetterbox(element,topBottom,leftRight){element.style.paddingLeft=element.style.paddingRight=leftRight+"px";element.style.paddingTop=element.style.paddingBottom=topBottom+"px"}function getBoundingClientRect(e){return specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0}}function _JSEvents_resizeCanvasForFullscreen(target,strategy){var restoreOldStyle=registerRestoreOldStyle(target);var cssWidth=strategy.softFullscreen?innerWidth:screen.width;var cssHeight=strategy.softFullscreen?innerHeight:screen.height;var rect=getBoundingClientRect(target);var windowedCssWidth=rect.width;var windowedCssHeight=rect.height;var canvasSize=getCanvasElementSize(target);var windowedRttWidth=canvasSize[0];var windowedRttHeight=canvasSize[1];if(strategy.scaleMode==3){setLetterbox(target,(cssHeight-windowedCssHeight)/2,(cssWidth-windowedCssWidth)/2);cssWidth=windowedCssWidth;cssHeight=windowedCssHeight}else if(strategy.scaleMode==2){if(cssWidth*windowedRttHeight>2]=isFullscreen;HEAP32[eventStruct+4>>2]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement&&reportedElement.id?reportedElement.id:"";stringToUTF8(nodeName,eventStruct+8,128);stringToUTF8(id,eventStruct+136,128);HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+268>>2]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+272>>2]=screen.width;HEAP32[eventStruct+276>>2]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}}function _emscripten_get_fullscreen_status(fullscreenStatus){if(!JSEvents.fullscreenEnabled())return-1;fillFullscreenChangeEventData(fullscreenStatus);return 0}function fillGamepadEventData(eventStruct,e){HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i>3]=e.axes[i]}for(var i=0;i>3]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i]}}for(var i=0;i>2]=e.buttons[i].pressed}else{HEAP32[eventStruct+i*4+1040>>2]=e.buttons[i]==1}}HEAP32[eventStruct+1296>>2]=e.connected;HEAP32[eventStruct+1300>>2]=e.index;HEAP32[eventStruct+8>>2]=e.axes.length;HEAP32[eventStruct+12>>2]=e.buttons.length;stringToUTF8(e.id,eventStruct+1304,64);stringToUTF8(e.mapping,eventStruct+1368,64)}function _emscripten_get_gamepad_status(index,gamepadState){if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0}function _emscripten_get_heap_max(){return 2147483648}function _emscripten_get_num_gamepads(){return JSEvents.lastGamepadState.length}function _emscripten_html5_remove_all_event_listeners(){JSEvents.removeAllEventListeners()}function _emscripten_is_webgl_context_lost(contextHandle){return!GL.contexts[contextHandle]||GL.contexts[contextHandle].GLctx.isContextLost()}function reallyNegative(x){return x<0||x===0&&1/x===-Infinity}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function convertU32PairToI53(lo,hi){return(lo>>>0)+(hi>>>0)*4294967296}function reSign(value,bits){if(value<=0){return value}var half=bits<=32?Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}function unSign(value,bits){if(value>=0){return value}return bits<=32?2*Math.abs(1<>3];argIndex+=8}else if(type=="i64"){ret=[HEAP32[argIndex>>2],HEAP32[argIndex+4>>2]];argIndex+=8}else{type="i32";ret=HEAP32[argIndex>>2];argIndex+=4}return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>0];if(curr===0)break;next=HEAP8[textIndex+1>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break}case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>0]}var width=0;if(next==42){width=getNextArg("i32");textIndex++;next=HEAP8[textIndex+1>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>0];if(next==42){precision=getNextArg("i32");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case"h":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case"l":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case"L":case"q":case"j":argSize=8;break;case"z":case"t":case"I":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>0];switch(String.fromCharCode(next)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":{var signed=next==100||next==105;argSize=argSize||4;currArg=getNextArg("i"+argSize*8);var argText;if(argSize==8){currArg=next==117?convertU32PairToI53(currArg[0],currArg[1]):convertI32PairToI53(currArg[0],currArg[1])}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix="";if(next==100||next==105){argText=reSign(currArg,8*argSize,1).toString(10)}else if(next==117){argText=unSign(currArg,8*argSize,1).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?"0":"")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?"0x":"";if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.lengthexponent&&exponent>=-4){next=(next==103?"f":"F").charCodeAt(0);precision-=exponent+1}else{next=(next==103?"e":"E").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+"0"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&reallyNegative(currArg)){argText="-"+argText}}var parts=argText.split("e");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].includes(".")&&(parts[0].slice(-1)=="0"||parts[0].slice(-1)==".")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(".")==-1)parts[0]+=".";while(precision>effectivePrecision++)parts[0]+="0"}argText=parts[0]+(parts.length>1?"e"+parts[1]:"");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText="+"+argText}else if(flagPadSign){argText=" "+argText}}}while(argText.length>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg("i8"));break}case"n":{var ptr=getNextArg("i32*");HEAP32[ptr>>2]=ret.length;break}case"%":{ret.push(curr);break}default:{for(var i=startTextIndex;i>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}function traverseStack(args){if(!args||!args.callee||!args.callee.name){return[null,"",""]}var funstr=args.callee.toString();var funcname=args.callee.name;var str="(";var first=true;for(var i in args){var a=args[i];if(!first){str+=", "}first=false;if(typeof a==="number"||typeof a==="string"){str+=a}else{str+="("+typeof a+")"}}str+=")";var caller=args.callee.caller;args=caller?caller.arguments:[];if(first)str="";return[args,funcname,str]}function _emscripten_get_callstack_js(flags){var callstack=jsStackTrace();var iThisFunc=callstack.lastIndexOf("_emscripten_log");var iThisFunc2=callstack.lastIndexOf("_emscripten_get_callstack");var iNextLine=callstack.indexOf("\n",Math.max(iThisFunc,iThisFunc2))+1;callstack=callstack.slice(iNextLine);if(flags&32){warnOnce("EM_LOG_DEMANGLE is deprecated; ignoring")}if(flags&8&&typeof emscripten_source_map==="undefined"){warnOnce('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.');flags^=8;flags|=16}var stack_args=null;if(flags&128){stack_args=traverseStack(arguments);while(stack_args[1].includes("_emscripten_"))stack_args=traverseStack(stack_args[0])}var lines=callstack.split("\n");callstack="";var newFirefoxRe=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)");var firefoxRe=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?");var chromeRe=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var l in lines){var line=lines[l];var symbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=newFirefoxRe.exec(line);if(!parts)parts=firefoxRe.exec(line);if(parts&&parts.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig&&orig.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=" at "+symbolName+" ("+orig.source+":"+orig.line+":"+orig.column+")\n"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?" = "+symbolName:" at "+symbolName)+" ("+file+":"+lineno+":"+column+")\n"}if(flags&128&&stack_args[0]){if(stack_args[1]==symbolName&&stack_args[2].length>0){callstack=callstack.replace(/\s+$/,"");callstack+=" with values: "+stack_args[1]+stack_args[2]+"\n"}stack_args=traverseStack(stack_args[0])}}callstack=callstack.replace(/\s+$/,"");return callstack}function _emscripten_log_js(flags,str){if(flags&24){str=str.replace(/\s+$/,"");str+=(str.length>0?"\n":"")+_emscripten_get_callstack_js(flags)}if(flags&1){if(flags&4){console.error(str)}else if(flags&2){console.warn(str)}else if(flags&512){console.info(str)}else if(flags&256){console.debug(str)}else{console.log(str)}}else if(flags&6){err(str)}else{out(str)}}function _emscripten_log(flags,format,varargs){var result=formatString(format,varargs);var str=UTF8ArrayToString(result,0);_emscripten_log_js(flags,str)}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(a0,a1){return _longjmp(a0,a1)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function doRequestFullscreen(target,strategy){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;if(!target.requestFullscreen&&!target.webkitRequestFullscreen){return-3}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(strategy.deferUntilInEventHandler){JSEvents.deferCall(_JSEvents_requestFullscreen,1,[target,strategy]);return 1}else{return-2}}return _JSEvents_requestFullscreen(target,strategy)}function _emscripten_request_fullscreen(target,deferUntilInEventHandler){var strategy={scaleMode:0,canvasResolutionScaleMode:0,filteringMode:0,deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallbackTargetThread:2};return doRequestFullscreen(target,strategy)}function _emscripten_request_pointerlock(target,deferUntilInEventHandler){target=findEventTarget(target);if(!target)return-4;if(!target.requestPointerLock&&!target.msRequestPointerLock){return-1}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(deferUntilInEventHandler){JSEvents.deferCall(requestPointerLock,2,[target]);return 1}else{return-2}}return requestPointerLock(target)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_sample_gamepad_data(){return(JSEvents.lastGamepadState=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():null)?0:-1}function registerFocusEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=function(ev){var e=ev||event;var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_blur_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);return 0}function _emscripten_set_focus_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);return 0}function registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.fullscreenChangeEvent)JSEvents.fullscreenChangeEvent=_malloc(280);var fullscreenChangeEventhandlerFunc=function(ev){var e=ev||event;var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;fillFullscreenChangeEventData(fullscreenChangeEvent);if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:fullscreenChangeEventhandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_fullscreenchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread);registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return 0}function registerGamepadEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.gamepadEvent)JSEvents.gamepadEvent=_malloc(1432);var gamepadEventHandlerFunc=function(ev){var e=ev||event;var gamepadEvent=JSEvents.gamepadEvent;fillGamepadEventData(gamepadEvent,e["gamepad"]);if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_gamepadconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread);return 0}function _emscripten_set_gamepaddisconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread);return 0}function _emscripten_set_interval(cb,msecs,userData){return setInterval(function(){(function(a1){dynCall_vi.apply(null,[cb,a1])})(userData)},msecs)}function registerKeyEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(164);var keyEventHandlerFunc=function(e){var keyEventData=JSEvents.keyEvent;var idx=keyEventData>>2;HEAP32[idx+0]=e.location;HEAP32[idx+1]=e.ctrlKey;HEAP32[idx+2]=e.shiftKey;HEAP32[idx+3]=e.altKey;HEAP32[idx+4]=e.metaKey;HEAP32[idx+5]=e.repeat;HEAP32[idx+6]=e.charCode;HEAP32[idx+7]=e.keyCode;HEAP32[idx+8]=e.which;stringToUTF8(e.key||"",keyEventData+36,32);stringToUTF8(e.code||"",keyEventData+68,32);stringToUTF8(e.char||"",keyEventData+100,32);stringToUTF8(e.locale||"",keyEventData+132,32);if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_keydown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);return 0}function _emscripten_set_keypress_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread);return 0}function _emscripten_set_keyup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=function(){dynCall_v.call(null,func)};setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}function fillMouseEventData(eventStruct,e,target){var idx=eventStruct>>2;HEAP32[idx+0]=e.screenX;HEAP32[idx+1]=e.screenY;HEAP32[idx+2]=e.clientX;HEAP32[idx+3]=e.clientY;HEAP32[idx+4]=e.ctrlKey;HEAP32[idx+5]=e.shiftKey;HEAP32[idx+6]=e.altKey;HEAP32[idx+7]=e.metaKey;HEAP16[idx*2+16]=e.button;HEAP16[idx*2+17]=e.buttons;HEAP32[idx+9]=e["movementX"];HEAP32[idx+10]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+11]=e.clientX-rect.left;HEAP32[idx+12]=e.clientY-rect.top}function registerMouseEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(64);target=findEventTarget(target);var mouseEventHandlerFunc=function(ev){var e=ev||event;fillMouseEventData(JSEvents.mouseEvent,e,target);if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_mousedown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);return 0}function _emscripten_set_mousemove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);return 0}function _emscripten_set_mouseup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);return 0}function registerTouchEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1684);target=findEventTarget(target);var touchEventHandlerFunc=function(e){var t,touches={},et=e.touches;for(var i=0;i>2;HEAP32[idx+1]=e.ctrlKey;HEAP32[idx+2]=e.shiftKey;HEAP32[idx+3]=e.altKey;HEAP32[idx+4]=e.metaKey;idx+=5;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){var t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent>>2]=numTouches;if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_touchcancel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);return 0}function _emscripten_set_touchend_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);return 0}function _emscripten_set_touchmove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);return 0}function _emscripten_set_touchstart_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);return 0}function registerWheelEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(96);var wheelHandlerFunc=function(ev){var e=ev||event;var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+64>>3]=e["deltaX"];HEAPF64[wheelEvent+72>>3]=e["deltaY"];HEAPF64[wheelEvent+80>>3]=e["deltaZ"];HEAP32[wheelEvent+88>>2]=e["deltaMode"];if(function(a1,a2,a3){return dynCall_iiii.apply(null,[callbackfunc,a1,a2,a3])}(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_wheel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target=findEventTarget(target);if(typeof target.onwheel!=="undefined"){registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread);return 0}else{return-1}}function _emscripten_thread_sleep(msecs){var start=_emscripten_get_now();while(_emscripten_get_now()-start>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:function getTempVertexBuffer(sizeBytes){var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},calcBufLength:function calcBufLength(size,type,stride,count){if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:function preDrawHandleClientVertexAttribBindings(count){GL.resetBufferBinding=false;for(var i=0;i1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}context.maxVertexAttribs=context.GLctx.getParameter(34921);context.clientBuffers=[];for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}function _emscripten_webgl_get_current_context(){return _emscripten_webgl_do_get_current_context()}Module["_emscripten_webgl_get_current_context"]=_emscripten_webgl_get_current_context;function _emscripten_webgl_make_context_current(contextHandle){var success=GL.makeContextCurrent(contextHandle);return success?0:-5}Module["_emscripten_webgl_make_context_current"]=_emscripten_webgl_make_context_current;function _emscripten_webgl_destroy_context(contextHandle){if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}function _emscripten_webgl_enable_extension(contextHandle,extension){var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.substr(3);if(extString=="ANGLE_instanced_arrays")__webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")__webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")__webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_draw_instanced_base_vertex_base_instance")__webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw_instanced_base_vertex_base_instance")__webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw")__webgl_enable_WEBGL_multi_draw(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext}function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){try{var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _environ_sizes_get(penviron_count,penviron_buf_size){try{var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _flock(fd,operation){return 0}function _getTempRet0(){return getTempRet0()}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAP32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAP32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}function getHostByName(name){var ret=_malloc(20);var nameBuf=_malloc(name.length+1);stringToUTF8(name,nameBuf,name.length+1);HEAP32[ret>>2]=nameBuf;var aliasesBuf=_malloc(4);HEAP32[aliasesBuf>>2]=0;HEAP32[ret+4>>2]=aliasesBuf;var afinet=2;HEAP32[ret+8>>2]=afinet;HEAP32[ret+12>>2]=4;var addrListBuf=_malloc(12);HEAP32[addrListBuf>>2]=addrListBuf+8;HEAP32[addrListBuf+4>>2]=0;HEAP32[addrListBuf+8>>2]=inetPton4(DNS.lookup_name(name));HEAP32[ret+16>>2]=addrListBuf;return ret}function _gethostbyaddr(addr,addrlen,type){if(type!==2){setErrNo(5);return null}addr=HEAP32[addr>>2];var host=inetNtop4(addr);var lookup=DNS.lookup_addr(host);if(lookup){host=lookup}return getHostByName(host)}function _gethostbyname(name){return getHostByName(UTF8ToString(name))}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function _getpwuid(){throw"getpwuid: TODO"}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){program=GL.programs[program];shader=GL.shaders[shader];program[shader.shaderType]=shader;GLctx.attachShader(program,shader)}function _glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _glBindBuffer(target,buffer){if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindTransformFeedback(target,id){GLctx["bindTransformFeedback"](target,GL.transformFeedbacks[id])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0}function _glBlendEquation(x0){GLctx["blendEquation"](x0)}function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _glClear(x0){GLctx["clear"](x0)}function _glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearBufferuiv(buffer,drawbuffer,value){GLctx["clearBufferuiv"](buffer,drawbuffer,HEAPU32,value>>2)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx["clearDepth"](x0)}function _glClearStencil(x0){GLctx["clearStencil"](x0)}function _glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);GL.shaders[id].shaderType=shaderType&1?"vs":"fs";return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteTransformFeedbacks(n,ids){for(var i=0;i>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx["deleteTransformFeedback"](transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)}function _glDrawArrays(mode,first,count){GL.preDrawHandleClientVertexAttribBindings(first+count);GLctx.drawArrays(mode,first,count);GL.postDrawHandleClientVertexAttribBindings()}function _glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElements(mode,count,type,indices){var buf;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));indices=0}GL.preDrawHandleClientVertexAttribBindings(count);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)}function _glEndQuery(x0){GLctx["endQuery"](x0)}function _glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _glFinish(){GLctx["finish"]()}function _glFlush(){GLctx["flush"]()}function emscriptenWebGLGetBufferBinding(target){switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0}function emscriptenWebGLValidateMapBufferTarget(target){switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}}function _glFlushMappedBufferRange(target,offset,length){if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glFlushMappedBufferRange");return}var mapping=GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glFlushMappedBufferRange");return}if(!(mapping.access&16)){GL.recordError(1282);err("buffer was not mapped with GL_MAP_FLUSH_EXPLICIT_BIT in glFlushMappedBufferRange");return}if(offset<0||length<0||offset+length>mapping.length){GL.recordError(1281);err("invalid range in glFlushMappedBufferRange");return}GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem+offset,mapping.mem+offset+length))}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenTransformFeedbacks(n,ids){__glGenObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}function _glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _glGetActiveUniformBlockName(program,uniformBlockIndex,bufSize,length,uniformBlockName){program=GL.programs[program];var result=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}}function _glGetActiveUniformBlockiv(program,uniformBlockIndex,pname,params){if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);HEAP32[params>>2]=name.length+1;return}var result=GLctx["getActiveUniformBlockParameter"](program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i>2]=result[i]}}else{HEAP32[params>>2]=result}}function _glGetActiveUniformsiv(program,uniformCount,uniformIndices,pname,params){if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i>2])}var result=GLctx["getActiveUniforms"](program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function _glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function _glGetBufferSubData(target,offset,size,data){if(!data){GL.recordError(1281);return}GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGetIndexed(target,index,data,type){if(!data){GL.recordError(1281);return}var result=GLctx["getIndexedParameter"](target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:HEAP32[data>>2]=ret;break;case 2:HEAPF32[data>>2]=ret;break;case 4:HEAP8[data>>0]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}}function _glGetIntegeri_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,0)}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33390:ret=1048576;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetInternalformativ(target,internalformat,pname,bufSize,params){if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx["getInternalformatParameter"](target,internalformat,pname);if(ret===null)return;for(var i=0;i>2]=ret[i]}}function _glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _glGetQueryiv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getQuery"](target,pname)}function _glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _glGetUniformIndices(program,uniformCount,uniformNames,uniformIndices){if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i>2]));var result=GLctx["getUniformIndices"](program,names);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function _glGetUniformLocation(program,name){function getLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}name=UTF8ToString(name);if(program=GL.programs[program]){var uniformLocsById=program.uniformLocsById;var uniformSizeAndIdsByName=program.uniformSizeAndIdsByName;var i,j;var arrayIndex=0;var uniformBaseName=name;var leftBrace=getLeftBracePos(name);if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=uniformSizeAndIdsByName[arrayName]?uniformSizeAndIdsByName[arrayName][1]:program.uniformIdCounter;program.uniformIdCounter=Math.max(id+sz,program.uniformIdCounter);uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}function _glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}if(GL.currentContext.clientBuffers[index].enabled){err("glGetVertexAttrib*v on client-side array: not supported, bad data returned")}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}function _glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _glInvalidateFramebuffer(target,numAttachments,attachments){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateFramebuffer"](target,list)}function _glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={};[program["vs"],program["fs"]].forEach(function(s){Object.keys(s.explicitUniformLocations).forEach(function(shaderLocation){var loc=s.explicitUniformLocations[shaderLocation];program.uniformSizeAndIdsByName[shaderLocation]=[1,loc];program.uniformIdCounter=Math.max(program.uniformIdCounter,loc+1)})});function copyKeys(dst,src){Object.keys(src).forEach(function(key){dst[key]=src[key]})}program.explicitUniformBindings={};program.explicitSamplerBindings={};[program["vs"],program["fs"]].forEach(function(s){copyKeys(program.explicitUniformBindings,s.explicitUniformBindings);copyKeys(program.explicitSamplerBindings,s.explicitSamplerBindings)});program.explicitProgramBindingsApplied=0}function _glMapBufferRange(target,offset,length,access){if(access!=26&&access!=10){err("glMapBufferRange is only supported when access is MAP_WRITE|INVALIDATE_BUFFER");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length);if(!mem)return 0;GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)]={offset:offset,length:length,mem:mem,access:access};return mem}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _glProgramParameteri(program,pname,value){GL.recordError(1280)}function _glReadBuffer(x0){GLctx["readBuffer"](x0)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function find_closing_parens_index(arr,i,opening="(",closing=")"){for(var nesting=0;i32)}function nextWhitespace(str,i){while(!isWhitespace(str,i))++i;return i}function classifyChar(str,idx){var cc=str.charCodeAt(idx);if(cc>32){if(cc<48)return 1;if(cc<58)return 2;if(cc<65)return 1;if(cc<91||cc==95)return 3;if(cc<97)return 1;if(cc<123)return 3;return 1}return cc<33?0:4}function tokenize(exprString,keepWhitespace){var out=[],len=exprString.length;for(var i=0;i<=len;++i){var kind=classifyChar(exprString,i);if(kind==2||kind==3){for(var j=i+1;j<=len;++j){var kind2=classifyChar(exprString,j);if(kind2!=kind&&(kind2!=2||kind!=3)){out.push(exprString.substring(i,j));i=j-1;break}}}else if(kind==1){var op2=exprString.substr(i,2);if(["<=",">=","==","!=","&&","||"].includes(op2)){out.push(op2);++i}else{out.push(exprString[i])}}}return out}function expandMacros(str,lineStart,lineEnd){if(lineEnd===undefined)lineEnd=str.length;var len=str.length;var out="";for(var i=lineStart;i1||typeof tokens[0]!="function"){tokens=function(tokens){var i,j,p,operatorAndPriority=-2;for(j=0;j",">=","==","!=","&&","||","("].indexOf(tokens[j]))>operatorAndPriority){i=j;operatorAndPriority=p}}if(operatorAndPriority==13){var j=find_closing_parens_index(tokens,i);if(j){tokens.splice(i,j+1-i,buildExprTree(tokens.slice(i+1,j)));return tokens}}if(operatorAndPriority==4){i=tokens.lastIndexOf("!");var innerExpr=buildExprTree(tokens.slice(i+1,i+2));tokens.splice(i,2,function(){return!innerExpr()});return tokens}if(operatorAndPriority>=0){var left=buildExprTree(tokens.slice(0,i));var right=buildExprTree(tokens.slice(i+1));switch(tokens[i]){case"&&":return[function(){return left()&&right()}];case"||":return[function(){return left()||right()}];case"==":return[function(){return left()==right()}];case"!=":return[function(){return left()!=right()}];case"<":return[function(){return left()":return[function(){return left()>right()}];case">=":return[function(){return left()>=right()}];case"+":return[function(){return left()+right()}];case"-":return[function(){return left()-right()}];case"*":return[function(){return left()*right()}];case"/":return[function(){return Math.floor(left()/right())}]}}var num=jstoi_q(tokens[i]);return[function(){return num}]}(tokens)}return tokens[0]}for(;i0){var macroEnd=expression.indexOf(")",macroStart);let params=expression.substring(macroStart+1,macroEnd).split(",").map(x=>x.trim());let value=tokenize(expression.substring(macroEnd+1).trim());defs[expression.substring(0,macroStart)]=function(args){var ret="";value.forEach(x=>{var argIndex=params.indexOf(x);ret+=argIndex>=0?args[argIndex]:x});return ret}}else{let value=expandMacros(expression.substring(firstWs+1).trim(),0);defs[expression.substring(0,firstWs)]=function(){return value}}}break;case"undef":if(thisLineIsInActivePreprocessingBlock)delete defs[expression];break;default:if(directive!="version"&&directive!="pragma"&&directive!="extension"){}out+=expandMacros(code,lineStart,i)+"\n"}}return out}function remove_cpp_comments_in_shaders(code){var i=0,out="",ch,next,len=code.length;for(;i=0&&explicitUniformLocations[match[5]]<1048576)){console.error('Specified an out of range layout(location=x) directive "'+explicitUniformLocations[match[5]]+'"! ('+match[0]+")");GL.recordError(1281);return}}source=source.replace(regex,"$2");GL.shaders[shader].explicitUniformLocations=explicitUniformLocations;var bindingRegex=/layout\s*\(.*?binding\s*=\s*(-?\d+).*?\)\s*uniform\s+(\w+)\s+(\w+)?/g,samplerBindings={},uniformBindings={},bindingMatch;while(bindingMatch=bindingRegex.exec(source)){var arrayLength=1;for(var i=bindingMatch.index;i=0&&binding+arrayLength<=numBindingPoints)){console.error('Specified an out of range layout(binding=x) directive "'+binding+'"! ('+bindingMatch[0]+"). Valid range is [0, "+numBindingPoints+"-1]");GL.recordError(1281);return}}source=source.replace(/layout\s*\(.*?binding\s*=\s*([-\d]+).*?\)/g,"");source=source.replace(/(layout\s*\((.*?)),\s*binding\s*=\s*([-\d]+)\)/g,"$1)");source=source.replace(/layout\s*\(\s*binding\s*=\s*([-\d]+)\s*,(.*?)\)/g,"layout($2)");GL.shaders[shader].explicitSamplerBindings=samplerBindings;GL.shaders[shader].explicitUniformBindings=uniformBindings;GLctx.shaderSource(GL.shaders[shader],source)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _glStencilMask(x0){GLctx["stencilMask"](x0)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}var miniTempWebGLFloatBuffers=[];function _glUniform1fv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var __miniTempWebGLIntBuffers=[];function _glUniform1iv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _glUniform1uiv(location,count,value){GLctx.uniform1uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count)}function _glUniform2fv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _glUniform2iv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _glUniform2uiv(location,count,value){GLctx.uniform2uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*2)}function _glUniform3fv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _glUniform3iv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _glUniform3uiv(location,count,value){GLctx.uniform3uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*3)}function _glUniform4fv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _glUniform4iv(location,count,value){if(GL.currentContext.version>=2){GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _glUniform4uiv(location,count,value){GLctx.uniform4uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*4)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _glUnmapBuffer(target){if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}GL.mappedBuffers[buffer]=null;if(!(mapping.access&16))if(GL.currentContext.version>=2){GLctx.bufferSubData(target,mapping.offset,HEAPU8,mapping.mem,mapping.length)}else{GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);return 1}function webglApplyExplicitProgramBindings(){var p=GLctx.currentProgram;if(!p.explicitProgramBindingsApplied){if(GL.currentContext.version>=2){Object.keys(p.explicitUniformBindings).forEach(function(ubo){var bindings=p.explicitUniformBindings[ubo];for(var i=0;i1?"["+i+"]":""));GLctx.uniformBlockBinding(p,blockIndex,bindings[0]+i)}})}Object.keys(p.explicitSamplerBindings).forEach(function(sampler){var bindings=p.explicitSamplerBindings[sampler];for(var i=0;i>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _glVertexAttribIPointer(index,size,type,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _llvm_eh_typeid_for(type){return type}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();return date.getTime()/1e3|0}function _setTempRet0(val){setTempRet0(val)}function _sigaction(signum,act,oldact){return 0}function _sigemptyset(set){HEAP32[set>>2]=0;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function setFileTime(path,time){path=UTF8ToString(path);try{FS.utime(path,time,time);return 0}catch(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();setErrNo(e.errno);return-1}}function _utime(path,times){var time;if(times){time=HEAP32[times+4>>2]*1e3}else{time=Date.now()}return setFileTime(path,time)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"Re":_JS_Accelerometer_IsRunning,"Ib":_JS_Accelerometer_Start,"Hb":_JS_Accelerometer_Stop,"We":_JS_Cursor_SetImage,"hb":_JS_Cursor_SetShow,"Ra":_JS_DOM_MapViewportCoordinateToElementLocalCoordinate,"ve":_JS_DOM_UnityCanvasSelector,"ye":_JS_Eval_OpenURL,"oe":_JS_FileSystem_Initialize,"da":_JS_FileSystem_Sync,"Oe":_JS_GravitySensor_IsRunning,"Db":_JS_GravitySensor_Start,"Cb":_JS_GravitySensor_Stop,"Ne":_JS_Gyroscope_IsRunning,"Bb":_JS_Gyroscope_Start,"Ab":_JS_Gyroscope_Stop,"Pe":_JS_LinearAccelerationSensor_IsRunning,"Gb":_JS_LinearAccelerationSensor_Start,"Eb":_JS_LinearAccelerationSensor_Stop,"Lc":_JS_Log_Dump,"ze":_JS_Log_StackTrace,"Se":_JS_OrientationSensor_IsRunning,"Kb":_JS_OrientationSensor_Start,"Jb":_JS_OrientationSensor_Stop,"Lb":_JS_RequestDeviceSensorPermissionsOnTouch,"re":_JS_RunQuitCallbacks,"Me":_JS_ScreenOrientation_DeInit,"Ue":_JS_ScreenOrientation_Init,"ca":_JS_ScreenOrientation_Lock,"zf":_JS_Sound_Create_Channel,"va":_JS_Sound_GetLength,"uf":_JS_Sound_GetLoadState,"sf":_JS_Sound_Init,"yf":_JS_Sound_IsStopped,"Yb":_JS_Sound_Load,"tf":_JS_Sound_Load_PCM,"Ua":_JS_Sound_Play,"Va":_JS_Sound_ReleaseInstance,"Mb":_JS_Sound_ResumeIfNeeded,"vf":_JS_Sound_Set3D,"qf":_JS_Sound_SetListenerOrientation,"rf":_JS_Sound_SetListenerPosition,"_b":_JS_Sound_SetLoop,"Zb":_JS_Sound_SetLoopPoints,"ua":_JS_Sound_SetPaused,"ea":_JS_Sound_SetPitch,"xf":_JS_Sound_SetPosition,"wf":_JS_Sound_SetVolume,"wa":_JS_Sound_Stop,"ma":_JS_SystemInfo_GetCanvasClientSize,"Xb":_JS_SystemInfo_GetDocumentURL,"tb":_JS_SystemInfo_GetGPUInfo,"zb":_JS_SystemInfo_GetMatchWebGLToCanvasSize,"ub":_JS_SystemInfo_GetMemory,"vb":_JS_SystemInfo_GetOS,"xb":_JS_SystemInfo_GetPreferredDevicePixelRatio,"Be":_JS_SystemInfo_GetScreenSize,"Xe":_JS_SystemInfo_HasAstcHdr,"wb":_JS_SystemInfo_HasCursorLock,"Ke":_JS_SystemInfo_HasFullscreen,"sa":_JS_SystemInfo_HasWebGL,"we":_JS_SystemInfo_IsMobile,"ue":_JS_UnityEngineShouldQuit,"mf":_JS_WebRequest_Abort,"jf":_JS_WebRequest_Create,"kf":_JS_WebRequest_GetResponseMetaData,"lf":_JS_WebRequest_GetResponseMetaDataLengths,"Ta":_JS_WebRequest_Release,"ef":_JS_WebRequest_Send,"gf":_JS_WebRequest_SetRedirectLimit,"ff":_JS_WebRequest_SetRequestHeader,"hf":_JS_WebRequest_SetTimeout,"Mh":_SendAccountInfo,"Nh":_TransferLOOT,"Oh":_TransferSOL,"p":___cxa_allocate_exception,"h":___cxa_begin_catch,"o":___cxa_end_catch,"e":___cxa_find_matching_catch_2,"a":___cxa_find_matching_catch_3,"di":___cxa_find_matching_catch_4,"Ga":___cxa_free_exception,"Wc":___cxa_rethrow,"X":___cxa_throw,"cd":___gmtime_r,"dd":___localtime_r,"k":___resumeException,"nd":___sys__newselect,"xe":___sys_accept4,"yd":___sys_access,"Ye":___sys_bind,"Tc":___sys_chmod,"Te":___sys_connect,"Zc":___sys_dup2,"Q":___sys_fcntl64,"Mf":___sys_fstat64,"Qc":___sys_getcwd,"Nc":___sys_getdents64,"Jc":___sys_getegid32,"Kc":___sys_geteuid32,"$c":___sys_getpeername,"Ja":___sys_getpid,"id":___sys_getrusage,"Le":___sys_getsockname,"Ve":___sys_getsockopt,"Df":___sys_getuid32,"sb":___sys_ioctl,"Ee":___sys_listen,"Uc":___sys_lstat64,"Pc":___sys_mkdir,"ld":___sys_mmap2,"gd":___sys_munmap,"Za":___sys_open,"Vc":___sys_pipe,"Qe":___sys_poll,"ci":___sys_readlink,"Ud":___sys_recvfrom,"Xc":___sys_recvmsg,"Rc":___sys_rename,"Oc":___sys_rmdir,"Yc":___sys_sendmsg,"de":___sys_sendto,"Jd":___sys_setsockopt,"_c":___sys_shutdown,"nb":___sys_socket,"cc":___sys_stat64,"Af":___sys_statfs64,"Bf":___sys_truncate64,"ed":___sys_uname,"Sc":___sys_unlink,"x":_abort,"N":_clock,"hd":_clock_getres,"rb":_clock_gettime,"bd":_difftime,"df":_dlclose,"ta":_dlerror,"$b":_dlopen,"nf":_dlsym,"Sa":_emscripten_asm_const_int_sync_on_main_thread,"se":_emscripten_cancel_main_loop,"qe":_emscripten_clear_interval,"Ie":_emscripten_exit_fullscreen,"Ce":_emscripten_exit_pointerlock,"Ae":_emscripten_get_canvas_element_size,"He":_emscripten_get_fullscreen_status,"Oa":_emscripten_get_gamepad_status,"fd":_emscripten_get_heap_max,"M":_emscripten_get_now,"Pa":_emscripten_get_num_gamepads,"te":_emscripten_html5_remove_all_event_listeners,"$e":_emscripten_is_webgl_context_lost,"C":_emscripten_log,"I":_emscripten_longjmp,"ei":_emscripten_memcpy_big,"Je":_emscripten_request_fullscreen,"De":_emscripten_request_pointerlock,"fi":_emscripten_resize_heap,"Qa":_emscripten_sample_gamepad_data,"yb":_emscripten_set_blur_callback_on_thread,"Na":_emscripten_set_canvas_element_size,"Fe":_emscripten_set_focus_callback_on_thread,"Ge":_emscripten_set_fullscreenchange_callback_on_thread,"Ob":_emscripten_set_gamepadconnected_callback_on_thread,"Nb":_emscripten_set_gamepaddisconnected_callback_on_thread,"ne":_emscripten_set_interval,"pa":_emscripten_set_keydown_callback_on_thread,"na":_emscripten_set_keypress_callback_on_thread,"oa":_emscripten_set_keyup_callback_on_thread,"me":_emscripten_set_main_loop,"pe":_emscripten_set_main_loop_timing,"Vb":_emscripten_set_mousedown_callback_on_thread,"Ub":_emscripten_set_mousemove_callback_on_thread,"Wb":_emscripten_set_mouseup_callback_on_thread,"Pb":_emscripten_set_touchcancel_callback_on_thread,"Rb":_emscripten_set_touchend_callback_on_thread,"Qb":_emscripten_set_touchmove_callback_on_thread,"Sb":_emscripten_set_touchstart_callback_on_thread,"Tb":_emscripten_set_wheel_callback_on_thread,"Mc":_emscripten_thread_sleep,"bf":_emscripten_webgl_create_context,"af":_emscripten_webgl_destroy_context,"qa":_emscripten_webgl_enable_extension,"_e":_emscripten_webgl_get_current_context,"cf":_emscripten_webgl_init_context_attributes,"ra":_emscripten_webgl_make_context_current,"jd":_environ_get,"kd":_environ_sizes_get,"A":_exit,"Z":_fd_close,"Fb":_fd_fdstat_get,"qb":_fd_read,"le":_fd_seek,"_a":_fd_write,"xa":_flock,"b":_getTempRet0,"ad":_getaddrinfo,"of":_gethostbyaddr,"pf":_gethostbyname,"ob":_getnameinfo,"Cf":_getpwuid,"la":_gettimeofday,"Ch":_glActiveTexture,"zh":_glAttachShader,"gc":_glBeginQuery,"pg":_glBeginTransformFeedback,"Ea":_glBindAttribLocation,"yh":_glBindBuffer,"Rf":_glBindBufferBase,"Qf":_glBindBufferRange,"vh":_glBindFramebuffer,"wh":_glBindRenderbuffer,"Kf":_glBindSampler,"xh":_glBindTexture,"ig":_glBindTransformFeedback,"lg":_glBindVertexArray,"yc":_glBlendEquation,"zc":_glBlendEquationSeparate,"Ac":_glBlendFuncSeparate,"ag":_glBlitFramebuffer,"th":_glBufferData,"uh":_glBufferSubData,"sh":_glCheckFramebufferStatus,"oh":_glClear,"Gf":_glClearBufferfi,"Ff":_glClearBufferfv,"Ef":_glClearBufferuiv,"ph":_glClearColor,"qh":_glClearDepthf,"rh":_glClearStencil,"md":_glClientWaitSync,"gb":_glColorMask,"nh":_glCompileShader,"lh":_glCompressedTexImage2D,"cg":_glCompressedTexImage3D,"mh":_glCompressedTexSubImage2D,"gg":_glCompressedTexSubImage3D,"Uf":_glCopyBufferSubData,"kh":_glCopyTexImage2D,"xc":_glCopyTexSubImage2D,"jh":_glCreateProgram,"ih":_glCreateShader,"hh":_glCullFace,"gh":_glDeleteBuffers,"fh":_glDeleteFramebuffers,"eh":_glDeleteProgram,"ab":_glDeleteQueries,"dh":_glDeleteRenderbuffers,"Jf":_glDeleteSamplers,"ch":_glDeleteShader,"bc":_glDeleteSync,"bh":_glDeleteTextures,"jg":_glDeleteTransformFeedbacks,"ng":_glDeleteVertexArrays,"Da":_glDepthFunc,"Ca":_glDepthMask,"ah":_glDetachShader,"$g":_glDisable,"_g":_glDisableVertexAttribArray,"Xg":_glDrawArrays,"Wf":_glDrawArraysInstanced,"Tf":_glDrawBuffers,"Yg":_glDrawElements,"Vf":_glDrawElementsInstanced,"Zg":_glEnable,"Wg":_glEnableVertexAttribArray,"hc":_glEndQuery,"qg":_glEndTransformFeedback,"ac":_glFenceSync,"Tg":_glFinish,"Ug":_glFlush,"Zf":_glFlushMappedBufferRange,"S":_glFramebufferRenderbuffer,"P":_glFramebufferTexture2D,"ya":_glFramebufferTextureLayer,"Ba":_glFrontFace,"Sg":_glGenBuffers,"Og":_glGenFramebuffers,"fc":_glGenQueries,"Pg":_glGenRenderbuffers,"If":_glGenSamplers,"Rg":_glGenTextures,"kg":_glGenTransformFeedbacks,"og":_glGenVertexArrays,"Qg":_glGenerateMipmap,"Ih":_glGetActiveAttrib,"fb":_glGetActiveUniform,"Xa":_glGetActiveUniformBlockName,"$":_glGetActiveUniformBlockiv,"_":_glGetActiveUniformsiv,"Hh":_glGetAttribLocation,"Ze":_glGetBufferSubData,"Ng":_glGetError,"Mg":_glGetFramebufferAttachmentParameteriv,"Bh":_glGetIntegeri_v,"Fa":_glGetIntegerv,"Nf":_glGetInternalformativ,"dc":_glGetProgramBinary,"Eh":_glGetProgramInfoLog,"U":_glGetProgramiv,"sg":_glGetQueryObjectuiv,"rg":_glGetQueryiv,"Vg":_glGetRenderbufferParameteriv,"Kg":_glGetShaderInfoLog,"wc":_glGetShaderPrecisionFormat,"Lg":_glGetShaderSource,"Dh":_glGetShaderiv,"Jg":_glGetString,"_f":_glGetStringi,"Ig":_glGetTexParameteriv,"Of":_glGetUniformBlockIndex,"Wa":_glGetUniformIndices,"fa":_glGetUniformLocation,"vc":_glGetUniformiv,"Gh":_glGetVertexAttribiv,"$a":_glInvalidateFramebuffer,"Ah":_glIsEnabled,"mg":_glIsVertexArray,"Gg":_glLinkProgram,"Xf":_glMapBufferRange,"Hg":_glPixelStorei,"uc":_glPolygonOffset,"ec":_glProgramBinary,"Hf":_glProgramParameteri,"Sf":_glReadBuffer,"ba":_glReadPixels,"Fg":_glRenderbufferStorage,"$f":_glRenderbufferStorageMultisample,"Lf":_glSamplerParameteri,"eb":_glScissor,"Dg":_glShaderSource,"Eg":_glStencilFuncSeparate,"Bg":_glStencilMask,"Cg":_glStencilOpSeparate,"zg":_glTexImage2D,"eg":_glTexImage3D,"Ag":_glTexParameterf,"db":_glTexParameteri,"yg":_glTexParameteriv,"bg":_glTexStorage2D,"dg":_glTexStorage3D,"xg":_glTexSubImage2D,"fg":_glTexSubImage3D,"hg":_glTransformFeedbackVaryings,"ic":_glUniform1fv,"za":_glUniform1i,"jc":_glUniform1iv,"kc":_glUniform1uiv,"mc":_glUniform2fv,"nc":_glUniform2iv,"oc":_glUniform2uiv,"cb":_glUniform3fv,"pc":_glUniform3iv,"qc":_glUniform3uiv,"aa":_glUniform4fv,"rc":_glUniform4iv,"sc":_glUniform4uiv,"Ya":_glUniformBlockBinding,"tc":_glUniformMatrix3fv,"Aa":_glUniformMatrix4fv,"Yf":_glUnmapBuffer,"tg":_glUseProgram,"Fh":_glValidateProgram,"ug":_glVertexAttrib4f,"vg":_glVertexAttrib4fv,"Pf":_glVertexAttribIPointer,"wg":_glVertexAttribPointer,"bb":_glViewport,"ja":invoke_dddi,"K":invoke_dii,"O":invoke_diii,"lb":invoke_diiii,"Ed":invoke_dji,"W":invoke_fffi,"kb":invoke_ffi,"Y":invoke_fi,"V":invoke_fifi,"D":invoke_fii,"E":invoke_fiii,"ha":invoke_fiiii,"Ph":invoke_fiiiii,"v":invoke_i,"Ec":invoke_idi,"Fc":invoke_ifi,"d":invoke_ii,"Uh":invoke_iidi,"Th":invoke_iifi,"Xh":invoke_iifii,"c":invoke_iii,"Dc":invoke_iiifi,"i":invoke_iiii,"Kh":invoke_iiiidii,"Jh":invoke_iiiifii,"r":invoke_iiiii,"Zh":invoke_iiiiifiiiii,"s":invoke_iiiiii,"u":invoke_iiiiiii,"B":invoke_iiiiiiii,"$h":invoke_iiiiiiiifiii,"H":invoke_iiiiiiiii,"R":invoke_iiiiiiiiii,"Bc":invoke_iiiiiiiiiii,"Vh":invoke_iiiiiiiiiiiii,"Ad":invoke_iiiiiiiiiji,"Gd":invoke_iiiiij,"od":invoke_iiiijii,"Qd":invoke_iiiijjii,"je":invoke_iiij,"Cd":invoke_iiiji,"ge":invoke_iiijiii,"he":invoke_iij,"Yd":invoke_iiji,"Rd":invoke_iijii,"Od":invoke_iijiii,"Md":invoke_iijiiiiii,"vd":invoke_iijji,"Nd":invoke_iijjiiiiii,"Td":invoke_iji,"Xd":invoke_ijji,"ie":invoke_j,"Id":invoke_jdi,"fe":invoke_ji,"ee":invoke_jii,"_d":invoke_jiii,"ke":invoke_jiiii,"pd":invoke_jiiiii,"Fd":invoke_jiiiiiiiiii,"Ld":invoke_jiiji,"wd":invoke_jiji,"$d":invoke_jijiii,"Bd":invoke_jijj,"Wd":invoke_jji,"Dd":invoke_jjii,"Vd":invoke_jjji,"g":invoke_v,"Wh":invoke_vfi,"l":invoke_vi,"y":invoke_vidi,"bi":invoke_viffffi,"ai":invoke_viffi,"G":invoke_vifi,"n":invoke_vii,"ib":invoke_viidi,"lc":invoke_viif,"T":invoke_viiff,"Cc":invoke_viifffffi,"Hc":invoke_viifffi,"Qh":invoke_viiffi,"J":invoke_viifi,"Yh":invoke_viifiiiii,"f":invoke_viii,"Sh":invoke_viiif,"Ia":invoke_viiifi,"m":invoke_viiii,"Lh":invoke_viiiifi,"q":invoke_viiiii,"ga":invoke_viiiiifffiii,"_h":invoke_viiiiiffi,"Ic":invoke_viiiiifi,"t":invoke_viiiiii,"z":invoke_viiiiiii,"F":invoke_viiiiiiii,"L":invoke_viiiiiiiii,"Gc":invoke_viiiiiiiiifi,"Ha":invoke_viiiiiiiiii,"ia":invoke_viiiiiiiiiii,"jb":invoke_viiiiiiiiiiii,"Rh":invoke_viiiiiiiiiiiii,"xd":invoke_viiij,"Sd":invoke_viiiji,"ud":invoke_viij,"ae":invoke_viiji,"Pd":invoke_viijii,"qd":invoke_viijiiiiii,"Kd":invoke_viijiiijiiii,"Zd":invoke_viji,"ce":invoke_vijii,"td":invoke_vijiii,"be":invoke_vijiiii,"Hd":invoke_vijjji,"zd":invoke_vji,"rd":invoke_vjiiiii,"sd":invoke_vjjjiiii,"j":_llvm_eh_typeid_for,"pb":_mktime,"w":_setTempRet0,"La":_sigaction,"Ma":_sigemptyset,"Ka":_strftime,"ka":_time,"mb":_utime};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["hi"]).apply(null,arguments)};var _SendMessageFloat=Module["_SendMessageFloat"]=function(){return(_SendMessageFloat=Module["_SendMessageFloat"]=Module["asm"]["ii"]).apply(null,arguments)};var _SendMessageString=Module["_SendMessageString"]=function(){return(_SendMessageString=Module["_SendMessageString"]=Module["asm"]["ji"]).apply(null,arguments)};var _SendMessage=Module["_SendMessage"]=function(){return(_SendMessage=Module["_SendMessage"]=Module["asm"]["ki"]).apply(null,arguments)};var _SetFullscreen=Module["_SetFullscreen"]=function(){return(_SetFullscreen=Module["_SetFullscreen"]=Module["asm"]["li"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["mi"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["ni"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["oi"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["pi"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["qi"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["ri"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["si"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["ti"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["ui"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["vi"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["wi"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["xi"]).apply(null,arguments)};var ___cxa_can_catch=Module["___cxa_can_catch"]=function(){return(___cxa_can_catch=Module["___cxa_can_catch"]=Module["asm"]["yi"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["zi"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["Ai"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["Bi"]).apply(null,arguments)};var _memalign=Module["_memalign"]=function(){return(_memalign=Module["_memalign"]=Module["asm"]["Ci"]).apply(null,arguments)};var _memset=Module["_memset"]=function(){return(_memset=Module["_memset"]=Module["asm"]["Di"]).apply(null,arguments)};var _strlen=Module["_strlen"]=function(){return(_strlen=Module["_strlen"]=Module["asm"]["Ei"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["Gi"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["Hi"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["Ii"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["Ji"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["Ki"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["Li"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["Mi"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["Ni"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["Oi"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["Pi"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["Qi"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["Ri"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["Si"]).apply(null,arguments)};var dynCall_iiij=Module["dynCall_iiij"]=function(){return(dynCall_iiij=Module["dynCall_iiij"]=Module["asm"]["Ti"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["Ui"]).apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return(dynCall_i=Module["dynCall_i"]=Module["asm"]["Vi"]).apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return(dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=Module["asm"]["Wi"]).apply(null,arguments)};var dynCall_iiijiii=Module["dynCall_iiijiii"]=function(){return(dynCall_iiijiii=Module["dynCall_iiijiii"]=Module["asm"]["Xi"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["Yi"]).apply(null,arguments)};var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=function(){return(dynCall_iiiiiii=Module["dynCall_iiiiiii"]=Module["asm"]["Zi"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["_i"]).apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return(dynCall_viiiiiii=Module["dynCall_viiiiiii"]=Module["asm"]["$i"]).apply(null,arguments)};var dynCall_vijii=Module["dynCall_vijii"]=function(){return(dynCall_vijii=Module["dynCall_vijii"]=Module["asm"]["aj"]).apply(null,arguments)};var dynCall_viiji=Module["dynCall_viiji"]=function(){return(dynCall_viiji=Module["dynCall_viiji"]=Module["asm"]["bj"]).apply(null,arguments)};var dynCall_viiff=Module["dynCall_viiff"]=function(){return(dynCall_viiff=Module["dynCall_viiff"]=Module["asm"]["cj"]).apply(null,arguments)};var dynCall_jiiii=Module["dynCall_jiiii"]=function(){return(dynCall_jiiii=Module["dynCall_jiiii"]=Module["asm"]["dj"]).apply(null,arguments)};var dynCall_diiii=Module["dynCall_diiii"]=function(){return(dynCall_diiii=Module["dynCall_diiii"]=Module["asm"]["ej"]).apply(null,arguments)};var dynCall_fii=Module["dynCall_fii"]=function(){return(dynCall_fii=Module["dynCall_fii"]=Module["asm"]["fj"]).apply(null,arguments)};var dynCall_viifi=Module["dynCall_viifi"]=function(){return(dynCall_viifi=Module["dynCall_viifi"]=Module["asm"]["gj"]).apply(null,arguments)};var dynCall_jiii=Module["dynCall_jiii"]=function(){return(dynCall_jiii=Module["dynCall_jiii"]=Module["asm"]["hj"]).apply(null,arguments)};var dynCall_fiii=Module["dynCall_fiii"]=function(){return(dynCall_fiii=Module["dynCall_fiii"]=Module["asm"]["ij"]).apply(null,arguments)};var dynCall_viffi=Module["dynCall_viffi"]=function(){return(dynCall_viffi=Module["dynCall_viffi"]=Module["asm"]["jj"]).apply(null,arguments)};var dynCall_viiifi=Module["dynCall_viiifi"]=function(){return(dynCall_viiifi=Module["dynCall_viiifi"]=Module["asm"]["kj"]).apply(null,arguments)};var dynCall_ffi=Module["dynCall_ffi"]=function(){return(dynCall_ffi=Module["dynCall_ffi"]=Module["asm"]["lj"]).apply(null,arguments)};var dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=Module["asm"]["mj"]).apply(null,arguments)};var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=function(){return(dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=Module["asm"]["nj"]).apply(null,arguments)};var dynCall_iiiiiiiifiii=Module["dynCall_iiiiiiiifiii"]=function(){return(dynCall_iiiiiiiifiii=Module["dynCall_iiiiiiiifiii"]=Module["asm"]["oj"]).apply(null,arguments)};var dynCall_viiiiifi=Module["dynCall_viiiiifi"]=function(){return(dynCall_viiiiifi=Module["dynCall_viiiiifi"]=Module["asm"]["pj"]).apply(null,arguments)};var dynCall_viiiiiffi=Module["dynCall_viiiiiffi"]=function(){return(dynCall_viiiiiffi=Module["dynCall_viiiiiffi"]=Module["asm"]["qj"]).apply(null,arguments)};var dynCall_viffffi=Module["dynCall_viffffi"]=function(){return(dynCall_viffffi=Module["dynCall_viffffi"]=Module["asm"]["rj"]).apply(null,arguments)};var dynCall_dddi=Module["dynCall_dddi"]=function(){return(dynCall_dddi=Module["dynCall_dddi"]=Module["asm"]["sj"]).apply(null,arguments)};var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=function(){return(dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=Module["asm"]["tj"]).apply(null,arguments)};var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=function(){return(dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=Module["asm"]["uj"]).apply(null,arguments)};var dynCall_iiiiifiiiii=Module["dynCall_iiiiifiiiii"]=function(){return(dynCall_iiiiifiiiii=Module["dynCall_iiiiifiiiii"]=Module["asm"]["vj"]).apply(null,arguments)};var dynCall_fiiii=Module["dynCall_fiiii"]=function(){return(dynCall_fiiii=Module["dynCall_fiiii"]=Module["asm"]["wj"]).apply(null,arguments)};var dynCall_fi=Module["dynCall_fi"]=function(){return(dynCall_fi=Module["dynCall_fi"]=Module["asm"]["xj"]).apply(null,arguments)};var dynCall_viifiiiii=Module["dynCall_viifiiiii"]=function(){return(dynCall_viifiiiii=Module["dynCall_viifiiiii"]=Module["asm"]["yj"]).apply(null,arguments)};var dynCall_iifii=Module["dynCall_iifii"]=function(){return(dynCall_iifii=Module["dynCall_iifii"]=Module["asm"]["zj"]).apply(null,arguments)};var dynCall_vfi=Module["dynCall_vfi"]=function(){return(dynCall_vfi=Module["dynCall_vfi"]=Module["asm"]["Aj"]).apply(null,arguments)};var dynCall_viji=Module["dynCall_viji"]=function(){return(dynCall_viji=Module["dynCall_viji"]=Module["asm"]["Bj"]).apply(null,arguments)};var dynCall_iiji=Module["dynCall_iiji"]=function(){return(dynCall_iiji=Module["dynCall_iiji"]=Module["asm"]["Cj"]).apply(null,arguments)};var dynCall_viiiiiiiiiiii=Module["dynCall_viiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiii=Module["dynCall_viiiiiiiiiiii"]=Module["asm"]["Dj"]).apply(null,arguments)};var dynCall_viifii=Module["dynCall_viifii"]=function(){return(dynCall_viifii=Module["dynCall_viifii"]=Module["asm"]["Ej"]).apply(null,arguments)};var dynCall_fffi=Module["dynCall_fffi"]=function(){return(dynCall_fffi=Module["dynCall_fffi"]=Module["asm"]["Fj"]).apply(null,arguments)};var dynCall_viifffi=Module["dynCall_viifffi"]=function(){return(dynCall_viifffi=Module["dynCall_viifffi"]=Module["asm"]["Gj"]).apply(null,arguments)};var dynCall_viiiiiiiiifi=Module["dynCall_viiiiiiiiifi"]=function(){return(dynCall_viiiiiiiiifi=Module["dynCall_viiiiiiiiifi"]=Module["asm"]["Hj"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiii"]=Module["asm"]["Ij"]).apply(null,arguments)};var dynCall_vifi=Module["dynCall_vifi"]=function(){return(dynCall_vifi=Module["dynCall_vifi"]=Module["asm"]["Jj"]).apply(null,arguments)};var dynCall_viif=Module["dynCall_viif"]=function(){return(dynCall_viif=Module["dynCall_viif"]=Module["asm"]["Kj"]).apply(null,arguments)};var dynCall_vidi=Module["dynCall_vidi"]=function(){return(dynCall_vidi=Module["dynCall_vidi"]=Module["asm"]["Lj"]).apply(null,arguments)};var dynCall_dii=Module["dynCall_dii"]=function(){return(dynCall_dii=Module["dynCall_dii"]=Module["asm"]["Mj"]).apply(null,arguments)};var dynCall_ijji=Module["dynCall_ijji"]=function(){return(dynCall_ijji=Module["dynCall_ijji"]=Module["asm"]["Nj"]).apply(null,arguments)};var dynCall_jji=Module["dynCall_jji"]=function(){return(dynCall_jji=Module["dynCall_jji"]=Module["asm"]["Oj"]).apply(null,arguments)};var dynCall_jjji=Module["dynCall_jjji"]=function(){return(dynCall_jjji=Module["dynCall_jjji"]=Module["asm"]["Pj"]).apply(null,arguments)};var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=function(){return(dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=Module["asm"]["Qj"]).apply(null,arguments)};var dynCall_ifi=Module["dynCall_ifi"]=function(){return(dynCall_ifi=Module["dynCall_ifi"]=Module["asm"]["Rj"]).apply(null,arguments)};var dynCall_idi=Module["dynCall_idi"]=function(){return(dynCall_idi=Module["dynCall_idi"]=Module["asm"]["Sj"]).apply(null,arguments)};var dynCall_diii=Module["dynCall_diii"]=function(){return(dynCall_diii=Module["dynCall_diii"]=Module["asm"]["Tj"]).apply(null,arguments)};var dynCall_iidi=Module["dynCall_iidi"]=function(){return(dynCall_iidi=Module["dynCall_iidi"]=Module["asm"]["Uj"]).apply(null,arguments)};var dynCall_iifi=Module["dynCall_iifi"]=function(){return(dynCall_iifi=Module["dynCall_iifi"]=Module["asm"]["Vj"]).apply(null,arguments)};var dynCall_iji=Module["dynCall_iji"]=function(){return(dynCall_iji=Module["dynCall_iji"]=Module["asm"]["Wj"]).apply(null,arguments)};var dynCall_vijiiii=Module["dynCall_vijiiii"]=function(){return(dynCall_vijiiii=Module["dynCall_vijiiii"]=Module["asm"]["Xj"]).apply(null,arguments)};var dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=function(){return(dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=Module["asm"]["Yj"]).apply(null,arguments)};var dynCall_viiif=Module["dynCall_viiif"]=function(){return(dynCall_viiif=Module["dynCall_viiif"]=Module["asm"]["Zj"]).apply(null,arguments)};var dynCall_iijji=Module["dynCall_iijji"]=function(){return(dynCall_iijji=Module["dynCall_iijji"]=Module["asm"]["_j"]).apply(null,arguments)};var dynCall_iiddi=Module["dynCall_iiddi"]=function(){return(dynCall_iiddi=Module["dynCall_iiddi"]=Module["asm"]["$j"]).apply(null,arguments)};var dynCall_iiffi=Module["dynCall_iiffi"]=function(){return(dynCall_iiffi=Module["dynCall_iiffi"]=Module["asm"]["ak"]).apply(null,arguments)};var dynCall_iiiiji=Module["dynCall_iiiiji"]=function(){return(dynCall_iiiiji=Module["dynCall_iiiiji"]=Module["asm"]["bk"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiii"]=Module["asm"]["ck"]).apply(null,arguments)};var dynCall_jijiii=Module["dynCall_jijiii"]=function(){return(dynCall_jijiii=Module["dynCall_jijiii"]=Module["asm"]["dk"]).apply(null,arguments)};var dynCall_jiiji=Module["dynCall_jiiji"]=function(){return(dynCall_jiiji=Module["dynCall_jiiji"]=Module["asm"]["ek"]).apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return(dynCall_ji=Module["dynCall_ji"]=Module["asm"]["fk"]).apply(null,arguments)};var dynCall_viijiiijiiii=Module["dynCall_viijiiijiiii"]=function(){return(dynCall_viijiiijiiii=Module["dynCall_viijiiijiiii"]=Module["asm"]["gk"]).apply(null,arguments)};var dynCall_iiijii=Module["dynCall_iiijii"]=function(){return(dynCall_iiijii=Module["dynCall_iiijii"]=Module["asm"]["hk"]).apply(null,arguments)};var dynCall_iijiiii=Module["dynCall_iijiiii"]=function(){return(dynCall_iijiiii=Module["dynCall_iijiiii"]=Module["asm"]["ik"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["jk"]).apply(null,arguments)};var dynCall_iijiiiiii=Module["dynCall_iijiiiiii"]=function(){return(dynCall_iijiiiiii=Module["dynCall_iijiiiiii"]=Module["asm"]["kk"]).apply(null,arguments)};var dynCall_iijjiiiiii=Module["dynCall_iijjiiiiii"]=function(){return(dynCall_iijjiiiiii=Module["dynCall_iijjiiiiii"]=Module["asm"]["lk"]).apply(null,arguments)};var dynCall_iiiijjii=Module["dynCall_iiiijjii"]=function(){return(dynCall_iiiijjii=Module["dynCall_iiiijjii"]=Module["asm"]["mk"]).apply(null,arguments)};var dynCall_iijii=Module["dynCall_iijii"]=function(){return(dynCall_iijii=Module["dynCall_iijii"]=Module["asm"]["nk"]).apply(null,arguments)};var dynCall_iijiii=Module["dynCall_iijiii"]=function(){return(dynCall_iijiii=Module["dynCall_iijiii"]=Module["asm"]["ok"]).apply(null,arguments)};var dynCall_jdi=Module["dynCall_jdi"]=function(){return(dynCall_jdi=Module["dynCall_jdi"]=Module["asm"]["pk"]).apply(null,arguments)};var dynCall_vijjji=Module["dynCall_vijjji"]=function(){return(dynCall_vijjji=Module["dynCall_vijjji"]=Module["asm"]["qk"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["rk"]).apply(null,arguments)};var dynCall_iiiifi=Module["dynCall_iiiifi"]=function(){return(dynCall_iiiifi=Module["dynCall_iiiifi"]=Module["asm"]["sk"]).apply(null,arguments)};var dynCall_iiifi=Module["dynCall_iiifi"]=function(){return(dynCall_iiifi=Module["dynCall_iiifi"]=Module["asm"]["tk"]).apply(null,arguments)};var dynCall_jiiiiiiiiii=Module["dynCall_jiiiiiiiiii"]=function(){return(dynCall_jiiiiiiiiii=Module["dynCall_jiiiiiiiiii"]=Module["asm"]["uk"]).apply(null,arguments)};var dynCall_dji=Module["dynCall_dji"]=function(){return(dynCall_dji=Module["dynCall_dji"]=Module["asm"]["vk"]).apply(null,arguments)};var dynCall_jjii=Module["dynCall_jjii"]=function(){return(dynCall_jjii=Module["dynCall_jjii"]=Module["asm"]["wk"]).apply(null,arguments)};var dynCall_iiiji=Module["dynCall_iiiji"]=function(){return(dynCall_iiiji=Module["dynCall_iiiji"]=Module["asm"]["xk"]).apply(null,arguments)};var dynCall_viiffi=Module["dynCall_viiffi"]=function(){return(dynCall_viiffi=Module["dynCall_viiffi"]=Module["asm"]["yk"]).apply(null,arguments)};var dynCall_iiiifii=Module["dynCall_iiiifii"]=function(){return(dynCall_iiiifii=Module["dynCall_iiiifii"]=Module["asm"]["zk"]).apply(null,arguments)};var dynCall_iiifii=Module["dynCall_iiifii"]=function(){return(dynCall_iiifii=Module["dynCall_iiifii"]=Module["asm"]["Ak"]).apply(null,arguments)};var dynCall_viiiifii=Module["dynCall_viiiifii"]=function(){return(dynCall_viiiifii=Module["dynCall_viiiifii"]=Module["asm"]["Bk"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiii"]=Module["asm"]["Ck"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiii"]=Module["asm"]["Dk"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiii"]=Module["asm"]["Ek"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiii"]=Module["asm"]["Fk"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiiii"]=Module["asm"]["Gk"]).apply(null,arguments)};var dynCall_j=Module["dynCall_j"]=function(){return(dynCall_j=Module["dynCall_j"]=Module["asm"]["Hk"]).apply(null,arguments)};var dynCall_jijj=Module["dynCall_jijj"]=function(){return(dynCall_jijj=Module["dynCall_jijj"]=Module["asm"]["Ik"]).apply(null,arguments)};var dynCall_iiiiiiiiiji=Module["dynCall_iiiiiiiiiji"]=function(){return(dynCall_iiiiiiiiiji=Module["dynCall_iiiiiiiiiji"]=Module["asm"]["Jk"]).apply(null,arguments)};var dynCall_vji=Module["dynCall_vji"]=function(){return(dynCall_vji=Module["dynCall_vji"]=Module["asm"]["Kk"]).apply(null,arguments)};var dynCall_viiiji=Module["dynCall_viiiji"]=function(){return(dynCall_viiiji=Module["dynCall_viiiji"]=Module["asm"]["Lk"]).apply(null,arguments)};var dynCall_viifffffi=Module["dynCall_viifffffi"]=function(){return(dynCall_viifffffi=Module["dynCall_viifffffi"]=Module["asm"]["Mk"]).apply(null,arguments)};var dynCall_fifi=Module["dynCall_fifi"]=function(){return(dynCall_fifi=Module["dynCall_fifi"]=Module["asm"]["Nk"]).apply(null,arguments)};var dynCall_viiiiifffiii=Module["dynCall_viiiiifffiii"]=function(){return(dynCall_viiiiifffiii=Module["dynCall_viiiiifffiii"]=Module["asm"]["Ok"]).apply(null,arguments)};var dynCall_fiiiii=Module["dynCall_fiiiii"]=function(){return(dynCall_fiiiii=Module["dynCall_fiiiii"]=Module["asm"]["Pk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiii=Module["dynCall_iiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiii=Module["dynCall_iiiiiiiiiiii"]=Module["asm"]["Qk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiii"]=Module["asm"]["Rk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiii"]=Module["asm"]["Sk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiii"]=Module["asm"]["Tk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=Module["asm"]["Uk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiii"]=Module["asm"]["Vk"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiii"]=Module["asm"]["Wk"]).apply(null,arguments)};var dynCall_fiifi=Module["dynCall_fiifi"]=function(){return(dynCall_fiifi=Module["dynCall_fiifi"]=Module["asm"]["Xk"]).apply(null,arguments)};var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=Module["asm"]["Yk"]).apply(null,arguments)};var dynCall_fiiffi=Module["dynCall_fiiffi"]=function(){return(dynCall_fiiffi=Module["dynCall_fiiffi"]=Module["asm"]["Zk"]).apply(null,arguments)};var dynCall_viiififii=Module["dynCall_viiififii"]=function(){return(dynCall_viiififii=Module["dynCall_viiififii"]=Module["asm"]["_k"]).apply(null,arguments)};var dynCall_viiij=Module["dynCall_viiij"]=function(){return(dynCall_viiij=Module["dynCall_viiij"]=Module["asm"]["$k"]).apply(null,arguments)};var dynCall_viiiifi=Module["dynCall_viiiifi"]=function(){return(dynCall_viiiifi=Module["dynCall_viiiifi"]=Module["asm"]["al"]).apply(null,arguments)};var dynCall_viij=Module["dynCall_viij"]=function(){return(dynCall_viij=Module["dynCall_viij"]=Module["asm"]["bl"]).apply(null,arguments)};var dynCall_viijiiiiii=Module["dynCall_viijiiiiii"]=function(){return(dynCall_viijiiiiii=Module["dynCall_viijiiiiii"]=Module["asm"]["cl"]).apply(null,arguments)};var dynCall_vijiii=Module["dynCall_vijiii"]=function(){return(dynCall_vijiii=Module["dynCall_vijiii"]=Module["asm"]["dl"]).apply(null,arguments)};var dynCall_vjjjiiii=Module["dynCall_vjjjiiii"]=function(){return(dynCall_vjjjiiii=Module["dynCall_vjjjiiii"]=Module["asm"]["el"]).apply(null,arguments)};var dynCall_vjiiiii=Module["dynCall_vjiiiii"]=function(){return(dynCall_vjiiiii=Module["dynCall_vjiiiii"]=Module["asm"]["fl"]).apply(null,arguments)};var dynCall_jiiiii=Module["dynCall_jiiiii"]=function(){return(dynCall_jiiiii=Module["dynCall_jiiiii"]=Module["asm"]["gl"]).apply(null,arguments)};var dynCall_iiifiii=Module["dynCall_iiifiii"]=function(){return(dynCall_iiifiii=Module["dynCall_iiifiii"]=Module["asm"]["hl"]).apply(null,arguments)};var dynCall_viiifiii=Module["dynCall_viiifiii"]=function(){return(dynCall_viiifiii=Module["dynCall_viiifiii"]=Module["asm"]["il"]).apply(null,arguments)};var dynCall_iifiiii=Module["dynCall_iifiiii"]=function(){return(dynCall_iifiiii=Module["dynCall_iifiiii"]=Module["asm"]["jl"]).apply(null,arguments)};var dynCall_iiifiiii=Module["dynCall_iiifiiii"]=function(){return(dynCall_iiifiiii=Module["dynCall_iiifiiii"]=Module["asm"]["kl"]).apply(null,arguments)};var dynCall_viiiiifiiii=Module["dynCall_viiiiifiiii"]=function(){return(dynCall_viiiiifiiii=Module["dynCall_viiiiifiiii"]=Module["asm"]["ll"]).apply(null,arguments)};var dynCall_iiijiiiii=Module["dynCall_iiijiiiii"]=function(){return(dynCall_iiijiiiii=Module["dynCall_iiijiiiii"]=Module["asm"]["ml"]).apply(null,arguments)};var dynCall_iiiijii=Module["dynCall_iiiijii"]=function(){return(dynCall_iiiijii=Module["dynCall_iiiijii"]=Module["asm"]["nl"]).apply(null,arguments)};var dynCall_iiiijiii=Module["dynCall_iiiijiii"]=function(){return(dynCall_iiiijiii=Module["dynCall_iiiijiii"]=Module["asm"]["ol"]).apply(null,arguments)};var dynCall_ijii=Module["dynCall_ijii"]=function(){return(dynCall_ijii=Module["dynCall_ijii"]=Module["asm"]["pl"]).apply(null,arguments)};var dynCall_iiiiiiffi=Module["dynCall_iiiiiiffi"]=function(){return(dynCall_iiiiiiffi=Module["dynCall_iiiiiiffi"]=Module["asm"]["ql"]).apply(null,arguments)};var dynCall_iiifiiiii=Module["dynCall_iiifiiiii"]=function(){return(dynCall_iiifiiiii=Module["dynCall_iiifiiiii"]=Module["asm"]["rl"]).apply(null,arguments)};var dynCall_viiifiiii=Module["dynCall_viiifiiii"]=function(){return(dynCall_viiifiiii=Module["dynCall_viiifiiii"]=Module["asm"]["sl"]).apply(null,arguments)};var dynCall_iifiii=Module["dynCall_iifiii"]=function(){return(dynCall_iifiii=Module["dynCall_iifiii"]=Module["asm"]["tl"]).apply(null,arguments)};var dynCall_viiiiifii=Module["dynCall_viiiiifii"]=function(){return(dynCall_viiiiifii=Module["dynCall_viiiiifii"]=Module["asm"]["ul"]).apply(null,arguments)};var dynCall_viiiiiifi=Module["dynCall_viiiiiifi"]=function(){return(dynCall_viiiiiifi=Module["dynCall_viiiiiifi"]=Module["asm"]["vl"]).apply(null,arguments)};var dynCall_viiiiiifii=Module["dynCall_viiiiiifii"]=function(){return(dynCall_viiiiiifii=Module["dynCall_viiiiiifii"]=Module["asm"]["wl"]).apply(null,arguments)};var dynCall_vifii=Module["dynCall_vifii"]=function(){return(dynCall_vifii=Module["dynCall_vifii"]=Module["asm"]["xl"]).apply(null,arguments)};var dynCall_ifffi=Module["dynCall_ifffi"]=function(){return(dynCall_ifffi=Module["dynCall_ifffi"]=Module["asm"]["yl"]).apply(null,arguments)};var dynCall_iffffi=Module["dynCall_iffffi"]=function(){return(dynCall_iffffi=Module["dynCall_iffffi"]=Module["asm"]["zl"]).apply(null,arguments)};var dynCall_vffi=Module["dynCall_vffi"]=function(){return(dynCall_vffi=Module["dynCall_vffi"]=Module["asm"]["Al"]).apply(null,arguments)};var dynCall_viiiiiifiii=Module["dynCall_viiiiiifiii"]=function(){return(dynCall_viiiiiifiii=Module["dynCall_viiiiiifiii"]=Module["asm"]["Bl"]).apply(null,arguments)};var dynCall_iifffiiii=Module["dynCall_iifffiiii"]=function(){return(dynCall_iifffiiii=Module["dynCall_iifffiiii"]=Module["asm"]["Cl"]).apply(null,arguments)};var dynCall_iiffiiii=Module["dynCall_iiffiiii"]=function(){return(dynCall_iiffiiii=Module["dynCall_iiffiiii"]=Module["asm"]["Dl"]).apply(null,arguments)};var dynCall_viiiifffiiii=Module["dynCall_viiiifffiiii"]=function(){return(dynCall_viiiifffiiii=Module["dynCall_viiiifffiiii"]=Module["asm"]["El"]).apply(null,arguments)};var dynCall_ijiii=Module["dynCall_ijiii"]=function(){return(dynCall_ijiii=Module["dynCall_ijiii"]=Module["asm"]["Fl"]).apply(null,arguments)};var dynCall_ifiiii=Module["dynCall_ifiiii"]=function(){return(dynCall_ifiiii=Module["dynCall_ifiiii"]=Module["asm"]["Gl"]).apply(null,arguments)};var dynCall_idiiiii=Module["dynCall_idiiiii"]=function(){return(dynCall_idiiiii=Module["dynCall_idiiiii"]=Module["asm"]["Hl"]).apply(null,arguments)};var dynCall_idiiii=Module["dynCall_idiiii"]=function(){return(dynCall_idiiii=Module["dynCall_idiiii"]=Module["asm"]["Il"]).apply(null,arguments)};var dynCall_idii=Module["dynCall_idii"]=function(){return(dynCall_idii=Module["dynCall_idii"]=Module["asm"]["Jl"]).apply(null,arguments)};var dynCall_iidii=Module["dynCall_iidii"]=function(){return(dynCall_iidii=Module["dynCall_iidii"]=Module["asm"]["Kl"]).apply(null,arguments)};var dynCall_iidiii=Module["dynCall_iidiii"]=function(){return(dynCall_iidiii=Module["dynCall_iidiii"]=Module["asm"]["Ll"]).apply(null,arguments)};var dynCall_iiijiiii=Module["dynCall_iiijiiii"]=function(){return(dynCall_iiijiiii=Module["dynCall_iiijiiii"]=Module["asm"]["Ml"]).apply(null,arguments)};var dynCall_vjiiii=Module["dynCall_vjiiii"]=function(){return(dynCall_vjiiii=Module["dynCall_vjiiii"]=Module["asm"]["Nl"]).apply(null,arguments)};var dynCall_iddi=Module["dynCall_iddi"]=function(){return(dynCall_iddi=Module["dynCall_iddi"]=Module["asm"]["Ol"]).apply(null,arguments)};var dynCall_jijii=Module["dynCall_jijii"]=function(){return(dynCall_jijii=Module["dynCall_jijii"]=Module["asm"]["Pl"]).apply(null,arguments)};var dynCall_iiiiiji=Module["dynCall_iiiiiji"]=function(){return(dynCall_iiiiiji=Module["dynCall_iiiiiji"]=Module["asm"]["Ql"]).apply(null,arguments)};var dynCall_viiijii=Module["dynCall_viiijii"]=function(){return(dynCall_viiijii=Module["dynCall_viiijii"]=Module["asm"]["Rl"]).apply(null,arguments)};var dynCall_viijiii=Module["dynCall_viijiii"]=function(){return(dynCall_viijiii=Module["dynCall_viijiii"]=Module["asm"]["Sl"]).apply(null,arguments)};var dynCall_ijjiiii=Module["dynCall_ijjiiii"]=function(){return(dynCall_ijjiiii=Module["dynCall_ijjiiii"]=Module["asm"]["Tl"]).apply(null,arguments)};var dynCall_vdiiiii=Module["dynCall_vdiiiii"]=function(){return(dynCall_vdiiiii=Module["dynCall_vdiiiii"]=Module["asm"]["Ul"]).apply(null,arguments)};var dynCall_diiji=Module["dynCall_diiji"]=function(){return(dynCall_diiji=Module["dynCall_diiji"]=Module["asm"]["Vl"]).apply(null,arguments)};var dynCall_vjiiiiiiii=Module["dynCall_vjiiiiiiii"]=function(){return(dynCall_vjiiiiiiii=Module["dynCall_vjiiiiiiii"]=Module["asm"]["Wl"]).apply(null,arguments)};var dynCall_vjiiiiiii=Module["dynCall_vjiiiiiii"]=function(){return(dynCall_vjiiiiiii=Module["dynCall_vjiiiiiii"]=Module["asm"]["Xl"]).apply(null,arguments)};var dynCall_ijiiii=Module["dynCall_ijiiii"]=function(){return(dynCall_ijiiii=Module["dynCall_ijiiii"]=Module["asm"]["Yl"]).apply(null,arguments)};var dynCall_viidi=Module["dynCall_viidi"]=function(){return(dynCall_viidi=Module["dynCall_viidi"]=Module["asm"]["Zl"]).apply(null,arguments)};var dynCall_jidi=Module["dynCall_jidi"]=function(){return(dynCall_jidi=Module["dynCall_jidi"]=Module["asm"]["_l"]).apply(null,arguments)};var dynCall_diji=Module["dynCall_diji"]=function(){return(dynCall_diji=Module["dynCall_diji"]=Module["asm"]["$l"]).apply(null,arguments)};var dynCall_fidi=Module["dynCall_fidi"]=function(){return(dynCall_fidi=Module["dynCall_fidi"]=Module["asm"]["am"]).apply(null,arguments)};var dynCall_vjii=Module["dynCall_vjii"]=function(){return(dynCall_vjii=Module["dynCall_vjii"]=Module["asm"]["bm"]).apply(null,arguments)};var dynCall_viiifii=Module["dynCall_viiifii"]=function(){return(dynCall_viiifii=Module["dynCall_viiifii"]=Module["asm"]["cm"]).apply(null,arguments)};var dynCall_vfffi=Module["dynCall_vfffi"]=function(){return(dynCall_vfffi=Module["dynCall_vfffi"]=Module["asm"]["dm"]).apply(null,arguments)};var dynCall_vffffi=Module["dynCall_vffffi"]=function(){return(dynCall_vffffi=Module["dynCall_vffffi"]=Module["asm"]["em"]).apply(null,arguments)};var dynCall_viiiiffi=Module["dynCall_viiiiffi"]=function(){return(dynCall_viiiiffi=Module["dynCall_viiiiffi"]=Module["asm"]["fm"]).apply(null,arguments)};var dynCall_viiiffii=Module["dynCall_viiiffii"]=function(){return(dynCall_viiiffii=Module["dynCall_viiiffii"]=Module["asm"]["gm"]).apply(null,arguments)};var dynCall_vijji=Module["dynCall_vijji"]=function(){return(dynCall_vijji=Module["dynCall_vijji"]=Module["asm"]["hm"]).apply(null,arguments)};var dynCall_vifffi=Module["dynCall_vifffi"]=function(){return(dynCall_vifffi=Module["dynCall_vifffi"]=Module["asm"]["im"]).apply(null,arguments)};var dynCall_viffffffi=Module["dynCall_viffffffi"]=function(){return(dynCall_viffffffi=Module["dynCall_viffffffi"]=Module["asm"]["jm"]).apply(null,arguments)};var dynCall_vffffffii=Module["dynCall_vffffffii"]=function(){return(dynCall_vffffffii=Module["dynCall_vffffffii"]=Module["asm"]["km"]).apply(null,arguments)};var dynCall_vffffii=Module["dynCall_vffffii"]=function(){return(dynCall_vffffii=Module["dynCall_vffffii"]=Module["asm"]["lm"]).apply(null,arguments)};var dynCall_vfiii=Module["dynCall_vfiii"]=function(){return(dynCall_vfiii=Module["dynCall_vfiii"]=Module["asm"]["mm"]).apply(null,arguments)};var dynCall_ffffi=Module["dynCall_ffffi"]=function(){return(dynCall_ffffi=Module["dynCall_ffffi"]=Module["asm"]["nm"]).apply(null,arguments)};var dynCall_iffi=Module["dynCall_iffi"]=function(){return(dynCall_iffi=Module["dynCall_iffi"]=Module["asm"]["om"]).apply(null,arguments)};var dynCall_fffifffi=Module["dynCall_fffifffi"]=function(){return(dynCall_fffifffi=Module["dynCall_fffifffi"]=Module["asm"]["pm"]).apply(null,arguments)};var dynCall_vfii=Module["dynCall_vfii"]=function(){return(dynCall_vfii=Module["dynCall_vfii"]=Module["asm"]["qm"]).apply(null,arguments)};var dynCall_iiiifiiiii=Module["dynCall_iiiifiiiii"]=function(){return(dynCall_iiiifiiiii=Module["dynCall_iiiifiiiii"]=Module["asm"]["rm"]).apply(null,arguments)};var dynCall_iiiifiiii=Module["dynCall_iiiifiiii"]=function(){return(dynCall_iiiifiiii=Module["dynCall_iiiifiiii"]=Module["asm"]["sm"]).apply(null,arguments)};var dynCall_iiiifiii=Module["dynCall_iiiifiii"]=function(){return(dynCall_iiiifiii=Module["dynCall_iiiifiii"]=Module["asm"]["tm"]).apply(null,arguments)};var dynCall_vijjii=Module["dynCall_vijjii"]=function(){return(dynCall_vijjii=Module["dynCall_vijjii"]=Module["asm"]["um"]).apply(null,arguments)};var dynCall_viiiiiiifi=Module["dynCall_viiiiiiifi"]=function(){return(dynCall_viiiiiiifi=Module["dynCall_viiiiiiifi"]=Module["asm"]["vm"]).apply(null,arguments)};var dynCall_iiiiiiifiiii=Module["dynCall_iiiiiiifiiii"]=function(){return(dynCall_iiiiiiifiiii=Module["dynCall_iiiiiiifiiii"]=Module["asm"]["wm"]).apply(null,arguments)};var dynCall_viiiiiffii=Module["dynCall_viiiiiffii"]=function(){return(dynCall_viiiiiffii=Module["dynCall_viiiiiffii"]=Module["asm"]["xm"]).apply(null,arguments)};var dynCall_viffffii=Module["dynCall_viffffii"]=function(){return(dynCall_viffffii=Module["dynCall_viffffii"]=Module["asm"]["ym"]).apply(null,arguments)};var dynCall_viiififi=Module["dynCall_viiififi"]=function(){return(dynCall_viiififi=Module["dynCall_viiififi"]=Module["asm"]["zm"]).apply(null,arguments)};var dynCall_viiififfi=Module["dynCall_viiififfi"]=function(){return(dynCall_viiififfi=Module["dynCall_viiififfi"]=Module["asm"]["Am"]).apply(null,arguments)};var dynCall_iiiiifi=Module["dynCall_iiiiifi"]=function(){return(dynCall_iiiiifi=Module["dynCall_iiiiifi"]=Module["asm"]["Bm"]).apply(null,arguments)};var dynCall_iiiiifiii=Module["dynCall_iiiiifiii"]=function(){return(dynCall_iiiiifiii=Module["dynCall_iiiiifiii"]=Module["asm"]["Cm"]).apply(null,arguments)};var dynCall_vifffffi=Module["dynCall_vifffffi"]=function(){return(dynCall_vifffffi=Module["dynCall_vifffffi"]=Module["asm"]["Dm"]).apply(null,arguments)};var dynCall_viffiiii=Module["dynCall_viffiiii"]=function(){return(dynCall_viffiiii=Module["dynCall_viffiiii"]=Module["asm"]["Em"]).apply(null,arguments)};var dynCall_viiiiffffiiii=Module["dynCall_viiiiffffiiii"]=function(){return(dynCall_viiiiffffiiii=Module["dynCall_viiiiffffiiii"]=Module["asm"]["Fm"]).apply(null,arguments)};var dynCall_iiiiiiffiiiiiiiiiffffiiii=Module["dynCall_iiiiiiffiiiiiiiiiffffiiii"]=function(){return(dynCall_iiiiiiffiiiiiiiiiffffiiii=Module["dynCall_iiiiiiffiiiiiiiiiffffiiii"]=Module["asm"]["Gm"]).apply(null,arguments)};var dynCall_iiiiiiffiiiiiiiiiiiiiii=Module["dynCall_iiiiiiffiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiffiiiiiiiiiiiiiii=Module["dynCall_iiiiiiffiiiiiiiiiiiiiii"]=Module["asm"]["Hm"]).apply(null,arguments)};var dynCall_fiiiffi=Module["dynCall_fiiiffi"]=function(){return(dynCall_fiiiffi=Module["dynCall_fiiiffi"]=Module["asm"]["Im"]).apply(null,arguments)};var dynCall_viffffiii=Module["dynCall_viffffiii"]=function(){return(dynCall_viffffiii=Module["dynCall_viffffiii"]=Module["asm"]["Jm"]).apply(null,arguments)};var dynCall_viijji=Module["dynCall_viijji"]=function(){return(dynCall_viijji=Module["dynCall_viijji"]=Module["asm"]["Km"]).apply(null,arguments)};var dynCall_viififii=Module["dynCall_viififii"]=function(){return(dynCall_viififii=Module["dynCall_viififii"]=Module["asm"]["Lm"]).apply(null,arguments)};var dynCall_iiiffiiii=Module["dynCall_iiiffiiii"]=function(){return(dynCall_iiiffiiii=Module["dynCall_iiiffiiii"]=Module["asm"]["Mm"]).apply(null,arguments)};var dynCall_fffffi=Module["dynCall_fffffi"]=function(){return(dynCall_fffffi=Module["dynCall_fffffi"]=Module["asm"]["Nm"]).apply(null,arguments)};var dynCall_iiiiffiiii=Module["dynCall_iiiiffiiii"]=function(){return(dynCall_iiiiffiiii=Module["dynCall_iiiiffiiii"]=Module["asm"]["Om"]).apply(null,arguments)};var dynCall_viiffffi=Module["dynCall_viiffffi"]=function(){return(dynCall_viiffffi=Module["dynCall_viiffffi"]=Module["asm"]["Pm"]).apply(null,arguments)};var dynCall_fifffi=Module["dynCall_fifffi"]=function(){return(dynCall_fifffi=Module["dynCall_fifffi"]=Module["asm"]["Qm"]).apply(null,arguments)};var dynCall_viffiii=Module["dynCall_viffiii"]=function(){return(dynCall_viffiii=Module["dynCall_viffiii"]=Module["asm"]["Rm"]).apply(null,arguments)};var dynCall_fiffffi=Module["dynCall_fiffffi"]=function(){return(dynCall_fiffffi=Module["dynCall_fiffffi"]=Module["asm"]["Sm"]).apply(null,arguments)};var dynCall_fffffffi=Module["dynCall_fffffffi"]=function(){return(dynCall_fffffffi=Module["dynCall_fffffffi"]=Module["asm"]["Tm"]).apply(null,arguments)};var dynCall_viffifi=Module["dynCall_viffifi"]=function(){return(dynCall_viffifi=Module["dynCall_viffifi"]=Module["asm"]["Um"]).apply(null,arguments)};var dynCall_viiffifi=Module["dynCall_viiffifi"]=function(){return(dynCall_viiffifi=Module["dynCall_viiffifi"]=Module["asm"]["Vm"]).apply(null,arguments)};var dynCall_viiififiii=Module["dynCall_viiififiii"]=function(){return(dynCall_viiififiii=Module["dynCall_viiififiii"]=Module["asm"]["Wm"]).apply(null,arguments)};var dynCall_vifiii=Module["dynCall_vifiii"]=function(){return(dynCall_vifiii=Module["dynCall_vifiii"]=Module["asm"]["Xm"]).apply(null,arguments)};var dynCall_viiffiiiiiiiii=Module["dynCall_viiffiiiiiiiii"]=function(){return(dynCall_viiffiiiiiiiii=Module["dynCall_viiffiiiiiiiii"]=Module["asm"]["Ym"]).apply(null,arguments)};var dynCall_viiiiiffiii=Module["dynCall_viiiiiffiii"]=function(){return(dynCall_viiiiiffiii=Module["dynCall_viiiiiffiii"]=Module["asm"]["Zm"]).apply(null,arguments)};var dynCall_viiffiii=Module["dynCall_viiffiii"]=function(){return(dynCall_viiffiii=Module["dynCall_viiffiii"]=Module["asm"]["_m"]).apply(null,arguments)};var dynCall_viiffiiiiiii=Module["dynCall_viiffiiiiiii"]=function(){return(dynCall_viiffiiiiiii=Module["dynCall_viiffiiiiiii"]=Module["asm"]["$m"]).apply(null,arguments)};var dynCall_viiffii=Module["dynCall_viiffii"]=function(){return(dynCall_viiffii=Module["dynCall_viiffii"]=Module["asm"]["an"]).apply(null,arguments)};var dynCall_fffffffffi=Module["dynCall_fffffffffi"]=function(){return(dynCall_fffffffffi=Module["dynCall_fffffffffi"]=Module["asm"]["bn"]).apply(null,arguments)};var dynCall_vifiiiiii=Module["dynCall_vifiiiiii"]=function(){return(dynCall_vifiiiiii=Module["dynCall_vifiiiiii"]=Module["asm"]["cn"]).apply(null,arguments)};var dynCall_vifiiiii=Module["dynCall_vifiiiii"]=function(){return(dynCall_vifiiiii=Module["dynCall_vifiiiii"]=Module["asm"]["dn"]).apply(null,arguments)};var dynCall_viifiiiiiii=Module["dynCall_viifiiiiiii"]=function(){return(dynCall_viifiiiiiii=Module["dynCall_viifiiiiiii"]=Module["asm"]["en"]).apply(null,arguments)};var dynCall_viiififfiiiiiii=Module["dynCall_viiififfiiiiiii"]=function(){return(dynCall_viiififfiiiiiii=Module["dynCall_viiififfiiiiiii"]=Module["asm"]["fn"]).apply(null,arguments)};var dynCall_viiffiifiiiiiii=Module["dynCall_viiffiifiiiiiii"]=function(){return(dynCall_viiffiifiiiiiii=Module["dynCall_viiffiifiiiiiii"]=Module["asm"]["gn"]).apply(null,arguments)};var dynCall_viifiiiiii=Module["dynCall_viifiiiiii"]=function(){return(dynCall_viifiiiiii=Module["dynCall_viifiiiiii"]=Module["asm"]["hn"]).apply(null,arguments)};var dynCall_viiifiiiiii=Module["dynCall_viiifiiiiii"]=function(){return(dynCall_viiifiiiiii=Module["dynCall_viiifiiiiii"]=Module["asm"]["jn"]).apply(null,arguments)};var dynCall_viiiifiiiiii=Module["dynCall_viiiifiiiiii"]=function(){return(dynCall_viiiifiiiiii=Module["dynCall_viiiifiiiiii"]=Module["asm"]["kn"]).apply(null,arguments)};var dynCall_viififiiiiii=Module["dynCall_viififiiiiii"]=function(){return(dynCall_viififiiiiii=Module["dynCall_viififiiiiii"]=Module["asm"]["ln"]).apply(null,arguments)};var dynCall_viiiffiifiiiiiii=Module["dynCall_viiiffiifiiiiiii"]=function(){return(dynCall_viiiffiifiiiiiii=Module["dynCall_viiiffiifiiiiiii"]=Module["asm"]["mn"]).apply(null,arguments)};var dynCall_viiiiiifiiiiii=Module["dynCall_viiiiiifiiiiii"]=function(){return(dynCall_viiiiiifiiiiii=Module["dynCall_viiiiiifiiiiii"]=Module["asm"]["nn"]).apply(null,arguments)};var dynCall_ffii=Module["dynCall_ffii"]=function(){return(dynCall_ffii=Module["dynCall_ffii"]=Module["asm"]["on"]).apply(null,arguments)};var dynCall_viffii=Module["dynCall_viffii"]=function(){return(dynCall_viffii=Module["dynCall_viffii"]=Module["asm"]["pn"]).apply(null,arguments)};var dynCall_vififiii=Module["dynCall_vififiii"]=function(){return(dynCall_vififiii=Module["dynCall_vififiii"]=Module["asm"]["qn"]).apply(null,arguments)};var dynCall_fiffi=Module["dynCall_fiffi"]=function(){return(dynCall_fiffi=Module["dynCall_fiffi"]=Module["asm"]["rn"]).apply(null,arguments)};var dynCall_viiiiiiiijiiii=Module["dynCall_viiiiiiiijiiii"]=function(){return(dynCall_viiiiiiiijiiii=Module["dynCall_viiiiiiiijiiii"]=Module["asm"]["sn"]).apply(null,arguments)};var dynCall_viifiii=Module["dynCall_viifiii"]=function(){return(dynCall_viifiii=Module["dynCall_viifiii"]=Module["asm"]["tn"]).apply(null,arguments)};var dynCall_viifiiii=Module["dynCall_viifiiii"]=function(){return(dynCall_viifiiii=Module["dynCall_viifiiii"]=Module["asm"]["un"]).apply(null,arguments)};var dynCall_fifii=Module["dynCall_fifii"]=function(){return(dynCall_fifii=Module["dynCall_fifii"]=Module["asm"]["vn"]).apply(null,arguments)};var dynCall_vifffii=Module["dynCall_vifffii"]=function(){return(dynCall_vifffii=Module["dynCall_vifffii"]=Module["asm"]["wn"]).apply(null,arguments)};var dynCall_viiiffi=Module["dynCall_viiiffi"]=function(){return(dynCall_viiiffi=Module["dynCall_viiiffi"]=Module["asm"]["xn"]).apply(null,arguments)};var dynCall_viiifffi=Module["dynCall_viiifffi"]=function(){return(dynCall_viiifffi=Module["dynCall_viiifffi"]=Module["asm"]["yn"]).apply(null,arguments)};var dynCall_fiifii=Module["dynCall_fiifii"]=function(){return(dynCall_fiifii=Module["dynCall_fiifii"]=Module["asm"]["zn"]).apply(null,arguments)};var dynCall_iifffi=Module["dynCall_iifffi"]=function(){return(dynCall_iifffi=Module["dynCall_iifffi"]=Module["asm"]["An"]).apply(null,arguments)};var dynCall_ijiiiiiiiii=Module["dynCall_ijiiiiiiiii"]=function(){return(dynCall_ijiiiiiiiii=Module["dynCall_ijiiiiiiiii"]=Module["asm"]["Bn"]).apply(null,arguments)};var dynCall_viiijiii=Module["dynCall_viiijiii"]=function(){return(dynCall_viiijiii=Module["dynCall_viiijiii"]=Module["asm"]["Cn"]).apply(null,arguments)};var dynCall_viiidii=Module["dynCall_viiidii"]=function(){return(dynCall_viiidii=Module["dynCall_viiidii"]=Module["asm"]["Dn"]).apply(null,arguments)};var dynCall_ijjiii=Module["dynCall_ijjiii"]=function(){return(dynCall_ijjiii=Module["dynCall_ijjiii"]=Module["asm"]["En"]).apply(null,arguments)};var dynCall_ffiii=Module["dynCall_ffiii"]=function(){return(dynCall_ffiii=Module["dynCall_ffiii"]=Module["asm"]["Fn"]).apply(null,arguments)};var dynCall_ddiii=Module["dynCall_ddiii"]=function(){return(dynCall_ddiii=Module["dynCall_ddiii"]=Module["asm"]["Gn"]).apply(null,arguments)};var dynCall_fffiii=Module["dynCall_fffiii"]=function(){return(dynCall_fffiii=Module["dynCall_fffiii"]=Module["asm"]["Hn"]).apply(null,arguments)};var dynCall_dddiii=Module["dynCall_dddiii"]=function(){return(dynCall_dddiii=Module["dynCall_dddiii"]=Module["asm"]["In"]).apply(null,arguments)};var dynCall_jjiii=Module["dynCall_jjiii"]=function(){return(dynCall_jjiii=Module["dynCall_jjiii"]=Module["asm"]["Jn"]).apply(null,arguments)};var dynCall_jddi=Module["dynCall_jddi"]=function(){return(dynCall_jddi=Module["dynCall_jddi"]=Module["asm"]["Kn"]).apply(null,arguments)};var dynCall_jjjii=Module["dynCall_jjjii"]=function(){return(dynCall_jjjii=Module["dynCall_jjjii"]=Module["asm"]["Ln"]).apply(null,arguments)};var dynCall_ifii=Module["dynCall_ifii"]=function(){return(dynCall_ifii=Module["dynCall_ifii"]=Module["asm"]["Mn"]).apply(null,arguments)};var dynCall_jdii=Module["dynCall_jdii"]=function(){return(dynCall_jdii=Module["dynCall_jdii"]=Module["asm"]["Nn"]).apply(null,arguments)};var dynCall_djii=Module["dynCall_djii"]=function(){return(dynCall_djii=Module["dynCall_djii"]=Module["asm"]["On"]).apply(null,arguments)};var dynCall_fdi=Module["dynCall_fdi"]=function(){return(dynCall_fdi=Module["dynCall_fdi"]=Module["asm"]["Pn"]).apply(null,arguments)};var dynCall_jjiiii=Module["dynCall_jjiiii"]=function(){return(dynCall_jjiiii=Module["dynCall_jjiiii"]=Module["asm"]["Qn"]).apply(null,arguments)};var dynCall_ddi=Module["dynCall_ddi"]=function(){return(dynCall_ddi=Module["dynCall_ddi"]=Module["asm"]["Rn"]).apply(null,arguments)};var dynCall_vidiii=Module["dynCall_vidiii"]=function(){return(dynCall_vidiii=Module["dynCall_vidiii"]=Module["asm"]["Sn"]).apply(null,arguments)};var dynCall_viiidi=Module["dynCall_viiidi"]=function(){return(dynCall_viiidi=Module["dynCall_viiidi"]=Module["asm"]["Tn"]).apply(null,arguments)};var dynCall_viddi=Module["dynCall_viddi"]=function(){return(dynCall_viddi=Module["dynCall_viddi"]=Module["asm"]["Un"]).apply(null,arguments)};var dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii=Module["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"]=Module["asm"]["Vn"]).apply(null,arguments)};var dynCall_viffffffffi=Module["dynCall_viffffffffi"]=function(){return(dynCall_viffffffffi=Module["dynCall_viffffffffi"]=Module["asm"]["Wn"]).apply(null,arguments)};var dynCall_viddddi=Module["dynCall_viddddi"]=function(){return(dynCall_viddddi=Module["dynCall_viddddi"]=Module["asm"]["Xn"]).apply(null,arguments)};var dynCall_vijjjji=Module["dynCall_vijjjji"]=function(){return(dynCall_vijjjji=Module["dynCall_vijjjji"]=Module["asm"]["Yn"]).apply(null,arguments)};var dynCall_ddii=Module["dynCall_ddii"]=function(){return(dynCall_ddii=Module["dynCall_ddii"]=Module["asm"]["Zn"]).apply(null,arguments)};var dynCall_viddddddi=Module["dynCall_viddddddi"]=function(){return(dynCall_viddddddi=Module["dynCall_viddddddi"]=Module["asm"]["_n"]).apply(null,arguments)};var dynCall_viddddddddi=Module["dynCall_viddddddddi"]=function(){return(dynCall_viddddddddi=Module["dynCall_viddddddddi"]=Module["asm"]["$n"]).apply(null,arguments)};var dynCall_vidddi=Module["dynCall_vidddi"]=function(){return(dynCall_vidddi=Module["dynCall_vidddi"]=Module["asm"]["ao"]).apply(null,arguments)};var dynCall_vidii=Module["dynCall_vidii"]=function(){return(dynCall_vidii=Module["dynCall_vidii"]=Module["asm"]["bo"]).apply(null,arguments)};var dynCall_vidddddddddi=Module["dynCall_vidddddddddi"]=function(){return(dynCall_vidddddddddi=Module["dynCall_vidddddddddi"]=Module["asm"]["co"]).apply(null,arguments)};var dynCall_viddddddddddddi=Module["dynCall_viddddddddddddi"]=function(){return(dynCall_viddddddddddddi=Module["dynCall_viddddddddddddi"]=Module["asm"]["eo"]).apply(null,arguments)};var dynCall_viddii=Module["dynCall_viddii"]=function(){return(dynCall_viddii=Module["dynCall_viddii"]=Module["asm"]["fo"]).apply(null,arguments)};var dynCall_vididi=Module["dynCall_vididi"]=function(){return(dynCall_vididi=Module["dynCall_vididi"]=Module["asm"]["go"]).apply(null,arguments)};var dynCall_viiddi=Module["dynCall_viiddi"]=function(){return(dynCall_viiddi=Module["dynCall_viiddi"]=Module["asm"]["ho"]).apply(null,arguments)};var dynCall_viddddddddddddddddi=Module["dynCall_viddddddddddddddddi"]=function(){return(dynCall_viddddddddddddddddi=Module["dynCall_viddddddddddddddddi"]=Module["asm"]["io"]).apply(null,arguments)};var dynCall_vifffffffffi=Module["dynCall_vifffffffffi"]=function(){return(dynCall_vifffffffffi=Module["dynCall_vifffffffffi"]=Module["asm"]["jo"]).apply(null,arguments)};var dynCall_viffffffffffffi=Module["dynCall_viffffffffffffi"]=function(){return(dynCall_viffffffffffffi=Module["dynCall_viffffffffffffi"]=Module["asm"]["ko"]).apply(null,arguments)};var dynCall_vififi=Module["dynCall_vififi"]=function(){return(dynCall_vififi=Module["dynCall_vififi"]=Module["asm"]["lo"]).apply(null,arguments)};var dynCall_viffffffffffffffffi=Module["dynCall_viffffffffffffffffi"]=function(){return(dynCall_viffffffffffffffffi=Module["dynCall_viffffffffffffffffi"]=Module["asm"]["mo"]).apply(null,arguments)};var dynCall_ddddi=Module["dynCall_ddddi"]=function(){return(dynCall_ddddi=Module["dynCall_ddddi"]=Module["asm"]["no"]).apply(null,arguments)};var dynCall_ffffffi=Module["dynCall_ffffffi"]=function(){return(dynCall_ffffffi=Module["dynCall_ffffffi"]=Module["asm"]["oo"]).apply(null,arguments)};var dynCall_ddddddi=Module["dynCall_ddddddi"]=function(){return(dynCall_ddddddi=Module["dynCall_ddddddi"]=Module["asm"]["po"]).apply(null,arguments)};var dynCall_jjjji=Module["dynCall_jjjji"]=function(){return(dynCall_jjjji=Module["dynCall_jjjji"]=Module["asm"]["qo"]).apply(null,arguments)};var dynCall_fffii=Module["dynCall_fffii"]=function(){return(dynCall_fffii=Module["dynCall_fffii"]=Module["asm"]["ro"]).apply(null,arguments)};var dynCall_dddii=Module["dynCall_dddii"]=function(){return(dynCall_dddii=Module["dynCall_dddii"]=Module["asm"]["so"]).apply(null,arguments)};var dynCall_vdiii=Module["dynCall_vdiii"]=function(){return(dynCall_vdiii=Module["dynCall_vdiii"]=Module["asm"]["to"]).apply(null,arguments)};var dynCall_didi=Module["dynCall_didi"]=function(){return(dynCall_didi=Module["dynCall_didi"]=Module["asm"]["uo"]).apply(null,arguments)};var dynCall_diddi=Module["dynCall_diddi"]=function(){return(dynCall_diddi=Module["dynCall_diddi"]=Module["asm"]["vo"]).apply(null,arguments)};var dynCall_viifffii=Module["dynCall_viifffii"]=function(){return(dynCall_viifffii=Module["dynCall_viifffii"]=Module["asm"]["wo"]).apply(null,arguments)};var dynCall_viiiffiffiiiiiiiiiiiiiii=Module["dynCall_viiiffiffiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiffiffiiiiiiiiiiiiiii=Module["dynCall_viiiffiffiiiiiiiiiiiiiii"]=Module["asm"]["xo"]).apply(null,arguments)};var dynCall_viiiffiffiiiiiiiiiiiiiiiii=Module["dynCall_viiiffiffiiiiiiiiiiiiiiiii"]=function(){return(dynCall_viiiffiffiiiiiiiiiiiiiiiii=Module["dynCall_viiiffiffiiiiiiiiiiiiiiiii"]=Module["asm"]["yo"]).apply(null,arguments)};var dynCall_viiiiiffiiiii=Module["dynCall_viiiiiffiiiii"]=function(){return(dynCall_viiiiiffiiiii=Module["dynCall_viiiiiffiiiii"]=Module["asm"]["zo"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiifiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiifiiiiii"]=Module["asm"]["Ao"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiifiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiifiiiiii"]=Module["asm"]["Bo"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiifiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiifiiiiii"]=Module["asm"]["Co"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiiifiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiiiiifiiiiii"]=Module["asm"]["Do"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiifiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiifiiiiii=Module["dynCall_iiiiiiiiiiiiifiiiiii"]=Module["asm"]["Eo"]).apply(null,arguments)};var dynCall_iijjjji=Module["dynCall_iijjjji"]=function(){return(dynCall_iijjjji=Module["dynCall_iijjjji"]=Module["asm"]["Fo"]).apply(null,arguments)};var dynCall_viiiffffi=Module["dynCall_viiiffffi"]=function(){return(dynCall_viiiffffi=Module["dynCall_viiiffffi"]=Module["asm"]["Go"]).apply(null,arguments)};var dynCall_vifiiii=Module["dynCall_vifiiii"]=function(){return(dynCall_vifiiii=Module["dynCall_vifiiii"]=Module["asm"]["Ho"]).apply(null,arguments)};var dynCall_iiidi=Module["dynCall_iiidi"]=function(){return(dynCall_iiidi=Module["dynCall_iiidi"]=Module["asm"]["Io"]).apply(null,arguments)};var dynCall_iijjjjiii=Module["dynCall_iijjjjiii"]=function(){return(dynCall_iijjjjiii=Module["dynCall_iijjjjiii"]=Module["asm"]["Jo"]).apply(null,arguments)};var dynCall_iiiidi=Module["dynCall_iiiidi"]=function(){return(dynCall_iiiidi=Module["dynCall_iiiidi"]=Module["asm"]["Ko"]).apply(null,arguments)};var dynCall_viidii=Module["dynCall_viidii"]=function(){return(dynCall_viidii=Module["dynCall_viidii"]=Module["asm"]["Lo"]).apply(null,arguments)};var dynCall_iiiiiiifi=Module["dynCall_iiiiiiifi"]=function(){return(dynCall_iiiiiiifi=Module["dynCall_iiiiiiifi"]=Module["asm"]["Mo"]).apply(null,arguments)};var dynCall_iiiiiifiii=Module["dynCall_iiiiiifiii"]=function(){return(dynCall_iiiiiifiii=Module["dynCall_iiiiiifiii"]=Module["asm"]["No"]).apply(null,arguments)};var dynCall_iiiiiiiifiiiii=Module["dynCall_iiiiiiiifiiiii"]=function(){return(dynCall_iiiiiiiifiiiii=Module["dynCall_iiiiiiiifiiiii"]=Module["asm"]["Oo"]).apply(null,arguments)};var dynCall_vffiii=Module["dynCall_vffiii"]=function(){return(dynCall_vffiii=Module["dynCall_vffiii"]=Module["asm"]["Po"]).apply(null,arguments)};var dynCall_vififiiii=Module["dynCall_vififiiii"]=function(){return(dynCall_vififiiii=Module["dynCall_vififiiii"]=Module["asm"]["Qo"]).apply(null,arguments)};var dynCall_viiiiiiiifi=Module["dynCall_viiiiiiiifi"]=function(){return(dynCall_viiiiiiiifi=Module["dynCall_viiiiiiiifi"]=Module["asm"]["Ro"]).apply(null,arguments)};var dynCall_iifiiiii=Module["dynCall_iifiiiii"]=function(){return(dynCall_iifiiiii=Module["dynCall_iifiiiii"]=Module["asm"]["So"]).apply(null,arguments)};var dynCall_iiiiiffii=Module["dynCall_iiiiiffii"]=function(){return(dynCall_iiiiiffii=Module["dynCall_iiiiiffii"]=Module["asm"]["To"]).apply(null,arguments)};var dynCall_viiiifiii=Module["dynCall_viiiifiii"]=function(){return(dynCall_viiiifiii=Module["dynCall_viiiifiii"]=Module["asm"]["Uo"]).apply(null,arguments)};var dynCall_viiffffffi=Module["dynCall_viiffffffi"]=function(){return(dynCall_viiffffffi=Module["dynCall_viiffffffi"]=Module["asm"]["Vo"]).apply(null,arguments)};var dynCall_viifffffffi=Module["dynCall_viifffffffi"]=function(){return(dynCall_viifffffffi=Module["dynCall_viifffffffi"]=Module["asm"]["Wo"]).apply(null,arguments)};var dynCall_viiffffffffi=Module["dynCall_viiffffffffi"]=function(){return(dynCall_viiffffffffi=Module["dynCall_viiffffffffi"]=Module["asm"]["Xo"]).apply(null,arguments)};var dynCall_viiffffffffiii=Module["dynCall_viiffffffffiii"]=function(){return(dynCall_viiffffffffiii=Module["dynCall_viiffffffffiii"]=Module["asm"]["Yo"]).apply(null,arguments)};var dynCall_viiiiffffii=Module["dynCall_viiiiffffii"]=function(){return(dynCall_viiiiffffii=Module["dynCall_viiiiffffii"]=Module["asm"]["Zo"]).apply(null,arguments)};var dynCall_fiiiiii=Module["dynCall_fiiiiii"]=function(){return(dynCall_fiiiiii=Module["dynCall_fiiiiii"]=Module["asm"]["_o"]).apply(null,arguments)};var dynCall_vijiiiiiii=Module["dynCall_vijiiiiiii"]=function(){return(dynCall_vijiiiiiii=Module["dynCall_vijiiiiiii"]=Module["asm"]["$o"]).apply(null,arguments)};var dynCall_vijiiiiiiii=Module["dynCall_vijiiiiiiii"]=function(){return(dynCall_vijiiiiiiii=Module["dynCall_vijiiiiiiii"]=Module["asm"]["ap"]).apply(null,arguments)};var dynCall_jjiiiii=Module["dynCall_jjiiiii"]=function(){return(dynCall_jjiiiii=Module["dynCall_jjiiiii"]=Module["asm"]["bp"]).apply(null,arguments)};var dynCall_jijjji=Module["dynCall_jijjji"]=function(){return(dynCall_jijjji=Module["dynCall_jijjji"]=Module["asm"]["cp"]).apply(null,arguments)};var dynCall_jijjjii=Module["dynCall_jijjjii"]=function(){return(dynCall_jijjjii=Module["dynCall_jijjjii"]=Module["asm"]["dp"]).apply(null,arguments)};var dynCall_ijijiiiii=Module["dynCall_ijijiiiii"]=function(){return(dynCall_ijijiiiii=Module["dynCall_ijijiiiii"]=Module["asm"]["ep"]).apply(null,arguments)};var dynCall_ijjjiii=Module["dynCall_ijjjiii"]=function(){return(dynCall_ijjjiii=Module["dynCall_ijjjiii"]=Module["asm"]["fp"]).apply(null,arguments)};var dynCall_vijjjiijii=Module["dynCall_vijjjiijii"]=function(){return(dynCall_vijjjiijii=Module["dynCall_vijjjiijii"]=Module["asm"]["gp"]).apply(null,arguments)};var dynCall_ijjjiijii=Module["dynCall_ijjjiijii"]=function(){return(dynCall_ijjjiijii=Module["dynCall_ijjjiijii"]=Module["asm"]["hp"]).apply(null,arguments)};var dynCall_vijiiiiii=Module["dynCall_vijiiiiii"]=function(){return(dynCall_vijiiiiii=Module["dynCall_vijiiiiii"]=Module["asm"]["ip"]).apply(null,arguments)};var dynCall_jfi=Module["dynCall_jfi"]=function(){return(dynCall_jfi=Module["dynCall_jfi"]=Module["asm"]["jp"]).apply(null,arguments)};var dynCall_fji=Module["dynCall_fji"]=function(){return(dynCall_fji=Module["dynCall_fji"]=Module["asm"]["kp"]).apply(null,arguments)};var dynCall_dfi=Module["dynCall_dfi"]=function(){return(dynCall_dfi=Module["dynCall_dfi"]=Module["asm"]["lp"]).apply(null,arguments)};var dynCall_jidii=Module["dynCall_jidii"]=function(){return(dynCall_jidii=Module["dynCall_jidii"]=Module["asm"]["mp"]).apply(null,arguments)};var dynCall_viiiiiiiji=Module["dynCall_viiiiiiiji"]=function(){return(dynCall_viiiiiiiji=Module["dynCall_viiiiiiiji"]=Module["asm"]["np"]).apply(null,arguments)};var dynCall_viiiiiiiiji=Module["dynCall_viiiiiiiiji"]=function(){return(dynCall_viiiiiiiiji=Module["dynCall_viiiiiiiiji"]=Module["asm"]["op"]).apply(null,arguments)};var dynCall_viiiiiiiiiji=Module["dynCall_viiiiiiiiiji"]=function(){return(dynCall_viiiiiiiiiji=Module["dynCall_viiiiiiiiiji"]=Module["asm"]["pp"]).apply(null,arguments)};var dynCall_ijiijii=Module["dynCall_ijiijii"]=function(){return(dynCall_ijiijii=Module["dynCall_ijiijii"]=Module["asm"]["qp"]).apply(null,arguments)};var dynCall_vjjiiiii=Module["dynCall_vjjiiiii"]=function(){return(dynCall_vjjiiiii=Module["dynCall_vjjiiiii"]=Module["asm"]["rp"]).apply(null,arguments)};var dynCall_vjjii=Module["dynCall_vjjii"]=function(){return(dynCall_vjjii=Module["dynCall_vjjii"]=Module["asm"]["sp"]).apply(null,arguments)};var dynCall_ijiiji=Module["dynCall_ijiiji"]=function(){return(dynCall_ijiiji=Module["dynCall_ijiiji"]=Module["asm"]["tp"]).apply(null,arguments)};var dynCall_ijiiiii=Module["dynCall_ijiiiii"]=function(){return(dynCall_ijiiiii=Module["dynCall_ijiiiii"]=Module["asm"]["up"]).apply(null,arguments)};var dynCall_ijiiiiji=Module["dynCall_ijiiiiji"]=function(){return(dynCall_ijiiiiji=Module["dynCall_ijiiiiji"]=Module["asm"]["vp"]).apply(null,arguments)};var dynCall_jiiiiii=Module["dynCall_jiiiiii"]=function(){return(dynCall_jiiiiii=Module["dynCall_jiiiiii"]=Module["asm"]["wp"]).apply(null,arguments)};var dynCall_idiii=Module["dynCall_idiii"]=function(){return(dynCall_idiii=Module["dynCall_idiii"]=Module["asm"]["xp"]).apply(null,arguments)};var dynCall_ifiii=Module["dynCall_ifiii"]=function(){return(dynCall_ifiii=Module["dynCall_ifiii"]=Module["asm"]["yp"]).apply(null,arguments)};var dynCall_ifiiiii=Module["dynCall_ifiiiii"]=function(){return(dynCall_ifiiiii=Module["dynCall_ifiiiii"]=Module["asm"]["zp"]).apply(null,arguments)};var dynCall_djji=Module["dynCall_djji"]=function(){return(dynCall_djji=Module["dynCall_djji"]=Module["asm"]["Ap"]).apply(null,arguments)};var dynCall_vijijji=Module["dynCall_vijijji"]=function(){return(dynCall_vijijji=Module["dynCall_vijijji"]=Module["asm"]["Bp"]).apply(null,arguments)};var dynCall_iijjji=Module["dynCall_iijjji"]=function(){return(dynCall_iijjji=Module["dynCall_iijjji"]=Module["asm"]["Cp"]).apply(null,arguments)};var dynCall_viijjji=Module["dynCall_viijjji"]=function(){return(dynCall_viijjji=Module["dynCall_viijjji"]=Module["asm"]["Dp"]).apply(null,arguments)};var dynCall_vdii=Module["dynCall_vdii"]=function(){return(dynCall_vdii=Module["dynCall_vdii"]=Module["asm"]["Ep"]).apply(null,arguments)};var dynCall_jijji=Module["dynCall_jijji"]=function(){return(dynCall_jijji=Module["dynCall_jijji"]=Module["asm"]["Fp"]).apply(null,arguments)};var dynCall_viiiijii=Module["dynCall_viiiijii"]=function(){return(dynCall_viiiijii=Module["dynCall_viiiijii"]=Module["asm"]["Gp"]).apply(null,arguments)};var dynCall_viiijji=Module["dynCall_viiijji"]=function(){return(dynCall_viiijji=Module["dynCall_viiijji"]=Module["asm"]["Hp"]).apply(null,arguments)};var dynCall_iijjii=Module["dynCall_iijjii"]=function(){return(dynCall_iijjii=Module["dynCall_iijjii"]=Module["asm"]["Ip"]).apply(null,arguments)};var dynCall_viijijii=Module["dynCall_viijijii"]=function(){return(dynCall_viijijii=Module["dynCall_viijijii"]=Module["asm"]["Jp"]).apply(null,arguments)};var dynCall_viijijiii=Module["dynCall_viijijiii"]=function(){return(dynCall_viijijiii=Module["dynCall_viijijiii"]=Module["asm"]["Kp"]).apply(null,arguments)};var dynCall_vijiji=Module["dynCall_vijiji"]=function(){return(dynCall_vijiji=Module["dynCall_vijiji"]=Module["asm"]["Lp"]).apply(null,arguments)};var dynCall_viijiijiii=Module["dynCall_viijiijiii"]=function(){return(dynCall_viijiijiii=Module["dynCall_viijiijiii"]=Module["asm"]["Mp"]).apply(null,arguments)};var dynCall_viiiijiiii=Module["dynCall_viiiijiiii"]=function(){return(dynCall_viiiijiiii=Module["dynCall_viiiijiiii"]=Module["asm"]["Np"]).apply(null,arguments)};var dynCall_di=Module["dynCall_di"]=function(){return(dynCall_di=Module["dynCall_di"]=Module["asm"]["Op"]).apply(null,arguments)};var dynCall_viijjii=Module["dynCall_viijjii"]=function(){return(dynCall_viijjii=Module["dynCall_viijjii"]=Module["asm"]["Pp"]).apply(null,arguments)};var dynCall_jiiiiiiiii=Module["dynCall_jiiiiiiiii"]=function(){return(dynCall_jiiiiiiiii=Module["dynCall_jiiiiiiiii"]=Module["asm"]["Qp"]).apply(null,arguments)};var dynCall_iiiiijii=Module["dynCall_iiiiijii"]=function(){return(dynCall_iiiiijii=Module["dynCall_iiiiijii"]=Module["asm"]["Rp"]).apply(null,arguments)};var dynCall_iiiiidii=Module["dynCall_iiiiidii"]=function(){return(dynCall_iiiiidii=Module["dynCall_iiiiidii"]=Module["asm"]["Sp"]).apply(null,arguments)};var dynCall_iiiidii=Module["dynCall_iiiidii"]=function(){return(dynCall_iiiidii=Module["dynCall_iiiidii"]=Module["asm"]["Tp"]).apply(null,arguments)};var dynCall_iiiiifii=Module["dynCall_iiiiifii"]=function(){return(dynCall_iiiiifii=Module["dynCall_iiiiifii"]=Module["asm"]["Up"]).apply(null,arguments)};var dynCall_iiidiii=Module["dynCall_iiidiii"]=function(){return(dynCall_iiidiii=Module["dynCall_iiidiii"]=Module["asm"]["Vp"]).apply(null,arguments)};var dynCall_iiiiffiiiji=Module["dynCall_iiiiffiiiji"]=function(){return(dynCall_iiiiffiiiji=Module["dynCall_iiiiffiiiji"]=Module["asm"]["Wp"]).apply(null,arguments)};var dynCall_jiiiiiii=Module["dynCall_jiiiiiii"]=function(){return(dynCall_jiiiiiii=Module["dynCall_jiiiiiii"]=Module["asm"]["Xp"]).apply(null,arguments)};var dynCall_iiiiffiiiii=Module["dynCall_iiiiffiiiii"]=function(){return(dynCall_iiiiffiiiii=Module["dynCall_iiiiffiiiii"]=Module["asm"]["Yp"]).apply(null,arguments)};var dynCall_jiiiiji=Module["dynCall_jiiiiji"]=function(){return(dynCall_jiiiiji=Module["dynCall_jiiiiji"]=Module["asm"]["Zp"]).apply(null,arguments)};var dynCall_fiiiifi=Module["dynCall_fiiiifi"]=function(){return(dynCall_fiiiifi=Module["dynCall_fiiiifi"]=Module["asm"]["_p"]).apply(null,arguments)};var dynCall_iiijjii=Module["dynCall_iiijjii"]=function(){return(dynCall_iiijjii=Module["dynCall_iiijjii"]=Module["asm"]["$p"]).apply(null,arguments)};var dynCall_iiiij=Module["dynCall_iiiij"]=function(){return(dynCall_iiiij=Module["dynCall_iiiij"]=Module["asm"]["aq"]).apply(null,arguments)};var dynCall_fff=Module["dynCall_fff"]=function(){return(dynCall_fff=Module["dynCall_fff"]=Module["asm"]["bq"]).apply(null,arguments)};var dynCall_ijj=Module["dynCall_ijj"]=function(){return(dynCall_ijj=Module["dynCall_ijj"]=Module["asm"]["cq"]).apply(null,arguments)};var dynCall_vjji=Module["dynCall_vjji"]=function(){return(dynCall_vjji=Module["dynCall_vjji"]=Module["asm"]["dq"]).apply(null,arguments)};var dynCall_ij=Module["dynCall_ij"]=function(){return(dynCall_ij=Module["dynCall_ij"]=Module["asm"]["eq"]).apply(null,arguments)};var dynCall_vif=Module["dynCall_vif"]=function(){return(dynCall_vif=Module["dynCall_vif"]=Module["asm"]["fq"]).apply(null,arguments)};var dynCall_vid=Module["dynCall_vid"]=function(){return(dynCall_vid=Module["dynCall_vid"]=Module["asm"]["gq"]).apply(null,arguments)};var dynCall_viiiiif=Module["dynCall_viiiiif"]=function(){return(dynCall_viiiiif=Module["dynCall_viiiiif"]=Module["asm"]["hq"]).apply(null,arguments)};var dynCall_viiiif=Module["dynCall_viiiif"]=function(){return(dynCall_viiiif=Module["dynCall_viiiif"]=Module["asm"]["iq"]).apply(null,arguments)};var dynCall_viiiiiif=Module["dynCall_viiiiiif"]=function(){return(dynCall_viiiiiif=Module["dynCall_viiiiiif"]=Module["asm"]["jq"]).apply(null,arguments)};var dynCall_iiif=Module["dynCall_iiif"]=function(){return(dynCall_iiif=Module["dynCall_iiif"]=Module["asm"]["kq"]).apply(null,arguments)};var dynCall_fif=Module["dynCall_fif"]=function(){return(dynCall_fif=Module["dynCall_fif"]=Module["asm"]["lq"]).apply(null,arguments)};var dynCall_iiiiiifff=Module["dynCall_iiiiiifff"]=function(){return(dynCall_iiiiiifff=Module["dynCall_iiiiiifff"]=Module["asm"]["mq"]).apply(null,arguments)};var dynCall_iiiiiifiif=Module["dynCall_iiiiiifiif"]=function(){return(dynCall_iiiiiifiif=Module["dynCall_iiiiiifiif"]=Module["asm"]["nq"]).apply(null,arguments)};var dynCall_iiiiiiifiif=Module["dynCall_iiiiiiifiif"]=function(){return(dynCall_iiiiiiifiif=Module["dynCall_iiiiiiifiif"]=Module["asm"]["oq"]).apply(null,arguments)};var dynCall_fiff=Module["dynCall_fiff"]=function(){return(dynCall_fiff=Module["dynCall_fiff"]=Module["asm"]["pq"]).apply(null,arguments)};var dynCall_fiiiiiifiifif=Module["dynCall_fiiiiiifiifif"]=function(){return(dynCall_fiiiiiifiifif=Module["dynCall_fiiiiiifiifif"]=Module["asm"]["qq"]).apply(null,arguments)};var dynCall_fiiiiiifiiiif=Module["dynCall_fiiiiiifiiiif"]=function(){return(dynCall_fiiiiiifiiiif=Module["dynCall_fiiiiiifiiiif"]=Module["asm"]["rq"]).apply(null,arguments)};var dynCall_iifiiiijii=Module["dynCall_iifiiiijii"]=function(){return(dynCall_iifiiiijii=Module["dynCall_iifiiiijii"]=Module["asm"]["sq"]).apply(null,arguments)};var dynCall_vifijii=Module["dynCall_vifijii"]=function(){return(dynCall_vifijii=Module["dynCall_vifijii"]=Module["asm"]["tq"]).apply(null,arguments)};var dynCall_iiiifffiii=Module["dynCall_iiiifffiii"]=function(){return(dynCall_iiiifffiii=Module["dynCall_iiiifffiii"]=Module["asm"]["uq"]).apply(null,arguments)};var dynCall_iiiifffffi=Module["dynCall_iiiifffffi"]=function(){return(dynCall_iiiifffffi=Module["dynCall_iiiifffffi"]=Module["asm"]["vq"]).apply(null,arguments)};var dynCall_viffiiiif=Module["dynCall_viffiiiif"]=function(){return(dynCall_viffiiiif=Module["dynCall_viffiiiif"]=Module["asm"]["wq"]).apply(null,arguments)};var dynCall_viffiifffffiii=Module["dynCall_viffiifffffiii"]=function(){return(dynCall_viffiifffffiii=Module["dynCall_viffiifffffiii"]=Module["asm"]["xq"]).apply(null,arguments)};var dynCall_viffffiifffiiiiif=Module["dynCall_viffffiifffiiiiif"]=function(){return(dynCall_viffffiifffiiiiif=Module["dynCall_viffffiifffiiiiif"]=Module["asm"]["yq"]).apply(null,arguments)};var dynCall_iiiifffffii=Module["dynCall_iiiifffffii"]=function(){return(dynCall_iiiifffffii=Module["dynCall_iiiifffffii"]=Module["asm"]["zq"]).apply(null,arguments)};var dynCall_viiiiiiiiiiifii=Module["dynCall_viiiiiiiiiiifii"]=function(){return(dynCall_viiiiiiiiiiifii=Module["dynCall_viiiiiiiiiiifii"]=Module["asm"]["Aq"]).apply(null,arguments)};var dynCall_viff=Module["dynCall_viff"]=function(){return(dynCall_viff=Module["dynCall_viff"]=Module["asm"]["Bq"]).apply(null,arguments)};var dynCall_iiiiifiiiiif=Module["dynCall_iiiiifiiiiif"]=function(){return(dynCall_iiiiifiiiiif=Module["dynCall_iiiiifiiiiif"]=Module["asm"]["Cq"]).apply(null,arguments)};var dynCall_viiifiiiii=Module["dynCall_viiifiiiii"]=function(){return(dynCall_viiifiiiii=Module["dynCall_viiifiiiii"]=Module["asm"]["Dq"]).apply(null,arguments)};var dynCall_viiiifiiiiif=Module["dynCall_viiiifiiiiif"]=function(){return(dynCall_viiiifiiiiif=Module["dynCall_viiiifiiiiif"]=Module["asm"]["Eq"]).apply(null,arguments)};var dynCall_iifff=Module["dynCall_iifff"]=function(){return(dynCall_iifff=Module["dynCall_iifff"]=Module["asm"]["Fq"]).apply(null,arguments)};var dynCall_iif=Module["dynCall_iif"]=function(){return(dynCall_iif=Module["dynCall_iif"]=Module["asm"]["Gq"]).apply(null,arguments)};var dynCall_viijijj=Module["dynCall_viijijj"]=function(){return(dynCall_viijijj=Module["dynCall_viijijj"]=Module["asm"]["Hq"]).apply(null,arguments)};var dynCall_viijj=Module["dynCall_viijj"]=function(){return(dynCall_viijj=Module["dynCall_viijj"]=Module["asm"]["Iq"]).apply(null,arguments)};var dynCall_viiiij=Module["dynCall_viiiij"]=function(){return(dynCall_viiiij=Module["dynCall_viiiij"]=Module["asm"]["Jq"]).apply(null,arguments)};var dynCall_iiijji=Module["dynCall_iiijji"]=function(){return(dynCall_iiijji=Module["dynCall_iiijji"]=Module["asm"]["Kq"]).apply(null,arguments)};var dynCall_ijjiiiii=Module["dynCall_ijjiiiii"]=function(){return(dynCall_ijjiiiii=Module["dynCall_ijjiiiii"]=Module["asm"]["Lq"]).apply(null,arguments)};var dynCall_iiiiiifffiiifiii=Module["dynCall_iiiiiifffiiifiii"]=function(){return(dynCall_iiiiiifffiiifiii=Module["dynCall_iiiiiifffiiifiii"]=Module["asm"]["Mq"]).apply(null,arguments)};var dynCall_viid=Module["dynCall_viid"]=function(){return(dynCall_viid=Module["dynCall_viid"]=Module["asm"]["Nq"]).apply(null,arguments)};var dynCall_fiiiif=Module["dynCall_fiiiif"]=function(){return(dynCall_fiiiif=Module["dynCall_fiiiif"]=Module["asm"]["Oq"]).apply(null,arguments)};var dynCall_iiiiiff=Module["dynCall_iiiiiff"]=function(){return(dynCall_iiiiiff=Module["dynCall_iiiiiff"]=Module["asm"]["Pq"]).apply(null,arguments)};var dynCall_viffff=Module["dynCall_viffff"]=function(){return(dynCall_viffff=Module["dynCall_viffff"]=Module["asm"]["Qq"]).apply(null,arguments)};var dynCall_vifff=Module["dynCall_vifff"]=function(){return(dynCall_vifff=Module["dynCall_vifff"]=Module["asm"]["Rq"]).apply(null,arguments)};var dynCall_viifff=Module["dynCall_viifff"]=function(){return(dynCall_viifff=Module["dynCall_viifff"]=Module["asm"]["Sq"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["Tq"]).apply(null,arguments)};var dynCall_vf=Module["dynCall_vf"]=function(){return(dynCall_vf=Module["dynCall_vf"]=Module["asm"]["Uq"]).apply(null,arguments)};var dynCall_vffff=Module["dynCall_vffff"]=function(){return(dynCall_vffff=Module["dynCall_vffff"]=Module["asm"]["Vq"]).apply(null,arguments)};var dynCall_vff=Module["dynCall_vff"]=function(){return(dynCall_vff=Module["dynCall_vff"]=Module["asm"]["Wq"]).apply(null,arguments)};var dynCall_vfff=Module["dynCall_vfff"]=function(){return(dynCall_vfff=Module["dynCall_vfff"]=Module["asm"]["Xq"]).apply(null,arguments)};var dynCall_iiff=Module["dynCall_iiff"]=function(){return(dynCall_iiff=Module["dynCall_iiff"]=Module["asm"]["Yq"]).apply(null,arguments)};var dynCall_f=Module["dynCall_f"]=function(){return(dynCall_f=Module["dynCall_f"]=Module["asm"]["Zq"]).apply(null,arguments)};var dynCall_vffffffi=Module["dynCall_vffffffi"]=function(){return(dynCall_vffffffi=Module["dynCall_vffffffi"]=Module["asm"]["_q"]).apply(null,arguments)};var dynCall_ff=Module["dynCall_ff"]=function(){return(dynCall_ff=Module["dynCall_ff"]=Module["asm"]["$q"]).apply(null,arguments)};var dynCall_if=Module["dynCall_if"]=function(){return(dynCall_if=Module["dynCall_if"]=Module["asm"]["ar"]).apply(null,arguments)};var dynCall_iiiiiiifiii=Module["dynCall_iiiiiiifiii"]=function(){return(dynCall_iiiiiiifiii=Module["dynCall_iiiiiiifiii"]=Module["asm"]["br"]).apply(null,arguments)};var dynCall_fiif=Module["dynCall_fiif"]=function(){return(dynCall_fiif=Module["dynCall_fiif"]=Module["asm"]["cr"]).apply(null,arguments)};var dynCall_iiiiiiffiiiiiiiiiffffiii=Module["dynCall_iiiiiiffiiiiiiiiiffffiii"]=function(){return(dynCall_iiiiiiffiiiiiiiiiffffiii=Module["dynCall_iiiiiiffiiiiiiiiiffffiii"]=Module["asm"]["dr"]).apply(null,arguments)};var dynCall_viififi=Module["dynCall_viififi"]=function(){return(dynCall_viififi=Module["dynCall_viififi"]=Module["asm"]["er"]).apply(null,arguments)};var dynCall_viiiiiiiijiii=Module["dynCall_viiiiiiiijiii"]=function(){return(dynCall_viiiiiiiijiii=Module["dynCall_viiiiiiiijiii"]=Module["asm"]["fr"]).apply(null,arguments)};function invoke_iii(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_fiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_diii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viif(index,a1,a2,a3){var sp=stackSave();try{dynCall_viif(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{dynCall_v(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return dynCall_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iiiiiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viiiiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return dynCall_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiff(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiff(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fi(index,a1){var sp=stackSave();try{return dynCall_fi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_diiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_diiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fii(index,a1,a2){var sp=stackSave();try{return dynCall_fii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viifi(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viifi(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viffffi(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viffffi(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_dddi(index,a1,a2,a3){var sp=stackSave();try{return dynCall_dddi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{dynCall_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viffi(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viffi(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiifi(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiifi(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ffi(index,a1,a2){var sp=stackSave();try{return dynCall_ffi(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vidi(index,a1,a2,a3){var sp=stackSave();try{dynCall_vidi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vifi(index,a1,a2,a3){var sp=stackSave();try{dynCall_vifi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{dynCall_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{dynCall_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return dynCall_iiiiiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiifi(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_viiiiifi(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiffi(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{dynCall_viiiiiffi(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{return dynCall_iiiiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_fiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{dynCall_viifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iifii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iifii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vfi(index,a1,a2){var sp=stackSave();try{dynCall_vfi(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{dynCall_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fffi(index,a1,a2,a3){var sp=stackSave();try{return dynCall_fffi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viifffi(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viifffi(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiiifi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{dynCall_viiiiiiiiifi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return dynCall_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{return dynCall_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_dii(index,a1,a2){var sp=stackSave();try{return dynCall_dii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{dynCall_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ifi(index,a1,a2){var sp=stackSave();try{return dynCall_ifi(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_idi(index,a1,a2){var sp=stackSave();try{return dynCall_idi(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iidi(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iidi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iifi(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iifi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiif(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiif(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13){var sp=stackSave();try{dynCall_viiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiifi(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiifi(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiffi(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiffi(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viidi(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viidi(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viifffffi(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{dynCall_viifffffi(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fifi(index,a1,a2,a3){var sp=stackSave();try{return dynCall_fifi(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiifffiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{dynCall_viiiiifffiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_fiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_fiiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiifi(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viiiifi(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{return dynCall_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiidii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iiiidii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiifii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iiiifii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_jiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiij(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiij(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_j(index){var sp=stackSave();try{return dynCall_j(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iij(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiijiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return dynCall_iiijiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return dynCall_ji(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return dynCall_jii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vijii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_vijii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vijiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_vijiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiji(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jijiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_jijiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_jiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viji(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viji(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiji(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiji(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ijji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_ijji(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jji(index,a1,a2,a3){var sp=stackSave();try{return dynCall_jji(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jjji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_jjji(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iji(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iji(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiji(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viiiji(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iijii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iijii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiijjii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{return dynCall_iiiijjii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viijii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_viijii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iijiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iijiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iijjiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return dynCall_iijjiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{return dynCall_iijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiiji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_jiiji(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viijiiijiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13){var sp=stackSave();try{dynCall_viijiiijiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jdi(index,a1,a2){var sp=stackSave();try{return dynCall_jdi(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vijjji(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{dynCall_vijjji(index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiij(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iiiiij(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{return dynCall_jiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_dji(index,a1,a2,a3){var sp=stackSave();try{return dynCall_dji(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jjii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_jjii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiji(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jijj(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_jijj(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return dynCall_iiiiiiiiiji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vji(index,a1,a2,a3){var sp=stackSave();try{dynCall_vji(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiij(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiij(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiji(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_jiji(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iijji(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iijji(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viij(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vijiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{dynCall_vijiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vjjjiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{dynCall_vjjjiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vjiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_vjiiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{dynCall_viijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_jiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_jiiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiijii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return dynCall_iiiijii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["stackTrace"]=stackTrace;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["stackTrace"]=stackTrace;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(thisProgram);for(var i=1;i>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=entryFunction(argc,argv);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="unwind"){return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);quit_(1,e)}}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(implicit&&keepRuntimeAlive()&&status===0){return}if(keepRuntimeAlive()){}else{exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); + +} diff --git a/public/unitybuild/LevelEditor.loader.js b/public/unitybuild/LevelEditor.loader.js new file mode 100755 index 00000000..6bcb648e --- /dev/null +++ b/public/unitybuild/LevelEditor.loader.js @@ -0,0 +1 @@ +function createUnityInstance(t,r,d){function i(e,t){if(!i.aborted&&r.showBanner)return"error"==t&&(i.aborted=!0),r.showBanner(e,t);switch(t){case"error":console.error(e);break;case"warning":console.warn(e);break;default:console.log(e)}}function n(e){var t=e.reason||e.error,r=t?t.toString():e.message||e.reason||"",n=t&&t.stack?t.stack.toString():"";(r+="\n"+(n=n.startsWith(r)?n.substring(r.length):n).trim())&&c.stackTraceRegExp&&c.stackTraceRegExp.test(r)&&C(r,e.filename||t&&(t.fileName||t.sourceURL)||"",e.lineno||t&&(t.lineNumber||t.line)||0)}function e(e,t,r){var n=e[t];void 0!==n&&n||(console.warn('Config option "'+t+'" is missing or empty. Falling back to default value: "'+r+'". Consider updating your WebGL template to include the missing config option.'),e[t]=r)}d=d||function(){};var o,c={canvas:t,webglContextAttributes:{preserveDrawingBuffer:!1,powerPreference:2},cacheControl:function(e){return e==c.dataUrl?"must-revalidate":"no-store"},streamingAssetsUrl:"StreamingAssets",downloadProgress:{},deinitializers:[],intervals:{},setInterval:function(e,t){e=window.setInterval(e,t);return this.intervals[e]=!0,e},clearInterval:function(e){delete this.intervals[e],window.clearInterval(e)},preRun:[],postRun:[],print:function(e){console.log(e)},printErr:function(e){console.error(e),"string"==typeof e&&-1!=e.indexOf("wasm streaming compile failed")&&(-1!=e.toLowerCase().indexOf("mime")?i('HTTP Response Header "Content-Type" configured incorrectly on the server for file '+c.codeUrl+' , should be "application/wasm". Startup time performance will suffer.',"warning"):i('WebAssembly streaming compilation failed! This can happen for example if "Content-Encoding" HTTP header is incorrectly enabled on the server for file '+c.codeUrl+", but the file is not pre-compressed on disk (or vice versa). Check the Network tab in browser Devtools to debug server header configuration.","warning"))},locateFile:function(e){return"build.wasm"==e?this.codeUrl:e},disabledCanvasEvents:["contextmenu","dragstart"]};for(o in e(r,"companyName","Unity"),e(r,"productName","WebGL Player"),e(r,"productVersion","1.0"),r)c[o]=r[o];c.streamingAssetsUrl=new URL(c.streamingAssetsUrl,document.URL).href;var a=c.disabledCanvasEvents.slice();function s(e){e.preventDefault()}a.forEach(function(e){t.addEventListener(e,s)}),window.addEventListener("error",n),window.addEventListener("unhandledrejection",n),c.deinitializers.push(function(){for(var e in c.disableAccessToMediaDevices(),a.forEach(function(e){t.removeEventListener(e,s)}),window.removeEventListener("error",n),window.removeEventListener("unhandledrejection",n),c.intervals)window.clearInterval(e);c.intervals={}}),c.QuitCleanup=function(){for(var e=0;eIf using custom web server, verify that web server is sending .br files with HTTP Response Header "Content-Encoding: br". Brotli compression may not be supported in Firefox over HTTP connections. '+n+' See https://bugzilla.mozilla.org/show_bug.cgi?id=1670675 for more information.':"Unable to parse "+c.frameworkUrl+'!
If using custom web server, verify that web server is sending .br files with HTTP Response Header "Content-Encoding: br". Brotli compression may not be supported over HTTP connections. Migrate your server to use HTTPS.'),void i(r,"error"))}i("Unable to parse "+c.frameworkUrl+"! The file is corrupt, or compression was misconfigured? (check Content-Encoding HTTP Response Header on web server)","error")}var o=unityFramework;unityFramework=null,s.onload=null,a(o)},s.onerror=function(e){i("Unable to load file "+c.frameworkUrl+"! Check that the file exists on the remote server. (also check browser Console and Devtools Network tab to debug)","error")},document.body.appendChild(s),c.deinitializers.push(function(){document.body.removeChild(s)})}).then(function(e){e(c)});x(r="dataUrl"),e=c.cacheControl(c[r]),t=c.companyName&&c.productName?c.cachedFetch:c.fetchWithProgress,n=c[r],n=/file:\/\//.exec(n)?"same-origin":void 0;var r,e,t,n,o=t(c[r],{method:"GET",companyName:c.companyName,productName:c.productName,control:e,mode:n,onProgress:function(e){x(r,e)}}).then(function(e){return e.parsedBody}).catch(function(e){var t="Failed to download file "+c[r];"file:"==location.protocol?i(t+". Loading web pages via a file:// URL without a web server is not supported by this browser. Please use a local development web server to host Unity content, or use the Unity Build and Run option.","error"):console.error(t)});c.preRun.push(function(){c.addRunDependency("dataUrl"),o.then(function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength),r=0,n="UnityWebData1.0\0";if(!String.fromCharCode.apply(null,e.subarray(r,r+n.length))==n)throw"unknown data format";var o=t.getUint32(r+=n.length,!0);for(r+=4;r { - let this_state = 1; - if (AchievementState !== null && AchievementState !== undefined) this_state = AchievementState[index]; - - let image_size = !isMobile ? "100px" : "50px"; - let divider_size = !isMobile ? "100px" : "70px"; - return ( -
- - -
- -
- - - - - {AchievementMetaData[index].name} - - {show_mint && (this_state === 2 || this_state === 3) ? ( - - {AchievementMetaData[index].description} - - ClaimAchievement(index)} borderWidth="2px" borderColor="white" width="60px"> - - Mint - - - - ) : ( - - {AchievementMetaData[index].description} - - )} - - {AchievementMetaData[index].percent}% of players unlocked this - - - -
-
- ); -}; - -export function AchievementsScreen({ AchievementState, ClaimAchievement }: { AchievementState: number[] | null; ClaimAchievement: any }) { - return ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/src/components/apps/dungeon/constants.tsx b/src/components/apps/dungeon/constants.tsx index b75a8206..33d4625a 100644 --- a/src/components/apps/dungeon/constants.tsx +++ b/src/components/apps/dungeon/constants.tsx @@ -51,7 +51,7 @@ if (isMobile) { POTION_SIZE = 20; } -export const PROD = true; +export const PROD = false; export const TEST = false; export const DEBUG = false; @@ -82,6 +82,7 @@ export const enum Screen { STATS_SCREEN = 9, MARKETPLACE_SCREEN = 10, ARENA_SCREEN = 11, + REST_SCREEN = 12, } export const enum KeyType { diff --git a/src/components/apps/dungeon/css/unity.css b/src/components/apps/dungeon/css/unity.css new file mode 100644 index 00000000..c1744708 --- /dev/null +++ b/src/components/apps/dungeon/css/unity.css @@ -0,0 +1,42 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; +} + +.container .unityWrapper { + background: #cecece; + width: 1200px; + height: 600px; + display: flex; + align-items: center; + justify-content: center; +} + +.container .unityWrapper .loadingBar { + background: #8c8c8c; + width: 400px; + height: 10px; + border-radius: 5px; + overflow: hidden; +} + +.container .unityWrapper .loadingBar .loadingBarFill { + height: 6px; + border-radius: 5px; + margin: 2px; + background: #ffffff; + transition: 0.3s width ease-out; +} + +.container .unityWrapper canvas { + width: 100%; + height: 100%; +} + +.container .screenshots { + display: grid; + gap: 20px; + grid-template-columns: repeat(3, 1fr); +} \ No newline at end of file diff --git a/src/components/apps/dungeon/dice_images/b1.png b/src/components/apps/dungeon/dice_images/b1.png deleted file mode 100644 index dfac34dd..00000000 Binary files a/src/components/apps/dungeon/dice_images/b1.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b10.png b/src/components/apps/dungeon/dice_images/b10.png deleted file mode 100644 index 0cc8dc3f..00000000 Binary files a/src/components/apps/dungeon/dice_images/b10.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b11.png b/src/components/apps/dungeon/dice_images/b11.png deleted file mode 100644 index db3b5bee..00000000 Binary files a/src/components/apps/dungeon/dice_images/b11.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b12.png b/src/components/apps/dungeon/dice_images/b12.png deleted file mode 100644 index 8e4c0a61..00000000 Binary files a/src/components/apps/dungeon/dice_images/b12.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b13.png b/src/components/apps/dungeon/dice_images/b13.png deleted file mode 100644 index a17f082c..00000000 Binary files a/src/components/apps/dungeon/dice_images/b13.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b14.png b/src/components/apps/dungeon/dice_images/b14.png deleted file mode 100644 index 978e2732..00000000 Binary files a/src/components/apps/dungeon/dice_images/b14.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b15.png b/src/components/apps/dungeon/dice_images/b15.png deleted file mode 100644 index 77b168c8..00000000 Binary files a/src/components/apps/dungeon/dice_images/b15.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b16.png b/src/components/apps/dungeon/dice_images/b16.png deleted file mode 100644 index bb63e77d..00000000 Binary files a/src/components/apps/dungeon/dice_images/b16.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b17.png b/src/components/apps/dungeon/dice_images/b17.png deleted file mode 100644 index a25606a4..00000000 Binary files a/src/components/apps/dungeon/dice_images/b17.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b18.png b/src/components/apps/dungeon/dice_images/b18.png deleted file mode 100644 index 6f3fffdf..00000000 Binary files a/src/components/apps/dungeon/dice_images/b18.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b19.png b/src/components/apps/dungeon/dice_images/b19.png deleted file mode 100644 index 46021054..00000000 Binary files a/src/components/apps/dungeon/dice_images/b19.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b2.png b/src/components/apps/dungeon/dice_images/b2.png deleted file mode 100644 index 6ee07520..00000000 Binary files a/src/components/apps/dungeon/dice_images/b2.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b20.png b/src/components/apps/dungeon/dice_images/b20.png deleted file mode 100644 index 5acb966b..00000000 Binary files a/src/components/apps/dungeon/dice_images/b20.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b3.png b/src/components/apps/dungeon/dice_images/b3.png deleted file mode 100644 index cfe11928..00000000 Binary files a/src/components/apps/dungeon/dice_images/b3.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b4.png b/src/components/apps/dungeon/dice_images/b4.png deleted file mode 100644 index 8ffb6e90..00000000 Binary files a/src/components/apps/dungeon/dice_images/b4.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b5.png b/src/components/apps/dungeon/dice_images/b5.png deleted file mode 100644 index c5993fe2..00000000 Binary files a/src/components/apps/dungeon/dice_images/b5.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b6.png b/src/components/apps/dungeon/dice_images/b6.png deleted file mode 100644 index d94e6e19..00000000 Binary files a/src/components/apps/dungeon/dice_images/b6.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b7.png b/src/components/apps/dungeon/dice_images/b7.png deleted file mode 100644 index ce5fb618..00000000 Binary files a/src/components/apps/dungeon/dice_images/b7.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b8.png b/src/components/apps/dungeon/dice_images/b8.png deleted file mode 100644 index c2ff36f4..00000000 Binary files a/src/components/apps/dungeon/dice_images/b8.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/b9.png b/src/components/apps/dungeon/dice_images/b9.png deleted file mode 100644 index 64b2e3fa..00000000 Binary files a/src/components/apps/dungeon/dice_images/b9.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r1.png b/src/components/apps/dungeon/dice_images/r1.png deleted file mode 100644 index 1803b731..00000000 Binary files a/src/components/apps/dungeon/dice_images/r1.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r10.png b/src/components/apps/dungeon/dice_images/r10.png deleted file mode 100644 index 7855f0b2..00000000 Binary files a/src/components/apps/dungeon/dice_images/r10.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r11.png b/src/components/apps/dungeon/dice_images/r11.png deleted file mode 100644 index 717773e5..00000000 Binary files a/src/components/apps/dungeon/dice_images/r11.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r12.png b/src/components/apps/dungeon/dice_images/r12.png deleted file mode 100644 index 142cd915..00000000 Binary files a/src/components/apps/dungeon/dice_images/r12.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r13.png b/src/components/apps/dungeon/dice_images/r13.png deleted file mode 100644 index 83be8ec5..00000000 Binary files a/src/components/apps/dungeon/dice_images/r13.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r14.png b/src/components/apps/dungeon/dice_images/r14.png deleted file mode 100644 index f071a4ff..00000000 Binary files a/src/components/apps/dungeon/dice_images/r14.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r15.png b/src/components/apps/dungeon/dice_images/r15.png deleted file mode 100644 index 0703cbe7..00000000 Binary files a/src/components/apps/dungeon/dice_images/r15.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r16.png b/src/components/apps/dungeon/dice_images/r16.png deleted file mode 100644 index 548cce23..00000000 Binary files a/src/components/apps/dungeon/dice_images/r16.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r17.png b/src/components/apps/dungeon/dice_images/r17.png deleted file mode 100644 index c8f19fe5..00000000 Binary files a/src/components/apps/dungeon/dice_images/r17.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r18.png b/src/components/apps/dungeon/dice_images/r18.png deleted file mode 100644 index cb25f97d..00000000 Binary files a/src/components/apps/dungeon/dice_images/r18.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r19.png b/src/components/apps/dungeon/dice_images/r19.png deleted file mode 100644 index 7d6c1874..00000000 Binary files a/src/components/apps/dungeon/dice_images/r19.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r2.png b/src/components/apps/dungeon/dice_images/r2.png deleted file mode 100644 index 7de8e5a8..00000000 Binary files a/src/components/apps/dungeon/dice_images/r2.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r20.png b/src/components/apps/dungeon/dice_images/r20.png deleted file mode 100644 index 6de68c77..00000000 Binary files a/src/components/apps/dungeon/dice_images/r20.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r3.png b/src/components/apps/dungeon/dice_images/r3.png deleted file mode 100644 index 3c977d28..00000000 Binary files a/src/components/apps/dungeon/dice_images/r3.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r4.png b/src/components/apps/dungeon/dice_images/r4.png deleted file mode 100644 index ceeedaeb..00000000 Binary files a/src/components/apps/dungeon/dice_images/r4.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r5.png b/src/components/apps/dungeon/dice_images/r5.png deleted file mode 100644 index fec13634..00000000 Binary files a/src/components/apps/dungeon/dice_images/r5.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r6.png b/src/components/apps/dungeon/dice_images/r6.png deleted file mode 100644 index a8022fce..00000000 Binary files a/src/components/apps/dungeon/dice_images/r6.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r7.png b/src/components/apps/dungeon/dice_images/r7.png deleted file mode 100644 index 65d4ddb0..00000000 Binary files a/src/components/apps/dungeon/dice_images/r7.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r8.png b/src/components/apps/dungeon/dice_images/r8.png deleted file mode 100644 index 3be0af0d..00000000 Binary files a/src/components/apps/dungeon/dice_images/r8.png and /dev/null differ diff --git a/src/components/apps/dungeon/dice_images/r9.png b/src/components/apps/dungeon/dice_images/r9.png deleted file mode 100644 index 4367e174..00000000 Binary files a/src/components/apps/dungeon/dice_images/r9.png and /dev/null differ diff --git a/src/components/apps/dungeon/dungeon_state.tsx b/src/components/apps/dungeon/dungeon_state.tsx deleted file mode 100644 index 90fa7488..00000000 --- a/src/components/apps/dungeon/dungeon_state.tsx +++ /dev/null @@ -1,974 +0,0 @@ -import { Box, Center, Text, HStack, VStack } from "@chakra-ui/react"; -import { isMobile } from "react-device-detect"; - -// dungeon constants -import { DUNGEON_FONT_SIZE, levels } from "./constants"; -import { PlayerData } from "./utils"; - -//enemies -import assassin from "./images/Assassin.gif"; -import blue_slime from "./images/Blue_Slime.gif"; -import boulder from "./images/Boulder.png"; -import carnivine from "./images/Carnivine.gif"; -import dungeon_master from "./images/Dungeon_Master.gif"; -import elves from "./images/Elves.gif"; -import giant_blue_slime from "./images/Giant_Blue_Slime.gif"; -import giant_green_slime from "./images/Giant_Green_Slime.gif"; -import giant_rat from "./images/Giant_Rat.gif"; -import giant_spider from "./images/Giant_Spider.gif"; -import goblins from "./images/Goblins.gif"; -import green_slime from "./images/Green_Slime.gif"; -import mimic from "./images/Mimic.gif"; -import orc from "./images/Orc.gif"; -import shade from "./images/Shade.gif"; -import skeleton_knight from "./images/Skelly_Knight.gif"; -import skeletons from "./images/Skellies.gif"; -import skeleton_wizard from "./images/Skelly_Wiz.gif"; -import floor_spikes from "./images/Spikes.png"; -import werewolf from "./images/Werewolf.gif"; - -import closed_chest from "./images/chest_closed.png"; -import open_chest from "./images/chest_open.png"; -import bones from "./images/Bones.png"; -import green_slime_corpse from "./images/slime_corpse.png"; -import blue_slime_corpse from "./images/Blue_Slime_Corpse.png"; -import spider_corpse from "./images/Spider_Corpse.png"; -import carnivine_corpse from "./images/Vine_Corpse.png"; -import werewolf_corpse from "./images/Wolf_Corpse.png"; -import shade_corpse from "./images/Shade_Corpse.png"; - -//characters -import knight from "./images/Knight.gif"; -import ranger from "./images/Ranger.gif"; -import wizard from "./images/Wizard.gif"; -import corpse from "./images/Corpse.png"; - -import loot from "./images/loot.png"; -import hour_glass from "./images/Hourglass.gif"; - -import rd20_1 from "./dice_images/r1.png"; -import rd20_2 from "./dice_images/r2.png"; -import rd20_3 from "./dice_images/r3.png"; -import rd20_4 from "./dice_images/r4.png"; -import rd20_5 from "./dice_images/r5.png"; -import rd20_6 from "./dice_images/r6.png"; -import rd20_7 from "./dice_images/r7.png"; -import rd20_8 from "./dice_images/r8.png"; -import rd20_9 from "./dice_images/r9.png"; -import rd20_10 from "./dice_images/r10.png"; -import rd20_11 from "./dice_images/r11.png"; -import rd20_12 from "./dice_images/r12.png"; -import rd20_13 from "./dice_images/r13.png"; -import rd20_14 from "./dice_images/r14.png"; -import rd20_15 from "./dice_images/r15.png"; -import rd20_16 from "./dice_images/r16.png"; -import rd20_17 from "./dice_images/r17.png"; -import rd20_18 from "./dice_images/r18.png"; -import rd20_19 from "./dice_images/r19.png"; -import rd20_20 from "./dice_images/r20.png"; - -import bd20_1 from "./dice_images/b1.png"; -import bd20_2 from "./dice_images/b2.png"; -import bd20_3 from "./dice_images/b3.png"; -import bd20_4 from "./dice_images/b4.png"; -import bd20_5 from "./dice_images/b5.png"; -import bd20_6 from "./dice_images/b6.png"; -import bd20_7 from "./dice_images/b7.png"; -import bd20_8 from "./dice_images/b8.png"; -import bd20_9 from "./dice_images/b9.png"; -import bd20_10 from "./dice_images/b10.png"; -import bd20_11 from "./dice_images/b11.png"; -import bd20_12 from "./dice_images/b12.png"; -import bd20_13 from "./dice_images/b13.png"; -import bd20_14 from "./dice_images/b14.png"; -import bd20_15 from "./dice_images/b15.png"; -import bd20_16 from "./dice_images/b16.png"; -import bd20_17 from "./dice_images/b17.png"; -import bd20_18 from "./dice_images/b18.png"; -import bd20_19 from "./dice_images/b19.png"; -import bd20_20 from "./dice_images/b20.png"; - -let red_dice_array: string[] = [ - rd20_1, - rd20_2, - rd20_3, - rd20_4, - rd20_5, - rd20_6, - rd20_7, - rd20_8, - rd20_9, - rd20_10, - rd20_11, - rd20_12, - rd20_13, - rd20_14, - rd20_15, - rd20_16, - rd20_17, - rd20_18, - rd20_19, - rd20_20, -]; - -let blue_dice_array: string[] = [ - bd20_1, - bd20_2, - bd20_3, - bd20_4, - bd20_5, - bd20_6, - bd20_7, - bd20_8, - bd20_9, - bd20_10, - bd20_11, - bd20_12, - bd20_13, - bd20_14, - bd20_15, - bd20_16, - bd20_17, - bd20_18, - bd20_19, - bd20_20, -]; - -export const WIN_FACTORS: number[] = [1.0, 1.5, 2.25, 3.375, 6.75, 13.5, 27, 54]; - -var seedrandom = require("seedrandom"); - -export const enum DungeonInstruction { - add_funds = 0, - play = 1, - quit = 2, - explore = 3, - claim_achievement = 4, - drink_potion = 5, - buy_potion = 6, - build_home = 7, - rest = 8, -} - -export const enum DungeonCharacter { - knight = 0, - ranger = 1, - wizard = 2, -} - -export const enum DungeonEnemy { - Assassin = 0, - BlueSlime, - BoulderTrap, - Carnivine, - DM, - Elves, - GiantBlueSlime, - GiantGreenSlime, - GiantRat, - GiantSpider, - Goblins, - GreenSlime, - Mimic, - Orc, - Shade, - SkeletonKnight, - Skeletons, - SkeletonWizard, - SpikeTrap, - Werewolf, - None, -} - -export const DungeonCharacterEmoji: string[] = [ - "", - "", - "", -]; - -export const GoldEmoji: string = ""; - -export const DungeonEnemyEmoji: string[] = [ - "", - "", - "<:Boulder:1070460848155410432>", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "<:Spikes:1070471412084654080>", - "", -]; - -export const enum DungeonStatus { - unknown = 0, - alive = 1, - dead = 2, - exploring = 3, -} - -const DungeonEnemyAppearsText: string[][] = [ - // assasin - [ - "You have encountered an Assassin, prepare yourself!", - "A smoke bomb goes off at the end of the corridor and an assassin flits into view. Prepare yourself!", - ], - // blue slime - [ - "You have encountered an blue slime, prepare yourself!", - "A Blue Slime squeezes out of a crack in the wall, prepare yourself!", - "A Blue Slime drops from the ceiling, prepare yourself!", - ], - // boulder - ["You enter a suspiciously empty room...", "The hallway is dark but it seems empty..."], - // carnivine - [ - "You have encountered a Carnivine, prepare yourself!", - "The smell of flowers makes you relax, but only until you see the source is a Carnivine. Prepare yourself!", - "Thick vines cover the walls. You've entered the lair of a Carnivine! Prepare yourself!", - ], - //dungeon master - [ - "You have encountered a Dungeon Master, prepare yourself!", - "The air begins to crackle around you as a Dungeon Master prepares to attack, get ready!", - ], - // elves - [ - "You have encountered a group of elven archers, prepare yourself!", - "A patrolling group of elven archers turns the corner, prepare yourself!", - ], - // giant blue slime - [ - "You have encountered a giant blue slime, prepare yourself!", - "Multiple blue slimes coalesce before you into a single giant slime! Prepare yourself!", - ], - // giant green slime - [ - "You have encountered a giant green slime, prepare yourself!", - "Multiple green slimes coalesce before you into a single giant slime! Prepare yourself!", - ], - // giant rat - [ - "You have encountered a giant rat, prepare yourself!", - "You notice the terrible stench in the room just as a giant rat bursts from the sewer grate ahead of you. Prepare yourself!", - ], - // giant spider - [ - "You have encountered a giant spider, prepare yourself!", - "A mass of sticky web bars your way. As you start to cut through a giant spider drops from the ceiling, prepare yourself!", - ], - // goblins - ["You have encountered a pair of goblins, prepare yourself!"], - // green slime - [ - "You have encountered an oozing green slime, prepare yourself!", - "A Green Slime squeezes out of a crack in the wall, prepare yourself!", - "A Green Slime drops from the ceiling, prepare yourself!", - ], - // mimic - ["You have found a treasure chest!", "You have found an old rusted treasure chest", "You have found an elaborately gilded coffer"], - // orc - ["You have encountered a huge orc, prepare yourself!", "The ground shakes as a gigantic orc charges towards you, prepare yourself!"], - // shade - [ - "You have encountered a Shade, prepare yourself!", - "The shadows around you start shifting and take on the form of a Shade, prepare yourself!", - ], - // skeleton_knight - ["You have encountered a skeleton knight, prepare yourself!", "An armour-clad skeleton appears, prepare yourself!"], - // skeletons - ["You have encountered a horde of skeletons, prepare yourself!", "You hear the rattling of bones ahead, prepare yourself!"], - // skeleton_wizard - ["You have encountered a skeleton wizard, prepare yourself!", "A skeleton wizard suddenly appears before you, prepare yourself!"], - // spikes - ["You enter a suspiciously empty room...", "The hallway is dark but it seems empty..."], - // werewolf - [ - "You have encountered a werewolf, prepare yourself!", - "You have encountered a strange half naked man... who transforms before you into a werewolf! Prepare yourself!", - ], -]; - -const DungeonEnemyDefeatedText: string[][] = [ - // assassin - [ - "You have defeated the assassin", - "You see through the assassins tricks and are waiting to strike when it next appears in front of you", - "The assassin was quick, but you were quicker", - ], - // blue slime - ["You have defeated the oozing blue slime", "A mere slime is no match for you!"], - // boulder - [ - "...but pass through without incident", - "Just in time you notice a pressure plate hidden amongst the stones on the ground, and carefully step over it to continue onwards", - ], - // carnivine - [ - "You have defeated the carnivine", - "You turn the Carnivine into compost", - "You hack through thorns and leaves until the Carnivine is reduced to mulch", - ], - // dungeon master - [ - "You have defeated the dungeon master", - "The dungeon master starts monologuing in typical villainic style. Its overconfidence is its weakness and mid speech you strike it down", - "Lighting arcs towards you but just misses the mark. You rush in while the dungeon master recharges and cut their head off before they can attack again", - ], - // elves - [ - "You have defeated the group of elven archers", - "You attack before the elves have even noticed you, striking them down faster than they can draw their bows", - ], - // giant blue slime - ["You have defeated the giant blue slime", "Your attack causes the slime to rupture, spilling blue ooze all over the floor"], - // giant green slime - ["You have defeated the giant green slime", "Your attack causes the slime to rupture, spilling green ooze all over the floor"], - // giant rat - ["You have defeated the giant rat", "Living underground has left the rat half blind, and you easily circle around and strike it down"], - // giant spider - ["You have defeated the giant spider", "Running in, you slide beneath the spider and attack its soft underbelly with all your might"], - // goblins - ["You have defeated the pair of goblins", "The goblins were intoxicated from mushroom brew. They barely put up a fight."], - // green slime - ["You have defeated the oozing green slime", "A mere slime is no match for you!"], - // mimic - [ - "You approach with great suspicion, but open it to find it full of gold!", - "You open the chest with care, and find it contains some useful supplies", - ], - // orc - ["You have defeated the orc", "The orcs size means it is too slow to hit you, or defend against your strikes"], - // shade - ["You have defeated the Shade", "The Shade chose the wrong soul to go after and you return it to the shadows"], - // skeleton_knight - [ - "You have defeated the skeleton knight", - "Noticing a crack in the knights armour you strike, and the knights protection disintegrates along with the skeleton itself", - ], - // skeletons - [ - "You have defeated the horde of skeletons", - "You take out the skeletons one by one, leaving nothing but scattered bones across the floor", - ], - // skeleton_wizard - ["You have defeated the skeleton wizard", "Your attacks disrupt the skeleton's incantation, causing it to backfire!"], - // spikes - [ - "...but pass through without incident", - "Just in time you notice a pressure plate hidden amongst the stones on the ground, and carefully step over it to continue onwards", - ], - // werewolf - [ - "You have defeated the werewolf", - "Before the transformation is complete you strike, cutting the head clean off", - "The werewolf attacks with bestial rage, but it is no match for you", - ], -]; - -const DungeonPlayerDefeatedText: string[][] = [ - // assassin - [ - "The assassin has defeated you.", - "Surrounded by fog you can't keep track of the assassins movements. You only learn of its location when you feel its blade in your back", - ], - // blue slime - [ - "The slime oozes past your defenses and envelopes you, suffocating you where you stand", - "Your weapons melt into a pool at your feet as you try to attack, and soon you join them", - ], - // boulder - [ - "A boulder suddenly falls from the ceiling, crushing you instantly.", - "The door behind you slams shut and a boulder starts rolling towards you. With nowhere to run you all you can do is watch with horror as it approaches", - ], - // carvinvine - [ - "The carvnivine has defeated you.", - "Vines wrap around your legs and arms pulling you beneath the soft earth", - "With every vine you cut down another replaces it. Exhausted, you succumb to the Carnivines relentless attacks.", - ], - // dungeon master - [ - "The dungeon master has defeated you.", - "Lightning arcs from the dungeon master and instantly incinerates you as it makes contact", - "Through ancient magics the dungeon master takes control of your body and forces you to end your own life", - ], - // elves - [ - "You take an arrow to the knee, and while stumbling are unable to dodge the next volley to the heart", - "A volley of arrows turns you into a human pin-cushion", - ], - // giant blue slime - [ - "The giant blue slime has defeated you.", - "Your attacks are absorbed by the giant slimes mass. There is nothing you can do as it slowly envelops you.", - "You can see the remains of other adventurers floating inside the giant slime, and realize with horror you will soon be joining them.", - ], - // giant greenf slime - [ - "The giant green slime has defeated you.", - "Your attacks are absorbed by the giant slimes mass. There is nothing you can do as it slowly envelops you.", - "You can see the remains of other adventurers floating inside the giant slime, and realize with horror you will soon be joining them.", - ], - // giant rat - [ - "The giant rat has defeated you.", - "As the rat approaches the smell of decay causes you to gag, and in that moment it strikes.", - "The rat trips you with its tail, and grabbing your ankles in its jaw it drags you into the sewers below", - ], - // giant spider - [ - "The giant spider has defeated you.", - "You get trapped in a mass of spider webs giving the spider ample time to wrap you up for a snack", - "With surprising speed the spider springs from its web and bites you. The venom acts quickly and you fall to the ground paralyzed", - ], - // goblins - ["The goblins are too fast, you lose sight of them for just a second and the next thing you see is a knife to your throat"], - // green slime - [ - "The slime oozes past your defenses and envelopes you, suffocating you where you stand", - "Your weapons melt into a pool at your feet as you try to attack, and soon you join them", - ], - // mimic - [ - "The mimic's transformation stuns you for just a moment, but that is all it needed", - "As you approach the chest you notice it starts to change shape, but before you can draw your weapon the mimic lunges and swallows you whole", - ], - // orc - [ - "With one swing from it's axe the orc cracks your head open like an egg", - "The orc slams into you knocking you to the ground, and then crushes your head like a bug beneath its feet", - ], - // shade - [ - "The Shade's scythe passes through you as though you were no more than air as it claims another soul", - "Your weapons do nothing to the Shade, and it calmly reaches out a shadowy hand to claim your soul", - ], - // skeleton knight - [ - "Your attacks are simply deflected off the knight's armour until it gets bored and strikes you down", - "You are no match for the knight, only pieces are left after it is done with you", - ], - // skeletons - ["The skeletons manage to surround you, and strike from all sides", "There were just.. too many skeletons"], - // skeleton wizard - [ - "Hoarsely croaking some ancient incantation the wizard turns you inside out before you even have a chance to attack", - "You collapse as your life energy is siphoned away by the skeletal mage", - ], - // spikes - [ - "A trapdoor opens beneath your feet, dropping you onto a mass of bloodied spikes.", - "Spikes suddenly burst from holes in the ground beneath your feet and impale you before you can react", - ], - // werewolf - ["The werewolf has defeated you.", "The werewolf leaps on you faster than you can react and tears you to shreds"], -]; - -export function GetCharacterLevel(player_data: PlayerData | null): number { - if (player_data == null) return 1; - - let current_level = 1; - for (let i = 0; i < levels.length; i++) { - if (player_data.character_xp[player_data.player_character] >= levels[i]) { - current_level = i + 1; - } - } - return current_level; -} - -export const DiceRollText = ({ - roll_one, - roll_two, - loading, - player_data, -}: { - roll_one: number; - roll_two: number; - loading: boolean; - player_data: PlayerData | null; -}) => { - let hour_glass_size: string | number = isMobile ? "2.5rem" : "5rem"; - let dice_roll_size: string | number = isMobile ? "64px" : "112px"; - - if (loading) { - return ( - - - Hourglass - - - Loading - - - ); - } - - let level: number = GetCharacterLevel(player_data); - let power_rest: number = player_data === null ? 0 : player_data?.rest_status[player_data?.player_character].power_bonus; - let bonus_roll: string = (Math.floor(level / 2) + power_rest).toFixed(0); - - let advantage = roll_two > 0; - let critical_miss = false; - - if (advantage) { - if (roll_one === 1 && roll_two === 1) critical_miss = true; - - return ( - - - You Rolled With Advantage: - - - roll_two ? red_dice_array[roll_one - 1] : blue_dice_array[roll_one - 1]} - alt={""} - /> - roll_one ? red_dice_array[roll_two - 1] : blue_dice_array[roll_two - 1]} - alt={""} - /> - - {!critical_miss && ( - - +{bonus_roll} Power Roll - - )} - {critical_miss && ( - - Critical Miss! - - )} - - ); - } - - if (roll_one === 1) critical_miss = true; - - // otherwise just return the first dice - return ( - - {""} - {!critical_miss && ( - - +{bonus_roll} Power Roll - - )} - {critical_miss && ( - - Critical Miss! - - )} - - ); -}; - -export const DisplayEnemyAppearsText = ({ - current_enemy, - current_level, - num_plays, -}: { - current_enemy: DungeonEnemy; - current_level: number; - num_plays: number; -}) => { - let seed_string = current_enemy.toString() + "_" + current_level.toString() + "_" + num_plays.toString(); - var random = seedrandom(seed_string); - let enemy_text: string[] = DungeonEnemyAppearsText[current_enemy]; - let idx: number = Math.floor(random() * enemy_text.length); - let chosen_text: string = enemy_text[idx]; - - // otherwise say the enemy type - return ( - - {chosen_text} - - ); -}; - -export const DisplayPlayerFailedText = ({ - current_enemy, - current_level, - num_plays, -}: { - current_enemy: DungeonEnemy; - current_level: number; - num_plays: number; -}) => { - let seed_string = current_enemy.toString() + "_" + current_level.toString() + "_" + num_plays.toString(); - var random = seedrandom(seed_string); - - let enemy_text: string[] = DungeonPlayerDefeatedText[current_enemy]; - let idx: number = Math.floor(random() * enemy_text.length); - let chosen_text: string = enemy_text[idx]; - - return ( -
- - {chosen_text} - -
- ); -}; - -const EnemyDefeatedText = ({ - current_enemy, - current_level, - num_plays, -}: { - current_enemy: DungeonEnemy; - current_level: number; - num_plays: number; -}) => { - let seed_string = current_enemy.toString() + "_" + current_level.toString() + "_" + num_plays.toString(); - var random = seedrandom(seed_string); - - let enemy_text: string[] = DungeonEnemyDefeatedText[current_enemy]; - let idx: number = Math.floor(random() * enemy_text.length); - let chosen_text: string = enemy_text[idx]; - - return ( - - {chosen_text} - - ); -}; - -export const DisplayPlayerSuccessText = ({ - current_level, - current_enemy, - last_loot, - num_plays, - total_loot, - loot_bonus, -}: { - current_level: number; - current_enemy: DungeonEnemy; - last_loot: number; - num_plays: number; - total_loot: number; - loot_bonus: boolean; -}) => { - if (current_level < 7) { - return ( -
- - - - - - You found {last_loot.toFixed(2)} - - - {""} - - - {loot_bonus ? "(with Luck bonus)" : ""} - - - {!isMobile && ( - - - Escape to claim {total_loot.toFixed(2)} - - - {""} - - - Or explore further to try and find more - - - )} - {isMobile && ( - - - - Escape to claim {total_loot.toFixed(2)} - - - {""} - - - - Or explore further to try and find more - - - )} - -
- ); - } - - // otherwise we retire - return ( -
- - - - - - You found {last_loot.toFixed(2)} - - - {""} - - - {loot_bonus ? "(with Luck bonus)" : ""} - - - - - Looking around you realise your job is done and there is nothing left to kill - - - - Retire to claim your current loot {total_loot.toFixed(2)} - - - {""} - - -
- ); -}; - -export const DisplayEnemy = ({ - player_state, - enemy_state, - current_enemy, -}: { - player_state: DungeonStatus; - enemy_state: DungeonStatus; - current_enemy: DungeonEnemy; -}) => { - if (enemy_state === DungeonStatus.unknown) { - return <>; - } - - if (enemy_state === DungeonStatus.dead) { - // for the traps we don't return anything - if (current_enemy === DungeonEnemy.BoulderTrap) { - return <>; - } - if (current_enemy === DungeonEnemy.SpikeTrap) { - return <>; - } - - if (current_enemy === DungeonEnemy.Mimic) { - return {""}; - } - - if (current_enemy === DungeonEnemy.GreenSlime || current_enemy === DungeonEnemy.GiantGreenSlime) { - return {""}; - } - - if (current_enemy === DungeonEnemy.BlueSlime || current_enemy === DungeonEnemy.GiantBlueSlime) { - return {""}; - } - - if (current_enemy === DungeonEnemy.Werewolf) { - return {""}; - } - - if (current_enemy === DungeonEnemy.Carnivine) { - return {""}; - } - - if (current_enemy === DungeonEnemy.Shade) { - return {""}; - } - - if (current_enemy === DungeonEnemy.GiantSpider) { - return {""}; - } - - if (current_enemy === DungeonEnemy.Skeletons) { - return {""}; - } - - return {""}; - } - - if (player_state === DungeonStatus.dead) { - if (current_enemy === DungeonEnemy.Mimic) { - return {""}; - } - } - - if (current_enemy === DungeonEnemy.Assassin) { - return {""}; - } - if (current_enemy === DungeonEnemy.BlueSlime) { - return {""}; - } - if (current_enemy === DungeonEnemy.Carnivine) { - return {""}; - } - if (current_enemy === DungeonEnemy.DM) { - return {""}; - } - if (current_enemy === DungeonEnemy.Elves) { - return {""}; - } - if (current_enemy === DungeonEnemy.GiantBlueSlime) { - return {""}; - } - if (current_enemy === DungeonEnemy.GiantGreenSlime) { - return {""}; - } - if (current_enemy === DungeonEnemy.GiantRat) { - return {""}; - } - if (current_enemy === DungeonEnemy.GiantSpider) { - return {""}; - } - if (current_enemy === DungeonEnemy.Goblins) { - return {""}; - } - if (current_enemy === DungeonEnemy.GreenSlime) { - return {""}; - } - if (current_enemy === DungeonEnemy.Mimic) { - return {""}; - } - if (current_enemy === DungeonEnemy.Orc) { - return {""}; - } - if (current_enemy === DungeonEnemy.Shade) { - return {""}; - } - if (current_enemy === DungeonEnemy.SkeletonKnight) { - return {""}; - } - if (current_enemy === DungeonEnemy.Skeletons) { - return {""}; - } - if (current_enemy === DungeonEnemy.SkeletonWizard) { - return {""}; - } - if (current_enemy === DungeonEnemy.Werewolf) { - return {""}; - } - - // for the traps we don't return anything - if (current_enemy === DungeonEnemy.BoulderTrap) { - return <>; - } - if (current_enemy === DungeonEnemy.SpikeTrap) { - return <>; - } - - return <>; -}; - -export const DisplayPlayer = ({ - player_state, - player_character, - current_enemy, -}: { - player_state: DungeonStatus; - player_character: DungeonCharacter; - current_enemy: DungeonEnemy; -}) => { - if (player_state === DungeonStatus.unknown) { - return <>; - } - - if (player_state === DungeonStatus.dead) { - // if the current enemy is a trap we should return that here - if (current_enemy === DungeonEnemy.BoulderTrap) { - return {""}; - } - if (current_enemy === DungeonEnemy.SpikeTrap) { - return {""}; - } - - // otherwise return the corpse - return {""}; - } - - // otherwise just return the player - if (player_character === DungeonCharacter.knight) { - return {""}; - } - - if (player_character === DungeonCharacter.ranger) { - return {""}; - } - - if (player_character === DungeonCharacter.wizard) { - return {""}; - } - - return <>; -}; - -export const DisplayXP = ({ current_xp }: { current_xp: number }) => { - let current_level = 1; - for (let i = 0; i < levels.length; i++) { - if (current_xp >= levels[i]) { - current_level = i + 1; - } - } - let next_xp = -1; - if (current_level < levels.length) { - next_xp = levels[current_level]; - } - - //console.log(current_xp, current_level, levels[current_level - 1], current_xp - levels[current_level - 1] ) - let xp_string = next_xp >= 0 ? "XP " + (current_xp - levels[current_level - 1]) + "/" + (next_xp - levels[current_level - 1]) : ""; - - return ( - - - Lvl {current_level} {xp_string} - - - ); -}; - -export const DisplayRoom = ({ current_room }: { current_room: number }) => { - return ( - - - Room {current_room > 0 ? current_room : ""} - - - ); -}; diff --git a/src/components/apps/dungeon/faq.tsx b/src/components/apps/dungeon/faq.tsx deleted file mode 100644 index a928496b..00000000 --- a/src/components/apps/dungeon/faq.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Box, Center } from "@chakra-ui/react"; - -import { DEFAULT_FONT_SIZE, DUNGEON_FONT_SIZE } from "./constants"; - -export function FAQScreen() { - return ( - <> -
- -
-

- WHAT IS THIS? -

-
- DUNGEONS & DEGENS is a retro RPG designed specifically for Web3 degens. Explore the Dungeon to earn XP and find - $LOOT, then spend it on Consumables to boost your progress or Limited Edition Collectibles! The game is constantly - updated with more content and new uses for $LOOT. -

- WHAT BLOCKCHAIN IS THE GAME ON? -

-
- DUNGEONS & DEGENS runs entirely on the Solana blockchain. It is the only network that can settle transactions fast - enough to handle all the game logic entirely on-chain. -
-
- The program address is: FUjAo5wevsyS2jpe2XnkYN3SyQVbxAjoy8fuWrw3wjUk -
-
- $LOOT is an SPL token. The token address is: FGXnWVQuc35M8XLG4egciVhZXqhy3XawbY2V8TpfHHag -

- HOW DOES IT WORK? -

-
-
    -
  • Step 1: Connect with a Solana wallet. We recommend Solflare.
  • -
  • - Step 2: Select a Hero then Enter the Dungeon. A 0.002 SOL entry fee is required. The first time you play a - little bit more will be required to create your game data account. -
  • -
  • Step 3: On Room 1, one of many possible Perils will spawn. Wait for your Die Roll to resolve on-chain.
  • -
  • - Step 4: If successful, you may choose to Escape with the $LOOT you have found or to Explore the next Room. - Deeper Rooms contain bigger $LOOT rewards but also have more dangerous Perils. -
  • -
  • Step 5: If unsuccessful, your Hero dies and the $LOOT accumulated during that run is lost.
  • -
  • Step 6: Spend $LOOT at the Shop on upgrades, boosts, and collectibles.
  • -
-

- DUNGEON KEYS -

-
- Dungeon Key NFTs grant a number of Free Entries to the Dungeon every day. They can be purchased in the SHOP for 2 - SOL each, while supplies last. -
-
- Free Entries per Day: -
    -
  • Bronze - 10
  • -
  • Silver - 20
  • -
  • Gold - 30
  • -
-
- To use the Free Plays, connect with a wallet holding a Dungeon Key, click the key symbol, enter its Key Number, then - click Apply. -

- WHAT GAMES INSPIRED DUNGEONS & DEGENS? -

-
- Too many to list but some of the most influential ones are: -
-
-
    -
  • Dungeons & Dragons 5th ed.
  • -
  • Ultima 2
  • -
  • Oregon Trail
  • -
  • Dragon's Lair
  • -
  • Old School Runescape
  • -
  • DeFi Kingdoms
  • -
  • Degen Coin Flip
  • -
-
- These games provide lessons not just in lore, art, and gameplay, but also in UX and good governance. -

- HOW DOES THE ARENA WORK -

-
- The Arena is a Player vs. Player mode where individuals can create or join games to compete against each other. - Right now we have an implementation of Rock Paper Scissors using the characters from Dungeons & Degens. Each of - these characters have their own 'move set' that maps to the traditional Rock Paper and Scissor moves. -
-
- When each participant joins the game their wagers will be transferred to an escrow account where it will be held - until the end of the game at which point the total deposited will be sent to the winner. No matter who wins the cost - of creating the data account for the game (around 0.003 SOL) will be returned to the player that set up the game - when it finishes. -
-
- To ensure that no-one can cause another players wager to be locked up indefinitely within the escrow account we have - included a timeout for all Arena games. This can be set to 'Fast' or to 'Slow' when creating the game and the option - chosen will be shown in the game browser. A Fast game will time out 2 minutes after the last player made a move - while a Slow game will time out 24 hours after the last player made a move. At that stage the player that went last - will be given the option to Execute their opponent which will immediately end the game and award them the victory - thus letting them claim the spoils. -
-
-
- - ); -} diff --git a/src/components/apps/dungeon/help.tsx b/src/components/apps/dungeon/help.tsx deleted file mode 100644 index fb4fdca8..00000000 --- a/src/components/apps/dungeon/help.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Box, Center } from "@chakra-ui/react"; - -import { DEFAULT_FONT_SIZE, DUNGEON_FONT_SIZE } from "./constants"; - -export function HelpScreen() { - return ( - <> -
- -
-

- Help! -

-
- If you have any questions that aren't covered in the FAQ, or find any technical issues with the site, please head - over to our Discord channel and make a support ticket to let us know. -
-
-
- - ); -} diff --git a/src/components/apps/dungeon/home.tsx b/src/components/apps/dungeon/home.tsx index c99de42b..7d9c4118 100644 --- a/src/components/apps/dungeon/home.tsx +++ b/src/components/apps/dungeon/home.tsx @@ -1,434 +1,96 @@ -import React, { useCallback, useEffect, useState, useMemo, useRef, useContext } from "react"; -import { useSearchParams } from "react-router-dom"; +import React, { useCallback, useEffect, useState, useMemo, useRef, Fragment } from "react"; -import { ChakraProvider, Box, Button, HStack, Center, Text, VStack, Divider, NumberInput, NumberInputField } from "@chakra-ui/react"; +import { ChakraProvider, Box, HStack, Center, Text, VStack } from "@chakra-ui/react"; -import Modal from "react-bootstrap/Modal"; - -import { Popover, PopoverTrigger, PopoverContent, PopoverHeader, PopoverBody, PopoverArrow, PopoverCloseButton } from "@chakra-ui/react"; import { useMediaQuery } from "react-responsive"; -import FocusLock from "react-focus-lock"; - -import { isMobile } from "react-device-detect"; - //import useSound from 'use-sound'; import "react-h5-audio-player/lib/styles.css"; import "./css/home.css"; -import { Keypair, PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { TOKEN_PROGRAM_ID, getAssociatedTokenAddress, ASSOCIATED_TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { Keypair, PublicKey, Transaction, TransactionInstruction, LAMPORTS_PER_SOL, SystemProgram } from "@solana/web3.js"; import { WalletProvider, useWallet } from "@solana/wallet-adapter-react"; import { PhantomWalletAdapter, SolflareWalletAdapter, BackpackWalletAdapter } from "@solana/wallet-adapter-wallets"; - import { WalletModalProvider, useWalletModal } from "@solana/wallet-adapter-react-ui"; import BN from "bn.js"; import bs58 from "bs58"; -import dungeon_title from "./images/Dungeon_Logo.png"; -import arena_title from "./images/Arena_Logo.png"; - import large_door from "./images/Large_Door.gif"; -import hallway from "./images/Hallway.gif"; -import hallway2 from "./images/Hallway2.gif"; - -//buttons -import enter_button from "./images/Enter_Button.png"; -import RollButton from "./images/RollButton.gif"; - -// rest beds -import loot_bed from "./images/LootBed.png"; -import xp_bed from "./images/XPBed.png"; -import power_bed from "./images/PowerBed.png"; - -// shop items -import key from "./images/Key.png"; -//characters -import knight from "./images/Knight.gif"; -import ranger from "./images/Ranger.gif"; -import wizard from "./images/Wizard.gif"; -import corpse from "./images/Corpse.png"; -import selector from "./images/Selector.gif"; - -// potions -import power_potion from "./shop_items/Power_Potion.gif"; -import luck_potion from "./shop_items/Luck_Potion.gif"; +import { Unity, useUnityContext } from "react-unity-webgl"; +import { bignum } from "@metaplex-foundation/beet"; // dungeon constants -import { - DEFAULT_FONT_SIZE, - DUNGEON_FONT_SIZE, - PROD, - PYTH_BTC_DEV, - PYTH_BTC_PROD, - PYTH_ETH_DEV, - PYTH_ETH_PROD, - PYTH_SOL_DEV, - PYTH_SOL_PROD, - METAPLEX_META, - SHOP_PROGRAM, - DUNGEON_PROGRAM, - SYSTEM_KEY, - DEBUG, - Screen, - DM_PROGRAM, - KeyType, - MAIN_ACCOUNT_SEED, - DATA_ACCOUNT_SEED, - LOOT_TOKEN_MINT, - POTION_SIZE, - levels, - DiscountKeyInputProps, -} from "./constants"; +import { DEFAULT_FONT_SIZE, DUNGEON_PROGRAM, SYSTEM_KEY, LOOT_TOKEN_MINT } from "./constants"; // dungeon utils import { - request_player_account_data, - request_token_amount, - serialise_play_instruction, - serialise_basic_instruction, - run_keyData_GPA, - post_discord_message, - request_player_achievement_data, - serialise_claim_achievement_instruction, - get_JWT_token, get_current_blockhash, send_transaction, - check_signature, - AchievementData, - NewDiscordMessage, - serialise_quit_instruction, bignum_to_num, - request_dungeon_program_data, - serialise_drink_potion_instruction, - PlayerData, - request_key_freeplays_data, - serialise_rest_instruction, + request_raw_account_data, + HouseStateData, + u64Data, + serialise_create_account_instruction, + serialise_gather_instruction, } from "./utils"; -import { - DisplayPlayerSuccessText, - DisplayPlayerFailedText, - DisplayEnemyAppearsText, - DisplayEnemy, - DisplayPlayer, - DisplayXP, - DisplayRoom, - DungeonEnemy, - DungeonCharacter, - DungeonStatus, - DungeonCharacterEmoji, - DungeonEnemyEmoji, - GoldEmoji, - DiceRollText, - DungeonInstruction, -} from "./dungeon_state"; - -import { AchievementCard, AchievementMetaData } from "./achievements"; - // navigation import { Navigation } from "./navigation"; -// dungeon pages -import { FAQScreen } from "./faq"; -import { OddsScreen } from "./odds"; -import { HelpScreen } from "./help"; -import { ShopScreen } from "./shop"; -import { DMScreen } from "./dm"; -import { AchievementsScreen } from "./achievements"; -import { StatsScreen } from "./stats"; import { Footer } from "./footer"; -import { MarketplaceScreen } from "./marketplace"; -import { ArenaScreen } from "./arena"; - -//import {DungeonScreen} from './dungeon'; - -import classSelect from "./sounds/Class_Select.mp3"; -import dungeonTile from "./sounds/Open_Door.mp3"; -import Retry from "./sounds/Retry.mp3"; -import Torch from "./sounds/Torch.mp3"; -import Escape from "./sounds/Escape.mp3"; -import Game_Over from "./sounds/Game_Over.mp3"; -import Player_Death from "./sounds/Player_Death.mp3"; -import Victory from "./sounds/Victory.mp3"; -import { MuteContext, MuteProvider } from "./mute"; import "./css/style.css"; import "./css/fonts.css"; import "./css/wallet.css"; -require("@solana/wallet-adapter-react-ui/styles.css"); - -// free play mint -const FREE_PLAY_MINT = new PublicKey("4JxGUVRp6CRffKpbtnSCZ4Z5dHqUWMZSxMuvFd7fG3nC"); +import { createTransferInstruction, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +const styles = require("./css/unity.css"); -// achievement collection -const ACHIEVEMENTS_COLLECTION_MASTER = new PublicKey("72Lwj7RDVN4yzCzUsZnvRF4Nav8Z8rVXB2fYzrkWLbHk"); -const ACHIEVEMENTS_COLLECTION_META = new PublicKey("FzbP3YEELyR1aMspJF9KgVAmTM7AJ2q8Y1ervqP3Wcq"); -const ACHIEVEMENTS_COLLECTION_MINT = new PublicKey("3pA2AKFXzj9DspM6iinzcsdx5rW9pQdiNJY4eYvz126Q"); - -const ACHIEVEMENT_SEED = "achievements_s1"; - -const enum AccountStatus { - unknown = 0, - created = 1, - not_created = 2, -} -//const AccountStatusString = ["unknown", "created", "not_created"]; - -const DungeonStatusString = ["unknown", "alive", "dead", "exploring"]; +require("@solana/wallet-adapter-react-ui/styles.css"); -const classSelectAudio = new Audio(classSelect); -const dungeonTileAudio = new Audio(dungeonTile); -const GameOverAudio = new Audio(Game_Over); -const EscapeAudio = new Audio(Escape); -const TorchAudio = new Audio(Torch); -const RetryAudio = new Audio(Retry); -const VictoryAudio = new Audio(Victory); -const PlayerDeathAudio = new Audio(Player_Death); +//var CryptoJS = require("crypto-js"); export function DungeonApp() { const wallet = useWallet(); // bearer token used to authorise RPC requests - const [bearer_token, setBearerToken] = useState(""); - const bearer_interval = useRef(null); - - // properties used to set what to display - const [data_account_status, setDataAccountStatus] = useState(AccountStatus.unknown); - const initial_status = useRef(DungeonStatus.unknown); - - // these come from the blockchain - const num_state_checks = useRef(0); - - // not all state should cause a rerender - const update_status_effects = useRef(true); - const num_plays = useRef(-1); - const last_advantage = useRef(false); - const last_loot_bonus = useRef(false); - const roll_one = useRef(0); - const roll_two = useRef(0); - - const current_interaction = useRef(null); - - const [current_player_data, setPlayerData] = useState(null); - const [advantage, setAdvantage] = useState(false); - const [loot_bonus, setLootBonus] = useState(false); - - const [current_level, setCurrentLevel] = useState(0); - const [currentStatus, setCurrentStatus] = useState(DungeonStatus.unknown); - const [current_enemy, setCurrentEnemy] = useState(DungeonEnemy.None); - const [total_loot, setTotalLoot] = useState(0); - const [last_loot, setLastLoot] = useState(0); - const [loot_per_day, setLootPerDay] = useState(0); - - // achievement state - const [which_achievement, setWhichAchievement] = useState(null); - const [show_achievement, setShowAchievement] = useState(false); - const [achievement_status, setAchievementStatus] = useState(null); - const [achievement_data, setAchievementData] = useState(null); - const [new_achievements, setNewAchievements] = useState(null); - const new_achievements_ref = useRef([]); - const achievement_interations = useRef(-1); - - // rest state - const rest_character = useRef(DungeonCharacter.knight); - const [rest_state, setRestState] = useState(0); - const [show_rest, setShowRest] = useState(false); - - // if we have a key then discounts can be applied - const [discount_key_index, setDiscountKeyIndex] = useState(""); - const [current_key_mint, setCurrentKeyMint] = useState(null); - const [current_key_index, setCurrentKeyIndex] = useState(null); - const [key_freeplays, setKeyFreePlays] = useState(-1); - - // error handling on applying the discount - const [discount_error, setDiscountError] = useState(null); - const [show_discount_error, setShowDiscountError] = useState(false); - - const [screen, setScreen] = useState(Screen.HOME_SCREEN); - - const [player_character, setWhichCharacter] = useState(DungeonCharacter.knight); - const [enemy_state, setEnemyState] = useState(DungeonStatus.unknown); - const [player_state, setPlayerState] = useState(DungeonStatus.unknown); - - // animateLevel becomes a useRef - const animateLevel = useRef(0); - - // refs to hold initial status - const initial_num_plays = useRef(-1); - - // refs for checking signatures - const signature_interval = useRef(null); - const current_signature = useRef(null); - const signature_check_count = useRef(0); - const [transaction_failed, setTransactionFailed] = useState(false); - - // refs for setting whether we continue to check state - const check_data_account = useRef(true); - const check_sol_balance = useRef(true); - const check_user_state = useRef(true); - const check_achievements = useRef(true); - const state_interval = useRef(null); - - // referall code - const [searchParams] = useSearchParams(); - - //button processing - const [processing_transaction, setProcessingTransaction] = useState(false); - - // discord processing - const discord_play_message_sent = useRef(false); - - // Checking Mute state - const { muteState, volume, isPlaying, setPlaying } = useContext(MuteContext); - - useEffect(() => { - if (discount_error === null) return; - - setShowDiscountError(true); - }, [discount_error, setDiscountError]); - - const CloseDiscountError = useCallback(async () => { - setShowDiscountError(false); - }, []); - - const OpenDiscountError = useCallback(async () => { - setShowDiscountError(true); - }, []); - - const DiscountKeyInput: React.FC = ({ connect }) => { - let key_size = "50"; - if (isMobile) { - key_size = "40"; - } - const { setVisible } = useWalletModal(); - - const handleConnectWallet = useCallback(async () => { - setVisible(true); - }, [setVisible]); - - return ( - <> -
-
{ - CloseDiscountError(); - handleConnectWallet(); - } - : undefined - } - > - - - - - -
- - Enter Key Number - -
- - - - - -
- setDiscountKeyIndex(valueString)} - value={discount_key_index} - precision={0} - borderColor="white" - min={1} - max={3500} - > - - -
-
- -
-
- {key_freeplays >= 0 && ( - <> - -
- {key_freeplays} freeplays remaining -
- - )} - {discount_error && ( - <> - -
- {discount_error} -
- - )} -
-
-
-
-
- - ); - }; + const [ready, setReady] = useState(false); function Disclaimer() { const { setVisible } = useWalletModal(); const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - const handleConnectWallet = useCallback(async () => { setVisible(true); }, [setVisible]); return ( <> - + { + handleConnectWallet(); + setReady(true); + }} + >
- - CONNECT - WALLET + + CONNECT WALLET
); } - + /* const CheckNewQuitAchievements = useCallback(async () => { if (achievement_status === null) return; @@ -471,7 +133,8 @@ export function DungeonApp() { setWhichAchievement(new_achievements_ref.current[0]); setShowAchievement(true); }, [new_achievements, show_achievement]); - +*/ + /* function AchievementsModal() { const handleClose = () => { setShowAchievement(false); @@ -518,1044 +181,630 @@ export function DungeonApp() { ); } + */ - function RestModal() { - const handleClose = () => { - setShowRest(false); - }; + const LargeDoor = () => { + const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); + + return ( + <> +
+ {"generic"} +
+ + ); + }; - if (show_rest === false) return <>; + const UnconnectedPage = () => { + const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); return ( <> - -
- - Rest at the Inn - -
-
- - - - setRestState(0)} - > - {"generic"} - - - XP - - - 50% chance to gain +1 XP per room - - - - setRestState(1)} - > - {"generic"} + {isTabletOrMobile ? ( + <> +
+
+
+ +
+
+ +
+
+
+ + ) : ( + +
+ + + + + - - Loot - - - +35% Loot per room - - - - setRestState(2)} - > - {"generic"} + + - - Power - - - +1 Power per room - - - - -
- - -
- - - - Rest(0)}> - - 1h -
- (4 LOOT) -
-
- - +5 Energy - -
- - Rest(1)}> - - 4h -
- (20 LOOT) -
-
- - +25 Energy - -
- - Rest(2)}> - - 8h -
- (40 LOOT) -
-
- - +60 Energy - -
+ {!isMobile && ( + + + + + + )}
-
-
+
+ )} ); - } + }; - const CheckSignature = useCallback(async () => { - if (current_signature.current === null) return; + const rest_state_interval = useRef(null); + const check_rest_state = useRef(true); + const level_loaded = useRef(false); + const unity_initialised = useRef(false); + + // account data + const user_name = useRef(null); + const user_keypair = useRef(null); + + const { + unityProvider, + requestFullscreen, + isLoaded, + addEventListener, + removeEventListener, + sendMessage, + UNSAFE__detachAndUnloadImmediate: detachAndUnloadImmediate, + } = useUnityContext({ + loaderUrl: "/unitybuild/LevelEditor.loader.js", + dataUrl: "/unitybuild/LevelEditor.data", + frameworkUrl: "/unitybuild/LevelEditor.framework.js", + codeUrl: "/unitybuild/LevelEditor.wasm", + }); - let signature_response = await check_signature(bearer_token, current_signature.current); + useEffect(() => { + return () => { + detachAndUnloadImmediate().catch((reason) => { + console.log(reason); + }); + }; + }, [detachAndUnloadImmediate]); - if (signature_response === null) { - return; - } + const setBrowserWallet = useCallback( + (pubkey: string) => { + sendMessage("ConnectUI", "setBrowserPubkey", pubkey); + }, + [sendMessage], + ); - //console.log(signature_response); - let confirmation = signature_response.result?.value[0]; + useEffect(() => { + console.log("Wallet has changed", wallet.connected, wallet.connecting, wallet.disconnecting); + if (wallet.publicKey == null) return; - if (confirmation !== null) { - if (confirmation?.err !== null) { - console.log("error: ", confirmation?.err); - setTransactionFailed(true); - } else { - setTransactionFailed(false); - } + setBrowserWallet(wallet.publicKey.toString()); + }, [wallet, setBrowserWallet]); - current_signature.current = null; - signature_check_count.current = 0; - setProcessingTransaction(false); - } else { - signature_check_count.current += 1; - } - if (signature_check_count.current >= 10) { - setTransactionFailed(true); - setProcessingTransaction(false); - current_signature.current = null; - signature_check_count.current = 0; - } - }, [bearer_token]); + const sendLoginConfirmation = useCallback( + (message: string) => { + console.log("has unity loaded in sendLoginConfirmation", isLoaded); + sendMessage("ConnectUI", "ConfirmLogIn", message); + }, + [sendMessage, isLoaded], + ); - // interval for checking signatures - useEffect(() => { - if (signature_interval.current === null) { - signature_interval.current = window.setInterval(CheckSignature, 1000); - } else { - window.clearInterval(signature_interval.current); - signature_interval.current = null; + const setLevelData = useCallback( + (level: string) => { + console.log("has unity loaded in setLevelData", isLoaded); + sendMessage("DataManager", "UpdateWorldData", level); + }, + [sendMessage, isLoaded], + ); + + const get_rest_state = useCallback(async () => { + if (user_keypair.current === null) { + return; } - // here's the cleanup function - return () => { - if (signature_interval.current !== null) { - window.clearInterval(signature_interval.current); - signature_interval.current = null; - } - }; - }, [CheckSignature]); + //return; + console.log("unity initialised? ", unity_initialised.current); - const check_state = useCallback(async () => { - if (bearer_token === "") { - console.log("no bearer token set in check_state"); + if (!unity_initialised.current) { return; } - if (DEBUG) { - console.log("in in it check_updates ", check_user_state.current); + if (!check_rest_state.current) { + return; } + let player_home_key = PublicKey.findProgramAddressSync( + [user_keypair.current.publicKey.toBytes(), Buffer.from("home")], + DUNGEON_PROGRAM, + )[0]; + + let house_data = await request_raw_account_data("", player_home_key, "home data"); - if (!wallet.publicKey) { + if (house_data === null) { + console.log("Set home data to empty string"); + setLevelData(""); + check_rest_state.current = false; return; } + let size_bytes: number[] = []; + for (let i = 0; i < 8; i++) size_bytes.push(house_data[i]); + + const [size] = u64Data.struct.deserialize(house_data.slice(0, 8)); + let size_val = bignum_to_num(size.value); + + const [house] = HouseStateData.struct.deserialize(house_data.slice(8, 8 + size_val)); + console.log("house data: ", house.data, house.data.length); + + let layers_array = []; + for (let l = 0; l < house.data.length; l++) { + let sprite_json = []; + for (let x = 0; x < house.data[l].grid_width; x++) { + for (let y = 0; y < house.data[l].grid_height; y++) { + let index = x * house.data[l].grid_height + y; + let sprite_object = { + x: x, + y: y, + tilemapSprite: house.data[l].sprites[index], + }; + sprite_json.push(sprite_object); + } + } - if (num_state_checks.current > 2) check_user_state.current = false; + let player_json = []; + for (let i = 0; i < house.data[l].player_data.length; i++) { + player_json.push(JSON.parse(house.data[l].player_data[i])); + } + + let enemy_json = []; + for (let i = 0; i < house.data[l].enemy_data.length; i++) { + enemy_json.push(JSON.parse(house.data[l].enemy_data[i])); + } - if (!check_user_state.current && !check_achievements.current) return; + let json_result = { + tile_map: { + gridWidth: house.data[l].grid_width, + gridHeight: house.data[l].grid_height, + gridCellSize: house.data[l].grid_cell_size, + gridOffset: { + x: house.data[l].grid_offset[0], + y: house.data[l].grid_offset[1], + z: house.data[l].grid_offset[2], + }, + tilemapObjectArray: sprite_json, + }, + player_prefabs: player_json, + enemy_prefabs: enemy_json, + }; - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; + layers_array.push(JSON.stringify(json_result)); + } - let program_data_key = PublicKey.findProgramAddressSync([Buffer.from(DATA_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; + let layers_json = { + level_data: layers_array, + }; + //console.log(JSON.stringify(layers_json)); - if (check_user_state.current) { - try { - let dungeon_program_data = await request_dungeon_program_data(bearer_token, program_data_key); + setLevelData(JSON.stringify(layers_json)); + check_rest_state.current = false; - if (dungeon_program_data !== null) { - let ema_value = new BN(dungeon_program_data?.current_ema_value).toNumber() / 1e6; + return; + }, [setLevelData]); - setLootPerDay(24 * 60 * ema_value); - } - } catch (error) { - console.log(error); - setLootPerDay(0); + // interval for checking state + useEffect(() => { + if (rest_state_interval.current === null) { + rest_state_interval.current = window.setInterval(get_rest_state, 1000); + } else { + window.clearInterval(rest_state_interval.current); + rest_state_interval.current = null; + } + // here's the cleanup function + return () => { + if (rest_state_interval.current !== null) { + window.clearInterval(rest_state_interval.current); + rest_state_interval.current = null; } + }; + }, [get_rest_state]); - try { - let player_data = await request_player_account_data(bearer_token, player_data_key); + // Unity -> React + /* + const UploadLevel = useCallback(async (house_data: HouseData, layer: number) => { + if (user_keypair.current === null) return; - if (player_data === null) { - num_state_checks.current += 1; - setDataAccountStatus(AccountStatus.not_created); - return; - } + let player_home_key = PublicKey.findProgramAddressSync( + [user_keypair.current.publicKey.toBytes(), Buffer.from("home")], + DUNGEON_PROGRAM, + )[0]; - setDataAccountStatus(AccountStatus.created); + const instruction_data = serialise_save_home_instruction(DungeonInstruction.save_home, layer, house_data); - let current_status = player_data.player_status + 1; - if (initial_status.current === DungeonStatus.unknown) { - initial_status.current = current_status; - } + let max_size = 1044; + if (instruction_data.length > max_size) return; - let current_num_plays = new BN(player_data.num_plays).toNumber(); + var account_vector = [ + { pubkey: user_keypair.current.publicKey, isSigner: true, isWritable: true }, + { pubkey: player_home_key, isSigner: false, isWritable: true }, + { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, + ]; - if (current_interaction.current !== null && current_num_plays <= current_interaction.current) { - if (DEBUG) { - console.log("num plays not increased", current_num_plays); - } - return; - } + const play_instruction = new TransactionInstruction({ + keys: account_vector, + programId: DUNGEON_PROGRAM, + data: instruction_data, + }); - setPlayerData(player_data); + let txArgs = await get_current_blockhash(""); + + let transaction = new Transaction(txArgs); + transaction.feePayer = user_keypair.current.publicKey; - current_interaction.current = current_num_plays; + transaction.add(play_instruction); - num_plays.current = current_num_plays; + transaction.sign(user_keypair.current); - let current_xp = new BN(player_data.num_xp).toNumber(); + try { + const encoded_transaction = bs58.encode(transaction.serialize()); - if (DEBUG) { - console.log( - "in init, progress: ", - player_data.in_progress, - "enemy", - player_data.dungeon_enemy, - "alive", - DungeonStatusString[player_data.player_status + 1], - "num_plays", - current_num_plays, - "num_xp", - current_xp, - ); - } + var transaction_response = await send_transaction("", encoded_transaction); - if (initial_num_plays.current === -1) { - initial_num_plays.current = current_num_plays; - } + if (transaction_response.result === "INVALID") { + console.log(transaction_response); + return; + } + } catch (error) { + console.log(error); + return; + } + }, []); +*/ + + const enum DungeonInstruction { + add_funds = 0, + play = 1, + quit = 2, + explore = 3, + claim_achievement = 4, + drink_potion = 5, + buy_potion = 6, + save_home = 7, + rest = 8, + create_account = 9, + craft = 10, + } - if (current_num_plays === 0) { - return; - } + const CreatePlayerAccount = useCallback( + async (name: string, balance: bignum, iv: number[], salt: number[], data: number[], keypair: Keypair) => { + console.log("create player account", wallet.publicKey === null); + if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - check_user_state.current = false; + let player_account_key = PublicKey.findProgramAddressSync([Buffer.from(name)], DUNGEON_PROGRAM)[0]; + let player_dungeon_key = PublicKey.findProgramAddressSync([keypair.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - setWhichCharacter(player_data.player_character); + console.log("iv :", iv, iv.length); + console.log("salt :", salt, salt.length); - setCurrentEnemy(player_data.dungeon_enemy); + const instruction_data = serialise_create_account_instruction(DungeonInstruction.create_account, name, balance, iv, salt, data); - setCurrentLevel(player_data.in_progress); + let max_size = 1044; + if (instruction_data.length > max_size) return; - setCurrentStatus(current_status); + var account_vector = [ + { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, + { pubkey: player_account_key, isSigner: false, isWritable: true }, + { pubkey: keypair.publicKey, isSigner: true, isWritable: true }, + { pubkey: player_dungeon_key, isSigner: false, isWritable: true }, - setTotalLoot(bignum_to_num(player_data.total_gold) / 1e6); + { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, + ]; - setLastLoot(bignum_to_num(player_data.last_gold) / 1e6); + const play_instruction = new TransactionInstruction({ + keys: account_vector, + programId: DUNGEON_PROGRAM, + data: instruction_data, + }); - setAdvantage(player_data.advantage === 1); + let txArgs = await get_current_blockhash(""); - let loot_bonus_time = bignum_to_num(player_data.bonus_loot_activation_time); - let current_time = Date.now() / 1000; + console.log("txArgs: ", txArgs); - setLootBonus(player_data.bonus_loot === 1 && (current_time - loot_bonus_time) / 60 < 10.1); + let transaction = new Transaction(txArgs); + transaction.feePayer = wallet.publicKey; - if (update_status_effects.current) { - update_status_effects.current = false; - } + transaction.add(play_instruction); - roll_one.current = player_data.dice_one; - roll_two.current = player_data.dice_two; + transaction.partialSign(keypair); - // just check the freeplay key if the amount remaining is greater than zero - if (current_key_mint !== null && key_freeplays > 0) { - let key_freeplays_account = PublicKey.findProgramAddressSync( - [Buffer.from("key_freeplays"), current_key_mint.toBytes()], - DUNGEON_PROGRAM, - )[0]; + try { + console.log("sign transaction"); + let signed_transaction = await wallet.signTransaction(transaction); + const encoded_transaction = bs58.encode(signed_transaction.serialize()); - let freeplay_data = await request_key_freeplays_data(bearer_token, key_freeplays_account); + var transaction_response = await send_transaction("", encoded_transaction); - if (freeplay_data !== null) { - console.log("free plays remaining", freeplay_data); - setKeyFreePlays(freeplay_data.freeplays_remaining); - } - } - num_state_checks.current = 0; - } catch (error) { - console.log(error); - setCurrentLevel(0); - setCurrentStatus(DungeonStatus.unknown); - setCurrentEnemy(DungeonEnemy.None); - setDataAccountStatus(AccountStatus.not_created); - num_state_checks.current += 1; - } - } + if (transaction_response.result === "INVALID") { + console.log(transaction_response); - if (check_achievements.current) { - if (DEBUG) { - console.log("check achievement status"); - } + let message_json = { + result_code: -1, + result_message: "Transaction Failed, Try Again", + }; + sendLoginConfirmation(JSON.stringify(message_json)); - try { - // get the achievement data - let achievement_data_key = PublicKey.findProgramAddressSync( - [wallet.publicKey.toBytes(), Buffer.from(ACHIEVEMENT_SEED)], - DUNGEON_PROGRAM, - )[0]; - let achievement_data = await request_player_achievement_data(bearer_token, achievement_data_key); - - if (achievement_data !== null) { - if (DEBUG) { - console.log(achievement_data); - console.log(achievement_data.n_interactions, achievement_interations.current); - } - - if (achievement_data.n_interactions >= achievement_interations.current) { - if (DEBUG) { - console.log("update achievement state"); - } - - setAchievementData(achievement_data); - setAchievementStatus(achievement_data.achievement_state); - achievement_interations.current = achievement_data.n_interactions; - check_achievements.current = false; - } - } else { - setAchievementStatus(null); - setAchievementData(null); - check_achievements.current = false; + return; } } catch (error) { console.log(error); - setAchievementStatus(null); - setAchievementData(null); - } - } - }, [wallet, bearer_token, current_key_mint, key_freeplays]); - // interval for checking state - useEffect(() => { - if (state_interval.current === null) { - state_interval.current = window.setInterval(check_state, 1000); - } else { - window.clearInterval(state_interval.current); - state_interval.current = null; - } - // here's the cleanup function - return () => { - if (state_interval.current !== null) { - window.clearInterval(state_interval.current); - state_interval.current = null; + let message_json = { + result_code: -1, + result_message: "Transaction Failed, Try Again", + }; + sendLoginConfirmation(JSON.stringify(message_json)); + + return; } - }; - }, [check_state]); - // reset things when the wallet changes - useEffect(() => { - if (DEBUG) { - console.log("wallet things changed"); - } + user_keypair.current = keypair; + unity_initialised.current = true; - initial_num_plays.current = -1; - current_interaction.current = null; - initial_status.current = DungeonStatus.unknown; - setTransactionFailed(false); - setScreen(Screen.HOME_SCREEN); - setCurrentLevel(0); - num_plays.current = -1; - setDataAccountStatus(AccountStatus.unknown); - setCurrentStatus(DungeonStatus.unknown); - setPlayerState(DungeonStatus.unknown); - setCurrentEnemy(DungeonEnemy.None); - setEnemyState(DungeonStatus.unknown); - setAchievementStatus(null); - setAchievementData(null); - setPlayerData(null); - achievement_interations.current = -1; - - check_data_account.current = true; - check_user_state.current = true; - check_sol_balance.current = true; - check_achievements.current = true; - signature_check_count.current = 0; - }, [wallet]); + let message_json = { + result_code: 0, + result_message: "Login Succeeded", + }; + sendLoginConfirmation(JSON.stringify(message_json)); + }, + [wallet, sendLoginConfirmation, DungeonInstruction.create_account], + ); - useEffect(() => { - if (DEBUG) { - console.log( - "in use effect, check_state: ", - check_user_state.current, - "level: ", - current_level, - "enemy", - current_enemy, - "currentStatus", - DungeonStatusString[currentStatus], - "num_plays", - num_plays.current, - "init num plays", - initial_num_plays.current, - ); - } + // Save the level data + /* + const handleSaveData = useCallback( + async (level: string) => { + console.log(level); + let json = JSON.parse(level); - if (current_level === 0) return; + let layers: string[] = json["layer_saves"]; + let num_layers = layers.length; - if ( - check_user_state.current === false && - screen === Screen.HOME_SCREEN && - current_level > 0 && - currentStatus === DungeonStatus.alive - ) { - setScreen(Screen.DUNGEON_SCREEN); - } + console.log("Have ", num_layers, " layers"); - // if we aren't alive and numplays is still initial num plays we shouldn't display the enemy - if ( - num_plays.current > 1 && - num_plays.current === initial_num_plays.current && - data_account_status === AccountStatus.created && - currentStatus !== DungeonStatus.alive - ) - return; + for (let i = 0; i < num_layers; i++) { + if (layers[i] === "") continue; - // if we know we are currently waiting for state to update then don't display the enemy - if (check_user_state.current === true) return; + let layer: any = JSON.parse(layers[i]); - if (DEBUG) { - console.log("display enemy"); - } - // display the current enemy - setEnemyState(DungeonStatus.alive); - setPlayerState(DungeonStatus.alive); - if (currentStatus === DungeonStatus.alive) { - animateLevel.current = 1; - } else { - animateLevel.current = 2; - } - }, [current_level, current_enemy, currentStatus, data_account_status, screen]); + let tilemap = layer["tile_map"]; + let player_data: string[] = []; + let enemy_data: string[] = []; - const playAudio = useCallback( - (audio: HTMLAudioElement) => { - audio.volume = volume / 100; + //for (let i = 0; i < layer["player_prefabs"].length; i++) player_data.push(JSON.stringify(layer["player_prefabs"][i])); - if (muteState !== 1) { - try { - audio.play(); - } catch (error) { - console.log("Failed to play audio"); - } - } - }, - [muteState, volume], - ); + for (let i = 0; i < layer["enemy_prefabs"].length; i++) enemy_data.push(JSON.stringify(layer["enemy_prefabs"][i])); - // New function to handle animation - const handleAnimation = useCallback( - (level: number) => { - if (level === 0) { - return; - } - if (level === 1) { - if (DEBUG) { - console.log("player killed enemy"); + console.log("detected save data", layer); + let sprites: number[] = []; + for (let i = 0; i < tilemap["tilemapObjectArray"].length; i++) { + sprites.push(tilemap["tilemapObjectArray"][i]["tilemapSprite"]); } - setPlayerState(DungeonStatus.alive); - setEnemyState(DungeonStatus.dead); - - //Victory sound plays - playAudio(VictoryAudio); - } else { - if (DEBUG) { - console.log("enemy killed player"); - } - setPlayerState(DungeonStatus.dead); - setEnemyState(DungeonStatus.alive); - //player death audio - playAudio(PlayerDeathAudio); - } + let offset: number[] = [tilemap["gridOffset"]["x"], tilemap["gridOffset"]["y"], tilemap["gridOffset"]["z"]]; + let house_data = new HouseData( + tilemap["gridWidth"], + tilemap["gridHeight"], + tilemap["gridCellSize"], + offset, + sprites, + player_data, + enemy_data, + ); - if (current_level > 0 && PROD && discord_play_message_sent.current === false) { - const message: NewDiscordMessage = { - message_type: level === 1 ? "defeated" : "killed_by", - emoji_1: DungeonCharacterEmoji[player_character], - emoji_2: DungeonEnemyEmoji[current_enemy], - level: current_level, - sol_amount: 0, - achievement_name: "", - }; + await UploadLevel(house_data, i); - post_discord_message(message); - discord_play_message_sent.current = true; + console.log("buffer", house_data); } - - animateLevel.current = 0; - CheckNewPlayAchievements(); }, - [current_level, player_character, current_enemy, CheckNewPlayAchievements, playAudio], + [UploadLevel], ); +*/ + const handleAccountData = useCallback( + async (account_data: string) => { + console.log(account_data); + let account_json = JSON.parse(account_data); - const set_JWT_token = useCallback(async () => { - console.log("Setting new JWT token"); - let token = await get_JWT_token(); - setBearerToken(token["token"]); - }, []); + user_name.current = account_json["user_name"]; + let balance: number = parseFloat(account_json["balance"]); + let iv: number[] = account_json["iv"]; + let salt: number[] = account_json["salt"]; + let data: number[] = account_json["data"]; + let private_key: number[] = account_json["private_key"]; - // interval for checking JWT - useEffect(() => { - let one_second = 1000; - if (bearer_interval.current === null) { - bearer_interval.current = window.setInterval(set_JWT_token, one_second * 60 * 5); - } else { - window.clearInterval(bearer_interval.current); - bearer_interval.current = null; - } - // here's the cleanup function - return () => { - if (bearer_interval.current !== null) { - window.clearInterval(bearer_interval.current); - bearer_interval.current = null; - } - }; - }, [set_JWT_token]); - - useEffect(() => { - if (DEBUG) { - console.log("In initial use effect"); - } - - set_JWT_token(); - setPlayerState(DungeonStatus.unknown); - setEnemyState(DungeonStatus.unknown); - }, [set_JWT_token]); - - const handleEnterBtn = () => { - playAudio(dungeonTileAudio); - }; - - const Play = useCallback(async () => { - setTransactionFailed(false); - num_state_checks.current = 0; - - if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - - if (current_player_data !== null && current_player_data?.rest_status[player_character].rest_time_remaining > Date.now() / 1000 + 60) - return; - - setProcessingTransaction(true); - - let program_data_key = PublicKey.findProgramAddressSync([Buffer.from(MAIN_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - let player_achievement_key = PublicKey.findProgramAddressSync( - [wallet.publicKey.toBytes(), Buffer.from(ACHIEVEMENT_SEED)], - DUNGEON_PROGRAM, - )[0]; - - let loot_token_account = await getAssociatedTokenAddress( - LOOT_TOKEN_MINT, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); - - let dm_data_key = PublicKey.findProgramAddressSync([Buffer.from("data_account")], DM_PROGRAM)[0]; - - const instruction_data = serialise_play_instruction(DungeonInstruction.play, player_character, 0); - - var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: player_achievement_key, isSigner: false, isWritable: true }, - { pubkey: LOOT_TOKEN_MINT, isSigner: false, isWritable: true }, - { pubkey: loot_token_account, isSigner: false, isWritable: true }, - ]; - - if (PROD) { - account_vector.push({ pubkey: PYTH_BTC_PROD, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: PYTH_ETH_PROD, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: PYTH_SOL_PROD, isSigner: false, isWritable: false }); - } else { - account_vector.push({ pubkey: PYTH_BTC_DEV, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: PYTH_ETH_DEV, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: PYTH_SOL_DEV, isSigner: false, isWritable: false }); - } - - account_vector.push({ pubkey: program_data_key, isSigner: false, isWritable: true }); - account_vector.push({ pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }); + console.log("have user data", account_json); - // next 3 accounts are for the free play tokens - account_vector.push({ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }); + user_keypair.current = Keypair.fromSecretKey(new Uint8Array(private_key)); - account_vector.push({ pubkey: FREE_PLAY_MINT, isSigner: false, isWritable: true }); - - let free_play_token_account = await getAssociatedTokenAddress( - FREE_PLAY_MINT, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); - - account_vector.push({ pubkey: free_play_token_account, isSigner: false, isWritable: true }); - - account_vector.push({ pubkey: DM_PROGRAM, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: dm_data_key, isSigner: false, isWritable: true }); - - if (current_key_mint && current_key_index) { - let dungeon_key_meta_account = PublicKey.findProgramAddressSync( - [Buffer.from("key_meta"), current_key_mint.toBuffer()], - SHOP_PROGRAM, - )[0]; - - let key_token_account = await getAssociatedTokenAddress( - current_key_mint, // mint - wallet.publicKey, // owner - true, // allow owner off curve + console.log( + "have key ", + balance, + user_name.current, + user_keypair.current.publicKey.toString(), + user_keypair.current.secretKey.toString(), ); - let dungeon_key_metaplex_account = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), METAPLEX_META.toBuffer(), current_key_mint.toBuffer()], - METAPLEX_META, - )[0]; - - let key_freeplays_account = PublicKey.findProgramAddressSync( - [Buffer.from("key_freeplays"), current_key_mint.toBytes()], - DUNGEON_PROGRAM, - )[0]; - - // accounts for discount key - account_vector.push({ pubkey: current_key_mint, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: key_token_account, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: dungeon_key_meta_account, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: dungeon_key_metaplex_account, isSigner: false, isWritable: false }); - account_vector.push({ pubkey: key_freeplays_account, isSigner: false, isWritable: true }); - } - - const play_instruction = new TransactionInstruction({ - keys: account_vector, - programId: DUNGEON_PROGRAM, - data: instruction_data, - }); - - let txArgs = await get_current_blockhash(bearer_token); - - let transaction = new Transaction(txArgs); - transaction.feePayer = wallet.publicKey; - - transaction.add(play_instruction); - - try { - let signed_transaction = await wallet.signTransaction(transaction); - const encoded_transaction = bs58.encode(signed_transaction.serialize()); - - var transaction_response = await send_transaction(bearer_token, encoded_transaction); - - if (transaction_response.result === "INVALID") { - console.log(transaction_response); - setProcessingTransaction(false); - return; - } - - let signature = transaction_response.result; - - if (DEBUG) { - console.log("play signature: ", signature); - } - - current_signature.current = signature; - signature_check_count.current = 0; - } catch (error) { - setProcessingTransaction(false); - console.log(error); - return; - } - - if (DEBUG) { - console.log("In Play - setting state"); - } - - setScreen(Screen.DUNGEON_SCREEN); - setEnemyState(DungeonStatus.unknown); - setPlayerState(DungeonStatus.alive); - - if (!isPlaying) { - const audioElement = document.getElementsByTagName("audio")[0]; - if (audioElement) { - audioElement.play(); - setPlaying(true); - } - } - - check_user_state.current = true; - check_sol_balance.current = true; - check_achievements.current = true; - discord_play_message_sent.current = false; - update_status_effects.current = true; - - last_advantage.current = advantage; - last_loot_bonus.current = loot_bonus; - }, [ - wallet, - player_character, - current_key_index, - current_key_mint, - bearer_token, - advantage, - loot_bonus, - current_player_data, - setPlaying, - isPlaying, - ]); - - const Quit = useCallback(async () => { - setTransactionFailed(false); - num_state_checks.current = 0; - if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - - setProcessingTransaction(true); - let program_account_key = PublicKey.findProgramAddressSync([Buffer.from(MAIN_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; - let program_data_key = PublicKey.findProgramAddressSync([Buffer.from(DATA_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; - - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - let player_achievement_key = PublicKey.findProgramAddressSync( - [wallet.publicKey.toBytes(), Buffer.from(ACHIEVEMENT_SEED)], - DUNGEON_PROGRAM, - )[0]; - - let loot_token_account = await getAssociatedTokenAddress( - LOOT_TOKEN_MINT, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); - - let ref_code = searchParams.get("ref"); - - if (ref_code === null) ref_code = "None"; - - const instruction_data = serialise_quit_instruction(DungeonInstruction.quit, ref_code); - - var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: player_achievement_key, isSigner: false, isWritable: true }, - { pubkey: program_account_key, isSigner: false, isWritable: true }, - { pubkey: program_data_key, isSigner: false, isWritable: true }, - - { pubkey: LOOT_TOKEN_MINT, isSigner: false, isWritable: true }, - { pubkey: loot_token_account, isSigner: false, isWritable: true }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, - ]; - - const quit_instruction = new TransactionInstruction({ - keys: account_vector, - programId: DUNGEON_PROGRAM, - data: instruction_data, - }); - - let txArgs = await get_current_blockhash(bearer_token); - - let transaction = new Transaction(txArgs); - transaction.feePayer = wallet.publicKey; - - transaction.add(quit_instruction); - - try { - let signed_transaction = await wallet.signTransaction(transaction); - const encoded_transaction = bs58.encode(signed_transaction.serialize()); - - var transaction_response = await send_transaction(bearer_token, encoded_transaction); - - if (transaction_response.result === "INVALID") { - console.log(transaction_response); - setProcessingTransaction(false); + if (balance === 0) { + console.log("balance zero, returning"); return; } + console.log("balance not zero, ", balance, balance === 0); + + if (user_name.current === null) return; + + await CreatePlayerAccount( + user_name.current, + new BN(Math.floor(balance * LAMPORTS_PER_SOL)), + Array.from(iv), + Array.from(salt), + Array.from(data), + user_keypair.current, + ); + }, + [CreatePlayerAccount], + ); - let signature = transaction_response.result; - current_signature.current = signature; - signature_check_count.current = 0; - } catch (error) { - console.log(error); - setProcessingTransaction(false); - return; - } - - if (DEBUG) { - console.log("In quit, setting state"); - } - - setScreen(Screen.HOME_SCREEN); - setEnemyState(DungeonStatus.unknown); - //setProcessingTransaction(false); - check_user_state.current = true; - check_sol_balance.current = true; - check_achievements.current = true; - - // send a discord message - let current_win = total_loot; - - const message: NewDiscordMessage = { - message_type: current_level === 7 ? "retired" : "escaped", - emoji_1: DungeonCharacterEmoji[player_character], - emoji_2: GoldEmoji, - level: current_level, - sol_amount: current_win, - achievement_name: "", - }; - - if (PROD) post_discord_message(message); - - return; - }, [wallet, player_character, current_level, total_loot, bearer_token, searchParams]); - - const DrinkPotion = useCallback( - async (which: number) => { - setTransactionFailed(false); - num_state_checks.current = 0; - - if (wallet.publicKey === null || wallet.signTransaction === undefined || wallet.signMessage === undefined) return; - - setProcessingTransaction(true); - - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; + const handleTransferSOL = useCallback( + async (amount: number) => { + console.log("Transfer sol", amount, wallet.publicKey === null, user_keypair.current === null); + if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - const instruction_data = serialise_drink_potion_instruction(DungeonInstruction.drink_potion, which); + if (user_keypair.current === null) return; - var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, - ]; - - const play_instruction = new TransactionInstruction({ - keys: account_vector, - programId: DUNGEON_PROGRAM, - data: instruction_data, + let amount_bn = BigInt(amount * LAMPORTS_PER_SOL); + const transfer_instruction = SystemProgram.transfer({ + fromPubkey: wallet.publicKey, + toPubkey: user_keypair.current.publicKey, + lamports: amount_bn, }); - let txArgs = await get_current_blockhash(bearer_token); + let txArgs = await get_current_blockhash(""); let transaction = new Transaction(txArgs); transaction.feePayer = wallet.publicKey; - transaction.add(play_instruction); + console.log(transaction.recentBlockhash, transaction.lastValidBlockHeight); + transaction.add(transfer_instruction); + console.log("send transaction"); try { let signed_transaction = await wallet.signTransaction(transaction); const encoded_transaction = bs58.encode(signed_transaction.serialize()); - var transaction_response = await send_transaction(bearer_token, encoded_transaction); - + var transaction_response = await send_transaction("", encoded_transaction); + console.log("transaction response:", transaction_response); if (transaction_response.result === "INVALID") { console.log(transaction_response); - setProcessingTransaction(false); return; } - - let signature = transaction_response.result; - - if (DEBUG) { - console.log("play signature: ", signature); - } - - current_signature.current = signature; - signature_check_count.current = 0; } catch (error) { - setProcessingTransaction(false); console.log(error); return; } - - if (DEBUG) { - console.log("In Play - setting state"); - } - - check_user_state.current = true; - check_sol_balance.current = true; }, - [wallet, bearer_token], + [wallet], ); - const Rest = useCallback( - async (which: number) => { - setTransactionFailed(false); - num_state_checks.current = 0; + const handleTransferLOOT = useCallback( + async (amount: number) => { + console.log("Transfer loot", amount, wallet.publicKey === null, user_keypair.current === null); + if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - if (wallet.publicKey === null || wallet.signTransaction === undefined || wallet.signMessage === undefined) return; + if (user_keypair.current === null) return; - setProcessingTransaction(true); - - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - - let loot_token_account = await getAssociatedTokenAddress( + let source_token_account = await getAssociatedTokenAddress( LOOT_TOKEN_MINT, // mint wallet.publicKey, // owner true, // allow owner off curve ); - const instruction_data = serialise_rest_instruction(DungeonInstruction.rest, rest_character.current, rest_state, which); - var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: LOOT_TOKEN_MINT, isSigner: false, isWritable: true }, - { pubkey: loot_token_account, isSigner: false, isWritable: true }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, - ]; + let destination_token_account = await getAssociatedTokenAddress( + LOOT_TOKEN_MINT, // mint + user_keypair.current.publicKey, // owner + true, // allow owner off curve + ); - const play_instruction = new TransactionInstruction({ - keys: account_vector, - programId: DUNGEON_PROGRAM, - data: instruction_data, - }); + let amount_bn = BigInt(amount * 1e6); + const transfer_instruction = createTransferInstruction( + source_token_account, + destination_token_account, + wallet.publicKey, + amount_bn, + undefined, + TOKEN_PROGRAM_ID, + ); - let txArgs = await get_current_blockhash(bearer_token); + let txArgs = await get_current_blockhash(""); let transaction = new Transaction(txArgs); transaction.feePayer = wallet.publicKey; - transaction.add(play_instruction); + console.log(transaction.recentBlockhash, transaction.lastValidBlockHeight); + transaction.add(transfer_instruction); + console.log("send transaction"); try { let signed_transaction = await wallet.signTransaction(transaction); const encoded_transaction = bs58.encode(signed_transaction.serialize()); - var transaction_response = await send_transaction(bearer_token, encoded_transaction); - + var transaction_response = await send_transaction("", encoded_transaction); + console.log("transaction response:", transaction_response); if (transaction_response.result === "INVALID") { console.log(transaction_response); - setProcessingTransaction(false); return; } - - let signature = transaction_response.result; - - if (DEBUG) { - console.log("play signature: ", signature); - } - - current_signature.current = signature; - signature_check_count.current = 0; } catch (error) { - setProcessingTransaction(false); console.log(error); return; } - - if (DEBUG) { - console.log("In Play - setting state"); - } - - check_user_state.current = true; - check_sol_balance.current = true; }, - [wallet, bearer_token, rest_state], + [wallet], ); - const ClaimAchievement = useCallback( - async (which: number) => { - setTransactionFailed(false); - num_state_checks.current = 0; - - if (wallet.publicKey === null || wallet.signTransaction === undefined || which === null) return; + useEffect(() => { + addEventListener("TransferSOL", handleTransferSOL); + return () => { + removeEventListener("TransferSOL", handleTransferSOL); + }; + }, [addEventListener, removeEventListener, handleTransferSOL]); - let program_account_key = PublicKey.findProgramAddressSync([Buffer.from(MAIN_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; - let program_data_key = PublicKey.findProgramAddressSync([Buffer.from(DATA_ACCOUNT_SEED)], DUNGEON_PROGRAM)[0]; + useEffect(() => { + addEventListener("TransferLOOT", handleTransferLOOT); + return () => { + removeEventListener("TransferLOOT", handleTransferLOOT); + }; + }, [addEventListener, removeEventListener, handleTransferLOOT]); - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - let player_achievement_key = PublicKey.findProgramAddressSync( - [wallet.publicKey.toBytes(), Buffer.from(ACHIEVEMENT_SEED)], - DUNGEON_PROGRAM, - )[0]; + useEffect(() => { + addEventListener("SendAccountInfo", handleAccountData); + return () => { + removeEventListener("SendAccountInfo", handleAccountData); + }; + }, [addEventListener, removeEventListener, handleAccountData]); - let shop_program_data_key = PublicKey.findProgramAddressSync([Buffer.from("data_account")], SHOP_PROGRAM)[0]; + const handleConfirmDataLoaded = useCallback(async () => { + console.log("load succeeded"); + level_loaded.current = true; + }, []); - const nft_mint_keypair = Keypair.generate(); - var nft_mint_pubkey = nft_mint_keypair.publicKey; + useEffect(() => { + addEventListener("ConfirmDataLoaded", handleConfirmDataLoaded); + return () => { + removeEventListener("ConfirmDataLoaded", handleConfirmDataLoaded); + }; + }, [addEventListener, removeEventListener, handleConfirmDataLoaded]); - let nft_meta_key = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), METAPLEX_META.toBuffer(), nft_mint_pubkey.toBuffer()], - METAPLEX_META, - )[0]; + const handleStartGathering = useCallback( + async (gathering_type: number) => { + console.log("detected start crafting", gathering_type); - let nft_master_key = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), METAPLEX_META.toBuffer(), nft_mint_pubkey.toBuffer(), Buffer.from("edition")], - METAPLEX_META, - )[0]; + if (user_keypair.current === null) return; - let nft_account_key = await getAssociatedTokenAddress( - nft_mint_pubkey, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); + let player_data_key = PublicKey.findProgramAddressSync([user_keypair.current.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - const instruction_data = serialise_claim_achievement_instruction(DungeonInstruction.claim_achievement, which); - const init_data = serialise_basic_instruction(DungeonInstruction.add_funds); + const instruction_data = serialise_gather_instruction(DungeonInstruction.craft, gathering_type); var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, + { pubkey: user_keypair.current.publicKey, isSigner: true, isWritable: true }, { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: player_achievement_key, isSigner: false, isWritable: true }, - - { pubkey: ACHIEVEMENTS_COLLECTION_MINT, isSigner: false, isWritable: true }, - { pubkey: ACHIEVEMENTS_COLLECTION_META, isSigner: false, isWritable: true }, - { pubkey: ACHIEVEMENTS_COLLECTION_MASTER, isSigner: false, isWritable: true }, - - { pubkey: nft_mint_pubkey, isSigner: true, isWritable: true }, - { pubkey: nft_account_key, isSigner: false, isWritable: true }, - { pubkey: nft_meta_key, isSigner: false, isWritable: true }, - { pubkey: nft_master_key, isSigner: false, isWritable: true }, - { pubkey: program_account_key, isSigner: false, isWritable: true }, - { pubkey: shop_program_data_key, isSigner: false, isWritable: true }, - - { pubkey: SHOP_PROGRAM, isSigner: false, isWritable: false }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, - { pubkey: METAPLEX_META, isSigner: false, isWritable: false }, ]; const play_instruction = new TransactionInstruction({ @@ -1564,1278 +813,92 @@ export function DungeonApp() { data: instruction_data, }); - const init_instruction = new TransactionInstruction({ - keys: [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: program_account_key, isSigner: false, isWritable: true }, - { pubkey: program_data_key, isSigner: false, isWritable: true }, - { pubkey: SYSTEM_KEY, isSigner: false, isWritable: true }, - ], - programId: DUNGEON_PROGRAM, - data: init_data, - }); - - let txArgs = await get_current_blockhash(bearer_token); + let txArgs = await get_current_blockhash(""); let transaction = new Transaction(txArgs); - transaction.feePayer = wallet.publicKey; + transaction.feePayer = user_keypair.current.publicKey; + + console.log(transaction.recentBlockhash, transaction.lastValidBlockHeight); transaction.add(play_instruction); - transaction.add(init_instruction); - transaction.partialSign(nft_mint_keypair); - try { - let signed_transaction = await wallet.signTransaction(transaction); - const encoded_transaction = bs58.encode(signed_transaction.serialize()); + transaction.sign(user_keypair.current); - var transaction_response = await send_transaction(bearer_token, encoded_transaction); + console.log("sign with ", user_keypair.current.publicKey.toString()); + try { + const encoded_transaction = bs58.encode(transaction.serialize()); + var transaction_response = await send_transaction("", encoded_transaction); + console.log("transaction response:", transaction_response); if (transaction_response.result === "INVALID") { console.log(transaction_response); return; } - - let signature = transaction_response.result; - - if (DEBUG) { - console.log("play signature: ", signature); - } - - current_signature.current = signature; - signature_check_count.current = 0; } catch (error) { console.log(error); return; } - - check_achievements.current = true; - setShowAchievement(false); - - const message: NewDiscordMessage = { - message_type: "achievement", - emoji_1: DungeonCharacterEmoji[player_character], - emoji_2: "", - level: 0, - sol_amount: 0, - achievement_name: AchievementMetaData[which].name, - }; - - if (PROD) post_discord_message(message); }, - [wallet, player_character, bearer_token], + [DungeonInstruction.craft], ); - const ApplyKey = useCallback(async () => { - if (wallet.publicKey === null) return; - - setDiscountError(null); - - let parsed_key_index = parseInt(discount_key_index); - //console.log("key index", discount_key_index, parsed_key_index, isNaN(parsed_key_index)); - - if (isNaN(parsed_key_index)) return; - - let key_meta_data = await run_keyData_GPA(bearer_token, parsed_key_index); - - if (key_meta_data === null) { - setDiscountError("Key " + discount_key_index + " has not been minted"); - return; - } - - //console.log("key meta", key_meta_data, key_meta_data.key_mint.toString()); - - let key_mint = key_meta_data.key_mint; - let key_type = key_meta_data.key_type; - let key_index = parsed_key_index; - - // before we go on lets check they actually own the nft - let key_token_account = await getAssociatedTokenAddress( - key_mint, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); - - let token_amount = await request_token_amount(bearer_token, key_token_account); - - if (token_amount !== 1) { - setDiscountError("User does not own dungeon key " + key_index.toString()); - return; - } - - let max_freeplays = 10; - if (key_type === KeyType.Silver) max_freeplays = 20; - if (key_type === KeyType.Gold) max_freeplays = 30; - - // get remaining freeplays - let key_freeplays_account = PublicKey.findProgramAddressSync( - [Buffer.from("key_freeplays"), key_mint.toBytes()], - DUNGEON_PROGRAM, - )[0]; - - let freeplay_data = await request_key_freeplays_data(bearer_token, key_freeplays_account); - - if (freeplay_data === null) { - //console.log("no free play account found, setting to ", max_freeplays); - setKeyFreePlays(max_freeplays); - } else { - let current_time = Date.now() / 1000; - let current_date = Math.floor(current_time / 24 / 60 / 60); - //console.log("free plays remaining", freeplay_data.freeplays_remaining, freeplay_data.last_date, current_date); - if (current_date === freeplay_data.last_date) { - setKeyFreePlays(freeplay_data.freeplays_remaining); - } else { - setKeyFreePlays(max_freeplays); - } - } - - setCurrentKeyMint(key_mint); - setCurrentKeyIndex(key_index); - }, [wallet, discount_key_index, bearer_token]); - - const Reset = useCallback(async () => { - if (DEBUG) { - console.log("In reset - setting state"); - } - setScreen(Screen.HOME_SCREEN); - setEnemyState(DungeonStatus.unknown); - return; - }, []); - - const ShowDeath = useCallback(async () => { - if (DEBUG) { - console.log("In show death - setting state"); - } - setScreen(Screen.DEATH_SCREEN); - setEnemyState(DungeonStatus.unknown); - return; - }, []); - - const LargeDoor = () => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - return ( - <> -
- {"generic"} -
- - ); - }; - - const Title = () => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - return ( - - {""} - - ); - }; - - const PotionButtons = () => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - let loot_bonus_time = current_player_data ? bignum_to_num(current_player_data?.bonus_loot_activation_time) : 0; - let current_time = Date.now() / 1000; - let loot_bonus_valid = loot_bonus && (current_time - loot_bonus_time) / 60 < 10.1; - - return ( - - - DrinkPotion(0)} - borderWidth="1px" - borderColor={advantage ? "green" : "white"} - > - {""} - - - {current_player_data === null ? "" : "x" + current_player_data?.num_advantage_potions} - - - - DrinkPotion(1)} - borderWidth="1px" - borderColor={loot_bonus_valid ? "green" : "white"} - > - {""} - - - {current_player_data === null ? "" : "x" + current_player_data?.num_bonus_loot_potions} - - - - ); - }; - - const SelectKnight = useCallback(async () => { - playAudio(classSelectAudio); - setWhichCharacter(DungeonCharacter.knight); - }, [playAudio]); - - const SelectRanger = useCallback(async () => { - playAudio(classSelectAudio); - setWhichCharacter(DungeonCharacter.ranger); - }, [playAudio]); - - const SelectWizard = useCallback(async () => { - playAudio(classSelectAudio); - setWhichCharacter(DungeonCharacter.wizard); - }, [playAudio]); - - const CharacterXP = (character: { character: DungeonCharacter }) => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - if (current_player_data === null) { - return ( - - - Lvl 1 - - - ); - } - - let current_level = 1; - for (let i = 0; i < levels.length; i++) { - if (current_player_data.character_xp[character.character] >= levels[i]) { - current_level = i + 1; - } - } - - return ( - - - Lvl {current_level} - - - ); - }; - - const RestEnergy = (character: { character: DungeonCharacter }) => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - if (current_player_data === null) { - return ( - - Energy / 100 - - ); - } - - let rest_colour = "white"; - if (current_player_data?.rest_status[character.character].loot_bonus > 0) rest_colour = "yellow"; - else if (current_player_data?.rest_status[character.character].power_bonus > 0) rest_colour = "green"; - else if (current_player_data?.rest_status[character.character].xp_bonus > 0) rest_colour = "blue"; - - return ( - - Energy {current_player_data?.rest_status[character.character].energy}/100 - - ); - }; - - const CharacterSelect = () => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - //console.log("in characterSelect, progress: ", current_level, "enemy", current_enemy, "alive", currentStatus === 0, "num_plays", num_plays,initial_num_plays.current, "dataaccount:", data_account_status, "initial status", initial_status.current, initial_status.current === DungeonStatus.unknown); - - let now = Date.now() / 1000 + 60; - let knight_resting: boolean = current_player_data !== null && current_player_data?.rest_status[0].rest_time_remaining > now; - let ranger_resting: boolean = current_player_data !== null && current_player_data?.rest_status[1].rest_time_remaining > now; - let wizard_resting: boolean = current_player_data !== null && current_player_data?.rest_status[2].rest_time_remaining > now; - - let knight_rest_time = - current_player_data !== null - ? ((bignum_to_num(current_player_data?.rest_status[0].rest_time_remaining) - now) / 60.0 + 1).toFixed(0) - : ""; - - let ranger_rest_time = - current_player_data !== null - ? ((bignum_to_num(current_player_data?.rest_status[1].rest_time_remaining) - now) / 60.0 + 1).toFixed(0) - : ""; - - let wizard_rest_time = - current_player_data !== null - ? ((bignum_to_num(current_player_data?.rest_status[2].rest_time_remaining) - now) / 60.0 + 1).toFixed(0) - : ""; - return ( - -
- - {player_character === DungeonCharacter.knight && ( - - - - - - )} - {player_character !== DungeonCharacter.knight && ( - - - - - - )} - - - - { - rest_character.current = DungeonCharacter.knight; - setShowRest(true); - }} - > - - {knight_resting ? knight_rest_time + " min" : "Rest"} - - - - - - {player_character === DungeonCharacter.ranger && ( - - - - - - )} - {player_character !== DungeonCharacter.ranger && ( - - - - - - )} - - - { - rest_character.current = DungeonCharacter.ranger; - setShowRest(true); - }} - > - - {ranger_resting ? ranger_rest_time + " min" : "Rest"} - - - - - - {player_character === DungeonCharacter.wizard && ( - - - - - - )} - {player_character !== DungeonCharacter.wizard && ( - - - - - - )} - - - - { - rest_character.current = DungeonCharacter.wizard; - setShowRest(true); - }} - > - - {wizard_resting ? wizard_rest_time + " min" : "Rest"} - - - -
-
- ); - }; - - const UnconnectedPage = () => { - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - var font_size = DEFAULT_FONT_SIZE; - if (isTabletOrMobile) { - font_size = "15px"; - } - - return ( - <> - {isTabletOrMobile ? ( - <> -
- -
-
- -
-
- -
-
- - 0.002 SOL per Play - -
-
- - Dungeon Keys provide -
- Free Plays every day! -
-
-
- -
- -
-
- - -
-
- setScreen(Screen.FAQ_SCREEN)} - > - HOW TO PLAY - -
-
-
- -
- - ) : ( - -
- - - - -
- - Dungeon Keys provide -
- Free Plays every day! -
-
- - -
-
- - - - - - -
- {!isMobile && ( - - - - - - - - )} -
-
-
- )} - - ); - }; - - const ConnectedPage = () => { - var font_size = DEFAULT_FONT_SIZE; - if (isMobile) { - font_size = "15px"; - } - - let visible = true; - - //console.log("have made it here in CS", visible); - - // if i don't need to make an account but player status is unknown return nothing - if ( - data_account_status === AccountStatus.created && - (initial_status.current === DungeonStatus.unknown || - (num_plays.current === initial_num_plays.current && currentStatus === DungeonStatus.alive && current_level > 0)) - ) { - visible = false; - } - - //console.log("have made it here in CS 2", visible); - // if i am alive or exploring and the level is > 0 never show this - if (data_account_status === AccountStatus.unknown || (current_level > 0 && currentStatus === DungeonStatus.alive)) { - visible = false; - } - //console.log("have made it here in CS 3", visible); - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 900px)" }); - - return ( - <> - {isTabletOrMobile ? ( -
-
- -
- -
- -
-
- -
-
- -
-
- -
- {key_freeplays <= 0 && ( - - DUNGEON FEE: -
- 0.002 SOL -
- )} - {key_freeplays > 0 && ( - - DUNGEON FEE: -
- 0.000 SOL -
- )} -
-
-
-
- - Use Key - - -
-
-
- setScreen(Screen.FAQ_SCREEN)} - > - HOW TO PLAY - -
-
-
- ) : ( - -
- - - - -
- - Dungeon Keys provide -
- Free Plays every day! -
-
- - -
-
- - - - - -
- {key_freeplays <= 0 && ( - - DUNGEON -
- FEE: -
- 0.002 SOL -
- )} - {key_freeplays > 0 && ( - - DUNGEON -
- FEE: -
- 0.000 SOL -
- )} - - -
- -
-
-
- - - - - -
- setScreen(Screen.FAQ_SCREEN)} - > - HOW TO PLAY - -
-
- - -
-
-
-
- )} - - ); - }; - - const handleExploreFurther = () => { - playAudio(TorchAudio); - Play(); - }; - - const handleEscape = () => { - playAudio(EscapeAudio); - Quit(); - }; - - const handleRetry = () => { - playAudio(RetryAudio); - Play(); - }; - - const handleExit = () => { - playAudio(GameOverAudio); - ShowDeath(); - }; - - const InDungeon = () => { - var font_size = DEFAULT_FONT_SIZE; - if (isMobile) { - font_size = "15px"; - } - - if (DEBUG) { - console.log( - "in dungeon: check_state: ", - check_user_state.current, - "current_state ", - DungeonStatusString[currentStatus], - "player_state", - DungeonStatusString[player_state], - "level ", - current_level, - "enemy", - current_enemy, - "enemy_state", - DungeonStatusString[enemy_state], - ); - } - - let background_image = hallway; - if (current_level > 4) background_image = hallway2; - - return ( - <> - - - - - - - - - - + useEffect(() => { + addEventListener("StartCrafting", handleStartGathering); + return () => { + removeEventListener("StartCrafting", handleStartGathering); + }; + }, [addEventListener, removeEventListener, handleStartGathering]); - - - - - - - - - - - - - - - - - - - - {transaction_failed && ( -
- - Transaction Failed.
- Please Refresh. -
-
- )} - - {player_state === DungeonStatus.dead && ( - <> - - - - -
- - - - Drink a Potion - - - - - - - - - -
-
- - )} - {player_state === DungeonStatus.alive && current_level > 0 && ( - <> - {enemy_state === DungeonStatus.unknown && ( - - )} - {enemy_state === DungeonStatus.alive && ( - <> - - handleAnimation(animateLevel.current)} - mt="2%" - display="flex" - justifyContent="center" - > - Roll Button - - - Click to Roll - - - )} - {enemy_state === DungeonStatus.dead && ( - - - - - - {current_level < 7 && ( -
- - - - Drink a Potion - - - - - - - - - - -
- )} - {current_level >= 7 && ( -
- -
- )} -
- )} - - )} -
-
- - ); - }; + function handleClickEnterFullscreen() { + requestFullscreen(true); + } - const DeathScreen = () => { - return ( - <> - - - - - {""} - - - + const isMobile = useMediaQuery({ query: "(max-width: 1920px)" }); - -
-
- - You Have Died -
- {total_loot.toFixed(3)} Loot -
-
-
-
+ let width = 1920; + let height = 1080; - - -
- -
- -
-
- - ); - }; + if (isMobile) { + width = window.innerWidth; + height = window.innerHeight; + } return ( <> - - {(screen === Screen.HOME_SCREEN || screen === Screen.DUNGEON_SCREEN) && } - {screen === Screen.HOME_SCREEN && } - - -
- - </Center> - </Box> - + <Navigation /> + <Text color="white"> + {width} vs {height} + </Text> <Box width="100%"> <Center> - {!wallet.publicKey && ( + {!ready && ( <> - {screen === Screen.ARENA_SCREEN && <ArenaScreen bearer_token={bearer_token} />} - {screen === Screen.ODDS_SCREEN && <OddsScreen />} - {screen === Screen.FAQ_SCREEN && <FAQScreen />} - {screen === Screen.HELP_SCREEN && <HelpScreen />} - {screen === Screen.SHOP_SCREEN && ( - <ShopScreen - player_data={current_player_data} - bearer_token={bearer_token} - check_sol_balance={check_sol_balance} - check_user_state={check_user_state} - /> - )} - {screen === Screen.MARKETPLACE_SCREEN && <MarketplaceScreen bearer_token={bearer_token} />} - {screen === Screen.DM_SCREEN && <DMScreen bearer_token={bearer_token} />} - {screen === Screen.ACHIEVEMENT_SCREEN && ( - <AchievementsScreen AchievementState={achievement_status} ClaimAchievement={ClaimAchievement} /> - )} - {screen === Screen.STATS_SCREEN && ( - <StatsScreen - AchievementData={achievement_data} - loot_per_day={loot_per_day.toFixed(2)} - player_data={current_player_data} - /> - )} - {(screen === Screen.HOME_SCREEN || screen === Screen.DUNGEON_SCREEN || screen === Screen.DEATH_SCREEN) && ( - <UnconnectedPage /> - )} + <UnconnectedPage /> </> )} - {wallet.publicKey && ( + + {ready && ( <> - {screen === Screen.HOME_SCREEN && <ConnectedPage />} - {screen === Screen.DUNGEON_SCREEN && <InDungeon />} - {screen === Screen.DEATH_SCREEN && <DeathScreen />} - {screen === Screen.ARENA_SCREEN && <ArenaScreen bearer_token={bearer_token} />} - {screen === Screen.ODDS_SCREEN && <OddsScreen />} - {screen === Screen.FAQ_SCREEN && <FAQScreen />} - {screen === Screen.SHOP_SCREEN && ( - <ShopScreen - player_data={current_player_data} - bearer_token={bearer_token} - check_sol_balance={check_sol_balance} - check_user_state={check_user_state} - /> - )} - {screen === Screen.MARKETPLACE_SCREEN && <MarketplaceScreen bearer_token={bearer_token} />} - {screen === Screen.HELP_SCREEN && <HelpScreen />} - {screen === Screen.ACHIEVEMENT_SCREEN && ( - <AchievementsScreen AchievementState={achievement_status} ClaimAchievement={ClaimAchievement} /> - )} - {screen === Screen.STATS_SCREEN && ( - <StatsScreen - AchievementData={achievement_data} - loot_per_day={loot_per_day.toFixed(2)} - player_data={current_player_data} - /> - )} - {screen === Screen.DM_SCREEN && <DMScreen bearer_token={bearer_token} />} + <div className="home"> + <div className="container"> + <div className={styles.container}> + <div className={styles.unityWrapper}> + <Fragment> + <Unity unityProvider={unityProvider} style={{ width: width, height: height }} /> + <Box as="button" onClick={handleClickEnterFullscreen}> + <div className="font-face-sfpb"> + <Text fontSize={25} textAlign="center" color="white"> + FullScreen + </Text> + </div> + </Box> + </Fragment> + </div> + </div> + + <br /> + </div> + </div> </> )} </Center> @@ -2853,10 +916,8 @@ function Home() { <ChakraProvider> <WalletProvider wallets={wallets} autoConnect> <WalletModalProvider> - <MuteProvider isMuted={false}> - <DungeonApp /> - <Footer /> - </MuteProvider> + <DungeonApp /> + <Footer /> </WalletModalProvider> </WalletProvider> </ChakraProvider> diff --git a/src/components/apps/dungeon/musicPlayer.tsx b/src/components/apps/dungeon/musicPlayer.tsx deleted file mode 100644 index e4590890..00000000 --- a/src/components/apps/dungeon/musicPlayer.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { useContext, useEffect, useState } from "react"; -import ReactAudioPlayer from "react-h5-audio-player"; -import { MuteContext } from "./mute"; -import "react-h5-audio-player/lib/styles.css"; -import "./css/musicPlayer.css"; -import Next from "./images/Next.png"; -import Prev from "./images/Prev.png"; -import Play from "./images/Play.png"; -import Pause from "./images/Pause.png"; -import { Center } from "@chakra-ui/react"; - -interface MusicTrack { - src: string; - name: string; -} - -interface MusicPlayerProps { - tracks: MusicTrack[]; -} - -const MusicPlayer = ({ tracks }: MusicPlayerProps) => { - const [audioSrc, setAudioSrc] = useState<string>(tracks[0].src); - const { volume, muteState, setPlaying } = useContext(MuteContext); - - useEffect(() => { - const audioElement = document.getElementsByTagName("audio")[0]; - if (muteState === 1) { - audioElement.volume = 0; - } else { - audioElement.volume = volume / 100; - } - }, [volume, muteState]); - - const handleAudioPlay = () => { - setPlaying(true); - }; - - const handleAudioPause = () => { - setPlaying(false); - }; - - const handleMusicButtonClick = (direction: "next" | "previous") => { - // Find the index of the current audio source in the tracks array - const currentIndex = tracks.findIndex((item) => item.src === audioSrc); - - // Calculate the index of the next or previous track - let nextIndex; - if (direction === "next") { - nextIndex = currentIndex < tracks.length - 1 ? currentIndex + 1 : 0; - } else { - nextIndex = currentIndex > 0 ? currentIndex - 1 : tracks.length - 1; - } - - // Set the audio source to the next or previous track - setAudioSrc(tracks[nextIndex].src); - - // Automatically play the next or previous audio - setTimeout(() => { - const audioElement = document.getElementsByTagName("audio")[0]; - if (audioElement) { - audioElement.play(); - setPlaying(true); - } - }, 100); - }; - - return ( - <> - <Center> - <ReactAudioPlayer - src={audioSrc} - layout="horizontal" - autoPlay={false} - className="music-player" - onClickNext={() => handleMusicButtonClick("next")} - onClickPrevious={() => handleMusicButtonClick("previous")} - onEnded={() => handleMusicButtonClick("next")} - onPlay={handleAudioPlay} - onPause={handleAudioPause} - showSkipControls={true} - showDownloadProgress={false} - showFilledProgress={false} - customIcons={{ - next: <img src={Next} alt="Next" />, - previous: <img src={Prev} alt="Prev" />, - play: <img src={Play} alt="Play" />, - pause: <img src={Pause} alt="Pause" />, - }} - /> - </Center> - </> - ); -}; - -export default MusicPlayer; diff --git a/src/components/apps/dungeon/mute.tsx b/src/components/apps/dungeon/mute.tsx deleted file mode 100644 index f939a5b3..00000000 --- a/src/components/apps/dungeon/mute.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { Button, Box, Flex } from "@chakra-ui/react"; -import { FC, useState, useContext, createContext } from "react"; -import soundOnImg from "./images/Sound_On.png"; -import soundOffImg from "./images/Sound_Off.png"; -import "./css/mute.css"; -import VolumeSlider from "./slider"; - -enum MuteState { - Unmuted, - Muted, - VolumeSlider, -} - -interface MuteButtonProps { - muteState: MuteState; - toggleMute: () => void; - volume: number; - setVolume: (value: number) => void; - isPlaying: boolean; - setPlaying: (value: boolean) => void; -} - -export const MuteContext = createContext<MuteButtonProps>({ - muteState: MuteState.Unmuted, - toggleMute: () => {}, - volume: 35, - setVolume: () => {}, - isPlaying: false, - setPlaying: () => {}, -}); - -export const MuteButton: FC = () => { - const { muteState, toggleMute, setVolume } = useContext(MuteContext); - - const handleVolumeChange = (newVolume: number) => { - setVolume(newVolume); - }; - - let content; - switch (muteState) { - case MuteState.Muted: - content = <img src={soundOffImg} alt="Sound Off" />; - break; - case MuteState.Unmuted: - content = <img src={soundOnImg} alt="Sound On" />; - break; - case MuteState.VolumeSlider: - content = ( - <Flex direction="column" alignItems="center" className="volume-slider-flex"> - <img src={soundOnImg} alt="Sound On" /> - <Box width="1.5rem" height="0.3rem" marginTop="2rem"> - <VolumeSlider onInput={handleVolumeChange} /> - </Box> - </Flex> - ); - break; - } - - return ( - <Button size="md" onClick={toggleMute} className="mute-button"> - <div className="font-face-sfpb">{content}</div> - </Button> - ); -}; - -export const MuteProvider = ({ children, isMuted: initialMuted }: React.PropsWithChildren<{ isMuted: boolean }>) => { - const [muteState, setMuteState] = useState(initialMuted ? MuteState.Muted : MuteState.Unmuted); - const [volume, setVolume] = useState(35); - const [isPlaying, setPlaying] = useState(false); - - const toggleMute = () => { - setMuteState((prevState) => { - switch (prevState) { - case MuteState.Unmuted: - return MuteState.Muted; - case MuteState.Muted: - return MuteState.VolumeSlider; - case MuteState.VolumeSlider: - return MuteState.Unmuted; - } - }); - }; - - return <MuteContext.Provider value={{ muteState, toggleMute, volume, setVolume, isPlaying, setPlaying }}>{children}</MuteContext.Provider>; -}; diff --git a/src/components/apps/dungeon/navigation.tsx b/src/components/apps/dungeon/navigation.tsx index 74e49989..b121999b 100644 --- a/src/components/apps/dungeon/navigation.tsx +++ b/src/components/apps/dungeon/navigation.tsx @@ -1,29 +1,12 @@ -import React, { useCallback, useState, useEffect, useRef } from "react"; -import { SetStateAction } from "react"; - -import { Box, Button, Flex, HStack, Text, VStack } from "@chakra-ui/react"; - -import { useDisclosure, Drawer, DrawerBody, DrawerOverlay, DrawerContent, DrawerCloseButton } from "@chakra-ui/react"; +import { Box, Flex, HStack } from "@chakra-ui/react"; import { useWallet } from "@solana/wallet-adapter-react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { brands, solid } from "@fortawesome/fontawesome-svg-core/import.macro"; // <-- import styles to be used -import { Screen } from "./constants"; - -import { MuteButton } from "./mute"; +import { brands } from "@fortawesome/fontawesome-svg-core/import.macro"; // <-- import styles to be used -import large_door from "./images/Large_Door.gif"; -import delvingDeeper from "./sounds/Delving_Deeper.mp3"; -import hackNSlash from "./sounds/Hack_n_Slash.mp3"; -import enterTheDungeon from "./sounds/Enter_the_Dungeon.mp3"; -import dungeonCrawling from "./sounds/Dungeon_Crawling.mp3"; -import orcsAndGoblins from "./sounds/Orcs_n_Goblins.mp3"; -import glimmerGreen from "./sounds/Glimmer-Green_Spire.mp3"; -import MusicPlayer from "./musicPlayer"; -import { useMediaQuery } from 'react-responsive' // dungeon utils -import { WalletConnected, request_current_balance } from "./utils"; +import { WalletConnected } from "./utils"; import "./css/style.css"; import "./css/fonts.css"; @@ -32,274 +15,32 @@ import "./css/navigation.css"; require("@solana/wallet-adapter-react-ui/styles.css"); -export function Navigation({ - setScreen, - check_sol_balance, - bearer_token, -}: { - setScreen: React.Dispatch<SetStateAction<number>>; - check_sol_balance: React.MutableRefObject<boolean>; - bearer_token: string; -}) { +export function Navigation() { const wallet = useWallet(); - const [balance, setBalance] = useState(0); - - //MusicList - const MusicList = [ - { src: delvingDeeper, name: "Delving Deeper" }, - { src: hackNSlash, name: "Hack N Slash" }, - { src: enterTheDungeon, name: "Enter the Dungeon" }, - { src: dungeonCrawling, name: "Dungeon Crawling" }, - { src: orcsAndGoblins, name: "Orcs and Goblins" }, - { src: glimmerGreen, name: "Glimmer Green" }, - ]; - - // This will be used to store the interval - const intervalref = useRef<number | null>(null); - - const checkBalance = useCallback(async () => { - //console.log("in increase", balance, check_sol_balance.current); - - if (wallet.publicKey === null) return; - - if (check_sol_balance.current === false) return; - - let current_balance = await request_current_balance(bearer_token, wallet.publicKey); - - //console.log("balance ", current_balance); - if (current_balance !== balance) { - check_sol_balance.current = false; - } - - setBalance(current_balance); - }, [wallet, balance, check_sol_balance, bearer_token]); - - // Use the useEffect hook to cleanup the interval when the component unmounts - useEffect(() => { - if (intervalref.current === null) { - intervalref.current = window.setInterval(checkBalance, 1000); - } else { - window.clearInterval(intervalref.current); - intervalref.current = null; - } - // here's the cleanup function - return () => { - if (intervalref.current !== null) { - window.clearInterval(intervalref.current); - intervalref.current = null; - } - }; - }, [checkBalance]); - - useEffect(() => { - setBalance(0); - }, [wallet]); - - const ShowFAQ = useCallback(async () => { - setScreen(Screen.FAQ_SCREEN); - return; - }, [setScreen]); - - const ShowOdds = useCallback(async () => { - setScreen(Screen.ODDS_SCREEN); - return; - }, [setScreen]); - - const ShowHelp = useCallback(async () => { - setScreen(Screen.HELP_SCREEN); - return; - }, [setScreen]); - - const ShowHome = useCallback(async () => { - setScreen(Screen.HOME_SCREEN); - return; - }, [setScreen]); - - const ShowShop = useCallback(async () => { - setScreen(Screen.SHOP_SCREEN); - return; - }, [setScreen]); - - const ShowDM = useCallback(async () => { - setScreen(Screen.DM_SCREEN); - return; - }, [setScreen]); - - const ShowAchievements = useCallback(async () => { - setScreen(Screen.ACHIEVEMENT_SCREEN); - return; - }, [setScreen]); - - const ShowStats = useCallback(async () => { - setScreen(Screen.STATS_SCREEN); - return; - }, [setScreen]); - - const ShowArena = useCallback(async () => { - setScreen(Screen.ARENA_SCREEN); - return; - }, [setScreen]); - - const addMargin = (index: number) => { - if (index === 0) { - return { marginTop: "1rem", _focus: { boxShadow: "none" } }; - } else if (index === NavBar.length - 1) { - return { marginBottom: "1rem" }; - } else { - return {}; - } - }; - - const NavBar = [ - { text: "Home", onClick: ShowHome }, - { text: "Arena", onClick: ShowArena }, - { text: "DM", onClick: ShowDM }, - { text: "Shop", onClick: ShowShop }, - { text: "Achievements", onClick: ShowAchievements }, - { text: "Stats", onClick: ShowStats }, - { text: "Odds", onClick: ShowOdds }, - { text: "FAQ", onClick: ShowFAQ }, - { text: "Help", onClick: ShowHelp }, - ]; - const isTabletOrMobile = useMediaQuery({ query: '(max-width: 900px)' }) function DesktopNavigation() { - const { isOpen, onOpen, onClose } = useDisclosure(); - return ( <> <Box width="100%" ml="1%" mt="1%" mb="1%" mr="1%"> <Flex justifyContent="space-between" alignItems="center"> - <Box width="30%" display="flex" alignItems="center"> + <Box width="90%" display="flex" alignItems="center"> {wallet.publicKey !== null && <WalletConnected />} - <div className="font-face-sfpb"> - <Text fontSize="16px" color="white"> - {balance ? "Balance: " + balance.toFixed(3) + " SOL" : " "} - </Text> - </div> </Box> - <Box display="flex" mr="9.5%" justifyContent="flex-end"> - <HStack spacing="29%"> - <img - src={large_door} - onClick={() => setScreen(Screen.HOME_SCREEN)} - style={{ maxWidth: "none", cursor: "pointer" }} - width={24} - alt={"generic"} - /> - + <Box width="10%" mr="1rem"> + <HStack spacing="20%"> <a href="https://twitter.com/sol_dungeon"> <FontAwesomeIcon color="white" icon={brands("twitter")} size="lg" /> </a> <a href="https://discord.gg/soldungeon"> <FontAwesomeIcon color="white" icon={brands("discord")} size="lg" /> </a> - <MuteButton /> - - <FontAwesomeIcon color="white" icon={solid("bars")} size="lg" onClick={onOpen} /> </HStack> </Box> </Flex> - <Drawer isOpen={isOpen} placement="right" onClose={onClose} closeOnOverlayClick={true}> - <DrawerOverlay /> - <DrawerContent maxWidth={"25%"} maxHeight="fit-content" borderColor="white" borderWidth="2px"> - <DrawerBody bg="black" backgroundColor="#171923"> - <VStack spacing="24px"> - {NavBar.map((button, index) => ( - <Button - variant="link" - key={index} - size="md" - style={addMargin(index)} - onClick={button.onClick} - sx={{ outline: "none !important" }} - textTransform={"uppercase"} - > - <div className="font-face-sfpb"> - <Text fontSize="16px" color="white" _hover={{ textDecoration: "underline" }}> - {button.text} - </Text> - </div> - </Button> - ))} - </VStack> - </DrawerBody> - </DrawerContent> - </Drawer> </Box> </> ); } - function MobileNavigation() { - const { isOpen, onOpen, onClose } = useDisclosure(); - //const btnRef = React.useRef() - - return ( - <Box className="navigationMobileBody" > - {wallet.publicKey && ( - <Box width="70%"> - <HStack> - <WalletConnected /> - </HStack> - </Box> - )} - {!wallet.publicKey && <Box width="75%"></Box>} - - - {/* <a href="https://twitter.com/sol_dungeon"> - <FontAwesomeIcon color="white" icon={brands("twitter")} size="lg" /> - </a> - - <a href="https://discord.gg/HeKJZZEaPn"> - <FontAwesomeIcon color="white" icon={brands("discord")} size="lg" /> - </a> */} - <div className="navigationBtns" > - <MuteButton /> - - <FontAwesomeIcon color="white" icon={solid("bars")} size="lg" onClick={onOpen} /> - <Drawer isOpen={isOpen} placement="right" onClose={onClose}> - <DrawerOverlay /> - <DrawerContent> - <DrawerCloseButton color="white" /> - - <DrawerBody bg="black"> - <VStack spacing="24px"> - {NavBar.map((button, index) => ( - <Button variant="link" key={index} size="md" onClick={button.onClick}> - <div className="font-face-sfpb"> - <Text fontSize="16px" color="white"> - {button.text} - </Text> - </div> - </Button> - ))} - </VStack> - </DrawerBody> - </DrawerContent> - </Drawer> - </div> - - - </Box> - ); - } - - return ( - <> - {!isTabletOrMobile && ( - <> - <DesktopNavigation /> - <MusicPlayer tracks={MusicList} /> - </> - )} - - {isTabletOrMobile && ( - <> - <MobileNavigation /> - <MusicPlayer tracks={MusicList} /> - </> - )} - </> - ); + return <DesktopNavigation />; } diff --git a/src/components/apps/dungeon/shop.tsx b/src/components/apps/dungeon/shop.tsx index f2bc7b11..dd52eb6e 100644 --- a/src/components/apps/dungeon/shop.tsx +++ b/src/components/apps/dungeon/shop.tsx @@ -21,8 +21,6 @@ import { LOOT_TOKEN_MINT, } from "./constants"; -import { DungeonInstruction } from "./dungeon_state"; - import bs58 from "bs58"; import { @@ -35,7 +33,6 @@ import { request_token_amount, serialise_mint_from_collection_instruction, ShopData, - serialise_buy_potion_instruction, bignum_to_num, PlayerData, } from "./utils"; @@ -76,8 +73,6 @@ import tower_of_dur from "./shop_items/TowerOfDur.png"; // potions import power_collection from "./shop_items/PotionCollection.gif"; -import power_potion from "./shop_items/Power_Potion.gif"; -import luck_potion from "./shop_items/Luck_Potion.gif"; import "./css/style.css"; import "./css/fonts.css"; @@ -538,74 +533,6 @@ export function ShopScreen({ [wallet, bearer_token, check_sol_balance], ); - const MintPotion = useCallback( - async (which: number) => { - if (wallet.publicKey === null || wallet.signTransaction === undefined) return; - - setProcessingTransaction(true); - - let player_data_key = PublicKey.findProgramAddressSync([wallet.publicKey.toBytes()], DUNGEON_PROGRAM)[0]; - - let loot_token_account = await getAssociatedTokenAddress( - LOOT_TOKEN_MINT, // mint - wallet.publicKey, // owner - true, // allow owner off curve - ); - - let quantity = parseInt(potion_quantity); - if (isNaN(quantity)) { - setProcessingTransaction(false); - return; - } - const instruction_data = serialise_buy_potion_instruction(DungeonInstruction.buy_potion, which, quantity); - - var account_vector = [ - { pubkey: wallet.publicKey, isSigner: true, isWritable: true }, - { pubkey: player_data_key, isSigner: false, isWritable: true }, - { pubkey: LOOT_TOKEN_MINT, isSigner: false, isWritable: true }, - { pubkey: loot_token_account, isSigner: false, isWritable: true }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: SYSTEM_KEY, isSigner: false, isWritable: false }, - ]; - - const play_instruction = new TransactionInstruction({ - keys: account_vector, - programId: DUNGEON_PROGRAM, - data: instruction_data, - }); - - let txArgs = await get_current_blockhash(bearer_token); - - let transaction = new Transaction(txArgs); - transaction.feePayer = wallet.publicKey; - - transaction.add(play_instruction); - - try { - let signed_transaction = await wallet.signTransaction(transaction); - const encoded_transaction = bs58.encode(signed_transaction.serialize()); - - var transaction_response = await send_transaction(bearer_token, encoded_transaction); - - if (transaction_response.result === "INVALID") { - console.log(transaction_response); - setProcessingTransaction(false); - return; - } - } catch (error) { - setProcessingTransaction(false); - console.log(error); - return; - } - - setProcessingTransaction(false); - check_user_state.current = true; - check_sol_balance.current = true; - check_loot_balance.current = true; - }, - [wallet, bearer_token, check_user_state, check_sol_balance, potion_quantity], - ); - const MintKey = useCallback(async () => { if (wallet.publicKey === null || wallet.signTransaction === undefined) return; @@ -906,115 +833,6 @@ export function ShopScreen({ ); }; - const PotionText = (): JSX.Element | null => { - return ( - <Center width="100%"> - <Box width="80%"> - <Text className="font-face-sfpb" fontSize={DUNGEON_FONT_SIZE} textAlign="center" color="white" mb="1rem"> - Magical potions to help you in your adventures - </Text> - <Center> - <HStack> - <VStack alignItems="center"> - <Box as="button" onClick={() => setWhichPotion(0)}> - <img style={{ imageRendering: "pixelated" }} src={power_potion} width="150" alt={""} /> - </Box> - <Box> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - Attack Potion - </Text> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - 10 LOOT - </Text> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - You Own {player_data?.num_advantage_potions} - </Text> - </Box> - </VStack> - - <VStack alignItems="center"> - <Box as="button" onClick={() => setWhichPotion(1)}> - <img style={{ imageRendering: "pixelated" }} src={luck_potion} width="150" alt={""} /> - </Box> - <Box as="button"> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - Potion of Luck - </Text> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - 50 LOOT - </Text> - <Text textAlign="center" className="font-face-sfpb" color="grey" fontSize="10px"> - You Own {player_data?.num_bonus_loot_potions} - </Text> - </Box> - </VStack> - </HStack> - </Center> - - {which_potion === 0 && ( - <VStack> - <Text - mt="1rem" - className="font-face-sfpb" - fontSize={DUNGEON_FONT_SIZE} - textAlign="center" - color="white" - mb="1rem" - > - Potion of Power - Roll two dice in the next Room and pick the highest value as your attack - </Text> - <VStack> - <PotionQuantity /> - <Box - as="button" - onClick={() => { - MintPotion(0); - }} - borderWidth="1px" - borderColor="white" - > - <Text className="font-face-sfpb" color="white" fontSize={DUNGEON_FONT_SIZE}> - Purchase - </Text> - </Box> - </VStack> - </VStack> - )} - {which_potion === 1 && ( - <VStack> - <Text - mt="1rem" - className="font-face-sfpb" - fontSize={DUNGEON_FONT_SIZE} - textAlign="center" - color="white" - mb="1rem" - > - Potion of Luck - Find 1-3 extra LOOT per room for 10 minutes after drinking - </Text> - <VStack> - <PotionQuantity /> - - <Box - as="button" - onClick={() => { - MintPotion(1); - }} - borderWidth="1px" - borderColor="white" - > - <Text className="font-face-sfpb" color="white" fontSize={DUNGEON_FONT_SIZE}> - Purchase - </Text> - </Box> - </VStack> - </VStack> - )} - </Box> - </Center> - ); - }; - const MusicText = (): JSX.Element | null => { return ( <Center width="100%"> @@ -1220,10 +1038,6 @@ export function ShopScreen({ return <LoreText />; } - if (collection_page === Collection.Potions) { - return <PotionText />; - } - return null; }; diff --git a/src/components/apps/dungeon/slider.tsx b/src/components/apps/dungeon/slider.tsx deleted file mode 100644 index 5061c55f..00000000 --- a/src/components/apps/dungeon/slider.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, MouseEventHandler, useContext, useState } from "react"; -import { MuteContext } from "./mute"; -import "./css/slider.css"; - -interface SliderProps { - // value: number; - onInput: (value: number) => void; -} - -const VolumeSlider: FC<SliderProps> = ({ onInput }) => { - const { volume: globalVolume } = useContext(MuteContext); - const [volume, setVolume] = useState(globalVolume); - - const handleMouseUp: MouseEventHandler<HTMLInputElement> = (event) => { - const newValue = parseInt((event.target as HTMLInputElement).value, 10); - setVolume(newValue); - onInput(newValue); - }; - - return <input type="range" className="volume-slider" min={0} max={100} defaultValue={volume} onMouseUp={handleMouseUp} />; -}; - -export default VolumeSlider; diff --git a/src/components/apps/dungeon/sounds/Class_Select.mp3 b/src/components/apps/dungeon/sounds/Class_Select.mp3 deleted file mode 100644 index 93e74f45..00000000 Binary files a/src/components/apps/dungeon/sounds/Class_Select.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Delving_Deeper.mp3 b/src/components/apps/dungeon/sounds/Delving_Deeper.mp3 deleted file mode 100644 index 33207c6a..00000000 Binary files a/src/components/apps/dungeon/sounds/Delving_Deeper.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Dungeon_Crawling.mp3 b/src/components/apps/dungeon/sounds/Dungeon_Crawling.mp3 deleted file mode 100644 index 1db82d87..00000000 Binary files a/src/components/apps/dungeon/sounds/Dungeon_Crawling.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Dungeon_Title_Screen.mp3 b/src/components/apps/dungeon/sounds/Dungeon_Title_Screen.mp3 deleted file mode 100644 index c76f06b1..00000000 Binary files a/src/components/apps/dungeon/sounds/Dungeon_Title_Screen.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Enter_the_Dungeon.mp3 b/src/components/apps/dungeon/sounds/Enter_the_Dungeon.mp3 deleted file mode 100644 index c16c9f20..00000000 Binary files a/src/components/apps/dungeon/sounds/Enter_the_Dungeon.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Escape.mp3 b/src/components/apps/dungeon/sounds/Escape.mp3 deleted file mode 100644 index a9cf93db..00000000 Binary files a/src/components/apps/dungeon/sounds/Escape.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Game_Over.mp3 b/src/components/apps/dungeon/sounds/Game_Over.mp3 deleted file mode 100644 index fac106d8..00000000 Binary files a/src/components/apps/dungeon/sounds/Game_Over.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Glimmer-Green_Spire.mp3 b/src/components/apps/dungeon/sounds/Glimmer-Green_Spire.mp3 deleted file mode 100644 index ba077e44..00000000 Binary files a/src/components/apps/dungeon/sounds/Glimmer-Green_Spire.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Hack_n_Slash.mp3 b/src/components/apps/dungeon/sounds/Hack_n_Slash.mp3 deleted file mode 100644 index 30855e6e..00000000 Binary files a/src/components/apps/dungeon/sounds/Hack_n_Slash.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Open_Door.mp3 b/src/components/apps/dungeon/sounds/Open_Door.mp3 deleted file mode 100644 index 7a588a52..00000000 Binary files a/src/components/apps/dungeon/sounds/Open_Door.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Orcs_n_Goblins.mp3 b/src/components/apps/dungeon/sounds/Orcs_n_Goblins.mp3 deleted file mode 100644 index cf0af56d..00000000 Binary files a/src/components/apps/dungeon/sounds/Orcs_n_Goblins.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Player_Death.mp3 b/src/components/apps/dungeon/sounds/Player_Death.mp3 deleted file mode 100644 index 1695181b..00000000 Binary files a/src/components/apps/dungeon/sounds/Player_Death.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Retry.mp3 b/src/components/apps/dungeon/sounds/Retry.mp3 deleted file mode 100644 index 34368b7a..00000000 Binary files a/src/components/apps/dungeon/sounds/Retry.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Torch.mp3 b/src/components/apps/dungeon/sounds/Torch.mp3 deleted file mode 100644 index 0fe7461f..00000000 Binary files a/src/components/apps/dungeon/sounds/Torch.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Victory.mp3 b/src/components/apps/dungeon/sounds/Victory.mp3 deleted file mode 100644 index 527cbc32..00000000 Binary files a/src/components/apps/dungeon/sounds/Victory.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/Wager_Select.mp3 b/src/components/apps/dungeon/sounds/Wager_Select.mp3 deleted file mode 100644 index 1f7dafce..00000000 Binary files a/src/components/apps/dungeon/sounds/Wager_Select.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/sounds/click.mp3 b/src/components/apps/dungeon/sounds/click.mp3 deleted file mode 100644 index 1682ad49..00000000 Binary files a/src/components/apps/dungeon/sounds/click.mp3 and /dev/null differ diff --git a/src/components/apps/dungeon/stats.tsx b/src/components/apps/dungeon/stats.tsx index 4c09477f..d63429ea 100644 --- a/src/components/apps/dungeon/stats.tsx +++ b/src/components/apps/dungeon/stats.tsx @@ -1,25 +1,6 @@ -import React, { useCallback, useEffect, useState } from "react"; - -import PlotlyChart from "react-plotlyjs-ts"; -import { Box, Center, HStack, Text, VStack } from "@chakra-ui/react"; -import Table from "react-bootstrap/Table"; -//import { isMobile } from "react-device-detect"; -import Tab from "react-bootstrap/Tab"; -import Tabs from "react-bootstrap/Tabs"; -import Container from "react-bootstrap/Container"; -import { useMediaQuery } from "react-responsive"; -//import { -// useWallet -//} from '@solana/wallet-adapter-react'; - -import { DEFAULT_FONT_SIZE, DUNGEON_FONT_SIZE, EMOJI_SIZE } from "./constants"; -import { AchievementData, bignum_to_num, PlayerData } from "./utils"; -import { DungeonEnemy, DungeonCharacter } from "./dungeon_state"; - -import "./css/table.css"; -import "./css/fonts.css"; -import "./css/tabs.css"; +import React from "react"; +/* import assassin_emoji from "./emojis/Assassin.gif"; import blue_slime_emoji from "./emojis/BlueSlime.gif"; import boulder_emoji from "./emojis/Boulder.png"; @@ -985,3 +966,4 @@ export function StatsScreen({ </Container> ); } +*/ diff --git a/src/components/apps/dungeon/utils.tsx b/src/components/apps/dungeon/utils.tsx index 07940e09..6bcee01d 100644 --- a/src/components/apps/dungeon/utils.tsx +++ b/src/components/apps/dungeon/utils.tsx @@ -13,6 +13,7 @@ import { i64, bignum, bool, + array, } from "@metaplex-foundation/beet"; import { publicKey } from "@metaplex-foundation/beet-solana"; @@ -119,12 +120,23 @@ interface BlockHash { export async function get_current_blockhash(bearer: string): Promise<BlockHash> { var body = { id: 1, jsonrpc: "2.0", method: "getLatestBlockhash" }; - const blockhash_data_result = await postData(RPC_NODE, bearer, body); + let have_blockhash = false; - let blockhash = blockhash_data_result["result"]["value"]["blockhash"]; - let last_valid = blockhash_data_result["result"]["value"]["lastValidBlockHeight"]; + let hash_data: BlockHash = { blockhash: "", lastValidBlockHeight: 0 }; + while (!have_blockhash) { + console.log("getting blockhash"); + const blockhash_data_result = await postData(RPC_NODE, bearer, body); - let hash_data: BlockHash = { blockhash: blockhash, lastValidBlockHeight: last_valid }; + if (blockhash_data_result["result"]["value"] == null) continue; + + let blockhash = blockhash_data_result["result"]["value"]["blockhash"]; + let last_valid = blockhash_data_result["result"]["value"]["lastValidBlockHeight"]; + + hash_data = { blockhash: blockhash, lastValidBlockHeight: last_valid }; + have_blockhash = true; + } + + console.log("BH: ", hash_data); return hash_data; } @@ -139,6 +151,7 @@ export async function send_transaction(bearer: string, encoded_transaction: stri var body = { id: 1, jsonrpc: "2.0", method: "sendTransaction", params: [encoded_transaction, { skipPreflight: true }] }; var response_json = await postData(RPC_NODE, bearer, body); + console.log(response_json); let transaction_response: TransactionResponseData = response_json; let valid_json = check_json(response_json); @@ -430,7 +443,7 @@ class DungeonData { export class RestData { constructor( readonly energy: number, - readonly rest_time_remaining: bignum, + readonly rest_end_time: bignum, readonly power_bonus: number, readonly loot_bonus: number, readonly health_bonus: number, @@ -440,25 +453,85 @@ export class RestData { static readonly struct = new BeetStruct<RestData>( [ ["energy", u8], - ["rest_time_remaining", i64], + ["rest_end_time", i64], ["power_bonus", u8], ["loot_bonus", u8], ["health_bonus", u8], ["xp_bonus", u8], ], - (args) => - new RestData(args.energy!, args.rest_time_remaining!, args.power_bonus!, args.loot_bonus!, args.health_bonus!, args.xp_bonus!), + (args) => new RestData(args.energy!, args.rest_end_time!, args.power_bonus!, args.loot_bonus!, args.health_bonus!, args.xp_bonus!), "RestData", ); } +export class HouseData { + constructor( + readonly grid_width: number, + readonly grid_height: number, + readonly grid_cell_size: number, + readonly grid_offset: number[], + readonly sprites: number[], + readonly player_data: string[], + readonly enemy_data: string[], + ) {} + + static readonly struct = new FixableBeetStruct<HouseData>( + [ + ["grid_width", u8], + ["grid_height", u8], + ["grid_cell_size", u8], + ["grid_offset", uniformFixedSizeArray(u16, 3)], + ["sprites", array(u8)], + ["player_data", array(utf8String)], + ["enemy_data", array(utf8String)], + ], + (args) => + new HouseData( + args.grid_width!, + args.grid_height!, + args.grid_cell_size!, + args.grid_offset!, + args.sprites!, + args.player_data!, + args.enemy_data!, + ), + "HouseData", + ); +} + +export class u64Data { + constructor(readonly value: bignum) {} + + static readonly struct = new BeetStruct<u64Data>([["value", u64]], (args) => new u64Data(args.value!), "u64Data"); +} + +export class HouseStateData { + constructor(readonly data: HouseData[]) {} + + static readonly struct = new FixableBeetStruct<HouseStateData>( + [["data", array(HouseData.struct)]], + (args) => new HouseStateData(args.data!), + "HouseStateData", + ); +} + +export class PlayerAccountData { + constructor(readonly data: number[]) {} + + static readonly struct = new FixableBeetStruct<PlayerAccountData>( + [["data", array(u8)]], + (args) => new PlayerAccountData(args.data!), + "PlayerAccountData", + ); +} + export class PlayerData { constructor( - readonly num_plays: bignum, + readonly num_interactions: bignum, readonly num_xp: bignum, - readonly in_progress: number, + readonly current_room: number, readonly player_status: number, - readonly dungeon_enemy: number, + readonly current_enemy: number, readonly player_character: number, readonly last_gold: bignum, readonly current_key: number, @@ -472,16 +545,18 @@ export class PlayerData { readonly dice_one: number, readonly dice_two: number, readonly rest_status: RestData[], + readonly stone_amount: number, + readonly wood_amount: number, readonly extra_space: bignum[], ) {} static readonly struct = new BeetStruct<PlayerData>( [ - ["num_plays", u64], + ["num_interactions", u64], ["num_xp", u64], - ["in_progress", u8], + ["current_room", u8], ["player_status", u8], - ["dungeon_enemy", u8], + ["current_enemy", u8], ["player_character", u8], ["last_gold", u64], ["current_key", u8], @@ -495,15 +570,17 @@ export class PlayerData { ["dice_one", u8], ["dice_two", u8], ["rest_status", uniformFixedSizeArray(RestData.struct, 3)], - ["extra_space", uniformFixedSizeArray(u8, 41)], + ["stone_amount", u8], + ["wood_amount", u8], + ["extra_space", uniformFixedSizeArray(u8, 39)], ], (args) => new PlayerData( - args.num_plays!, + args.num_interactions!, args.num_xp!, - args.in_progress!, + args.current_room!, args.player_status!, - args.dungeon_enemy!, + args.current_enemy!, args.player_character!, args.last_gold!, args.current_key!, @@ -517,6 +594,8 @@ export class PlayerData { args.dice_one!, args.dice_two!, args.rest_status!, + args.stone_amount!, + args.wood_amount!, args.extra_space!, ), "PlayerData", @@ -700,6 +779,57 @@ class DungeonRestInstruction { ); } +class DungeonSaveHomeInstruction { + constructor(readonly instruction: number, readonly layer: number, readonly data: HouseData) {} + + static readonly struct = new FixableBeetStruct<DungeonSaveHomeInstruction>( + [ + ["instruction", u8], + ["layer", u8], + ["data", HouseData.struct], + ], + (args) => new DungeonSaveHomeInstruction(args.instruction!, args.layer!, args.data!), + "DungeonSaveHomeInstruction", + ); +} + +class DungeonCreateAccountInstruction { + constructor( + readonly instruction: number, + readonly character: string, + readonly balance: bignum, + readonly iv: number[], + readonly salt: number[], + readonly data: number[], + ) {} + + static readonly struct = new FixableBeetStruct<DungeonCreateAccountInstruction>( + [ + ["instruction", u8], + ["character", utf8String], + ["balance", u64], + ["iv", uniformFixedSizeArray(u8, 16)], + ["salt", uniformFixedSizeArray(u8, 16)], + ["data", array(u8)], + ], + (args) => new DungeonCreateAccountInstruction(args.instruction!, args.character!, args.balance!, args.iv!, args.salt!, args.data!), + "DungeonCreateAccountInstruction", + ); +} + +class DungeonGatherInstruction { + constructor(readonly instruction: number, readonly gather_type: number) {} + + static readonly struct = new BeetStruct<DungeonGatherInstruction>( + [ + ["instruction", u8], + ["gather_type", u8], + ], + (args) => new DungeonGatherInstruction(args.instruction!, args.gather_type!), + "DungeonGatherInstruction", + ); +} + export async function request_player_account_data(bearer: string, pubkey: PublicKey): Promise<PlayerData | null> { let account_data = await request_raw_account_data(bearer, pubkey); @@ -748,6 +878,40 @@ export async function request_player_achievement_data(bearer: string, pubkey: Pu return data; } +export async function request_player_home_data(bearer: string, pubkey: PublicKey): Promise<HouseStateData | null> { + let account_data = await request_raw_account_data(bearer, pubkey); + + if (account_data === null) { + return null; + } + + const [data] = HouseStateData.struct.deserialize(account_data); + + return data; +} + +export function serialise_house_data( + width: number, + height: number, + cell_size: number, + offset: number[], + sprites: number[], + player_data: string[], + enemy_data: string[], +): Buffer { + const data = new HouseData(width, height, cell_size, offset, sprites, player_data, enemy_data); + const [buf] = HouseData.struct.serialize(data); + + return buf; +} + +export function serialise_save_home_instruction(instruction: number, layer: number, house_data: HouseData): Buffer { + const data = new DungeonSaveHomeInstruction(instruction, layer, house_data); + const [buf] = DungeonSaveHomeInstruction.struct.serialize(data); + + return buf; +} + export function serialise_play_instruction(instruction: number, which_character: number, bet_size: number): Buffer { const data = new DungeonPlayInstruction(instruction, which_character, bet_size); const [buf] = DungeonPlayInstruction.struct.serialize(data); @@ -797,6 +961,27 @@ export function serialise_rest_instruction(instruction: number, character: numbe return buf; } +export function serialise_create_account_instruction( + instruction: number, + character: string, + balance: bignum, + iv: number[], + salt: number[], + encrypted_data: number[], +): Buffer { + const data = new DungeonCreateAccountInstruction(instruction, character, balance, iv, salt, encrypted_data); + const [buf] = DungeonCreateAccountInstruction.struct.serialize(data); + + return buf; +} + +export function serialise_gather_instruction(instruction: number, gather_type: number): Buffer { + const data = new DungeonGatherInstruction(instruction, gather_type); + const [buf] = DungeonGatherInstruction.struct.serialize(data); + + return buf; +} + //////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// Shop Instructions and MetaData ///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/components/apps/json_data/default_rest.json b/src/components/apps/json_data/default_rest.json new file mode 100644 index 00000000..28b88a40 --- /dev/null +++ b/src/components/apps/json_data/default_rest.json @@ -0,0 +1,839 @@ +{ + "tile_map": { + "tilemapObjectArray": [{ + "tilemapSprite": 2, + "x": 0, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 3 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 0, + "y": 5 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 0, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 1, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 1, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 1, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 1, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 2, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 2, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 2, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 2, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 3, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 3, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 3, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 3, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 4, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 4, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 4, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 4, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 5, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 5, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 5, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 5, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 6, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 6, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 6, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 6, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 7, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 7, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 7, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 7, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 8, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 8, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 8, + "y": 2 + }, { + "tilemapSprite": 3, + "x": 8, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 8, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 8, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 8, + "y": 6 + }, { + "tilemapSprite": 3, + "x": 8, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 8, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 8, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 9, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 1 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 2 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 3 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 5 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 6 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 9, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 9, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 10, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 10, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 2 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 3 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 4 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 5 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 10, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 10, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 10, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 11, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 11, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 2 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 3 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 4 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 5 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 11, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 11, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 11, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 12, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 12, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 12, + "y": 2 + }, { + "tilemapSprite": 3, + "x": 12, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 12, + "y": 4 + }, { + "tilemapSprite": 3, + "x": 12, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 12, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 12, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 12, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 12, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 13, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 13, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 13, + "y": 2 + }, { + "tilemapSprite": 1, + "x": 13, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 13, + "y": 4 + }, { + "tilemapSprite": 3, + "x": 13, + "y": 5 + }, { + "tilemapSprite": 1, + "x": 13, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 13, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 13, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 13, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 14, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 14, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 2 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 3 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 4 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 5 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 14, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 14, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 14, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 15, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 15, + "y": 1 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 2 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 3 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 4 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 5 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 6 + }, { + "tilemapSprite": 1, + "x": 15, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 15, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 15, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 16, + "y": 0 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 1 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 2 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 3 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 5 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 6 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 7 + }, { + "tilemapSprite": 4, + "x": 16, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 16, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 17, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 17, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 17, + "y": 2 + }, { + "tilemapSprite": 3, + "x": 17, + "y": 3 + }, { + "tilemapSprite": 3, + "x": 17, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 17, + "y": 5 + }, { + "tilemapSprite": 3, + "x": 17, + "y": 6 + }, { + "tilemapSprite": 3, + "x": 17, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 17, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 17, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 3 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 18, + "y": 5 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 18, + "y": 9 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 0 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 1 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 2 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 3 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 4 + }, { + "tilemapSprite": 4, + "x": 19, + "y": 5 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 6 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 7 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 8 + }, { + "tilemapSprite": 2, + "x": 19, + "y": 9 + }], + "gridWidth": 20, + "gridHeight": 10, + "gridCellSize": 10.0, + "gridOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "player_prefabs": [{ + "prefab_name": "Knight", + "spawn_position": { + "x": 0, + "y": 0 + } + }, { + "prefab_name": "Knight", + "spawn_position": { + "x": 0, + "y": 9 + } + }], + "enemy_prefabs": [{ + "prefab_name": "Ooze", + "spawn_position": { + "x": 19, + "y": 6 + } + }, { + "prefab_name": "Ooze", + "spawn_position": { + "x": 19, + "y": 4 + } + }] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d299e2e4..1de2e498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3386,6 +3386,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@openpgp/web-stream-tools@^0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@openpgp/web-stream-tools/-/web-stream-tools-0.0.13.tgz#f0be50120c152efb11b65df29ab482dc192dbbd7" + integrity sha512-VQ0O0lUcD9ilLcMLQMJMgPhp8fDgMd4copd+UhSBGjud0vbI1ONQ3ffAhixEMml/AApLJtqCpd7PJcccPliFSA== + "@particle-network/auth@^0.5.5": version "0.5.6" resolved "https://registry.yarnpkg.com/@particle-network/auth/-/auth-0.5.6.tgz#058e00980511fdf72189b6d4a7576e67934a008a" @@ -4913,6 +4918,11 @@ dependencies: "@types/node" "*" +"@types/crypto-js@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" + integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== + "@types/eslint@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" @@ -6272,7 +6282,7 @@ asap@~2.0.3, asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1.js@^5.2.0, asn1.js@^5.4.1: +asn1.js@^5.0.0, asn1.js@^5.2.0, asn1.js@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -14569,6 +14579,13 @@ open@^7.0.2: is-docker "^2.0.0" is-wsl "^2.1.1" +openpgp@^5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.9.0.tgz#f7ebe7b1e228aebc494835509ec9239853faed61" + integrity sha512-wEI6TAinCAq8ZLZA4oZ3ZtJ2BhhHj+CiPCd8TzE7zCicr0V8tvG5UF76OtddLLOJcK63w3Aj3KiRd+VLMScirQ== + dependencies: + asn1.js "^5.0.0" + opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -16617,6 +16634,11 @@ react-twitch-embed@^3.0.1: resolved "https://registry.yarnpkg.com/react-twitch-embed/-/react-twitch-embed-3.0.1.tgz#59701297144ccede4e3fabe42c4789d66399d242" integrity sha512-ZjsLB3AVDQiGpL30u5TNq0CrBSuZXMvhbTgNSeQwoT9ehGud3R4LHxA5PZlt/TEquRVEsNNryLtQbXekk/kyUQ== +react-unity-webgl@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/react-unity-webgl/-/react-unity-webgl-9.4.0.tgz#f20d839f1b1eda1285ed7bcde9aa9ee8b642b516" + integrity sha512-0R/Z/SPAth1pKIaykgZrweASqt+Y0Sf+ToO8TuX/D1goExK6G3gmGIln7HZl/FXPva0Mz/75qLkYEZE23mdhAg== + react-use-websocket@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-use-websocket/-/react-use-websocket-4.3.1.tgz#13cd2fd2e0fb90010482ab2858f8ae81f2ce85c2"