From f526039785376c337a95fc1917f7efc1450c6cb3 Mon Sep 17 00:00:00 2001 From: Tom Date: Sat, 3 Aug 2024 15:35:38 +0100 Subject: [PATCH] Update micropython post --- _posts/2024-07-20-micropython-1.md | 49 +++++----- assets/blog/micropython/demo.py | 99 ++++++++++++++++++++ assets/blog/micropython/micropython.min.mjs | 2 +- assets/blog/micropython/micropython.wasm | Bin 1429274 -> 1508650 bytes assets/blog/micropython/simulator.js | 62 +++++++++--- 5 files changed, 173 insertions(+), 39 deletions(-) create mode 100644 assets/blog/micropython/demo.py diff --git a/_posts/2024-07-20-micropython-1.md b/_posts/2024-07-20-micropython-1.md index c94152a..fb1ff7b 100644 --- a/_posts/2024-07-20-micropython-1.md +++ b/_posts/2024-07-20-micropython-1.md @@ -21,15 +21,15 @@ head: | My first exposures to programming as a kid were through [processing](https://processing.org/) and arduino. -With Arduino, I understood that it's really just C with some libraries and a toolchain and started to read the datasheets of things like the [ATmega328][atmega328_datasheet]. This is super fun because the atmega328 is a relatively simple computer and you can just about read through the datasheeet. +After a while as a kid playing with Arduino, I started to understand from forum posts and other places the magical truth: Arduino is is just C with some libraries and a easy to setup dev environment! I started to read the datasheets of things like the [ATmega328][atmega328_datasheet], I guess this way my version of the minicomputers that the generations before mine cut their teeth on. -The atmega328 has all sorts of hardware that you can configure, like the timers that you can set up to count up/down, to trigger interupts, toggle pins etc. I had loads of fun with this as a nerdy kid. +The atmega328 is a relatively simple computer and you can just about read and understand the datasheet in a reasonable amount of time. It has all sorts of hardware that you can configure, timers that you can set up to count up/down, to trigger interupts, toggle pins etc. I had loads of fun with this as a nerdy kid. However the compile and upload time is kinda long, C that hits registers directly is both ugly and hard to debug and when you start to work with bigger systems like the ESP32 and RP2040 that have WiFi and multiple cores and stuff this all starts to get a bit less fun, at least for me. But because the likes of the ESP32 and the RP2040 are so much more powerful **they can run a python interpreter and it's surprisingly fast and really fun!** -Everyone loves to hate on python for being slow, and obviously don't write your tight loops in it (or do, I can't tell you what to do). But even on a resource constrained microprocessor you can have a fun time! +Everyone loves to hate on python for being slow, and obviously don't write your tight loops in it (or do, I can't tell you what to do). But even on a resource constrained microprocessor you can have a fun time with python! So anyway, here is a compendium of things I've being doing with [micropython][micropython]. Some of this is so that I don't forget how to do it later so there's a little more detail than might be warranted. @@ -42,7 +42,9 @@ So anyway, here is a compendium of things I've being doing with [micropython][mi A photograph of 4 Raspberry Pi Pico Boards arranged in a row. -The Raspberry Pi Pico is really nice, if you went to EMFcamp you can use [the badge][badge], and ESP32 boards work really well too! The easiest way to start is to flash a prebuilt firmware (for RP2040 boards that means putting the board in boot mode and then dragging and dropping a .uf2 file onto a virtual file system that appears.) +The Raspberry Pi Pico (The offical dev board for the RP2040 micro-controller) is really nice, if you went to EMFcamp you can use [the badge][badge], and ESP32 based boards work really well too! The easiest way to start is to flash a prebuilt firmware. + +For RP2040 boards that means putting the board in boot mode (by holding the BOOT button and powering it up) and then dragging and dropping a .uf2 file onto a virtual file system that appears. [badge]: https://tildagon.badge.emfcamp.org/ @@ -53,33 +55,30 @@ mpremote is a really handy little tool for interacting with a micropython board. mpremote cp main.py :main.py mpremote run main.py ``` -You can also just run code -```python -{% flexible_include assets/blog/micropython/example_micropython.py %} -``` - - -## Webassembly port - -People are staring to use webassembly to create simulators for physical hardware that run in the browser, this can make the dev loop super fast. [More details here](https://github.com/micropython/micropython/blob/master/ports/webassembly/README.md) - -For me this looks like: +You can also go straight to a REPL: ```sh -cd /ports/webassembly -make min FROZEN_MANIFEST=/path/to/font_sources/manifest.py -cp ...wasm and ....min.mjs to your webserver directory +mpremote REPL ``` -Then in the js console you can do: -``` -const mp = await loadMicroPython(); -mp.runPython("import fonts; print(fonts.gunship30)") -``` +## Next Steps +In the next few posts I'll talk a little about: -Note that I've got access to my compiled in code here. +* Drawing graphics +* Using nice fonts +* Compiling your own custom micropython firmware builds and when that makes sense. +* Compiling you firmware to webassmebly so you can make a web based simulator. +* Debugging the RP2040 with the RP Debbug probe. +* Using the DMA hardware on the RP240 to offload work from the main CPU +* Async programming with micropython + +Here's a little webassembly simulator of the micropython project I've been working on. I'll expand on this in later posts but very quickly: + +* It's targeted at a 240x240 pixel circular display that stores RGB colors with 5, 6 and 5 bits for each channel, respectively. +* This is running under webasembly with some custom code to convert the RGB 565 data and display it in a `` tag +* I'm using a ttf font called [gunship](https://www.iconian.com/g.html) converted to bitmap format and frozen into the firmware. - \ No newline at end of file + \ No newline at end of file diff --git a/assets/blog/micropython/demo.py b/assets/blog/micropython/demo.py new file mode 100644 index 0000000..8061e9c --- /dev/null +++ b/assets/blog/micropython/demo.py @@ -0,0 +1,99 @@ +import asyncio +import gc +import sys + +import console +import display +import drawing as draw +import fonts +import framebuf + +console.log( + "This is μPython saying hello from the JS console!\n" + f"Version {sys.version}" +) + +w, h = 240, 240 +buf = bytearray(w * h * 2) +fbuf = framebuf.FrameBuffer(buf, w, h, framebuf.RGB565) + +mode = "day" # "night" +bg_color = draw.WHITE if mode == "day" else draw.BLACK +text_color = draw.BLACK if mode == "day" else draw.WHITE + +def draw_ui(fbuf, power, amps, volts): + fbuf.fill(bg_color) + + level = power/300 + color = draw.BLACK if level < 0.8 \ + else draw.ORANGE if level < 0.9 \ + else draw.RED + + if level > 0.8: + quads = 0b1010 if (i % 10) < 5 else 0b0101 + r1, r2 = 120, 115 + fbuf.ellipse(120, 120, r1, r1, color, True, quads) + fbuf.ellipse(120, 120, r2, r2, bg_color, True) + + x, y = draw.display_with_units( + fbuf, + str(power), + "W", + 185, + 145, + color=text_color, + bg=bg_color, + mainfont=fonts.gunship45, + subfont=fonts.gunship25, + ) + draw.display_with_units( + fbuf, + f"{volts:3.1f}", + "V", + x, + y - fonts.gunship45.height(), + text_color, + bg=bg_color, + mainfont=fonts.gunship30, + subfont=fonts.gunship20, + ) + draw.display_with_units( + fbuf, + f"{amps:3.1f}", + "A", + x, + 175, + text_color, + bg=bg_color, + mainfont=fonts.gunship30, + subfont=fonts.gunship20, + ) + + w = 100 + x = 120 - w//2 + draw.hbar(fbuf, x, 50, w, 10, power / 300, c = draw.BLACK) + + draw.vbar(fbuf, 50, 50, 8, 30, power/300, draw.BLACK) + draw.vbar(fbuf, 40, 50, 8, 30, volts/50, draw.BLACK) + + draw.curved_bar(fbuf, x=120, y=120, r1=105, r2=110, + theta1=4, theta2=6, level=level, + c=color, n=15) + + display.draw_RGB565(buf) + +i = 0 +while True: + i += 1 + power = i % 90 + 200 + volts = 24.1 + (i % 10)/10 + amps = power / volts + draw_ui(fbuf, power, amps, volts) + gc.collect() + + # Note: Because of the way the webassembly port works, this code is actually running like an asyncio thread + # This call to asyncio.sleep yields back to the JS event loop and gives the browser a chance to update the display. + # This is not needed on a real device. + # There is way to make it so that a bare time.sleep() will work but it requires emcripten's ASYNCIFY feature + # Which apparently kills performance. See https://github.com/tomhodson/micropython/commit/2fa6373d226b65f977486ecda32b8786cd1dceed + await asyncio.sleep(0.1) diff --git a/assets/blog/micropython/micropython.min.mjs b/assets/blog/micropython/micropython.min.mjs index 3e783fe..46a9acb 100644 --- a/assets/blog/micropython/micropython.min.mjs +++ b/assets/blog/micropython/micropython.min.mjs @@ -1 +1 @@ -var _scriptName,_createMicroPythonModule=(_scriptName=import.meta.url,async function(moduleArg={}){var moduleRtn,readyPromiseResolve,readyPromiseReject,Module=moduleArg,readyPromise=new Promise(((resolve,reject)=>{readyPromiseResolve=resolve,readyPromiseReject=reject}));["_free","_malloc","_mp_js_init","_mp_js_repl_init","_mp_js_repl_process_char","_mp_hal_get_interrupt_char","_mp_sched_keyboard_interrupt","_mp_js_do_exec","_mp_js_do_exec_async","_mp_js_do_import","_mp_js_register_js_module","_proxy_c_free_obj","_proxy_c_init","_proxy_c_to_js_call","_proxy_c_to_js_delete_attr","_proxy_c_to_js_dir","_proxy_c_to_js_get_array","_proxy_c_to_js_get_dict","_proxy_c_to_js_get_iter","_proxy_c_to_js_get_type","_proxy_c_to_js_has_attr","_proxy_c_to_js_iternext","_proxy_c_to_js_lookup_attr","_proxy_c_to_js_resume","_proxy_c_to_js_store_attr","_proxy_convert_mp_to_js_obj_cside","_memory","___indirect_function_table","_proxy_convert_mp_to_js_then_js_to_mp_obj_jsside","_proxy_convert_mp_to_js_then_js_to_js_then_js_to_mp_obj_jsside","_js_get_proxy_js_ref_info","_has_attr","_lookup_attr","_store_attr","_call0","_call1","_call2","_calln","_call0_kwarg","_call1_kwarg","_js_reflect_construct","_js_get_iter","_js_iter_next","_js_subscr_load","_js_subscr_store","_proxy_js_free_obj","_js_check_existing","_js_get_error_info","_js_then_resolve","_js_then_reject","_js_then_continue","_create_promise","onRuntimeInitialized"].forEach((prop=>{Object.getOwnPropertyDescriptor(readyPromise,prop)||Object.defineProperty(readyPromise,prop,{get:()=>abort("You are getting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js"),set:()=>abort("You are setting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")})}));var ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(Module.ENVIRONMENT)throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)");if(ENVIRONMENT_IS_NODE){const{createRequire:createRequire}=await import("module");var require=createRequire(import.meta.url)}var readAsync,readBinary,moduleOverrides=Object.assign({},Module),quit_=(status,toThrow)=>{throw toThrow},scriptDirectory="";if(ENVIRONMENT_IS_NODE){if("undefined"==typeof process||!process.release||"node"!==process.release.name)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");var nodeVersion=process.versions.node,numericVersion=nodeVersion.split(".").slice(0,3);if((numericVersion=1e4*numericVersion[0]+100*numericVersion[1]+1*numericVersion[2].split("-")[0])<16e4)throw new Error("This emscripten-generated code requires node v16.0.0 (detected v"+nodeVersion+")");var fs=require("fs"),nodePath=require("path");scriptDirectory=require("url").fileURLToPath(new URL("./",import.meta.url)),readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return assert(ret.buffer),ret},readAsync=(filename,binary=!0)=>(filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename),new Promise(((resolve,reject)=>{fs.readFile(filename,binary?void 0:"utf8",((err,data)=>{err?reject(err):resolve(binary?data.buffer:data)}))}))),!Module.thisProgram&&process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),quit_=(status,toThrow)=>{throw process.exitCode=status,toThrow}}else if(ENVIRONMENT_IS_SHELL){if("object"==typeof process&&"function"==typeof require||"object"==typeof window||"function"==typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)")}else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw new Error("environment detection error");if(ENVIRONMENT_IS_WORKER?scriptDirectory=self.location.href:"undefined"!=typeof document&&document.currentScript&&(scriptDirectory=document.currentScript.src),_scriptName&&(scriptDirectory=_scriptName),scriptDirectory=scriptDirectory.startsWith("blob:")?"":scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1),"object"!=typeof window&&"function"!=typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");ENVIRONMENT_IS_WORKER&&(readBinary=url=>{var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.responseType="arraybuffer",xhr.send(null),new Uint8Array(xhr.response)}),readAsync=url=>isFileURI(url)?new Promise(((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,!0),xhr.responseType="arraybuffer",xhr.onload=()=>{(200==xhr.status||0==xhr.status&&xhr.response)&&resolve(xhr.response),reject(xhr.status)},xhr.onerror=reject,xhr.send(null)})):fetch(url,{credentials:"same-origin"}).then((response=>response.ok?response.arrayBuffer():Promise.reject(new Error(response.status+" : "+response.url))))}var prop,wasmBinary,wasmMemory,out=Module.print||console.log.bind(console),err=Module.printErr||console.error.bind(console);Object.assign(Module,moduleOverrides),moduleOverrides=null,prop="fetchSettings",Object.getOwnPropertyDescriptor(Module,prop)&&abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`),Module.arguments&&Module.arguments,legacyModuleProp("arguments","arguments_"),Module.thisProgram&&Module.thisProgram,legacyModuleProp("thisProgram","thisProgram"),Module.quit&&(quit_=Module.quit),legacyModuleProp("quit","quit_"),assert(void 0===Module.memoryInitializerPrefixURL,"Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.pthreadMainPrefixURL,"Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.cdInitializerPrefixURL,"Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.filePackagePrefixURL,"Module.filePackagePrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.read,"Module.read option was removed"),assert(void 0===Module.readAsync,"Module.readAsync option was removed (modify readAsync in JS)"),assert(void 0===Module.readBinary,"Module.readBinary option was removed (modify readBinary in JS)"),assert(void 0===Module.setWindowTitle,"Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)"),assert(void 0===Module.TOTAL_MEMORY,"Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"),legacyModuleProp("asm","wasmExports"),legacyModuleProp("readAsync","readAsync"),legacyModuleProp("readBinary","readBinary"),legacyModuleProp("setWindowTitle","setWindowTitle"),assert(!ENVIRONMENT_IS_SHELL,"shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable."),Module.wasmBinary&&(wasmBinary=Module.wasmBinary),legacyModuleProp("wasmBinary","wasmBinary"),"object"!=typeof WebAssembly&&err("no native wasm support detected");var EXITSTATUS,HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64,ABORT=!1;function assert(condition,text){condition||abort("Assertion failed"+(text?": "+text:""))}function checkStackCookie(){if(!ABORT){var max=_emscripten_stack_get_end();0==max&&(max+=4);var cookie1=HEAPU32[max>>2],cookie2=HEAPU32[max+4>>2];34821223==cookie1&&2310721022==cookie2||abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`),1668509029!=HEAPU32[0]&&abort("Runtime error: The application has corrupted its heap memory area (address zero)!")}}assert(!Module.STACK_SIZE,"STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time"),assert("undefined"!=typeof Int32Array&&"undefined"!=typeof Float64Array&&null!=Int32Array.prototype.subarray&&null!=Int32Array.prototype.set,"JS engine does not provide full typed array support"),assert(!Module.wasmMemory,"Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally"),assert(!Module.INITIAL_MEMORY,"Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically"),function(){var h16=new Int16Array(1),h8=new Int8Array(h16.buffer);if(h16[0]=25459,115!==h8[0]||99!==h8[1])throw"Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)"}();var __ATPRERUN__=[],__ATINIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;assert(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null,runDependencyTracking={};function getUniqueRunDependency(id){for(var orig=id;;){if(!runDependencyTracking[id])return id;id=orig+Math.random()}}function addRunDependency(id){runDependencies++,Module.monitorRunDependencies?.(runDependencies),id?(assert(!runDependencyTracking[id]),runDependencyTracking[id]=1,null===runDependencyWatcher&&"undefined"!=typeof setInterval&&(runDependencyWatcher=setInterval((()=>{if(ABORT)return clearInterval(runDependencyWatcher),void(runDependencyWatcher=null);var shown=!1;for(var dep in runDependencyTracking)shown||(shown=!0,err("still waiting on run dependencies:")),err(`dependency: ${dep}`);shown&&err("(end of list)")}),1e4))):err("warning: run dependency added without ID")}function removeRunDependency(id){if(runDependencies--,Module.monitorRunDependencies?.(runDependencies),id?(assert(runDependencyTracking[id]),delete runDependencyTracking[id]):err("warning: run dependency removed without ID"),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var callback=dependenciesFulfilled;dependenciesFulfilled=null,callback()}}function abort(what){Module.onAbort?.(what),err(what="Aborted("+what+")"),ABORT=!0,EXITSTATUS=1,what.indexOf("RuntimeError: unreachable")>=0&&(what+='. "unreachable" may be due to ASYNCIFY_STACK_SIZE not being large enough (try increasing it)');var e=new WebAssembly.RuntimeError(what);throw readyPromiseReject(e),e}var wasmBinaryFile,tempDouble,tempI64,isDataURI=filename=>filename.startsWith("data:application/octet-stream;base64,"),isFileURI=filename=>filename.startsWith("file://");function createExportWrapper(name,nargs){return(...args)=>{assert(runtimeInitialized,`native function \`${name}\` called before runtime initialization`);var f=wasmExports[name];return assert(f,`exported native function \`${name}\` not found`),assert(args.length<=nargs,`native function \`${name}\` called with ${args.length} args but expects ${nargs}`),f(...args)}}function findWasmBinary(){if(Module.locateFile){var f="micropython.wasm";return isDataURI(f)?f:(path=f,Module.locateFile?Module.locateFile(path,scriptDirectory):scriptDirectory+path)}var path;return new URL("micropython.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary)return new Uint8Array(wasmBinary);if(readBinary)return readBinary(file);throw"both async and sync fetching of the wasm failed"}function instantiateArrayBuffer(binaryFile,imports,receiver){return function(binaryFile){return wasmBinary?Promise.resolve().then((()=>getBinarySync(binaryFile))):readAsync(binaryFile).then((response=>new Uint8Array(response)),(()=>getBinarySync(binaryFile)))}(binaryFile).then((binary=>WebAssembly.instantiate(binary,imports))).then(receiver,(reason=>{err(`failed to asynchronously prepare wasm: ${reason}`),isFileURI(wasmBinaryFile)&&err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`),abort(reason)}))}function legacyModuleProp(prop,newName,incoming=!0){Object.getOwnPropertyDescriptor(Module,prop)||Object.defineProperty(Module,prop,{configurable:!0,get(){abort(`\`Module.${prop}\` has been replaced by \`${newName}\``+(incoming?" (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)":""))}})}function isExportedByForceFilesystem(name){return"FS_createPath"===name||"FS_createDataFile"===name||"FS_createPreloadedFile"===name||"FS_unlink"===name||"addRunDependency"===name||"FS_createLazyFile"===name||"FS_createDevice"===name||"removeRunDependency"===name}function missingGlobal(sym,msg){"undefined"!=typeof globalThis&&Object.defineProperty(globalThis,sym,{configurable:!0,get(){warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`)}})}function unexportedRuntimeSymbol(sym){Object.getOwnPropertyDescriptor(Module,sym)||Object.defineProperty(Module,sym,{configurable:!0,get(){var msg=`'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;isExportedByForceFilesystem(sym)&&(msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"),abort(msg)}})}function ExitStatus(status){this.name="ExitStatus",this.message=`Program terminated with exit(${status})`,this.status=status}missingGlobal("buffer","Please use HEAP8.buffer or wasmMemory.buffer"),missingGlobal("asm","Please use wasmExports instead");var callRuntimeCallbacks=callbacks=>{for(;callbacks.length>0;)callbacks.shift()(Module)};function getValue(ptr,type="i8"){switch(type.endsWith("*")&&(type="*"),type){case"i1":case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module.noExitRuntime||!0,ptrToString=ptr=>(assert("number"==typeof ptr),"0x"+(ptr>>>=0).toString(16).padStart(8,"0")),stackRestore=val=>__emscripten_stack_restore(val),stackSave=()=>_emscripten_stack_get_current(),warnOnce=text=>{warnOnce.shown||={},warnOnce.shown[text]||(warnOnce.shown[text]=1,ENVIRONMENT_IS_NODE&&(text="warning: "+text),err(text))},PATH={isAbs:path=>"/"===path.charAt(0),splitPath:filename=>/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(filename).slice(1),normalizeArray:(parts,allowAboveRoot)=>{for(var up=0,i=parts.length-1;i>=0;i--){var last=parts[i];"."===last?parts.splice(i,1):".."===last?(parts.splice(i,1),up++):up&&(parts.splice(i,1),up--)}if(allowAboveRoot)for(;up;up--)parts.unshift("..");return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash="/"===path.substr(-1);return(path=PATH.normalizeArray(path.split("/").filter((p=>!!p)),!isAbsolute).join("/"))||isAbsolute||(path="."),path&&trailingSlash&&(path+="/"),(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];return root||dir?(dir&&(dir=dir.substr(0,dir.length-1)),root+dir):"."},basename:path=>{if("/"===path)return"/";var lastSlash=(path=(path=PATH.normalize(path)).replace(/\/$/,"")).lastIndexOf("/");return-1===lastSlash?path:path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)},randomFill=view=>(randomFill=(()=>{if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues)return view=>crypto.getRandomValues(view);if(ENVIRONMENT_IS_NODE)try{var crypto_module=require("crypto");if(crypto_module.randomFillSync)return view=>crypto_module.randomFillSync(view);var randomBytes=crypto_module.randomBytes;return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };")})())(view),PATH_FS={resolve:(...args)=>{for(var resolvedPath="",resolvedAbsolute=!1,i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if("string"!=typeof path)throw new TypeError("Arguments to path.resolve must be strings");if(!path)return"";resolvedPath=path+"/"+resolvedPath,resolvedAbsolute=PATH.isAbs(path)}return(resolvedAbsolute?"/":"")+(resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((p=>!!p)),!resolvedAbsolute).join("/"))||"."},relative:(from,to)=>{function trim(arr){for(var start=0;start=0&&""===arr[end];end--);return start>end?[]:arr.slice(start,end-start+1)}from=PATH_FS.resolve(from).substr(1),to=PATH_FS.resolve(to).substr(1);for(var fromParts=trim(from.split("/")),toParts=trim(to.split("/")),length=Math.min(fromParts.length,toParts.length),samePartsLength=length,i=0;i{for(var endIdx=idx+maxBytesToRead,endPtr=idx;heapOrArray[endPtr]&&!(endPtr>=endIdx);)++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder)return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr));for(var str="";idx>10,56320|1023&ch)}}else str+=String.fromCharCode((31&u0)<<6|u1)}else str+=String.fromCharCode(u0)}return str},FS_stdin_getChar_buffer=[],lengthBytesUTF8=str=>{for(var len=0,i=0;i=55296&&c<=57343?(len+=4,++i):len+=3}return len},stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(assert("string"==typeof str,`stringToUTF8Array expects a string (got ${typeof str})`),!(maxBytesToWrite>0))return 0;for(var startIdx=outIdx,endIdx=outIdx+maxBytesToWrite-1,i=0;i=55296&&u<=57343&&(u=65536+((1023&u)<<10)|1023&str.charCodeAt(++i)),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|63&u}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|63&u}else{if(outIdx+3>=endIdx)break;u>1114111&&warnOnce("Invalid Unicode code point "+ptrToString(u)+" encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF)."),heap[outIdx++]=240|u>>18,heap[outIdx++]=128|u>>12&63,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|63&u}}return heap[outIdx]=0,outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1,u8array=new Array(len),numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);return dontAddNull&&(u8array.length=numBytesWritten),u8array}var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops},FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty)throw new FS.ErrnoError(43);stream.tty=tty,stream.seekable=!1},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char)throw new FS.ErrnoError(60);for(var bytesRead=0,i=0;i(()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var buf=Buffer.alloc(256),bytesRead=0,fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,256)}catch(e){if(!e.toString().includes("EOF"))throw e;bytesRead=0}bytesRead>0&&(result=buf.slice(0,bytesRead).toString("utf-8"))}else"undefined"!=typeof window&&"function"==typeof window.prompt&&null!==(result=window.prompt("Input: "))&&(result+="\n");if(!result)return null;FS_stdin_getChar_buffer=intArrayFromString(result,!0)}return FS_stdin_getChar_buffer.shift()})(),put_char(tty,val){null===val||10===val?(out(UTF8ArrayToString(tty.output,0)),tty.output=[]):0!=val&&tty.output.push(val)},fsync(tty){tty.output&&tty.output.length>0&&(out(UTF8ArrayToString(tty.output,0)),tty.output=[])},ioctl_tcgets:tty=>({c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}),ioctl_tcsets:(tty,optional_actions,data)=>0,ioctl_tiocgwinsz:tty=>[24,80]},default_tty1_ops:{put_char(tty,val){null===val||10===val?(err(UTF8ArrayToString(tty.output,0)),tty.output=[]):0!=val&&tty.output.push(val)},fsync(tty){tty.output&&tty.output.length>0&&(err(UTF8ArrayToString(tty.output,0)),tty.output=[])}}},mmapAlloc=size=>{abort("internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported")},MEMFS={ops_table:null,mount:mount=>MEMFS.createNode(null,"/",16895,0),createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode))throw new FS.ErrnoError(63);MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);return FS.isDir(node.mode)?(node.node_ops=MEMFS.ops_table.dir.node,node.stream_ops=MEMFS.ops_table.dir.stream,node.contents={}):FS.isFile(node.mode)?(node.node_ops=MEMFS.ops_table.file.node,node.stream_ops=MEMFS.ops_table.file.stream,node.usedBytes=0,node.contents=null):FS.isLink(node.mode)?(node.node_ops=MEMFS.ops_table.link.node,node.stream_ops=MEMFS.ops_table.link.stream):FS.isChrdev(node.mode)&&(node.node_ops=MEMFS.ops_table.chrdev.node,node.stream_ops=MEMFS.ops_table.chrdev.stream),node.timestamp=Date.now(),parent&&(parent.contents[name]=node,parent.timestamp=node.timestamp),node},getFileDataAsTypedArray:node=>node.contents?node.contents.subarray?node.contents.subarray(0,node.usedBytes):new Uint8Array(node.contents):new Uint8Array(0),expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(!(prevCapacity>=newCapacity)){newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<1048576?2:1.125)>>>0),0!=prevCapacity&&(newCapacity=Math.max(newCapacity,256));var oldContents=node.contents;node.contents=new Uint8Array(newCapacity),node.usedBytes>0&&node.contents.set(oldContents.subarray(0,node.usedBytes),0)}},resizeFileStorage(node,newSize){if(node.usedBytes!=newSize)if(0==newSize)node.contents=null,node.usedBytes=0;else{var oldContents=node.contents;node.contents=new Uint8Array(newSize),oldContents&&node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes))),node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};return 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,FS.isDir(node.mode)?attr.size=4096:FS.isFile(node.mode)?attr.size=node.usedBytes:FS.isLink(node.mode)?attr.size=node.link.length: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),attr},setattr(node,attr){void 0!==attr.mode&&(node.mode=attr.mode),void 0!==attr.timestamp&&(node.timestamp=attr.timestamp),void 0!==attr.size&&MEMFS.resizeFileStorage(node,attr.size)},lookup(parent,name){throw FS.genericErrors[44]},mknod:(parent,name,mode,dev)=>MEMFS.createNode(parent,name,mode,dev),rename(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},unlink(parent,name){delete parent.contents[name],parent.timestamp=Date.now()},rmdir(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(node){var entries=[".",".."];for(var key of Object.keys(node.contents))entries.push(key);return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,41471,0);return node.link=oldpath,node},readlink(node){if(!FS.isLink(node.mode))throw new FS.ErrnoError(28);return node.link}},stream_ops:{read(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(assert(size>=0),size>8&&contents.subarray)buffer.set(contents.subarray(position,position+size),offset);else for(var i=0;i0||position+length(MEMFS.stream_ops.write(stream,buffer,0,length,offset,!1),0)}},preloadPlugins=Module.preloadPlugins||[],FS_getMode=(canRead,canWrite)=>{var mode=0;return canRead&&(mode|=365),canWrite&&(mode|=146),mode},UTF8ToString=(ptr,maxBytesToRead)=>(assert("number"==typeof ptr,`UTF8ToString expects a number (got ${typeof ptr})`),ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""),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},FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class extends Error{constructor(errno){for(var key in super(runtimeInitialized?(errno=>UTF8ToString(_strerror(errno)))(errno):""),this.name="ErrnoError",this.errno=errno,ERRNO_CODES)if(ERRNO_CODES[key]===errno){this.code=key;break}}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return 1!=(2097155&this.flags)}get isWrite(){return!!(2097155&this.flags)}get isAppend(){return 1024&this.flags}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){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,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!(path=PATH_FS.resolve(path)))return{path:"",node:null};if((opts=Object.assign({follow_mount:!0,recurse_count:0},opts)).recurse_count>8)throw new FS.ErrnoError(32);for(var parts=path.split("/").filter((p=>!!p)),current=FS.root,current_path="/",i=0;i40)throw new FS.ErrnoError(32)}}return{path:current_path,node:current}},getPath(node){for(var path;;){if(FS.isRoot(node)){var mount=node.mount.mountpoint;return path?"/"!==mount[mount.length-1]?`${mount}/${path}`:mount+path:mount}path=path?`${node.name}/${path}`:node.name,node=node.parent}},hashName(parentid,name){for(var hash=0,i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash],FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node)FS.nameTable[hash]=node.name_next;else for(var current=FS.nameTable[hash];current;){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode)throw new FS.ErrnoError(errCode);for(var hash=FS.hashName(parent.id,name),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(parent,name,mode,rdev){assert("object"==typeof parent);var node=new FS.FSNode(parent,name,mode,rdev);return FS.hashAddNode(node),node},destroyNode(node){FS.hashRemoveNode(node)},isRoot:node=>node===node.parent,isMountpoint:node=>!!node.mounted,isFile:mode=>32768==(61440&mode),isDir:mode=>16384==(61440&mode),isLink:mode=>40960==(61440&mode),isChrdev:mode=>8192==(61440&mode),isBlkdev:mode=>24576==(61440&mode),isFIFO:mode=>4096==(61440&mode),isSocket:mode=>!(49152&~mode),flagsToPermissionString(flag){var perms=["r","w","rw"][3&flag];return 512&flag&&(perms+="w"),perms},nodePermissions:(node,perms)=>FS.ignorePermissions||(!perms.includes("r")||292&node.mode)&&(!perms.includes("w")||146&node.mode)&&(!perms.includes("x")||73&node.mode)?0:2,mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");return errCode||(dir.node_ops.lookup?0:2)},mayCreate(dir,name){try{return FS.lookupNode(dir,name),20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(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:(node,flags)=>node?FS.isLink(node.mode)?32:FS.isDir(node.mode)&&("r"!==FS.flagsToPermissionString(flags)||512&flags)?31:FS.nodePermissions(node,FS.flagsToPermissionString(flags)):44,MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++)if(!FS.streams[fd])return fd;throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>(assert(fd>=-1),stream=Object.assign(new FS.FSStream,stream),-1==fd&&(fd=FS.nextfd()),stream.fd=fd,FS.streams[fd]=stream,stream),closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);return stream.stream_ops?.dup?.(stream),stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops,stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>255&dev,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){for(var mounts=[],check=[mount];check.length;){var m=check.pop();mounts.push(m),check.push(...m.mounts)}return mounts},syncfs(populate,callback){"function"==typeof populate&&(callback=populate,populate=!1),FS.syncFSRequests++,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),completed=0;function doCallback(errCode){return assert(FS.syncFSRequests>0),FS.syncFSRequests--,callback(errCode)}function done(errCode){if(errCode)return done.errored?void 0:(done.errored=!0,doCallback(errCode));++completed>=mounts.length&&doCallback(null)}mounts.forEach((mount=>{if(!mount.type.syncfs)return done(null);mount.type.syncfs(mount,populate,done)}))},mount(type,opts,mountpoint){if("string"==typeof type)throw type;var node,root="/"===mountpoint,pseudo=!mountpoint;if(root&&FS.root)throw new FS.ErrnoError(10);if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:!1});if(mountpoint=lookup.path,node=lookup.node,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:[]},mountRoot=type.mount(mount);return mountRoot.mount=mount,mount.root=mountRoot,root?FS.root=mountRoot:node&&(node.mounted=mount,node.mount&&node.mount.mounts.push(mount)),mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:!1});if(!FS.isMountpoint(lookup.node))throw new FS.ErrnoError(28);var node=lookup.node,mount=node.mounted,mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((hash=>{for(var current=FS.nameTable[hash];current;){var next=current.name_next;mounts.includes(current.mount)&&FS.destroyNode(current),current=next}})),node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(-1!==idx),node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>parent.node_ops.lookup(parent,name),mknod(path,mode,dev){var parent=FS.lookupPath(path,{parent:!0}).node,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:(path,mode)=>(mode=void 0!==mode?mode:438,mode&=4095,mode|=32768,FS.mknod(path,mode,0)),mkdir:(path,mode)=>(mode=void 0!==mode?mode:511,mode&=1023,mode|=16384,FS.mknod(path,mode,0)),mkdirTree(path,mode){for(var dirs=path.split("/"),d="",i=0;i(void 0===dev&&(dev=mode,mode=438),mode|=8192,FS.mknod(path,mode,dev)),symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath))throw new FS.ErrnoError(44);var parent=FS.lookupPath(newpath,{parent:!0}).node;if(!parent)throw new FS.ErrnoError(44);var newname=PATH.basename(newpath),errCode=FS.mayCreate(parent,newname);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.symlink)throw new FS.ErrnoError(63);return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dir,new_dir,old_dirname=PATH.dirname(old_path),new_dirname=PATH.dirname(new_path),old_name=PATH.basename(old_path),new_name=PATH.basename(new_path);if(old_dir=FS.lookupPath(old_path,{parent:!0}).node,new_dir=FS.lookupPath(new_path,{parent:!0}).node,!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount)throw new FS.ErrnoError(75);var new_node,old_node=FS.lookupNode(old_dir,old_name),relative=PATH_FS.relative(old_path,new_dirname);if("."!==relative.charAt(0))throw new FS.ErrnoError(28);if("."!==(relative=PATH_FS.relative(new_path,old_dirname)).charAt(0))throw new FS.ErrnoError(55);try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node!==new_node){var isdir=FS.isDir(old_node.mode),errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode)throw new FS.ErrnoError(errCode);if(errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name))throw new FS.ErrnoError(errCode);if(!old_dir.node_ops.rename)throw new FS.ErrnoError(63);if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node))throw new FS.ErrnoError(10);if(new_dir!==old_dir&&(errCode=FS.nodePermissions(old_dir,"w")))throw new FS.ErrnoError(errCode);FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name),old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}}},rmdir(path){var parent=FS.lookupPath(path,{parent:!0}).node,name=PATH.basename(path),node=FS.lookupNode(parent,name),errCode=FS.mayDelete(parent,name,!0);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.rmdir)throw new FS.ErrnoError(63);if(FS.isMountpoint(node))throw new FS.ErrnoError(10);parent.node_ops.rmdir(parent,name),FS.destroyNode(node)},readdir(path){var node=FS.lookupPath(path,{follow:!0}).node;if(!node.node_ops.readdir)throw new FS.ErrnoError(54);return node.node_ops.readdir(node)},unlink(path){var parent=FS.lookupPath(path,{parent:!0}).node;if(!parent)throw new FS.ErrnoError(44);var name=PATH.basename(path),node=FS.lookupNode(parent,name),errCode=FS.mayDelete(parent,name,!1);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.unlink)throw new FS.ErrnoError(63);if(FS.isMountpoint(node))throw new FS.ErrnoError(10);parent.node_ops.unlink(parent,name),FS.destroyNode(node)},readlink(path){var link=FS.lookupPath(path).node;if(!link)throw new FS.ErrnoError(44);if(!link.node_ops.readlink)throw new FS.ErrnoError(28);return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat(path,dontFollow){var node=FS.lookupPath(path,{follow:!dontFollow}).node;if(!node)throw new FS.ErrnoError(44);if(!node.node_ops.getattr)throw new FS.ErrnoError(63);return node.node_ops.getattr(node)},lstat:path=>FS.stat(path,!0),chmod(path,mode,dontFollow){var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!dontFollow}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);node.node_ops.setattr(node,{mode:4095&mode|-4096&node.mode,timestamp:Date.now()})},lchmod(path,mode){FS.chmod(path,mode,!0)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown(path,uid,gid,dontFollow){var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!dontFollow}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);node.node_ops.setattr(node,{timestamp:Date.now()})},lchown(path,uid,gid){FS.chown(path,uid,gid,!0)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate(path,len){if(len<0)throw new FS.ErrnoError(28);var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!0}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);if(FS.isDir(node.mode))throw new FS.ErrnoError(31);if(!FS.isFile(node.mode))throw new FS.ErrnoError(28);var errCode=FS.nodePermissions(node,"w");if(errCode)throw new FS.ErrnoError(errCode);node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(!(2097155&stream.flags))throw new FS.ErrnoError(28);FS.truncate(stream.node,len)},utime(path,atime,mtime){var node=FS.lookupPath(path,{follow:!0}).node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open(path,flags,mode){if(""===path)throw new FS.ErrnoError(44);var node;if(mode=64&(flags="string"==typeof flags?(str=>{var flags={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[str];if(void 0===flags)throw new Error(`Unknown file open mode: ${str}`);return flags})(flags):flags)?4095&(mode=void 0===mode?438:mode)|32768:0,"object"==typeof path)node=path;else{path=PATH.normalize(path);try{node=FS.lookupPath(path,{follow:!(131072&flags)}).node}catch(e){}}var created=!1;if(64&flags)if(node){if(128&flags)throw new FS.ErrnoError(20)}else node=FS.mknod(path,mode,0),created=!0;if(!node)throw new FS.ErrnoError(44);if(FS.isChrdev(node.mode)&&(flags&=-513),65536&flags&&!FS.isDir(node.mode))throw new FS.ErrnoError(54);if(!created){var errCode=FS.mayOpen(node,flags);if(errCode)throw new FS.ErrnoError(errCode)}512&flags&&!created&&FS.truncate(node,0),flags&=-131713;var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:!0,position:0,stream_ops:node.stream_ops,ungotten:[],error:!1});return stream.stream_ops.open&&stream.stream_ops.open(stream),!Module.logReadFiles||1&flags||(FS.readFiles||(FS.readFiles={}),path in FS.readFiles||(FS.readFiles[path]=1)),stream},close(stream){if(FS.isClosed(stream))throw new FS.ErrnoError(8);stream.getdents&&(stream.getdents=null);try{stream.stream_ops.close&&stream.stream_ops.close(stream)}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>null===stream.fd,llseek(stream,offset,whence){if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(!stream.seekable||!stream.stream_ops.llseek)throw new FS.ErrnoError(70);if(0!=whence&&1!=whence&&2!=whence)throw new FS.ErrnoError(28);return stream.position=stream.stream_ops.llseek(stream,offset,whence),stream.ungotten=[],stream.position},read(stream,buffer,offset,length,position){if(assert(offset>=0),length<0||position<0)throw new FS.ErrnoError(28);if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(1==(2097155&stream.flags))throw new FS.ErrnoError(8);if(FS.isDir(stream.node.mode))throw new FS.ErrnoError(31);if(!stream.stream_ops.read)throw new FS.ErrnoError(28);var seeking=void 0!==position;if(seeking){if(!stream.seekable)throw new FS.ErrnoError(70)}else position=stream.position;var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);return seeking||(stream.position+=bytesRead),bytesRead},write(stream,buffer,offset,length,position,canOwn){if(assert(offset>=0),length<0||position<0)throw new FS.ErrnoError(28);if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(!(2097155&stream.flags))throw new FS.ErrnoError(8);if(FS.isDir(stream.node.mode))throw new FS.ErrnoError(31);if(!stream.stream_ops.write)throw new FS.ErrnoError(28);stream.seekable&&1024&stream.flags&&FS.llseek(stream,0,2);var seeking=void 0!==position;if(seeking){if(!stream.seekable)throw new FS.ErrnoError(70)}else position=stream.position;var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);return seeking||(stream.position+=bytesWritten),bytesWritten},allocate(stream,offset,length){if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(offset<0||length<=0)throw new FS.ErrnoError(28);if(!(2097155&stream.flags))throw new FS.ErrnoError(8);if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode))throw new FS.ErrnoError(43);if(!stream.stream_ops.allocate)throw new FS.ErrnoError(138);stream.stream_ops.allocate(stream,offset,length)},mmap(stream,length,position,prot,flags){if(2&prot&&!(2&flags)&&2!=(2097155&stream.flags))throw new FS.ErrnoError(2);if(1==(2097155&stream.flags))throw new FS.ErrnoError(2);if(!stream.stream_ops.mmap)throw new FS.ErrnoError(43);return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>(assert(offset>=0),stream.stream_ops.msync?stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags):0),ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl)throw new FS.ErrnoError(59);return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){if(opts.flags=opts.flags||0,opts.encoding=opts.encoding||"binary","utf8"!==opts.encoding&&"binary"!==opts.encoding)throw new Error(`Invalid encoding type "${opts.encoding}"`);var ret,stream=FS.open(path,opts.flags),length=FS.stat(path).size,buf=new Uint8Array(length);return FS.read(stream,buf,0,length,0),"utf8"===opts.encoding?ret=UTF8ArrayToString(buf,0):"binary"===opts.encoding&&(ret=buf),FS.close(stream),ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if("string"==typeof data){var buf=new Uint8Array(lengthBytesUTF8(data)+1),actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,void 0,opts.canOwn)}else{if(!ArrayBuffer.isView(data))throw new Error("Unsupported data type");FS.write(stream,data,0,data.byteLength,void 0,opts.canOwn)}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:!0});if(null===lookup.node)throw new FS.ErrnoError(44);if(!FS.isDir(lookup.node.mode))throw new FS.ErrnoError(54);var errCode=FS.nodePermissions(lookup.node,"x");if(errCode)throw new FS.ErrnoError(errCode);FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp"),FS.mkdir("/home"),FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev"),FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length}),FS.mkdev("/dev/null",FS.makedev(1,3)),TTY.register(FS.makedev(5,0),TTY.default_tty_ops),TTY.register(FS.makedev(6,0),TTY.default_tty1_ops),FS.mkdev("/dev/tty",FS.makedev(5,0)),FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0,randomByte=()=>(0===randomLeft&&(randomLeft=randomFill(randomBuffer).byteLength),randomBuffer[--randomLeft]);FS.createDevice("/dev","random",randomByte),FS.createDevice("/dev","urandom",randomByte),FS.mkdir("/dev/shm"),FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd"),FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);return node.node_ops={lookup(parent,name){var fd=+name,stream=FS.getStreamChecked(fd),ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};return ret.parent=ret,ret}},node}},{},"/proc/self/fd")},createStandardStreams(){Module.stdin?FS.createDevice("/dev","stdin",Module.stdin):FS.symlink("/dev/tty","/dev/stdin"),Module.stdout?FS.createDevice("/dev","stdout",null,Module.stdout):FS.symlink("/dev/tty","/dev/stdout"),Module.stderr?FS.createDevice("/dev","stderr",null,Module.stderr):FS.symlink("/dev/tty1","/dev/stderr");var stdin=FS.open("/dev/stdin",0),stdout=FS.open("/dev/stdout",1),stderr=FS.open("/dev/stderr",1);assert(0===stdin.fd,`invalid handle for stdin (${stdin.fd})`),assert(1===stdout.fd,`invalid handle for stdout (${stdout.fd})`),assert(2===stderr.fd,`invalid handle for stderr (${stderr.fd})`)},staticInit(){[44].forEach((code=>{FS.genericErrors[code]=new FS.ErrnoError(code),FS.genericErrors[code].stack=""})),FS.nameTable=new Array(4096),FS.mount(MEMFS,{},"/"),FS.createDefaultDirectories(),FS.createDefaultDevices(),FS.createSpecialDirectories(),FS.filesystems={MEMFS:MEMFS}},init(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)"),FS.init.initialized=!0,Module.stdin=input||Module.stdin,Module.stdout=output||Module.stdout,Module.stderr=error||Module.stderr,FS.createStandardStreams()},quit(){FS.init.initialized=!1,_fflush(0);for(var i=0;ithis.length-1||idx<0)){var chunkOffset=idx%this.chunkSize,chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;if(xhr.open("HEAD",url,!1),xhr.send(null),!(xhr.status>=200&&xhr.status<300||304===xhr.status))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var header,datalength=Number(xhr.getResponseHeader("Content-length")),hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&"bytes"===header,usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&"gzip"===header,chunkSize=1048576;hasByteServing||(chunkSize=datalength);var lazyArray=this;lazyArray.setDataGetter((chunkNum=>{var start=chunkNum*chunkSize,end=(chunkNum+1)*chunkSize-1;if(end=Math.min(end,datalength-1),void 0===lazyArray.chunks[chunkNum]&&(lazyArray.chunks[chunkNum]=((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;if(xhr.open("GET",url,!1),datalength!==chunkSize&&xhr.setRequestHeader("Range","bytes="+from+"-"+to),xhr.responseType="arraybuffer",xhr.overrideMimeType&&xhr.overrideMimeType("text/plain; charset=x-user-defined"),xhr.send(null),!(xhr.status>=200&&xhr.status<300||304===xhr.status))throw new Error("Couldn't load "+url+". Status: "+xhr.status);return void 0!==xhr.response?new Uint8Array(xhr.response||[]):intArrayFromString(xhr.responseText||"",!0)})(start,end)),void 0===lazyArray.chunks[chunkNum])throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]})),!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=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if("undefined"!=typeof XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var properties={isDevice:!1,contents:new LazyUint8Array}}else properties={isDevice:!1,url:url};var node=FS.createFile(parent,name,properties,canRead,canWrite);properties.contents?node.contents=properties.contents:properties.url&&(node.contents=null,node.url=properties.url),Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(assert(size>=0),contents.slice)for(var i=0;i{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>(FS.forceLoadFile(node),fn(...args))})),stream_ops.read=(stream,buffer,offset,length,position)=>(FS.forceLoadFile(node),writeChunks(stream,buffer,offset,length,position)),stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc();if(!ptr)throw new FS.ErrnoError(48);return writeChunks(stream,HEAP8,ptr,length,position),{ptr:ptr,allocated:!0}},node.stream_ops=stream_ops,node},absolutePath(){abort("FS.absolutePath has been removed; use PATH_FS.resolve instead")},createFolder(){abort("FS.createFolder has been removed; use FS.mkdir instead")},createLink(){abort("FS.createLink has been removed; use FS.symlink instead")},joinPath(){abort("FS.joinPath has been removed; use PATH.join instead")},mmapAlloc(){abort("FS.mmapAlloc has been replaced by the top level function mmapAlloc")},standardizePath(){abort("FS.standardizePath has been removed; use PATH.normalize instead")}},SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path))return path;var dir;if(dir=-100===dirfd?FS.cwd():SYSCALLS.getStreamFromFD(dirfd).path,0==path.length){if(!allowEmpty)throw new FS.ErrnoError(44);return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev,HEAP32[buf+4>>2]=stat.mode,HEAPU32[buf+8>>2]=stat.nlink,HEAP32[buf+12>>2]=stat.uid,HEAP32[buf+16>>2]=stat.gid,HEAP32[buf+20>>2]=stat.rdev,tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1],HEAP32[buf+32>>2]=4096,HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime(),mtime=stat.mtime.getTime(),ctime=stat.ctime.getTime();return tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1],HEAPU32[buf+48>>2]=atime%1e3*1e3,tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1],HEAPU32[buf+64>>2]=mtime%1e3*1e3,tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1],HEAPU32[buf+80>>2]=ctime%1e3*1e3,tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1],0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode))throw new FS.ErrnoError(43);if(2&flags)return 0;var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD:fd=>FS.getStreamChecked(fd),varargs:void 0,getStr:ptr=>UTF8ToString(ptr)},stringToUTF8=(str,outPtr,maxBytesToWrite)=>(assert("number"==typeof maxBytesToWrite,"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)),handleException=e=>{if(e instanceof ExitStatus||"unwind"==e)return EXITSTATUS;checkStackCookie(),e instanceof WebAssembly.RuntimeError&&_emscripten_stack_get_current()<=0&&err("Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)"),quit_(1,e)},runtimeKeepaliveCounter=0,keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0,_exit=(status,implicit)=>{if(EXITSTATUS=status,function(){var oldOut=out,oldErr=err,has=!1;out=err=x=>{has=!0};try{_fflush(0),["stdout","stderr"].forEach((function(name){var info=FS.analyzePath("/dev/"+name);if(info){var rdev=info.object.rdev,tty=TTY.ttys[rdev];tty?.output?.length&&(has=!0)}}))}catch(e){}out=oldOut,err=oldErr,has&&warnOnce("stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.")}(),keepRuntimeAlive()&&!implicit){var msg=`program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;readyPromiseReject(msg),err(msg)}var code;EXITSTATUS=code=status,keepRuntimeAlive()||(Module.onExit?.(code),ABORT=!0),quit_(code,new ExitStatus(code))},callUserCallback=func=>{if(ABORT)err("user callback triggered after runtime exited or application aborted. Ignoring.");else try{func(),(()=>{if(!keepRuntimeAlive())try{_exit(EXITSTATUS)}catch(e){handleException(e)}})()}catch(e){handleException(e)}},_emscripten_scan_registers=func=>Asyncify.handleSleep((wakeUp=>{((func,timeout)=>{setTimeout((()=>{callUserCallback(func)}),timeout)})((()=>{var stackBegin=Asyncify.currData+12,stackEnd=HEAPU32[Asyncify.currData>>2];dynCall_vii(func,stackBegin,stackEnd),wakeUp()}),0)}));_emscripten_scan_registers.isAsync=!0;var _fd_sync=function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return Asyncify.handleSleep((wakeUp=>{var mount=stream.node.mount;mount.type.syncfs?mount.type.syncfs(mount,!1,(err=>{wakeUp(err?29:0)})):wakeUp(0)}))}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}};_fd_sync.isAsync=!0;var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}},Asyncify={instrumentWasmImports(imports){var importPattern=/^(invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports))if("function"==typeof original){let isAsyncifyImport=original.isAsync||importPattern.test(x);imports[x]=(...args)=>{var originalAsyncifyState=Asyncify.state;try{return original(...args)}finally{var changedToDisabled=originalAsyncifyState===Asyncify.State.Normal&&Asyncify.state===Asyncify.State.Disabled,ignoredInvoke=x.startsWith("invoke_")&&!0;if(Asyncify.state!==originalAsyncifyState&&!isAsyncifyImport&&!changedToDisabled&&!ignoredInvoke)throw new Error(`import ${x} was not in ASYNCIFY_IMPORTS, but changed the state`)}}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports))ret[x]="function"==typeof original?(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{ABORT||(assert(Asyncify.exportCallStack.pop()===x),Asyncify.maybeStopUnwind())}}:original;return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];return void 0===id&&(id=Asyncify.callStackId++,Asyncify.callStackNameToId[funcName]=id,Asyncify.callStackIdToName[id]=funcName),id},maybeStopUnwind(){Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&0===Asyncify.exportCallStack.length&&(Asyncify.state=Asyncify.State.Normal,runAndAbortIfError(_asyncify_stop_unwind),"undefined"!=typeof Fibers&&Fibers.trampoline())},whenDone:()=>(assert(Asyncify.currData,"Tried to wait for an async operation when none is in progress."),assert(!Asyncify.asyncPromiseHandlers,"Cannot have multiple async operations in flight at once"),new Promise(((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}}))),allocateData(){var ptr=_malloc(12+Asyncify.StackSize);return Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize),Asyncify.setDataRewindFunc(ptr),ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack,HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0],rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFuncName(ptr){var id=HEAP32[ptr+8>>2];return Asyncify.callStackIdToName[id]},getDataRewindFunc:name=>wasmExports[name],doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);return Asyncify.getDataRewindFunc(name)()},handleSleep(startAsync){if(assert(Asyncify.state!==Asyncify.State.Disabled,"Asyncify cannot be done during or after the runtime exits"),!ABORT){if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=!1,reachedAfterCallback=!1;startAsync(((handleSleepReturnValue=0)=>{if(assert(!handleSleepReturnValue||"number"==typeof handleSleepReturnValue||"boolean"==typeof handleSleepReturnValue),!ABORT&&(Asyncify.handleSleepReturnValue=handleSleepReturnValue,reachedCallback=!0,reachedAfterCallback)){assert(!Asyncify.exportCallStack.length,"Waking up (starting to rewind) must be done from JS, without compiled code on the stack."),Asyncify.state=Asyncify.State.Rewinding,runAndAbortIfError((()=>_asyncify_start_rewind(Asyncify.currData))),"undefined"!=typeof Browser&&Browser.mainLoop.func&&Browser.mainLoop.resume();var asyncWasmReturnValue,isError=!1;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err,isError=!0}var handled=!1;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;asyncPromiseHandlers&&(Asyncify.asyncPromiseHandlers=null,(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue),handled=!0)}if(isError&&!handled)throw asyncWasmReturnValue}})),reachedAfterCallback=!0,reachedCallback||(Asyncify.state=Asyncify.State.Unwinding,Asyncify.currData=Asyncify.allocateData(),"undefined"!=typeof Browser&&Browser.mainLoop.func&&Browser.mainLoop.pause(),runAndAbortIfError((()=>_asyncify_start_unwind(Asyncify.currData))))}else Asyncify.state===Asyncify.State.Rewinding?(Asyncify.state=Asyncify.State.Normal,runAndAbortIfError(_asyncify_stop_rewind),_free(Asyncify.currData),Asyncify.currData=null,Asyncify.sleepCallbacks.forEach(callUserCallback)):abort(`invalid state: ${Asyncify.state}`);return Asyncify.handleSleepReturnValue}},handleAsync:startAsync=>Asyncify.handleSleep((wakeUp=>{startAsync().then(wakeUp)}))},stackAlloc=sz=>__emscripten_stack_alloc(sz),ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;return null!=str&&0!==str&&(ret=(str=>{var size=lengthBytesUTF8(str)+1,ret=stackAlloc(size);return stringToUTF8(str,ret,size),ret})(str)),ret},array:arr=>{var array,buffer,ret=stackAlloc(arr.length);return buffer=ret,assert((array=arr).length>=0,"writeArrayToMemory array must have a length (should be an array or typed array)"),HEAP8.set(array,buffer),ret}},func=(ident=>{var func=Module["_"+ident];return assert(func,"Cannot call unknown function "+ident+", make sure it is exported"),func})(ident),cArgs=[],stack=0;if(assert("array"!==returnType,'Return type should not be "array".'),args)for(var i=0;i0),runtimeKeepaliveCounter-=1,0!==stack&&stackRestore(stack),function(ret){return"string"===returnType?UTF8ToString(ret):"boolean"===returnType?Boolean(ret):ret}(ret)}var asyncMode=opts?.async;return runtimeKeepaliveCounter+=1,Asyncify.currData!=previousAsync?(assert(!(previousAsync&&Asyncify.currData),"We cannot start an async operation when one is already flight"),assert(!(previousAsync&&!Asyncify.currData),"We cannot stop an async operation in flight"),assert(asyncMode,"The call to "+ident+" is running asynchronously. If this was intended, add the async option to the ccall/cwrap call."),Asyncify.whenDone().then(onDone)):(ret=onDone(ret),asyncMode?Promise.resolve(ret):ret)};FS.createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent,dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.(),dontCreateFile||((parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)})(parent,name,byteArray,canRead,canWrite,canOwn),onload?.(),removeRunDependency(dep)}((byteArray,fullname,finish,onerror)=>{"undefined"!=typeof Browser&&Browser.init();var handled=!1;return preloadPlugins.forEach((plugin=>{handled||plugin.canHandle(fullname)&&(plugin.handle(byteArray,fullname,finish,onerror),handled=!0)})),handled})(byteArray,fullname,finish,(()=>{onerror?.(),removeRunDependency(dep)}))||finish(byteArray)}addRunDependency(dep),"string"==typeof url?((url,onload,onerror,noRunDep)=>{var dep=noRunDep?"":getUniqueRunDependency(`al ${url}`);readAsync(url).then((arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`),onload(new Uint8Array(arrayBuffer)),dep&&removeRunDependency(dep)}),(err=>{if(!onerror)throw`Loading data file "${url}" failed.`;onerror()})),dep&&addRunDependency(dep)})(url,processData,onerror):processData(url)},FS.staticInit(),void 0===globalThis.crypto&&(globalThis.crypto=require("crypto"));var calledRun,MP_JS_EPOCH=Date.now(),wasmImports={__syscall_chdir:function(path){try{return path=SYSCALLS.getStr(path),FS.chdir(path),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_fstat64:function(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_getcwd:function(buf,size){try{if(0===size)return-28;var cwd=FS.cwd(),cwdLengthInBytes=lengthBytesUTF8(cwd)+1;return size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1],tempI64=[280*(idx+1)>>>0,(tempDouble=280*(idx+1),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>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]=type,stringToUTF8(name,dirp+pos+19,256),pos+=280,idx+=1}return FS.llseek(stream,280*idx,0),pos}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_lstat64:function(path,buf){try{return path=SYSCALLS.getStr(path),SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_mkdirat:function(dirfd,path,mode){try{return path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path),"/"===(path=PATH.normalize(path))[path.length-1]&&(path=path.substr(0,path.length-1)),FS.mkdir(path,mode,0),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_newfstatat:function(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=256&flags,allowEmpty=4096&flags;return assert(!(flags&=-6401),`unknown flags in __syscall_newfstatat: ${flags}`),path=SYSCALLS.calculateAt(dirfd,path,allowEmpty),SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_openat:function(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?function(){assert(null!=SYSCALLS.varargs);var ret=HEAP32[+SYSCALLS.varargs>>2];return SYSCALLS.varargs+=4,ret}():0;return FS.open(path,flags,mode).fd}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_poll:function(fds,nfds,timeout){try{for(var nonzero=0,i=0;i>2],events=HEAP16[pollfd+4>>1],mask=32,stream=FS.getStream(fd);stream&&(mask=SYSCALLS.DEFAULT_POLLMASK,stream.stream_ops.poll&&(mask=stream.stream_ops.poll(stream,-1))),(mask&=24|events)&&nonzero++,HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_renameat:function(olddirfd,oldpath,newdirfd,newpath){try{return oldpath=SYSCALLS.getStr(oldpath),newpath=SYSCALLS.getStr(newpath),oldpath=SYSCALLS.calculateAt(olddirfd,oldpath),newpath=SYSCALLS.calculateAt(newdirfd,newpath),FS.rename(oldpath,newpath),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_rmdir:function(path){try{return path=SYSCALLS.getStr(path),FS.rmdir(path),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_stat64:function(path,buf){try{return path=SYSCALLS.getStr(path),SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_statfs64:function(path,size,buf){try{return path=SYSCALLS.getStr(path),assert(64===size),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,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_unlinkat:function(dirfd,path,flags){try{return path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path),0===flags?FS.unlink(path):512===flags?FS.rmdir(path):abort("Invalid flags passed to unlinkat"),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},_emscripten_memcpy_js:(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num),_emscripten_throw_longjmp:()=>{throw 1/0},call0:function(f_ref,out){proxy_convert_js_to_mp_obj_jsside((0,proxy_js_ref[f_ref])(),out)},call0_kwarg:function(f_ref,n_kw,key,value,out){const f=proxy_js_ref[f_ref],a={};for(let i=0;i{HEAPU8.length,(requestedSize=>{abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`)})(requestedSize>>>=0)},emscripten_scan_registers:_emscripten_scan_registers,fd_close:function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return FS.close(stream),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_read:function(fd,iov,iovcnt,pnum){try{var num=((stream,iov,iovcnt,offset)=>{for(var ret=0,i=0;i>2],len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;if(ret+=curr,curr>2]=num,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_seek:function(fd,offset_low,offset_high,whence,newOffset){var lo,hi,offset=(hi=offset_high,assert((lo=offset_low)==lo>>>0||lo==(0|lo)),assert(hi===(0|hi)),hi+2097152>>>0<4194305-!!lo?(lo>>>0)+4294967296*hi:NaN);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);return FS.llseek(stream,offset,whence),tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1],stream.getdents&&0===offset&&0===whence&&(stream.getdents=null),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_sync:_fd_sync,fd_write:function(fd,iov,iovcnt,pnum){try{var num=((stream,iov,iovcnt,offset)=>{for(var ret=0,i=0;i>2],len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr,void 0!==offset&&(offset+=curr)}return ret})(SYSCALLS.getStreamFromFD(fd),iov,iovcnt);return HEAPU32[pnum>>2]=num,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},has_attr:function(jsref,str){const base=proxy_js_ref[jsref];return UTF8ToString(str)in base},invoke_i:function(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_ii:function(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iii:function(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiii:function(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiiii:function(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiiiii:function(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiiii(index,a1,a2,a3,a4,a5)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_v:function(index){var sp=stackSave();try{dynCall_v(index)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_vi:function(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_vii:function(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_viii:function(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_viiii:function(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},js_check_existing:function(c_ref){return function(c_ref){const existing_obj=globalThis.proxy_js_map.get(c_ref)?.deref();if(void 0===existing_obj)return-1;for(let i=0;i=target.length))throw new PythonError("IndexError","index out of range");return index}(target,proxy_convert_mp_to_js_obj_jsside(index_ref));proxy_convert_js_to_mp_obj_jsside(target[index],out)},js_subscr_store:function(f_ref,idx,value){proxy_js_ref[f_ref][proxy_convert_mp_to_js_obj_jsside(idx)]=proxy_convert_mp_to_js_obj_jsside(value)},js_then_continue:function(jsref,py_resume,resolve,reject,out){const py_resume_js=proxy_convert_mp_to_js_obj_jsside(py_resume),resolve_js=proxy_convert_mp_to_js_obj_jsside(resolve),reject_js=proxy_convert_mp_to_js_obj_jsside(reject);proxy_convert_js_to_mp_obj_jsside(proxy_js_ref[jsref].then((result=>{py_resume_js(result,null,resolve_js,reject_js)}),(reason=>{py_resume_js(null,reason,resolve_js,reject_js)})),out)},js_then_reject:function(ret_value,reject){let ret_value_js;try{ret_value_js=proxy_convert_mp_to_js_obj_jsside(ret_value)}catch(error){ret_value_js=error}proxy_convert_mp_to_js_obj_jsside(reject)(ret_value_js)},js_then_resolve:function(ret_value,resolve){const ret_value_js=proxy_convert_mp_to_js_obj_jsside(ret_value);proxy_convert_mp_to_js_obj_jsside(resolve)(ret_value_js)},lookup_attr:function(jsref,str,out){const base=proxy_js_ref[jsref],attr=UTF8ToString(str);let value=base[attr];return(void 0!==value||attr in base)&&("function"==typeof value&&base!==globalThis&&("_ref"in value||(value=value.bind(base))),proxy_convert_js_to_mp_obj_jsside(value,out),!0)},mp_js_hook:()=>{if(ENVIRONMENT_IS_NODE){const mp_interrupt_char=Module.ccall("mp_hal_get_interrupt_char","number",["number"],["null"]),fs=require("fs"),buf=Buffer.alloc(1);try{fs.readSync(process.stdin.fd,buf,0,1)>0&&(buf[0]===mp_interrupt_char?Module.ccall("mp_sched_keyboard_interrupt","null",["null"],["null"]):process.stdout.write(String.fromCharCode(buf[0])))}catch(e){if("EAGAIN"!==e.code)throw e}}},mp_js_random_u32:()=>globalThis.crypto.getRandomValues(new Uint32Array(1))[0],mp_js_ticks_ms:()=>Date.now()-MP_JS_EPOCH,mp_js_time_ms:()=>Date.now(),proxy_convert_mp_to_js_then_js_to_js_then_js_to_mp_obj_jsside:function(out){const ret=proxy_convert_mp_to_js_obj_jsside(out);proxy_convert_js_to_mp_obj_jsside(PyProxy.toJs(ret),out)},proxy_convert_mp_to_js_then_js_to_mp_obj_jsside:function(out){proxy_convert_js_to_mp_obj_jsside_force_double_proxy(proxy_convert_mp_to_js_obj_jsside(out),out)},proxy_js_free_obj:function(js_ref){js_ref>=PROXY_JS_REF_NUM_STATIC&&(proxy_js_ref[js_ref]=void 0,js_refWebAssembly.instantiateStreaming(response,imports).then(callback,(function(reason){return err(`wasm streaming compile failed: ${reason}`),err("falling back to ArrayBuffer instantiation"),instantiateArrayBuffer(binaryFile,imports,callback)}))))).catch(readyPromiseReject),{}}(),_malloc=(createExportWrapper("__wasm_call_ctors",0),Module._mp_sched_keyboard_interrupt=createExportWrapper("mp_sched_keyboard_interrupt",0),Module._mp_js_init=createExportWrapper("mp_js_init",2),Module._malloc=createExportWrapper("malloc",1)),_free=(Module._mp_js_register_js_module=createExportWrapper("mp_js_register_js_module",2),Module._mp_js_do_import=createExportWrapper("mp_js_do_import",2),Module._proxy_convert_mp_to_js_obj_cside=createExportWrapper("proxy_convert_mp_to_js_obj_cside",2),Module._mp_js_do_exec=createExportWrapper("mp_js_do_exec",3),Module._mp_js_do_exec_async=createExportWrapper("mp_js_do_exec_async",3),Module._mp_js_repl_init=createExportWrapper("mp_js_repl_init",0),Module._mp_js_repl_process_char=createExportWrapper("mp_js_repl_process_char",1),Module._mp_hal_get_interrupt_char=createExportWrapper("mp_hal_get_interrupt_char",0),Module._proxy_c_init=createExportWrapper("proxy_c_init",0),Module._proxy_c_free_obj=createExportWrapper("proxy_c_free_obj",1),Module._free=createExportWrapper("free",1)),_emscripten_stack_get_current=(Module._proxy_c_to_js_call=createExportWrapper("proxy_c_to_js_call",4),Module._proxy_c_to_js_dir=createExportWrapper("proxy_c_to_js_dir",2),Module._proxy_c_to_js_has_attr=createExportWrapper("proxy_c_to_js_has_attr",2),Module._proxy_c_to_js_lookup_attr=createExportWrapper("proxy_c_to_js_lookup_attr",3),Module._proxy_c_to_js_store_attr=createExportWrapper("proxy_c_to_js_store_attr",3),Module._proxy_c_to_js_delete_attr=createExportWrapper("proxy_c_to_js_delete_attr",2),Module._proxy_c_to_js_get_type=createExportWrapper("proxy_c_to_js_get_type",1),Module._proxy_c_to_js_get_array=createExportWrapper("proxy_c_to_js_get_array",2),Module._proxy_c_to_js_get_dict=createExportWrapper("proxy_c_to_js_get_dict",2),Module._proxy_c_to_js_get_iter=createExportWrapper("proxy_c_to_js_get_iter",1),Module._proxy_c_to_js_iternext=createExportWrapper("proxy_c_to_js_iternext",2),Module._proxy_c_to_js_resume=createExportWrapper("proxy_c_to_js_resume",2),()=>(_emscripten_stack_get_current=wasmExports.emscripten_stack_get_current)()),_fflush=createExportWrapper("fflush",1),_strerror=createExportWrapper("strerror",1),_setThrew=createExportWrapper("setThrew",2),_emscripten_stack_init=()=>(_emscripten_stack_init=wasmExports.emscripten_stack_init)(),_emscripten_stack_get_end=()=>(_emscripten_stack_get_end=wasmExports.emscripten_stack_get_end)(),__emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports._emscripten_stack_restore)(a0),__emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports._emscripten_stack_alloc)(a0),dynCall_viii=Module.dynCall_viii=createExportWrapper("dynCall_viii",4),dynCall_vi=Module.dynCall_vi=createExportWrapper("dynCall_vi",2),dynCall_ii=Module.dynCall_ii=createExportWrapper("dynCall_ii",2),dynCall_vii=Module.dynCall_vii=createExportWrapper("dynCall_vii",3),dynCall_iii=Module.dynCall_iii=createExportWrapper("dynCall_iii",3),dynCall_viiii=Module.dynCall_viiii=createExportWrapper("dynCall_viiii",5),dynCall_iiii=Module.dynCall_iiii=createExportWrapper("dynCall_iiii",4),dynCall_iiiii=Module.dynCall_iiiii=createExportWrapper("dynCall_iiiii",5),dynCall_v=Module.dynCall_v=createExportWrapper("dynCall_v",1),dynCall_i=Module.dynCall_i=createExportWrapper("dynCall_i",1),dynCall_iiiiii=(Module.dynCall_dd=createExportWrapper("dynCall_dd",2),Module.dynCall_ddd=createExportWrapper("dynCall_ddd",3),Module.dynCall_viiiiii=createExportWrapper("dynCall_viiiiii",7),Module.dynCall_iiiiii=createExportWrapper("dynCall_iiiiii",6)),_asyncify_start_unwind=(Module.dynCall_iidiiii=createExportWrapper("dynCall_iidiiii",7),createExportWrapper("asyncify_start_unwind",1)),_asyncify_stop_unwind=createExportWrapper("asyncify_stop_unwind",0),_asyncify_start_rewind=createExportWrapper("asyncify_start_rewind",1),_asyncify_stop_rewind=createExportWrapper("asyncify_stop_rewind",0);function stackCheckInit(){var max;_emscripten_stack_init(),assert(!(3&(max=_emscripten_stack_get_end()))),0==max&&(max+=4),HEAPU32[max>>2]=34821223,HEAPU32[max+4>>2]=2310721022,HEAPU32[0]=1668509029}function run(){function doRun(){calledRun||(calledRun=!0,Module.calledRun=!0,ABORT||(assert(!runtimeInitialized),runtimeInitialized=!0,checkStackCookie(),Module.noFSInit||FS.init.initialized||FS.init(),FS.ignorePermissions=!1,TTY.init(),callRuntimeCallbacks(__ATINIT__),readyPromiseResolve(Module),Module.onRuntimeInitialized?.(),assert(!Module._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),function(){if(checkStackCookie(),Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)cb=Module.postRun.shift(),__ATPOSTRUN__.unshift(cb);var cb;callRuntimeCallbacks(__ATPOSTRUN__)}()))}runDependencies>0||(stackCheckInit(),function(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)cb=Module.preRun.shift(),__ATPRERUN__.unshift(cb);var cb;callRuntimeCallbacks(__ATPRERUN__)}(),runDependencies>0||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),doRun()}),1)):doRun(),checkStackCookie()))}if(Module.ccall=ccall,Module.cwrap=(ident,returnType,argTypes,opts)=>(...args)=>ccall(ident,returnType,argTypes,args,opts),Module.setValue=function(ptr,value,type="i8"){switch(type.endsWith("*")&&(type="*"),type){case"i1":case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}},Module.getValue=getValue,Module.PATH=PATH,Module.PATH_FS=PATH_FS,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8,Module.FS=FS,["writeI53ToI64","writeI53ToI64Clamped","writeI53ToI64Signaling","writeI53ToU64Clamped","writeI53ToU64Signaling","readI53FromI64","readI53FromU64","convertI32PairToI53","convertU32PairToI53","getTempRet0","setTempRet0","growMemory","isLeapYear","ydayFromDate","arraySum","addDays","inetPton4","inetNtop4","inetPton6","inetNtop6","readSockaddr","writeSockaddr","emscriptenLog","readEmAsmArgs","jstoi_q","getExecutableName","listenOnce","autoResumeAudioContext","dynCallLegacy","getDynCaller","dynCall","asmjsMangle","HandleAllocator","getNativeTypeSize","STACK_SIZE","STACK_ALIGN","POINTER_SIZE","ASSERTIONS","uleb128Encode","generateFuncType","convertJsFunctionToWasm","getEmptyTableSlot","updateTableMap","getFunctionAddress","addFunction","removeFunction","reallyNegative","unSign","strLen","reSign","formatString","intArrayToString","AsciiToString","stringToAscii","UTF16ToString","stringToUTF16","lengthBytesUTF16","UTF32ToString","stringToUTF32","lengthBytesUTF32","stringToNewUTF8","registerKeyEventCallback","maybeCStringToJsString","findEventTarget","getBoundingClientRect","fillMouseEventData","registerMouseEventCallback","registerWheelEventCallback","registerUiEventCallback","registerFocusEventCallback","fillDeviceOrientationEventData","registerDeviceOrientationEventCallback","fillDeviceMotionEventData","registerDeviceMotionEventCallback","screenOrientation","fillOrientationChangeEventData","registerOrientationChangeEventCallback","fillFullscreenChangeEventData","registerFullscreenChangeEventCallback","JSEvents_requestFullscreen","JSEvents_resizeCanvasForFullscreen","registerRestoreOldStyle","hideEverythingExceptGivenElement","restoreHiddenElements","setLetterbox","softFullscreenResizeWebGLRenderTarget","doRequestFullscreen","fillPointerlockChangeEventData","registerPointerlockChangeEventCallback","registerPointerlockErrorEventCallback","requestPointerLock","fillVisibilityChangeEventData","registerVisibilityChangeEventCallback","registerTouchEventCallback","fillGamepadEventData","registerGamepadEventCallback","registerBeforeUnloadEventCallback","fillBatteryEventData","battery","registerBatteryEventCallback","setCanvasElementSize","getCanvasElementSize","jsStackTrace","getCallstack","convertPCtoSourceLocation","getEnvStrings","checkWasiClock","wasiRightsToMuslOFlags","wasiOFlagsToMuslOFlags","createDyncallWrapper","setImmediateWrapped","clearImmediateWrapped","polyfillSetImmediate","getPromise","makePromise","idsToPromises","makePromiseCallback","ExceptionInfo","findMatchingCatch","Browser_asyncPrepareDataCounter","setMainLoop","getSocketFromFD","getSocketAddress","FS_unlink","FS_mkdirTree","_setNetworkCallback","heapObjectForWebGLType","toTypedArrayIndex","webgl_enable_ANGLE_instanced_arrays","webgl_enable_OES_vertex_array_object","webgl_enable_WEBGL_draw_buffers","webgl_enable_WEBGL_multi_draw","emscriptenWebGLGet","computeUnpackAlignedImageSize","colorChannelsInGlTextureFormat","emscriptenWebGLGetTexPixelData","emscriptenWebGLGetUniform","webglGetUniformLocation","webglPrepareUniformLocationsBeforeFirstUse","webglGetLeftBracePos","emscriptenWebGLGetVertexAttrib","__glGetActiveAttribOrUniform","writeGLArray","registerWebGlEventCallback","ALLOC_NORMAL","ALLOC_STACK","allocate","writeStringToMemory","writeAsciiToMemory","setErrNo","demangle","stackTrace"].forEach((function(sym){"undefined"==typeof globalThis||Object.getOwnPropertyDescriptor(globalThis,sym)||Object.defineProperty(globalThis,sym,{configurable:!0,get(){var msg=`\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`,librarySymbol=sym;librarySymbol.startsWith("_")||(librarySymbol="$"+sym),msg+=` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`,isExportedByForceFilesystem(sym)&&(msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"),warnOnce(msg)}}),unexportedRuntimeSymbol(sym)})),["run","addOnPreRun","addOnInit","addOnPreMain","addOnExit","addOnPostRun","addRunDependency","removeRunDependency","out","err","callMain","abort","wasmMemory","wasmExports","writeStackCookie","checkStackCookie","convertI32PairToI53Checked","stackSave","stackRestore","stackAlloc","ptrToString","zeroMemory","exitJS","getHeapMax","abortOnCannotGrowMemory","ENV","MONTH_DAYS_REGULAR","MONTH_DAYS_LEAP","MONTH_DAYS_REGULAR_CUMULATIVE","MONTH_DAYS_LEAP_CUMULATIVE","ERRNO_CODES","strError","DNS","Protocols","Sockets","initRandomFill","randomFill","timers","warnOnce","readEmAsmArgsArray","jstoi_s","handleException","keepRuntimeAlive","runtimeKeepalivePush","runtimeKeepalivePop","callUserCallback","maybeExit","asyncLoad","alignMemory","mmapAlloc","wasmTable","noExitRuntime","getCFunc","sigToWasmTypes","freeTableIndexes","functionsInTableMap","UTF8Decoder","UTF8ArrayToString","stringToUTF8Array","intArrayFromString","UTF16Decoder","stringToUTF8OnStack","writeArrayToMemory","JSEvents","specialHTMLTargets","findCanvasEventTarget","currentFullscreenStrategy","restoreOldWindowedStyle","UNWIND_CACHE","ExitStatus","doReadv","doWritev","safeSetTimeout","promiseMap","uncaughtExceptionCount","exceptionLast","exceptionCaught","Browser","getPreloadedImageData__data","wget","SYSCALLS","preloadPlugins","FS_createPreloadedFile","FS_modeStringToFlags","FS_getMode","FS_stdin_getChar_buffer","FS_stdin_getChar","FS_createPath","FS_createDevice","FS_readFile","FS_createDataFile","FS_createLazyFile","MEMFS","TTY","PIPEFS","SOCKFS","tempFixedLengthArray","miniTempWebGLFloatBuffers","miniTempWebGLIntBuffers","GL","AL","GLUT","EGL","GLEW","IDBStore","runAndAbortIfError","Asyncify","Fibers","SDL","SDL_gfx","allocateUTF8","allocateUTF8OnStack","print","printErr"].forEach(unexportedRuntimeSymbol),dependenciesFulfilled=function runCaller(){calledRun||run(),calledRun||(dependenciesFulfilled=runCaller)},Module.preInit)for("function"==typeof Module.preInit&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();run(),moduleRtn=readyPromise;for(const prop of Object.keys(Module))prop in moduleArg||Object.defineProperty(moduleArg,prop,{configurable:!0,get(){abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`)}});return moduleRtn});export default _createMicroPythonModule;export async function loadMicroPython(options){const{pystack:pystack,heapsize:heapsize,url:url,stdin:stdin,stdout:stdout,stderr:stderr,linebuffer:linebuffer}=Object.assign({pystack:2048,heapsize:1048576,linebuffer:!0},options);let Module={locateFile:(path,scriptDirectory)=>url||scriptDirectory+path};Module._textDecoder=new TextDecoder,void 0!==stdin&&(Module.stdin=stdin),void 0!==stdout&&(linebuffer?(Module._stdoutBuffer=[],Module.stdout=c=>{10===c?(stdout(Module._textDecoder.decode(new Uint8Array(Module._stdoutBuffer))),Module._stdoutBuffer=[]):Module._stdoutBuffer.push(c)}):Module.stdout=c=>stdout(new Uint8Array([c]))),void 0!==stderr&&(linebuffer?(Module._stderrBuffer=[],Module.stderr=c=>{10===c?(stderr(Module._textDecoder.decode(new Uint8Array(Module._stderrBuffer))),Module._stderrBuffer=[]):Module._stderrBuffer.push(c)}):Module.stderr=c=>stderr(new Uint8Array([c]))),Module=await _createMicroPythonModule(Module),globalThis.Module=Module,proxy_js_init();const pyimport=name=>{const value=Module._malloc(12);return Module.ccall("mp_js_do_import","null",["string","pointer"],[name,value]),proxy_convert_mp_to_js_obj_jsside_with_free(value)};return Module.ccall("mp_js_init","null",["number","number"],[pystack,heapsize]),Module.ccall("proxy_c_init","null",[],[]),{_module:Module,PyProxy:PyProxy,FS:Module.FS,globals:{__dict__:pyimport("__main__").__dict__,get(key){return this.__dict__[key]},set(key,value){this.__dict__[key]=value},delete(key){delete this.__dict__[key]}},registerJsModule(name,module){const value=Module._malloc(12);proxy_convert_js_to_mp_obj_jsside(module,value),Module.ccall("mp_js_register_js_module","null",["string","pointer"],[name,value]),Module._free(value)},pyimport:pyimport,runPython(code){const len=Module.lengthBytesUTF8(code),buf=Module._malloc(len+1);Module.stringToUTF8(code,buf,len+1);const value=Module._malloc(12);return Module.ccall("mp_js_do_exec","number",["pointer","number","pointer"],[buf,len,value]),Module._free(buf),proxy_convert_mp_to_js_obj_jsside_with_free(value)},runPythonAsync(code){const len=Module.lengthBytesUTF8(code),buf=Module._malloc(len+1);Module.stringToUTF8(code,buf,len+1);const value=Module._malloc(12);Module.ccall("mp_js_do_exec_async","number",["pointer","number","pointer"],[buf,len,value]),Module._free(buf);const ret=proxy_convert_mp_to_js_obj_jsside_with_free(value);return ret instanceof PyProxyThenable?Promise.resolve(ret):ret},replInit(){Module.ccall("mp_js_repl_init","null",["null"])},replProcessChar:chr=>Module.ccall("mp_js_repl_process_char","number",["number"],[chr]),replProcessCharWithAsyncify:async chr=>Module.ccall("mp_js_repl_process_char","number",["number"],[chr],{async:!0})}}if(globalThis.loadMicroPython=loadMicroPython,"object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node&&process.argv.length>1){const path=await import("path"),url=await import("url"),pathToThisFile=path.resolve(url.fileURLToPath(import.meta.url)),pathPassedToNode=path.resolve(process.argv[1]);pathToThisFile.includes(pathPassedToNode)&&async function(){const fs=await import("fs");let heap_size=131072,contents="",repl=!0;for(let i=2;iprocess.stdout.write(data),linebuffer:!1});if(repl)mp.replInit(),process.stdin.setRawMode(!0),process.stdin.on("data",(data=>{for(let i=0;i{result&&process.exit()}))}));else{if(contents.endsWith("asyncio.run(main())\n")){const asyncio=mp.pyimport("asyncio");asyncio.run=async task=>{await asyncio.create_task(task)}}try{mp.runPython(contents)}catch(error){if("PythonError"!==error.name)throw error;"SystemExit"===error.type||console.error(error.message)}}}()}class PyProxy{constructor(ref){this._ref=ref}static toJs(js_obj){if(!(js_obj instanceof PyProxy))return js_obj;const type=Module.ccall("proxy_c_to_js_get_type","number",["number"],[js_obj._ref]);if(1===type||2===type){const array_ref=Module._malloc(8),item=Module._malloc(12);Module.ccall("proxy_c_to_js_get_array","null",["number","pointer"],[js_obj._ref,array_ref]);const len=Module.getValue(array_ref,"i32"),items_ptr=Module.getValue(array_ref+4,"i32"),js_array=[];for(let i=0;i8){Module.ccall("proxy_convert_mp_to_js_obj_cside","null",["pointer","pointer"],[mp_key,item]);const js_key=proxy_convert_mp_to_js_obj_jsside(item),mp_value=Module.getValue(table_ptr+8*i+4,"i32");Module.ccall("proxy_convert_mp_to_js_obj_cside","null",["pointer","pointer"],[mp_value,item]);const js_value=proxy_convert_mp_to_js_obj_jsside(item);js_dict[js_key]=PyProxy.toJs(js_value)}}return Module._free(map_ref),Module._free(item),js_dict}return js_obj}}const py_proxy_handler={isExtensible:()=>!0,ownKeys(target){const value=Module._malloc(12);Module.ccall("proxy_c_to_js_dir","null",["number","pointer"],[target._ref,value]);const dir=proxy_convert_mp_to_js_obj_jsside_with_free(value);return PyProxy.toJs(dir).filter((attr=>!attr.startsWith("__")))},getOwnPropertyDescriptor:(target,prop)=>({value:target[prop],enumerable:!0,writable:!0,configurable:!0}),has:(target,prop)=>Module.ccall("proxy_c_to_js_has_attr","number",["number","string"],[target._ref,prop]),get(target,prop){if("_ref"===prop)return target._ref;if("then"===prop)return null;if(prop===Symbol.iterator){const iter_ref=Module.ccall("proxy_c_to_js_get_iter","number",["number"],[target._ref]);return function*(){const value=Module._malloc(12);for(;;){if(!Module.ccall("proxy_c_to_js_iternext","number",["number","pointer"],[iter_ref,value]))break;yield proxy_convert_mp_to_js_obj_jsside(value)}Module._free(value)}}const value=Module._malloc(12);return Module.ccall("proxy_c_to_js_lookup_attr","null",["number","string","pointer"],[target._ref,prop,value]),proxy_convert_mp_to_js_obj_jsside_with_free(value)},set(target,prop,value){const value_conv=Module._malloc(12);proxy_convert_js_to_mp_obj_jsside(value,value_conv);const ret=Module.ccall("proxy_c_to_js_store_attr","number",["number","string","number"],[target._ref,prop,value_conv]);return Module._free(value_conv),ret},deleteProperty:(target,prop)=>Module.ccall("proxy_c_to_js_delete_attr","number",["number","string"],[target._ref,prop])};class PyProxyThenable{constructor(ref){this._ref=ref}then(resolve,reject){const values=Module._malloc(36);return proxy_convert_js_to_mp_obj_jsside(resolve,values+12),proxy_convert_js_to_mp_obj_jsside(reject,values+24),Module.ccall("proxy_c_to_js_resume","null",["number","pointer"],[this._ref,values]),proxy_convert_mp_to_js_obj_jsside_with_free(values)}}const PROXY_JS_REF_NUM_STATIC=2,PROXY_KIND_MP_EXCEPTION=-1,PROXY_KIND_MP_NULL=0,PROXY_KIND_MP_NONE=1,PROXY_KIND_MP_BOOL=2,PROXY_KIND_MP_INT=3,PROXY_KIND_MP_FLOAT=4,PROXY_KIND_MP_STR=5,PROXY_KIND_MP_CALLABLE=6,PROXY_KIND_MP_GENERATOR=7,PROXY_KIND_MP_JSPROXY=9,PROXY_KIND_MP_EXISTING=10,PROXY_KIND_JS_UNDEFINED=0,PROXY_KIND_JS_NULL=1,PROXY_KIND_JS_BOOLEAN=2,PROXY_KIND_JS_INTEGER=3,PROXY_KIND_JS_DOUBLE=4,PROXY_KIND_JS_STRING=5,PROXY_KIND_JS_OBJECT=6,PROXY_KIND_JS_PYPROXY=7;class PythonError extends Error{constructor(exc_type,exc_details){super(exc_details),this.name="PythonError",this.type=exc_type}}function proxy_js_init(){globalThis.proxy_js_ref=[globalThis,void 0],globalThis.proxy_js_ref_next=PROXY_JS_REF_NUM_STATIC,globalThis.proxy_js_map=new Map,globalThis.proxy_js_existing=[void 0],globalThis.pyProxyFinalizationRegistry=new FinalizationRegistry((cRef=>{globalThis.proxy_js_map.delete(cRef),Module.ccall("proxy_c_free_obj","null",["number"],[cRef])}))}function proxy_js_add_obj(js_obj){for(;proxy_js_ref_nextfunction(target,argumentsList){let args=0;for(;argumentsList.length>0&&void 0===argumentsList[argumentsList.length-1];)argumentsList.pop();if(argumentsList.length>0){args=Module._malloc(3*argumentsList.length*4);for(const i in argumentsList)proxy_convert_js_to_mp_obj_jsside(argumentsList[i],args+3*i*4)}const value=Module._malloc(12);Module.ccall("proxy_c_to_js_call","null",["number","number","number","pointer"],[target,argumentsList.length,args,value]),argumentsList.length>0&&Module._free(args);const ret=proxy_convert_mp_to_js_obj_jsside_with_free(value);return ret instanceof PyProxyThenable?Promise.resolve(ret):ret}(id,args),obj._ref=id;else if(kind===PROXY_KIND_MP_GENERATOR)obj=new PyProxyThenable(id);else{const target=new PyProxy(id);obj=new Proxy(target,py_proxy_handler)}globalThis.pyProxyFinalizationRegistry.register(obj,id),globalThis.proxy_js_map.set(id,new WeakRef(obj))}return obj}function proxy_convert_mp_to_js_obj_jsside_with_free(value){const ret=proxy_convert_mp_to_js_obj_jsside(value);return Module._free(value),ret} \ No newline at end of file +var _scriptName,_createMicroPythonModule=(_scriptName=import.meta.url,async function(moduleArg={}){var moduleRtn,readyPromiseResolve,readyPromiseReject,Module=moduleArg,readyPromise=new Promise(((resolve,reject)=>{readyPromiseResolve=resolve,readyPromiseReject=reject}));["_free","_malloc","_mp_js_init","_mp_js_repl_init","_mp_js_repl_process_char","_mp_hal_get_interrupt_char","_mp_sched_keyboard_interrupt","_mp_js_do_exec","_mp_js_do_exec_async","_mp_js_do_import","_mp_js_register_js_module","_proxy_c_free_obj","_proxy_c_init","_proxy_c_to_js_call","_proxy_c_to_js_delete_attr","_proxy_c_to_js_dir","_proxy_c_to_js_get_array","_proxy_c_to_js_get_dict","_proxy_c_to_js_get_iter","_proxy_c_to_js_get_type","_proxy_c_to_js_has_attr","_proxy_c_to_js_iternext","_proxy_c_to_js_lookup_attr","_proxy_c_to_js_resume","_proxy_c_to_js_store_attr","_proxy_convert_mp_to_js_obj_cside","_memory","___indirect_function_table","_proxy_convert_mp_to_js_then_js_to_mp_obj_jsside","_proxy_convert_mp_to_js_then_js_to_js_then_js_to_mp_obj_jsside","_js_get_proxy_js_ref_info","_has_attr","_lookup_attr","_store_attr","_call0","_call1","_call2","_calln","_call0_kwarg","_call1_kwarg","_js_reflect_construct","_js_get_iter","_js_iter_next","_js_subscr_load","_js_subscr_store","_proxy_js_free_obj","_js_check_existing","_js_get_error_info","_js_then_resolve","_js_then_reject","_js_then_continue","_create_promise","onRuntimeInitialized"].forEach((prop=>{Object.getOwnPropertyDescriptor(readyPromise,prop)||Object.defineProperty(readyPromise,prop,{get:()=>abort("You are getting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js"),set:()=>abort("You are setting "+prop+" on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")})}));var ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(Module.ENVIRONMENT)throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)");if(ENVIRONMENT_IS_NODE){const{createRequire:createRequire}=await import("module");var require=createRequire(import.meta.url)}var readAsync,readBinary,moduleOverrides=Object.assign({},Module),quit_=(status,toThrow)=>{throw toThrow},scriptDirectory="";if(ENVIRONMENT_IS_NODE){if("undefined"==typeof process||!process.release||"node"!==process.release.name)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");var nodeVersion=process.versions.node,numericVersion=nodeVersion.split(".").slice(0,3);if((numericVersion=1e4*numericVersion[0]+100*numericVersion[1]+1*numericVersion[2].split("-")[0])<16e4)throw new Error("This emscripten-generated code requires node v16.0.0 (detected v"+nodeVersion+")");var fs=require("fs"),nodePath=require("path");scriptDirectory=require("url").fileURLToPath(new URL("./",import.meta.url)),readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return assert(ret.buffer),ret},readAsync=(filename,binary=!0)=>(filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename),new Promise(((resolve,reject)=>{fs.readFile(filename,binary?void 0:"utf8",((err,data)=>{err?reject(err):resolve(binary?data.buffer:data)}))}))),!Module.thisProgram&&process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),quit_=(status,toThrow)=>{throw process.exitCode=status,toThrow}}else if(ENVIRONMENT_IS_SHELL){if("object"==typeof process&&"function"==typeof require||"object"==typeof window||"function"==typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)")}else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw new Error("environment detection error");if(ENVIRONMENT_IS_WORKER?scriptDirectory=self.location.href:"undefined"!=typeof document&&document.currentScript&&(scriptDirectory=document.currentScript.src),_scriptName&&(scriptDirectory=_scriptName),scriptDirectory=scriptDirectory.startsWith("blob:")?"":scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1),"object"!=typeof window&&"function"!=typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");ENVIRONMENT_IS_WORKER&&(readBinary=url=>{var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.responseType="arraybuffer",xhr.send(null),new Uint8Array(xhr.response)}),readAsync=url=>isFileURI(url)?new Promise(((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,!0),xhr.responseType="arraybuffer",xhr.onload=()=>{(200==xhr.status||0==xhr.status&&xhr.response)&&resolve(xhr.response),reject(xhr.status)},xhr.onerror=reject,xhr.send(null)})):fetch(url,{credentials:"same-origin"}).then((response=>response.ok?response.arrayBuffer():Promise.reject(new Error(response.status+" : "+response.url))))}var prop,wasmBinary,wasmMemory,out=Module.print||console.log.bind(console),err=Module.printErr||console.error.bind(console);Object.assign(Module,moduleOverrides),moduleOverrides=null,prop="fetchSettings",Object.getOwnPropertyDescriptor(Module,prop)&&abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`),Module.arguments&&Module.arguments,legacyModuleProp("arguments","arguments_"),Module.thisProgram&&Module.thisProgram,legacyModuleProp("thisProgram","thisProgram"),Module.quit&&(quit_=Module.quit),legacyModuleProp("quit","quit_"),assert(void 0===Module.memoryInitializerPrefixURL,"Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.pthreadMainPrefixURL,"Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.cdInitializerPrefixURL,"Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.filePackagePrefixURL,"Module.filePackagePrefixURL option was removed, use Module.locateFile instead"),assert(void 0===Module.read,"Module.read option was removed"),assert(void 0===Module.readAsync,"Module.readAsync option was removed (modify readAsync in JS)"),assert(void 0===Module.readBinary,"Module.readBinary option was removed (modify readBinary in JS)"),assert(void 0===Module.setWindowTitle,"Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)"),assert(void 0===Module.TOTAL_MEMORY,"Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"),legacyModuleProp("asm","wasmExports"),legacyModuleProp("readAsync","readAsync"),legacyModuleProp("readBinary","readBinary"),legacyModuleProp("setWindowTitle","setWindowTitle"),assert(!ENVIRONMENT_IS_SHELL,"shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable."),Module.wasmBinary&&(wasmBinary=Module.wasmBinary),legacyModuleProp("wasmBinary","wasmBinary"),"object"!=typeof WebAssembly&&err("no native wasm support detected");var EXITSTATUS,HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64,ABORT=!1;function assert(condition,text){condition||abort("Assertion failed"+(text?": "+text:""))}function checkStackCookie(){if(!ABORT){var max=_emscripten_stack_get_end();0==max&&(max+=4);var cookie1=HEAPU32[max>>2],cookie2=HEAPU32[max+4>>2];34821223==cookie1&&2310721022==cookie2||abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`),1668509029!=HEAPU32[0]&&abort("Runtime error: The application has corrupted its heap memory area (address zero)!")}}assert(!Module.STACK_SIZE,"STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time"),assert("undefined"!=typeof Int32Array&&"undefined"!=typeof Float64Array&&null!=Int32Array.prototype.subarray&&null!=Int32Array.prototype.set,"JS engine does not provide full typed array support"),assert(!Module.wasmMemory,"Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally"),assert(!Module.INITIAL_MEMORY,"Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically"),function(){var h16=new Int16Array(1),h8=new Int8Array(h16.buffer);if(h16[0]=25459,115!==h8[0]||99!==h8[1])throw"Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)"}();var __ATPRERUN__=[],__ATINIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;assert(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),assert(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null,runDependencyTracking={};function getUniqueRunDependency(id){for(var orig=id;;){if(!runDependencyTracking[id])return id;id=orig+Math.random()}}function addRunDependency(id){runDependencies++,Module.monitorRunDependencies?.(runDependencies),id?(assert(!runDependencyTracking[id]),runDependencyTracking[id]=1,null===runDependencyWatcher&&"undefined"!=typeof setInterval&&(runDependencyWatcher=setInterval((()=>{if(ABORT)return clearInterval(runDependencyWatcher),void(runDependencyWatcher=null);var shown=!1;for(var dep in runDependencyTracking)shown||(shown=!0,err("still waiting on run dependencies:")),err(`dependency: ${dep}`);shown&&err("(end of list)")}),1e4))):err("warning: run dependency added without ID")}function removeRunDependency(id){if(runDependencies--,Module.monitorRunDependencies?.(runDependencies),id?(assert(runDependencyTracking[id]),delete runDependencyTracking[id]):err("warning: run dependency removed without ID"),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var callback=dependenciesFulfilled;dependenciesFulfilled=null,callback()}}function abort(what){Module.onAbort?.(what),err(what="Aborted("+what+")"),ABORT=!0,EXITSTATUS=1,what.indexOf("RuntimeError: unreachable")>=0&&(what+='. "unreachable" may be due to ASYNCIFY_STACK_SIZE not being large enough (try increasing it)');var e=new WebAssembly.RuntimeError(what);throw readyPromiseReject(e),e}var wasmBinaryFile,tempDouble,tempI64,isDataURI=filename=>filename.startsWith("data:application/octet-stream;base64,"),isFileURI=filename=>filename.startsWith("file://");function createExportWrapper(name,nargs){return(...args)=>{assert(runtimeInitialized,`native function \`${name}\` called before runtime initialization`);var f=wasmExports[name];return assert(f,`exported native function \`${name}\` not found`),assert(args.length<=nargs,`native function \`${name}\` called with ${args.length} args but expects ${nargs}`),f(...args)}}function findWasmBinary(){if(Module.locateFile){var f="micropython.wasm";return isDataURI(f)?f:(path=f,Module.locateFile?Module.locateFile(path,scriptDirectory):scriptDirectory+path)}var path;return new URL("micropython.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary)return new Uint8Array(wasmBinary);if(readBinary)return readBinary(file);throw"both async and sync fetching of the wasm failed"}function instantiateArrayBuffer(binaryFile,imports,receiver){return function(binaryFile){return wasmBinary?Promise.resolve().then((()=>getBinarySync(binaryFile))):readAsync(binaryFile).then((response=>new Uint8Array(response)),(()=>getBinarySync(binaryFile)))}(binaryFile).then((binary=>WebAssembly.instantiate(binary,imports))).then(receiver,(reason=>{err(`failed to asynchronously prepare wasm: ${reason}`),isFileURI(wasmBinaryFile)&&err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`),abort(reason)}))}function legacyModuleProp(prop,newName,incoming=!0){Object.getOwnPropertyDescriptor(Module,prop)||Object.defineProperty(Module,prop,{configurable:!0,get(){abort(`\`Module.${prop}\` has been replaced by \`${newName}\``+(incoming?" (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)":""))}})}function isExportedByForceFilesystem(name){return"FS_createPath"===name||"FS_createDataFile"===name||"FS_createPreloadedFile"===name||"FS_unlink"===name||"addRunDependency"===name||"FS_createLazyFile"===name||"FS_createDevice"===name||"removeRunDependency"===name}function missingGlobal(sym,msg){"undefined"!=typeof globalThis&&Object.defineProperty(globalThis,sym,{configurable:!0,get(){warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`)}})}function unexportedRuntimeSymbol(sym){Object.getOwnPropertyDescriptor(Module,sym)||Object.defineProperty(Module,sym,{configurable:!0,get(){var msg=`'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;isExportedByForceFilesystem(sym)&&(msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"),abort(msg)}})}function ExitStatus(status){this.name="ExitStatus",this.message=`Program terminated with exit(${status})`,this.status=status}missingGlobal("buffer","Please use HEAP8.buffer or wasmMemory.buffer"),missingGlobal("asm","Please use wasmExports instead");var callRuntimeCallbacks=callbacks=>{for(;callbacks.length>0;)callbacks.shift()(Module)};function getValue(ptr,type="i8"){switch(type.endsWith("*")&&(type="*"),type){case"i1":case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module.noExitRuntime||!0,ptrToString=ptr=>(assert("number"==typeof ptr),"0x"+(ptr>>>=0).toString(16).padStart(8,"0")),stackRestore=val=>__emscripten_stack_restore(val),stackSave=()=>_emscripten_stack_get_current(),warnOnce=text=>{warnOnce.shown||={},warnOnce.shown[text]||(warnOnce.shown[text]=1,ENVIRONMENT_IS_NODE&&(text="warning: "+text),err(text))},PATH={isAbs:path=>"/"===path.charAt(0),splitPath:filename=>/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(filename).slice(1),normalizeArray:(parts,allowAboveRoot)=>{for(var up=0,i=parts.length-1;i>=0;i--){var last=parts[i];"."===last?parts.splice(i,1):".."===last?(parts.splice(i,1),up++):up&&(parts.splice(i,1),up--)}if(allowAboveRoot)for(;up;up--)parts.unshift("..");return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash="/"===path.substr(-1);return(path=PATH.normalizeArray(path.split("/").filter((p=>!!p)),!isAbsolute).join("/"))||isAbsolute||(path="."),path&&trailingSlash&&(path+="/"),(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];return root||dir?(dir&&(dir=dir.substr(0,dir.length-1)),root+dir):"."},basename:path=>{if("/"===path)return"/";var lastSlash=(path=(path=PATH.normalize(path)).replace(/\/$/,"")).lastIndexOf("/");return-1===lastSlash?path:path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)},randomFill=view=>(randomFill=(()=>{if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues)return view=>crypto.getRandomValues(view);if(ENVIRONMENT_IS_NODE)try{var crypto_module=require("crypto");if(crypto_module.randomFillSync)return view=>crypto_module.randomFillSync(view);var randomBytes=crypto_module.randomBytes;return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };")})())(view),PATH_FS={resolve:(...args)=>{for(var resolvedPath="",resolvedAbsolute=!1,i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if("string"!=typeof path)throw new TypeError("Arguments to path.resolve must be strings");if(!path)return"";resolvedPath=path+"/"+resolvedPath,resolvedAbsolute=PATH.isAbs(path)}return(resolvedAbsolute?"/":"")+(resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((p=>!!p)),!resolvedAbsolute).join("/"))||"."},relative:(from,to)=>{function trim(arr){for(var start=0;start=0&&""===arr[end];end--);return start>end?[]:arr.slice(start,end-start+1)}from=PATH_FS.resolve(from).substr(1),to=PATH_FS.resolve(to).substr(1);for(var fromParts=trim(from.split("/")),toParts=trim(to.split("/")),length=Math.min(fromParts.length,toParts.length),samePartsLength=length,i=0;i{for(var endIdx=idx+maxBytesToRead,endPtr=idx;heapOrArray[endPtr]&&!(endPtr>=endIdx);)++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder)return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr));for(var str="";idx>10,56320|1023&ch)}}else str+=String.fromCharCode((31&u0)<<6|u1)}else str+=String.fromCharCode(u0)}return str},FS_stdin_getChar_buffer=[],lengthBytesUTF8=str=>{for(var len=0,i=0;i=55296&&c<=57343?(len+=4,++i):len+=3}return len},stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(assert("string"==typeof str,`stringToUTF8Array expects a string (got ${typeof str})`),!(maxBytesToWrite>0))return 0;for(var startIdx=outIdx,endIdx=outIdx+maxBytesToWrite-1,i=0;i=55296&&u<=57343&&(u=65536+((1023&u)<<10)|1023&str.charCodeAt(++i)),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|63&u}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|63&u}else{if(outIdx+3>=endIdx)break;u>1114111&&warnOnce("Invalid Unicode code point "+ptrToString(u)+" encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF)."),heap[outIdx++]=240|u>>18,heap[outIdx++]=128|u>>12&63,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|63&u}}return heap[outIdx]=0,outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1,u8array=new Array(len),numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);return dontAddNull&&(u8array.length=numBytesWritten),u8array}var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops},FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty)throw new FS.ErrnoError(43);stream.tty=tty,stream.seekable=!1},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char)throw new FS.ErrnoError(60);for(var bytesRead=0,i=0;i(()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var buf=Buffer.alloc(256),bytesRead=0,fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,256)}catch(e){if(!e.toString().includes("EOF"))throw e;bytesRead=0}bytesRead>0&&(result=buf.slice(0,bytesRead).toString("utf-8"))}else"undefined"!=typeof window&&"function"==typeof window.prompt&&null!==(result=window.prompt("Input: "))&&(result+="\n");if(!result)return null;FS_stdin_getChar_buffer=intArrayFromString(result,!0)}return FS_stdin_getChar_buffer.shift()})(),put_char(tty,val){null===val||10===val?(out(UTF8ArrayToString(tty.output,0)),tty.output=[]):0!=val&&tty.output.push(val)},fsync(tty){tty.output&&tty.output.length>0&&(out(UTF8ArrayToString(tty.output,0)),tty.output=[])},ioctl_tcgets:tty=>({c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}),ioctl_tcsets:(tty,optional_actions,data)=>0,ioctl_tiocgwinsz:tty=>[24,80]},default_tty1_ops:{put_char(tty,val){null===val||10===val?(err(UTF8ArrayToString(tty.output,0)),tty.output=[]):0!=val&&tty.output.push(val)},fsync(tty){tty.output&&tty.output.length>0&&(err(UTF8ArrayToString(tty.output,0)),tty.output=[])}}},mmapAlloc=size=>{abort("internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported")},MEMFS={ops_table:null,mount:mount=>MEMFS.createNode(null,"/",16895,0),createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode))throw new FS.ErrnoError(63);MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);return FS.isDir(node.mode)?(node.node_ops=MEMFS.ops_table.dir.node,node.stream_ops=MEMFS.ops_table.dir.stream,node.contents={}):FS.isFile(node.mode)?(node.node_ops=MEMFS.ops_table.file.node,node.stream_ops=MEMFS.ops_table.file.stream,node.usedBytes=0,node.contents=null):FS.isLink(node.mode)?(node.node_ops=MEMFS.ops_table.link.node,node.stream_ops=MEMFS.ops_table.link.stream):FS.isChrdev(node.mode)&&(node.node_ops=MEMFS.ops_table.chrdev.node,node.stream_ops=MEMFS.ops_table.chrdev.stream),node.timestamp=Date.now(),parent&&(parent.contents[name]=node,parent.timestamp=node.timestamp),node},getFileDataAsTypedArray:node=>node.contents?node.contents.subarray?node.contents.subarray(0,node.usedBytes):new Uint8Array(node.contents):new Uint8Array(0),expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(!(prevCapacity>=newCapacity)){newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<1048576?2:1.125)>>>0),0!=prevCapacity&&(newCapacity=Math.max(newCapacity,256));var oldContents=node.contents;node.contents=new Uint8Array(newCapacity),node.usedBytes>0&&node.contents.set(oldContents.subarray(0,node.usedBytes),0)}},resizeFileStorage(node,newSize){if(node.usedBytes!=newSize)if(0==newSize)node.contents=null,node.usedBytes=0;else{var oldContents=node.contents;node.contents=new Uint8Array(newSize),oldContents&&node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes))),node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};return 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,FS.isDir(node.mode)?attr.size=4096:FS.isFile(node.mode)?attr.size=node.usedBytes:FS.isLink(node.mode)?attr.size=node.link.length: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),attr},setattr(node,attr){void 0!==attr.mode&&(node.mode=attr.mode),void 0!==attr.timestamp&&(node.timestamp=attr.timestamp),void 0!==attr.size&&MEMFS.resizeFileStorage(node,attr.size)},lookup(parent,name){throw FS.genericErrors[44]},mknod:(parent,name,mode,dev)=>MEMFS.createNode(parent,name,mode,dev),rename(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},unlink(parent,name){delete parent.contents[name],parent.timestamp=Date.now()},rmdir(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(node){var entries=[".",".."];for(var key of Object.keys(node.contents))entries.push(key);return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,41471,0);return node.link=oldpath,node},readlink(node){if(!FS.isLink(node.mode))throw new FS.ErrnoError(28);return node.link}},stream_ops:{read(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(assert(size>=0),size>8&&contents.subarray)buffer.set(contents.subarray(position,position+size),offset);else for(var i=0;i0||position+length(MEMFS.stream_ops.write(stream,buffer,0,length,offset,!1),0)}},preloadPlugins=Module.preloadPlugins||[],FS_getMode=(canRead,canWrite)=>{var mode=0;return canRead&&(mode|=365),canWrite&&(mode|=146),mode},UTF8ToString=(ptr,maxBytesToRead)=>(assert("number"==typeof ptr,`UTF8ToString expects a number (got ${typeof ptr})`),ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""),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},FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class extends Error{constructor(errno){for(var key in super(runtimeInitialized?(errno=>UTF8ToString(_strerror(errno)))(errno):""),this.name="ErrnoError",this.errno=errno,ERRNO_CODES)if(ERRNO_CODES[key]===errno){this.code=key;break}}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return 1!=(2097155&this.flags)}get isWrite(){return!!(2097155&this.flags)}get isAppend(){return 1024&this.flags}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){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,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!(path=PATH_FS.resolve(path)))return{path:"",node:null};if((opts=Object.assign({follow_mount:!0,recurse_count:0},opts)).recurse_count>8)throw new FS.ErrnoError(32);for(var parts=path.split("/").filter((p=>!!p)),current=FS.root,current_path="/",i=0;i40)throw new FS.ErrnoError(32)}}return{path:current_path,node:current}},getPath(node){for(var path;;){if(FS.isRoot(node)){var mount=node.mount.mountpoint;return path?"/"!==mount[mount.length-1]?`${mount}/${path}`:mount+path:mount}path=path?`${node.name}/${path}`:node.name,node=node.parent}},hashName(parentid,name){for(var hash=0,i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash],FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node)FS.nameTable[hash]=node.name_next;else for(var current=FS.nameTable[hash];current;){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode)throw new FS.ErrnoError(errCode);for(var hash=FS.hashName(parent.id,name),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(parent,name,mode,rdev){assert("object"==typeof parent);var node=new FS.FSNode(parent,name,mode,rdev);return FS.hashAddNode(node),node},destroyNode(node){FS.hashRemoveNode(node)},isRoot:node=>node===node.parent,isMountpoint:node=>!!node.mounted,isFile:mode=>32768==(61440&mode),isDir:mode=>16384==(61440&mode),isLink:mode=>40960==(61440&mode),isChrdev:mode=>8192==(61440&mode),isBlkdev:mode=>24576==(61440&mode),isFIFO:mode=>4096==(61440&mode),isSocket:mode=>!(49152&~mode),flagsToPermissionString(flag){var perms=["r","w","rw"][3&flag];return 512&flag&&(perms+="w"),perms},nodePermissions:(node,perms)=>FS.ignorePermissions||(!perms.includes("r")||292&node.mode)&&(!perms.includes("w")||146&node.mode)&&(!perms.includes("x")||73&node.mode)?0:2,mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");return errCode||(dir.node_ops.lookup?0:2)},mayCreate(dir,name){try{return FS.lookupNode(dir,name),20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(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:(node,flags)=>node?FS.isLink(node.mode)?32:FS.isDir(node.mode)&&("r"!==FS.flagsToPermissionString(flags)||512&flags)?31:FS.nodePermissions(node,FS.flagsToPermissionString(flags)):44,MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++)if(!FS.streams[fd])return fd;throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>(assert(fd>=-1),stream=Object.assign(new FS.FSStream,stream),-1==fd&&(fd=FS.nextfd()),stream.fd=fd,FS.streams[fd]=stream,stream),closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);return stream.stream_ops?.dup?.(stream),stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops,stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>255&dev,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){for(var mounts=[],check=[mount];check.length;){var m=check.pop();mounts.push(m),check.push(...m.mounts)}return mounts},syncfs(populate,callback){"function"==typeof populate&&(callback=populate,populate=!1),FS.syncFSRequests++,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),completed=0;function doCallback(errCode){return assert(FS.syncFSRequests>0),FS.syncFSRequests--,callback(errCode)}function done(errCode){if(errCode)return done.errored?void 0:(done.errored=!0,doCallback(errCode));++completed>=mounts.length&&doCallback(null)}mounts.forEach((mount=>{if(!mount.type.syncfs)return done(null);mount.type.syncfs(mount,populate,done)}))},mount(type,opts,mountpoint){if("string"==typeof type)throw type;var node,root="/"===mountpoint,pseudo=!mountpoint;if(root&&FS.root)throw new FS.ErrnoError(10);if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:!1});if(mountpoint=lookup.path,node=lookup.node,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:[]},mountRoot=type.mount(mount);return mountRoot.mount=mount,mount.root=mountRoot,root?FS.root=mountRoot:node&&(node.mounted=mount,node.mount&&node.mount.mounts.push(mount)),mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:!1});if(!FS.isMountpoint(lookup.node))throw new FS.ErrnoError(28);var node=lookup.node,mount=node.mounted,mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((hash=>{for(var current=FS.nameTable[hash];current;){var next=current.name_next;mounts.includes(current.mount)&&FS.destroyNode(current),current=next}})),node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(-1!==idx),node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>parent.node_ops.lookup(parent,name),mknod(path,mode,dev){var parent=FS.lookupPath(path,{parent:!0}).node,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:(path,mode)=>(mode=void 0!==mode?mode:438,mode&=4095,mode|=32768,FS.mknod(path,mode,0)),mkdir:(path,mode)=>(mode=void 0!==mode?mode:511,mode&=1023,mode|=16384,FS.mknod(path,mode,0)),mkdirTree(path,mode){for(var dirs=path.split("/"),d="",i=0;i(void 0===dev&&(dev=mode,mode=438),mode|=8192,FS.mknod(path,mode,dev)),symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath))throw new FS.ErrnoError(44);var parent=FS.lookupPath(newpath,{parent:!0}).node;if(!parent)throw new FS.ErrnoError(44);var newname=PATH.basename(newpath),errCode=FS.mayCreate(parent,newname);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.symlink)throw new FS.ErrnoError(63);return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dir,new_dir,old_dirname=PATH.dirname(old_path),new_dirname=PATH.dirname(new_path),old_name=PATH.basename(old_path),new_name=PATH.basename(new_path);if(old_dir=FS.lookupPath(old_path,{parent:!0}).node,new_dir=FS.lookupPath(new_path,{parent:!0}).node,!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount)throw new FS.ErrnoError(75);var new_node,old_node=FS.lookupNode(old_dir,old_name),relative=PATH_FS.relative(old_path,new_dirname);if("."!==relative.charAt(0))throw new FS.ErrnoError(28);if("."!==(relative=PATH_FS.relative(new_path,old_dirname)).charAt(0))throw new FS.ErrnoError(55);try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node!==new_node){var isdir=FS.isDir(old_node.mode),errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode)throw new FS.ErrnoError(errCode);if(errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name))throw new FS.ErrnoError(errCode);if(!old_dir.node_ops.rename)throw new FS.ErrnoError(63);if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node))throw new FS.ErrnoError(10);if(new_dir!==old_dir&&(errCode=FS.nodePermissions(old_dir,"w")))throw new FS.ErrnoError(errCode);FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name),old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}}},rmdir(path){var parent=FS.lookupPath(path,{parent:!0}).node,name=PATH.basename(path),node=FS.lookupNode(parent,name),errCode=FS.mayDelete(parent,name,!0);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.rmdir)throw new FS.ErrnoError(63);if(FS.isMountpoint(node))throw new FS.ErrnoError(10);parent.node_ops.rmdir(parent,name),FS.destroyNode(node)},readdir(path){var node=FS.lookupPath(path,{follow:!0}).node;if(!node.node_ops.readdir)throw new FS.ErrnoError(54);return node.node_ops.readdir(node)},unlink(path){var parent=FS.lookupPath(path,{parent:!0}).node;if(!parent)throw new FS.ErrnoError(44);var name=PATH.basename(path),node=FS.lookupNode(parent,name),errCode=FS.mayDelete(parent,name,!1);if(errCode)throw new FS.ErrnoError(errCode);if(!parent.node_ops.unlink)throw new FS.ErrnoError(63);if(FS.isMountpoint(node))throw new FS.ErrnoError(10);parent.node_ops.unlink(parent,name),FS.destroyNode(node)},readlink(path){var link=FS.lookupPath(path).node;if(!link)throw new FS.ErrnoError(44);if(!link.node_ops.readlink)throw new FS.ErrnoError(28);return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat(path,dontFollow){var node=FS.lookupPath(path,{follow:!dontFollow}).node;if(!node)throw new FS.ErrnoError(44);if(!node.node_ops.getattr)throw new FS.ErrnoError(63);return node.node_ops.getattr(node)},lstat:path=>FS.stat(path,!0),chmod(path,mode,dontFollow){var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!dontFollow}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);node.node_ops.setattr(node,{mode:4095&mode|-4096&node.mode,timestamp:Date.now()})},lchmod(path,mode){FS.chmod(path,mode,!0)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown(path,uid,gid,dontFollow){var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!dontFollow}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);node.node_ops.setattr(node,{timestamp:Date.now()})},lchown(path,uid,gid){FS.chown(path,uid,gid,!0)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate(path,len){if(len<0)throw new FS.ErrnoError(28);var node;if(!(node="string"==typeof path?FS.lookupPath(path,{follow:!0}).node:path).node_ops.setattr)throw new FS.ErrnoError(63);if(FS.isDir(node.mode))throw new FS.ErrnoError(31);if(!FS.isFile(node.mode))throw new FS.ErrnoError(28);var errCode=FS.nodePermissions(node,"w");if(errCode)throw new FS.ErrnoError(errCode);node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(!(2097155&stream.flags))throw new FS.ErrnoError(28);FS.truncate(stream.node,len)},utime(path,atime,mtime){var node=FS.lookupPath(path,{follow:!0}).node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open(path,flags,mode){if(""===path)throw new FS.ErrnoError(44);var node;if(mode=64&(flags="string"==typeof flags?(str=>{var flags={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[str];if(void 0===flags)throw new Error(`Unknown file open mode: ${str}`);return flags})(flags):flags)?4095&(mode=void 0===mode?438:mode)|32768:0,"object"==typeof path)node=path;else{path=PATH.normalize(path);try{node=FS.lookupPath(path,{follow:!(131072&flags)}).node}catch(e){}}var created=!1;if(64&flags)if(node){if(128&flags)throw new FS.ErrnoError(20)}else node=FS.mknod(path,mode,0),created=!0;if(!node)throw new FS.ErrnoError(44);if(FS.isChrdev(node.mode)&&(flags&=-513),65536&flags&&!FS.isDir(node.mode))throw new FS.ErrnoError(54);if(!created){var errCode=FS.mayOpen(node,flags);if(errCode)throw new FS.ErrnoError(errCode)}512&flags&&!created&&FS.truncate(node,0),flags&=-131713;var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:!0,position:0,stream_ops:node.stream_ops,ungotten:[],error:!1});return stream.stream_ops.open&&stream.stream_ops.open(stream),!Module.logReadFiles||1&flags||(FS.readFiles||(FS.readFiles={}),path in FS.readFiles||(FS.readFiles[path]=1)),stream},close(stream){if(FS.isClosed(stream))throw new FS.ErrnoError(8);stream.getdents&&(stream.getdents=null);try{stream.stream_ops.close&&stream.stream_ops.close(stream)}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>null===stream.fd,llseek(stream,offset,whence){if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(!stream.seekable||!stream.stream_ops.llseek)throw new FS.ErrnoError(70);if(0!=whence&&1!=whence&&2!=whence)throw new FS.ErrnoError(28);return stream.position=stream.stream_ops.llseek(stream,offset,whence),stream.ungotten=[],stream.position},read(stream,buffer,offset,length,position){if(assert(offset>=0),length<0||position<0)throw new FS.ErrnoError(28);if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(1==(2097155&stream.flags))throw new FS.ErrnoError(8);if(FS.isDir(stream.node.mode))throw new FS.ErrnoError(31);if(!stream.stream_ops.read)throw new FS.ErrnoError(28);var seeking=void 0!==position;if(seeking){if(!stream.seekable)throw new FS.ErrnoError(70)}else position=stream.position;var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);return seeking||(stream.position+=bytesRead),bytesRead},write(stream,buffer,offset,length,position,canOwn){if(assert(offset>=0),length<0||position<0)throw new FS.ErrnoError(28);if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(!(2097155&stream.flags))throw new FS.ErrnoError(8);if(FS.isDir(stream.node.mode))throw new FS.ErrnoError(31);if(!stream.stream_ops.write)throw new FS.ErrnoError(28);stream.seekable&&1024&stream.flags&&FS.llseek(stream,0,2);var seeking=void 0!==position;if(seeking){if(!stream.seekable)throw new FS.ErrnoError(70)}else position=stream.position;var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);return seeking||(stream.position+=bytesWritten),bytesWritten},allocate(stream,offset,length){if(FS.isClosed(stream))throw new FS.ErrnoError(8);if(offset<0||length<=0)throw new FS.ErrnoError(28);if(!(2097155&stream.flags))throw new FS.ErrnoError(8);if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode))throw new FS.ErrnoError(43);if(!stream.stream_ops.allocate)throw new FS.ErrnoError(138);stream.stream_ops.allocate(stream,offset,length)},mmap(stream,length,position,prot,flags){if(2&prot&&!(2&flags)&&2!=(2097155&stream.flags))throw new FS.ErrnoError(2);if(1==(2097155&stream.flags))throw new FS.ErrnoError(2);if(!stream.stream_ops.mmap)throw new FS.ErrnoError(43);return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>(assert(offset>=0),stream.stream_ops.msync?stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags):0),ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl)throw new FS.ErrnoError(59);return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){if(opts.flags=opts.flags||0,opts.encoding=opts.encoding||"binary","utf8"!==opts.encoding&&"binary"!==opts.encoding)throw new Error(`Invalid encoding type "${opts.encoding}"`);var ret,stream=FS.open(path,opts.flags),length=FS.stat(path).size,buf=new Uint8Array(length);return FS.read(stream,buf,0,length,0),"utf8"===opts.encoding?ret=UTF8ArrayToString(buf,0):"binary"===opts.encoding&&(ret=buf),FS.close(stream),ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if("string"==typeof data){var buf=new Uint8Array(lengthBytesUTF8(data)+1),actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,void 0,opts.canOwn)}else{if(!ArrayBuffer.isView(data))throw new Error("Unsupported data type");FS.write(stream,data,0,data.byteLength,void 0,opts.canOwn)}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:!0});if(null===lookup.node)throw new FS.ErrnoError(44);if(!FS.isDir(lookup.node.mode))throw new FS.ErrnoError(54);var errCode=FS.nodePermissions(lookup.node,"x");if(errCode)throw new FS.ErrnoError(errCode);FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp"),FS.mkdir("/home"),FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev"),FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length}),FS.mkdev("/dev/null",FS.makedev(1,3)),TTY.register(FS.makedev(5,0),TTY.default_tty_ops),TTY.register(FS.makedev(6,0),TTY.default_tty1_ops),FS.mkdev("/dev/tty",FS.makedev(5,0)),FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0,randomByte=()=>(0===randomLeft&&(randomLeft=randomFill(randomBuffer).byteLength),randomBuffer[--randomLeft]);FS.createDevice("/dev","random",randomByte),FS.createDevice("/dev","urandom",randomByte),FS.mkdir("/dev/shm"),FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd"),FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);return node.node_ops={lookup(parent,name){var fd=+name,stream=FS.getStreamChecked(fd),ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};return ret.parent=ret,ret}},node}},{},"/proc/self/fd")},createStandardStreams(){Module.stdin?FS.createDevice("/dev","stdin",Module.stdin):FS.symlink("/dev/tty","/dev/stdin"),Module.stdout?FS.createDevice("/dev","stdout",null,Module.stdout):FS.symlink("/dev/tty","/dev/stdout"),Module.stderr?FS.createDevice("/dev","stderr",null,Module.stderr):FS.symlink("/dev/tty1","/dev/stderr");var stdin=FS.open("/dev/stdin",0),stdout=FS.open("/dev/stdout",1),stderr=FS.open("/dev/stderr",1);assert(0===stdin.fd,`invalid handle for stdin (${stdin.fd})`),assert(1===stdout.fd,`invalid handle for stdout (${stdout.fd})`),assert(2===stderr.fd,`invalid handle for stderr (${stderr.fd})`)},staticInit(){[44].forEach((code=>{FS.genericErrors[code]=new FS.ErrnoError(code),FS.genericErrors[code].stack=""})),FS.nameTable=new Array(4096),FS.mount(MEMFS,{},"/"),FS.createDefaultDirectories(),FS.createDefaultDevices(),FS.createSpecialDirectories(),FS.filesystems={MEMFS:MEMFS}},init(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)"),FS.init.initialized=!0,Module.stdin=input||Module.stdin,Module.stdout=output||Module.stdout,Module.stderr=error||Module.stderr,FS.createStandardStreams()},quit(){FS.init.initialized=!1,_fflush(0);for(var i=0;ithis.length-1||idx<0)){var chunkOffset=idx%this.chunkSize,chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;if(xhr.open("HEAD",url,!1),xhr.send(null),!(xhr.status>=200&&xhr.status<300||304===xhr.status))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var header,datalength=Number(xhr.getResponseHeader("Content-length")),hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&"bytes"===header,usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&"gzip"===header,chunkSize=1048576;hasByteServing||(chunkSize=datalength);var lazyArray=this;lazyArray.setDataGetter((chunkNum=>{var start=chunkNum*chunkSize,end=(chunkNum+1)*chunkSize-1;if(end=Math.min(end,datalength-1),void 0===lazyArray.chunks[chunkNum]&&(lazyArray.chunks[chunkNum]=((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;if(xhr.open("GET",url,!1),datalength!==chunkSize&&xhr.setRequestHeader("Range","bytes="+from+"-"+to),xhr.responseType="arraybuffer",xhr.overrideMimeType&&xhr.overrideMimeType("text/plain; charset=x-user-defined"),xhr.send(null),!(xhr.status>=200&&xhr.status<300||304===xhr.status))throw new Error("Couldn't load "+url+". Status: "+xhr.status);return void 0!==xhr.response?new Uint8Array(xhr.response||[]):intArrayFromString(xhr.responseText||"",!0)})(start,end)),void 0===lazyArray.chunks[chunkNum])throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]})),!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=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if("undefined"!=typeof XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var properties={isDevice:!1,contents:new LazyUint8Array}}else properties={isDevice:!1,url:url};var node=FS.createFile(parent,name,properties,canRead,canWrite);properties.contents?node.contents=properties.contents:properties.url&&(node.contents=null,node.url=properties.url),Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(assert(size>=0),contents.slice)for(var i=0;i{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>(FS.forceLoadFile(node),fn(...args))})),stream_ops.read=(stream,buffer,offset,length,position)=>(FS.forceLoadFile(node),writeChunks(stream,buffer,offset,length,position)),stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc();if(!ptr)throw new FS.ErrnoError(48);return writeChunks(stream,HEAP8,ptr,length,position),{ptr:ptr,allocated:!0}},node.stream_ops=stream_ops,node},absolutePath(){abort("FS.absolutePath has been removed; use PATH_FS.resolve instead")},createFolder(){abort("FS.createFolder has been removed; use FS.mkdir instead")},createLink(){abort("FS.createLink has been removed; use FS.symlink instead")},joinPath(){abort("FS.joinPath has been removed; use PATH.join instead")},mmapAlloc(){abort("FS.mmapAlloc has been replaced by the top level function mmapAlloc")},standardizePath(){abort("FS.standardizePath has been removed; use PATH.normalize instead")}},SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path))return path;var dir;if(dir=-100===dirfd?FS.cwd():SYSCALLS.getStreamFromFD(dirfd).path,0==path.length){if(!allowEmpty)throw new FS.ErrnoError(44);return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev,HEAP32[buf+4>>2]=stat.mode,HEAPU32[buf+8>>2]=stat.nlink,HEAP32[buf+12>>2]=stat.uid,HEAP32[buf+16>>2]=stat.gid,HEAP32[buf+20>>2]=stat.rdev,tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1],HEAP32[buf+32>>2]=4096,HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime(),mtime=stat.mtime.getTime(),ctime=stat.ctime.getTime();return tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1],HEAPU32[buf+48>>2]=atime%1e3*1e3,tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1],HEAPU32[buf+64>>2]=mtime%1e3*1e3,tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1],HEAPU32[buf+80>>2]=ctime%1e3*1e3,tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1],0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode))throw new FS.ErrnoError(43);if(2&flags)return 0;var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD:fd=>FS.getStreamChecked(fd),varargs:void 0,getStr:ptr=>UTF8ToString(ptr)},stringToUTF8=(str,outPtr,maxBytesToWrite)=>(assert("number"==typeof maxBytesToWrite,"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)),handleException=e=>{if(e instanceof ExitStatus||"unwind"==e)return EXITSTATUS;checkStackCookie(),e instanceof WebAssembly.RuntimeError&&_emscripten_stack_get_current()<=0&&err("Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)"),quit_(1,e)},runtimeKeepaliveCounter=0,keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0,_exit=(status,implicit)=>{if(EXITSTATUS=status,function(){var oldOut=out,oldErr=err,has=!1;out=err=x=>{has=!0};try{_fflush(0),["stdout","stderr"].forEach((function(name){var info=FS.analyzePath("/dev/"+name);if(info){var rdev=info.object.rdev,tty=TTY.ttys[rdev];tty?.output?.length&&(has=!0)}}))}catch(e){}out=oldOut,err=oldErr,has&&warnOnce("stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.")}(),keepRuntimeAlive()&&!implicit){var msg=`program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;readyPromiseReject(msg),err(msg)}var code;EXITSTATUS=code=status,keepRuntimeAlive()||(Module.onExit?.(code),ABORT=!0),quit_(code,new ExitStatus(code))},callUserCallback=func=>{if(ABORT)err("user callback triggered after runtime exited or application aborted. Ignoring.");else try{func(),(()=>{if(!keepRuntimeAlive())try{_exit(EXITSTATUS)}catch(e){handleException(e)}})()}catch(e){handleException(e)}},_emscripten_scan_registers=func=>Asyncify.handleSleep((wakeUp=>{((func,timeout)=>{setTimeout((()=>{callUserCallback(func)}),timeout)})((()=>{var stackBegin=Asyncify.currData+12,stackEnd=HEAPU32[Asyncify.currData>>2];dynCall_vii(func,stackBegin,stackEnd),wakeUp()}),0)}));_emscripten_scan_registers.isAsync=!0;var _fd_sync=function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return Asyncify.handleSleep((wakeUp=>{var mount=stream.node.mount;mount.type.syncfs?mount.type.syncfs(mount,!1,(err=>{wakeUp(err?29:0)})):wakeUp(0)}))}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}};_fd_sync.isAsync=!0;var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}},Asyncify={instrumentWasmImports(imports){var importPattern=/^(invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports))if("function"==typeof original){let isAsyncifyImport=original.isAsync||importPattern.test(x);imports[x]=(...args)=>{var originalAsyncifyState=Asyncify.state;try{return original(...args)}finally{var changedToDisabled=originalAsyncifyState===Asyncify.State.Normal&&Asyncify.state===Asyncify.State.Disabled,ignoredInvoke=x.startsWith("invoke_")&&!0;if(Asyncify.state!==originalAsyncifyState&&!isAsyncifyImport&&!changedToDisabled&&!ignoredInvoke)throw new Error(`import ${x} was not in ASYNCIFY_IMPORTS, but changed the state`)}}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports))ret[x]="function"==typeof original?(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{ABORT||(assert(Asyncify.exportCallStack.pop()===x),Asyncify.maybeStopUnwind())}}:original;return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];return void 0===id&&(id=Asyncify.callStackId++,Asyncify.callStackNameToId[funcName]=id,Asyncify.callStackIdToName[id]=funcName),id},maybeStopUnwind(){Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&0===Asyncify.exportCallStack.length&&(Asyncify.state=Asyncify.State.Normal,runAndAbortIfError(_asyncify_stop_unwind),"undefined"!=typeof Fibers&&Fibers.trampoline())},whenDone:()=>(assert(Asyncify.currData,"Tried to wait for an async operation when none is in progress."),assert(!Asyncify.asyncPromiseHandlers,"Cannot have multiple async operations in flight at once"),new Promise(((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}}))),allocateData(){var ptr=_malloc(12+Asyncify.StackSize);return Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize),Asyncify.setDataRewindFunc(ptr),ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack,HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0],rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFuncName(ptr){var id=HEAP32[ptr+8>>2];return Asyncify.callStackIdToName[id]},getDataRewindFunc:name=>wasmExports[name],doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);return Asyncify.getDataRewindFunc(name)()},handleSleep(startAsync){if(assert(Asyncify.state!==Asyncify.State.Disabled,"Asyncify cannot be done during or after the runtime exits"),!ABORT){if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=!1,reachedAfterCallback=!1;startAsync(((handleSleepReturnValue=0)=>{if(assert(!handleSleepReturnValue||"number"==typeof handleSleepReturnValue||"boolean"==typeof handleSleepReturnValue),!ABORT&&(Asyncify.handleSleepReturnValue=handleSleepReturnValue,reachedCallback=!0,reachedAfterCallback)){assert(!Asyncify.exportCallStack.length,"Waking up (starting to rewind) must be done from JS, without compiled code on the stack."),Asyncify.state=Asyncify.State.Rewinding,runAndAbortIfError((()=>_asyncify_start_rewind(Asyncify.currData))),"undefined"!=typeof Browser&&Browser.mainLoop.func&&Browser.mainLoop.resume();var asyncWasmReturnValue,isError=!1;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err,isError=!0}var handled=!1;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;asyncPromiseHandlers&&(Asyncify.asyncPromiseHandlers=null,(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue),handled=!0)}if(isError&&!handled)throw asyncWasmReturnValue}})),reachedAfterCallback=!0,reachedCallback||(Asyncify.state=Asyncify.State.Unwinding,Asyncify.currData=Asyncify.allocateData(),"undefined"!=typeof Browser&&Browser.mainLoop.func&&Browser.mainLoop.pause(),runAndAbortIfError((()=>_asyncify_start_unwind(Asyncify.currData))))}else Asyncify.state===Asyncify.State.Rewinding?(Asyncify.state=Asyncify.State.Normal,runAndAbortIfError(_asyncify_stop_rewind),_free(Asyncify.currData),Asyncify.currData=null,Asyncify.sleepCallbacks.forEach(callUserCallback)):abort(`invalid state: ${Asyncify.state}`);return Asyncify.handleSleepReturnValue}},handleAsync:startAsync=>Asyncify.handleSleep((wakeUp=>{startAsync().then(wakeUp)}))},stackAlloc=sz=>__emscripten_stack_alloc(sz),ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;return null!=str&&0!==str&&(ret=(str=>{var size=lengthBytesUTF8(str)+1,ret=stackAlloc(size);return stringToUTF8(str,ret,size),ret})(str)),ret},array:arr=>{var array,buffer,ret=stackAlloc(arr.length);return buffer=ret,assert((array=arr).length>=0,"writeArrayToMemory array must have a length (should be an array or typed array)"),HEAP8.set(array,buffer),ret}},func=(ident=>{var func=Module["_"+ident];return assert(func,"Cannot call unknown function "+ident+", make sure it is exported"),func})(ident),cArgs=[],stack=0;if(assert("array"!==returnType,'Return type should not be "array".'),args)for(var i=0;i0),runtimeKeepaliveCounter-=1,0!==stack&&stackRestore(stack),function(ret){return"string"===returnType?UTF8ToString(ret):"boolean"===returnType?Boolean(ret):ret}(ret)}var asyncMode=opts?.async;return runtimeKeepaliveCounter+=1,Asyncify.currData!=previousAsync?(assert(!(previousAsync&&Asyncify.currData),"We cannot start an async operation when one is already flight"),assert(!(previousAsync&&!Asyncify.currData),"We cannot stop an async operation in flight"),assert(asyncMode,"The call to "+ident+" is running asynchronously. If this was intended, add the async option to the ccall/cwrap call."),Asyncify.whenDone().then(onDone)):(ret=onDone(ret),asyncMode?Promise.resolve(ret):ret)};FS.createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent,dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.(),dontCreateFile||((parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)})(parent,name,byteArray,canRead,canWrite,canOwn),onload?.(),removeRunDependency(dep)}((byteArray,fullname,finish,onerror)=>{"undefined"!=typeof Browser&&Browser.init();var handled=!1;return preloadPlugins.forEach((plugin=>{handled||plugin.canHandle(fullname)&&(plugin.handle(byteArray,fullname,finish,onerror),handled=!0)})),handled})(byteArray,fullname,finish,(()=>{onerror?.(),removeRunDependency(dep)}))||finish(byteArray)}addRunDependency(dep),"string"==typeof url?((url,onload,onerror,noRunDep)=>{var dep=noRunDep?"":getUniqueRunDependency(`al ${url}`);readAsync(url).then((arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`),onload(new Uint8Array(arrayBuffer)),dep&&removeRunDependency(dep)}),(err=>{if(!onerror)throw`Loading data file "${url}" failed.`;onerror()})),dep&&addRunDependency(dep)})(url,processData,onerror):processData(url)},FS.staticInit(),void 0===globalThis.crypto&&(globalThis.crypto=require("crypto"));var calledRun,MP_JS_EPOCH=Date.now(),wasmImports={__syscall_chdir:function(path){try{return path=SYSCALLS.getStr(path),FS.chdir(path),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_fstat64:function(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_getcwd:function(buf,size){try{if(0===size)return-28;var cwd=FS.cwd(),cwdLengthInBytes=lengthBytesUTF8(cwd)+1;return size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1],tempI64=[280*(idx+1)>>>0,(tempDouble=280*(idx+1),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>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]=type,stringToUTF8(name,dirp+pos+19,256),pos+=280,idx+=1}return FS.llseek(stream,280*idx,0),pos}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_lstat64:function(path,buf){try{return path=SYSCALLS.getStr(path),SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_mkdirat:function(dirfd,path,mode){try{return path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path),"/"===(path=PATH.normalize(path))[path.length-1]&&(path=path.substr(0,path.length-1)),FS.mkdir(path,mode,0),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_newfstatat:function(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=256&flags,allowEmpty=4096&flags;return assert(!(flags&=-6401),`unknown flags in __syscall_newfstatat: ${flags}`),path=SYSCALLS.calculateAt(dirfd,path,allowEmpty),SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_openat:function(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?function(){assert(null!=SYSCALLS.varargs);var ret=HEAP32[+SYSCALLS.varargs>>2];return SYSCALLS.varargs+=4,ret}():0;return FS.open(path,flags,mode).fd}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_poll:function(fds,nfds,timeout){try{for(var nonzero=0,i=0;i>2],events=HEAP16[pollfd+4>>1],mask=32,stream=FS.getStream(fd);stream&&(mask=SYSCALLS.DEFAULT_POLLMASK,stream.stream_ops.poll&&(mask=stream.stream_ops.poll(stream,-1))),(mask&=24|events)&&nonzero++,HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_renameat:function(olddirfd,oldpath,newdirfd,newpath){try{return oldpath=SYSCALLS.getStr(oldpath),newpath=SYSCALLS.getStr(newpath),oldpath=SYSCALLS.calculateAt(olddirfd,oldpath),newpath=SYSCALLS.calculateAt(newdirfd,newpath),FS.rename(oldpath,newpath),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_rmdir:function(path){try{return path=SYSCALLS.getStr(path),FS.rmdir(path),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_stat64:function(path,buf){try{return path=SYSCALLS.getStr(path),SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_statfs64:function(path,size,buf){try{return path=SYSCALLS.getStr(path),assert(64===size),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,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},__syscall_unlinkat:function(dirfd,path,flags){try{return path=SYSCALLS.getStr(path),path=SYSCALLS.calculateAt(dirfd,path),0===flags?FS.unlink(path):512===flags?FS.rmdir(path):abort("Invalid flags passed to unlinkat"),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return-e.errno}},_emscripten_memcpy_js:(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num),_emscripten_throw_longjmp:()=>{throw 1/0},call0:function(f_ref,out){proxy_convert_js_to_mp_obj_jsside((0,proxy_js_ref[f_ref])(),out)},call0_kwarg:function(f_ref,n_kw,key,value,out){const f=proxy_js_ref[f_ref],a={};for(let i=0;i{HEAPU8.length,(requestedSize=>{abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`)})(requestedSize>>>=0)},emscripten_scan_registers:_emscripten_scan_registers,fd_close:function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return FS.close(stream),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_read:function(fd,iov,iovcnt,pnum){try{var num=((stream,iov,iovcnt,offset)=>{for(var ret=0,i=0;i>2],len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;if(ret+=curr,curr>2]=num,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_seek:function(fd,offset_low,offset_high,whence,newOffset){var lo,hi,offset=(hi=offset_high,assert((lo=offset_low)==lo>>>0||lo==(0|lo)),assert(hi===(0|hi)),hi+2097152>>>0<4194305-!!lo?(lo>>>0)+4294967296*hi:NaN);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);return FS.llseek(stream,offset,whence),tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1],stream.getdents&&0===offset&&0===whence&&(stream.getdents=null),0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},fd_sync:_fd_sync,fd_write:function(fd,iov,iovcnt,pnum){try{var num=((stream,iov,iovcnt,offset)=>{for(var ret=0,i=0;i>2],len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr,void 0!==offset&&(offset+=curr)}return ret})(SYSCALLS.getStreamFromFD(fd),iov,iovcnt);return HEAPU32[pnum>>2]=num,0}catch(e){if(void 0===FS||"ErrnoError"!==e.name)throw e;return e.errno}},has_attr:function(jsref,str){const base=proxy_js_ref[jsref];return UTF8ToString(str)in base},invoke_i:function(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_ii:function(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iii:function(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiii:function(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiiii:function(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_iiiiii:function(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiiii(index,a1,a2,a3,a4,a5)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_v:function(index){var sp=stackSave();try{dynCall_v(index)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_vi:function(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_vii:function(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_viii:function(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},invoke_viiii:function(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){if(stackRestore(sp),e!==e+0)throw e;_setThrew(1,0)}},js_check_existing:function(c_ref){return function(c_ref){const existing_obj=globalThis.proxy_js_map.get(c_ref)?.deref();if(void 0===existing_obj)return-1;for(let i=0;i=target.length))throw new PythonError("IndexError","index out of range");return index}(target,proxy_convert_mp_to_js_obj_jsside(index_ref));proxy_convert_js_to_mp_obj_jsside(target[index],out)},js_subscr_store:function(f_ref,idx,value){proxy_js_ref[f_ref][proxy_convert_mp_to_js_obj_jsside(idx)]=proxy_convert_mp_to_js_obj_jsside(value)},js_then_continue:function(jsref,py_resume,resolve,reject,out){const py_resume_js=proxy_convert_mp_to_js_obj_jsside(py_resume),resolve_js=proxy_convert_mp_to_js_obj_jsside(resolve),reject_js=proxy_convert_mp_to_js_obj_jsside(reject);proxy_convert_js_to_mp_obj_jsside(proxy_js_ref[jsref].then((result=>{py_resume_js(result,null,resolve_js,reject_js)}),(reason=>{py_resume_js(null,reason,resolve_js,reject_js)})),out)},js_then_reject:function(ret_value,reject){let ret_value_js;try{ret_value_js=proxy_convert_mp_to_js_obj_jsside(ret_value)}catch(error){ret_value_js=error}proxy_convert_mp_to_js_obj_jsside(reject)(ret_value_js)},js_then_resolve:function(ret_value,resolve){const ret_value_js=proxy_convert_mp_to_js_obj_jsside(ret_value);proxy_convert_mp_to_js_obj_jsside(resolve)(ret_value_js)},lookup_attr:function(jsref,str,out){const base=proxy_js_ref[jsref],attr=UTF8ToString(str);let value=base[attr];return(void 0!==value||attr in base)&&("function"==typeof value&&base!==globalThis&&("_ref"in value||(value=value.bind(base))),proxy_convert_js_to_mp_obj_jsside(value,out),!0)},mp_js_hook:()=>{if(ENVIRONMENT_IS_NODE){const mp_interrupt_char=Module.ccall("mp_hal_get_interrupt_char","number",["number"],["null"]),fs=require("fs"),buf=Buffer.alloc(1);try{fs.readSync(process.stdin.fd,buf,0,1)>0&&(buf[0]===mp_interrupt_char?Module.ccall("mp_sched_keyboard_interrupt","null",["null"],["null"]):process.stdout.write(String.fromCharCode(buf[0])))}catch(e){if("EAGAIN"!==e.code)throw e}}},mp_js_random_u32:()=>globalThis.crypto.getRandomValues(new Uint32Array(1))[0],mp_js_ticks_ms:()=>Date.now()-MP_JS_EPOCH,mp_js_time_ms:()=>Date.now(),proxy_convert_mp_to_js_then_js_to_js_then_js_to_mp_obj_jsside:function(out){const ret=proxy_convert_mp_to_js_obj_jsside(out);proxy_convert_js_to_mp_obj_jsside(PyProxy.toJs(ret),out)},proxy_convert_mp_to_js_then_js_to_mp_obj_jsside:function(out){proxy_convert_js_to_mp_obj_jsside_force_double_proxy(proxy_convert_mp_to_js_obj_jsside(out),out)},proxy_js_free_obj:function(js_ref){js_ref>=PROXY_JS_REF_NUM_STATIC&&(proxy_js_ref[js_ref]=void 0,js_refWebAssembly.instantiateStreaming(response,imports).then(callback,(function(reason){return err(`wasm streaming compile failed: ${reason}`),err("falling back to ArrayBuffer instantiation"),instantiateArrayBuffer(binaryFile,imports,callback)}))))).catch(readyPromiseReject),{}}(),_malloc=(createExportWrapper("__wasm_call_ctors",0),Module._mp_sched_keyboard_interrupt=createExportWrapper("mp_sched_keyboard_interrupt",0),Module._mp_js_init=createExportWrapper("mp_js_init",2),Module._malloc=createExportWrapper("malloc",1)),_free=(Module._mp_js_register_js_module=createExportWrapper("mp_js_register_js_module",2),Module._mp_js_do_import=createExportWrapper("mp_js_do_import",2),Module._proxy_convert_mp_to_js_obj_cside=createExportWrapper("proxy_convert_mp_to_js_obj_cside",2),Module._mp_js_do_exec=createExportWrapper("mp_js_do_exec",3),Module._mp_js_do_exec_async=createExportWrapper("mp_js_do_exec_async",3),Module._mp_js_repl_init=createExportWrapper("mp_js_repl_init",0),Module._mp_js_repl_process_char=createExportWrapper("mp_js_repl_process_char",1),Module._mp_hal_get_interrupt_char=createExportWrapper("mp_hal_get_interrupt_char",0),Module._proxy_c_init=createExportWrapper("proxy_c_init",0),Module._proxy_c_free_obj=createExportWrapper("proxy_c_free_obj",1),Module._free=createExportWrapper("free",1)),_emscripten_stack_get_current=(Module._proxy_c_to_js_call=createExportWrapper("proxy_c_to_js_call",4),Module._proxy_c_to_js_dir=createExportWrapper("proxy_c_to_js_dir",2),Module._proxy_c_to_js_has_attr=createExportWrapper("proxy_c_to_js_has_attr",2),Module._proxy_c_to_js_lookup_attr=createExportWrapper("proxy_c_to_js_lookup_attr",3),Module._proxy_c_to_js_store_attr=createExportWrapper("proxy_c_to_js_store_attr",3),Module._proxy_c_to_js_delete_attr=createExportWrapper("proxy_c_to_js_delete_attr",2),Module._proxy_c_to_js_get_type=createExportWrapper("proxy_c_to_js_get_type",1),Module._proxy_c_to_js_get_array=createExportWrapper("proxy_c_to_js_get_array",2),Module._proxy_c_to_js_get_dict=createExportWrapper("proxy_c_to_js_get_dict",2),Module._proxy_c_to_js_get_iter=createExportWrapper("proxy_c_to_js_get_iter",1),Module._proxy_c_to_js_iternext=createExportWrapper("proxy_c_to_js_iternext",2),Module._proxy_c_to_js_resume=createExportWrapper("proxy_c_to_js_resume",2),()=>(_emscripten_stack_get_current=wasmExports.emscripten_stack_get_current)()),_fflush=createExportWrapper("fflush",1),_strerror=createExportWrapper("strerror",1),_setThrew=createExportWrapper("setThrew",2),_emscripten_stack_init=()=>(_emscripten_stack_init=wasmExports.emscripten_stack_init)(),_emscripten_stack_get_end=()=>(_emscripten_stack_get_end=wasmExports.emscripten_stack_get_end)(),__emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports._emscripten_stack_restore)(a0),__emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports._emscripten_stack_alloc)(a0),dynCall_viii=Module.dynCall_viii=createExportWrapper("dynCall_viii",4),dynCall_vi=Module.dynCall_vi=createExportWrapper("dynCall_vi",2),dynCall_ii=Module.dynCall_ii=createExportWrapper("dynCall_ii",2),dynCall_vii=Module.dynCall_vii=createExportWrapper("dynCall_vii",3),dynCall_iii=Module.dynCall_iii=createExportWrapper("dynCall_iii",3),dynCall_viiii=Module.dynCall_viiii=createExportWrapper("dynCall_viiii",5),dynCall_iiii=Module.dynCall_iiii=createExportWrapper("dynCall_iiii",4),dynCall_iiiii=Module.dynCall_iiiii=createExportWrapper("dynCall_iiiii",5),dynCall_v=Module.dynCall_v=createExportWrapper("dynCall_v",1),dynCall_i=Module.dynCall_i=createExportWrapper("dynCall_i",1),dynCall_iiiiii=(Module.dynCall_dd=createExportWrapper("dynCall_dd",2),Module.dynCall_ddd=createExportWrapper("dynCall_ddd",3),Module.dynCall_viiiiii=createExportWrapper("dynCall_viiiiii",7),Module.dynCall_iiiiii=createExportWrapper("dynCall_iiiiii",6)),_asyncify_start_unwind=(Module.dynCall_iidiiii=createExportWrapper("dynCall_iidiiii",7),createExportWrapper("asyncify_start_unwind",1)),_asyncify_stop_unwind=createExportWrapper("asyncify_stop_unwind",0),_asyncify_start_rewind=createExportWrapper("asyncify_start_rewind",1),_asyncify_stop_rewind=createExportWrapper("asyncify_stop_rewind",0);function stackCheckInit(){var max;_emscripten_stack_init(),assert(!(3&(max=_emscripten_stack_get_end()))),0==max&&(max+=4),HEAPU32[max>>2]=34821223,HEAPU32[max+4>>2]=2310721022,HEAPU32[0]=1668509029}function run(){function doRun(){calledRun||(calledRun=!0,Module.calledRun=!0,ABORT||(assert(!runtimeInitialized),runtimeInitialized=!0,checkStackCookie(),Module.noFSInit||FS.init.initialized||FS.init(),FS.ignorePermissions=!1,TTY.init(),callRuntimeCallbacks(__ATINIT__),readyPromiseResolve(Module),Module.onRuntimeInitialized?.(),assert(!Module._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),function(){if(checkStackCookie(),Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)cb=Module.postRun.shift(),__ATPOSTRUN__.unshift(cb);var cb;callRuntimeCallbacks(__ATPOSTRUN__)}()))}runDependencies>0||(stackCheckInit(),function(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)cb=Module.preRun.shift(),__ATPRERUN__.unshift(cb);var cb;callRuntimeCallbacks(__ATPRERUN__)}(),runDependencies>0||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),doRun()}),1)):doRun(),checkStackCookie()))}if(Module.ccall=ccall,Module.cwrap=(ident,returnType,argTypes,opts)=>(...args)=>ccall(ident,returnType,argTypes,args,opts),Module.setValue=function(ptr,value,type="i8"){switch(type.endsWith("*")&&(type="*"),type){case"i1":case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}},Module.getValue=getValue,Module.PATH=PATH,Module.PATH_FS=PATH_FS,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8,Module.FS=FS,["writeI53ToI64","writeI53ToI64Clamped","writeI53ToI64Signaling","writeI53ToU64Clamped","writeI53ToU64Signaling","readI53FromI64","readI53FromU64","convertI32PairToI53","convertU32PairToI53","getTempRet0","setTempRet0","growMemory","isLeapYear","ydayFromDate","arraySum","addDays","inetPton4","inetNtop4","inetPton6","inetNtop6","readSockaddr","writeSockaddr","emscriptenLog","readEmAsmArgs","jstoi_q","getExecutableName","listenOnce","autoResumeAudioContext","dynCallLegacy","getDynCaller","dynCall","asmjsMangle","HandleAllocator","getNativeTypeSize","STACK_SIZE","STACK_ALIGN","POINTER_SIZE","ASSERTIONS","uleb128Encode","generateFuncType","convertJsFunctionToWasm","getEmptyTableSlot","updateTableMap","getFunctionAddress","addFunction","removeFunction","reallyNegative","unSign","strLen","reSign","formatString","intArrayToString","AsciiToString","stringToAscii","UTF16ToString","stringToUTF16","lengthBytesUTF16","UTF32ToString","stringToUTF32","lengthBytesUTF32","stringToNewUTF8","registerKeyEventCallback","maybeCStringToJsString","findEventTarget","getBoundingClientRect","fillMouseEventData","registerMouseEventCallback","registerWheelEventCallback","registerUiEventCallback","registerFocusEventCallback","fillDeviceOrientationEventData","registerDeviceOrientationEventCallback","fillDeviceMotionEventData","registerDeviceMotionEventCallback","screenOrientation","fillOrientationChangeEventData","registerOrientationChangeEventCallback","fillFullscreenChangeEventData","registerFullscreenChangeEventCallback","JSEvents_requestFullscreen","JSEvents_resizeCanvasForFullscreen","registerRestoreOldStyle","hideEverythingExceptGivenElement","restoreHiddenElements","setLetterbox","softFullscreenResizeWebGLRenderTarget","doRequestFullscreen","fillPointerlockChangeEventData","registerPointerlockChangeEventCallback","registerPointerlockErrorEventCallback","requestPointerLock","fillVisibilityChangeEventData","registerVisibilityChangeEventCallback","registerTouchEventCallback","fillGamepadEventData","registerGamepadEventCallback","registerBeforeUnloadEventCallback","fillBatteryEventData","battery","registerBatteryEventCallback","setCanvasElementSize","getCanvasElementSize","jsStackTrace","getCallstack","convertPCtoSourceLocation","getEnvStrings","checkWasiClock","wasiRightsToMuslOFlags","wasiOFlagsToMuslOFlags","createDyncallWrapper","setImmediateWrapped","clearImmediateWrapped","polyfillSetImmediate","getPromise","makePromise","idsToPromises","makePromiseCallback","ExceptionInfo","findMatchingCatch","Browser_asyncPrepareDataCounter","setMainLoop","getSocketFromFD","getSocketAddress","FS_unlink","FS_mkdirTree","_setNetworkCallback","heapObjectForWebGLType","toTypedArrayIndex","webgl_enable_ANGLE_instanced_arrays","webgl_enable_OES_vertex_array_object","webgl_enable_WEBGL_draw_buffers","webgl_enable_WEBGL_multi_draw","emscriptenWebGLGet","computeUnpackAlignedImageSize","colorChannelsInGlTextureFormat","emscriptenWebGLGetTexPixelData","emscriptenWebGLGetUniform","webglGetUniformLocation","webglPrepareUniformLocationsBeforeFirstUse","webglGetLeftBracePos","emscriptenWebGLGetVertexAttrib","__glGetActiveAttribOrUniform","writeGLArray","registerWebGlEventCallback","ALLOC_NORMAL","ALLOC_STACK","allocate","writeStringToMemory","writeAsciiToMemory","setErrNo","demangle","stackTrace"].forEach((function(sym){"undefined"==typeof globalThis||Object.getOwnPropertyDescriptor(globalThis,sym)||Object.defineProperty(globalThis,sym,{configurable:!0,get(){var msg=`\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`,librarySymbol=sym;librarySymbol.startsWith("_")||(librarySymbol="$"+sym),msg+=` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`,isExportedByForceFilesystem(sym)&&(msg+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"),warnOnce(msg)}}),unexportedRuntimeSymbol(sym)})),["run","addOnPreRun","addOnInit","addOnPreMain","addOnExit","addOnPostRun","addRunDependency","removeRunDependency","out","err","callMain","abort","wasmMemory","wasmExports","writeStackCookie","checkStackCookie","convertI32PairToI53Checked","stackSave","stackRestore","stackAlloc","ptrToString","zeroMemory","exitJS","getHeapMax","abortOnCannotGrowMemory","ENV","MONTH_DAYS_REGULAR","MONTH_DAYS_LEAP","MONTH_DAYS_REGULAR_CUMULATIVE","MONTH_DAYS_LEAP_CUMULATIVE","ERRNO_CODES","strError","DNS","Protocols","Sockets","initRandomFill","randomFill","timers","warnOnce","readEmAsmArgsArray","jstoi_s","handleException","keepRuntimeAlive","runtimeKeepalivePush","runtimeKeepalivePop","callUserCallback","maybeExit","asyncLoad","alignMemory","mmapAlloc","wasmTable","noExitRuntime","getCFunc","sigToWasmTypes","freeTableIndexes","functionsInTableMap","UTF8Decoder","UTF8ArrayToString","stringToUTF8Array","intArrayFromString","UTF16Decoder","stringToUTF8OnStack","writeArrayToMemory","JSEvents","specialHTMLTargets","findCanvasEventTarget","currentFullscreenStrategy","restoreOldWindowedStyle","UNWIND_CACHE","ExitStatus","doReadv","doWritev","safeSetTimeout","promiseMap","uncaughtExceptionCount","exceptionLast","exceptionCaught","Browser","getPreloadedImageData__data","wget","SYSCALLS","preloadPlugins","FS_createPreloadedFile","FS_modeStringToFlags","FS_getMode","FS_stdin_getChar_buffer","FS_stdin_getChar","FS_createPath","FS_createDevice","FS_readFile","FS_createDataFile","FS_createLazyFile","MEMFS","TTY","PIPEFS","SOCKFS","tempFixedLengthArray","miniTempWebGLFloatBuffers","miniTempWebGLIntBuffers","GL","AL","GLUT","EGL","GLEW","IDBStore","runAndAbortIfError","Asyncify","Fibers","SDL","SDL_gfx","allocateUTF8","allocateUTF8OnStack","print","printErr"].forEach(unexportedRuntimeSymbol),dependenciesFulfilled=function runCaller(){calledRun||run(),calledRun||(dependenciesFulfilled=runCaller)},Module.preInit)for("function"==typeof Module.preInit&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();run(),moduleRtn=readyPromise;for(const prop of Object.keys(Module))prop in moduleArg||Object.defineProperty(moduleArg,prop,{configurable:!0,get(){abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`)}});return moduleRtn});export default _createMicroPythonModule;export async function loadMicroPython(options){const{pystack:pystack,heapsize:heapsize,url:url,stdin:stdin,stdout:stdout,stderr:stderr,linebuffer:linebuffer}=Object.assign({pystack:2048,heapsize:1048576,linebuffer:!0},options);let Module={locateFile:(path,scriptDirectory)=>url||scriptDirectory+path};Module._textDecoder=new TextDecoder,void 0!==stdin&&(Module.stdin=stdin),void 0!==stdout&&(linebuffer?(Module._stdoutBuffer=[],Module.stdout=c=>{10===c?(stdout(Module._textDecoder.decode(new Uint8Array(Module._stdoutBuffer))),Module._stdoutBuffer=[]):Module._stdoutBuffer.push(c)}):Module.stdout=c=>stdout(new Uint8Array([c]))),void 0!==stderr&&(linebuffer?(Module._stderrBuffer=[],Module.stderr=c=>{10===c?(stderr(Module._textDecoder.decode(new Uint8Array(Module._stderrBuffer))),Module._stderrBuffer=[]):Module._stderrBuffer.push(c)}):Module.stderr=c=>stderr(new Uint8Array([c]))),Module=await _createMicroPythonModule(Module),globalThis.Module=Module,proxy_js_init();const pyimport=name=>{const value=Module._malloc(12);return Module.ccall("mp_js_do_import","null",["string","pointer"],[name,value]),proxy_convert_mp_to_js_obj_jsside_with_free(value)};return Module.ccall("mp_js_init","null",["number","number"],[pystack,heapsize]),Module.ccall("proxy_c_init","null",[],[]),{_module:Module,PyProxy:PyProxy,FS:Module.FS,globals:{__dict__:pyimport("__main__").__dict__,get(key){return this.__dict__[key]},set(key,value){this.__dict__[key]=value},delete(key){delete this.__dict__[key]}},registerJsModule(name,module){const value=Module._malloc(12);proxy_convert_js_to_mp_obj_jsside(module,value),Module.ccall("mp_js_register_js_module","null",["string","pointer"],[name,value]),Module._free(value)},pyimport:pyimport,runPython(code){const len=Module.lengthBytesUTF8(code),buf=Module._malloc(len+1);Module.stringToUTF8(code,buf,len+1);const value=Module._malloc(12);return Module.ccall("mp_js_do_exec","number",["pointer","number","pointer"],[buf,len,value]),Module._free(buf),proxy_convert_mp_to_js_obj_jsside_with_free(value)},runPythonAsync(code){const len=Module.lengthBytesUTF8(code),buf=Module._malloc(len+1);Module.stringToUTF8(code,buf,len+1);const value=Module._malloc(12);Module.ccall("mp_js_do_exec_async","number",["pointer","number","pointer"],[buf,len,value]),Module._free(buf);const ret=proxy_convert_mp_to_js_obj_jsside_with_free(value);return ret instanceof PyProxyThenable?Promise.resolve(ret):ret},replInit(){Module.ccall("mp_js_repl_init","null",["null"])},replProcessChar:chr=>Module.ccall("mp_js_repl_process_char","number",["number"],[chr]),replProcessCharWithAsyncify:async chr=>Module.ccall("mp_js_repl_process_char","number",["number"],[chr],{async:!0})}}if(globalThis.loadMicroPython=loadMicroPython,"object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node&&process.argv.length>1){const path=await import("path"),url=await import("url"),pathToThisFile=path.resolve(url.fileURLToPath(import.meta.url)),pathPassedToNode=path.resolve(process.argv[1]);pathToThisFile.includes(pathPassedToNode)&&async function(){const fs=await import("fs");let heap_size=131072,contents="",repl=!0;for(let i=2;iprocess.stdout.write(data),linebuffer:!1});if(repl)mp.replInit(),process.stdin.setRawMode(!0),process.stdin.on("data",(data=>{for(let i=0;i{result&&process.exit()}))}));else{if(contents.endsWith("asyncio.run(main())\n")){const asyncio=mp.pyimport("asyncio");asyncio.run=async task=>{await asyncio.create_task(task)}}try{mp.runPython(contents)}catch(error){if("PythonError"!==error.name)throw error;"SystemExit"===error.type||console.error(error.message)}}}()}class PyProxy{constructor(ref){this._ref=ref}static toJs(js_obj){if(!(js_obj instanceof PyProxy))return js_obj;const type=Module.ccall("proxy_c_to_js_get_type","number",["number"],[js_obj._ref]);if(1===type||2===type){const array_ref=Module._malloc(8),item=Module._malloc(12);Module.ccall("proxy_c_to_js_get_array","null",["number","pointer"],[js_obj._ref,array_ref]);const len=Module.getValue(array_ref,"i32"),items_ptr=Module.getValue(array_ref+4,"i32"),js_array=[];for(let i=0;i8){Module.ccall("proxy_convert_mp_to_js_obj_cside","null",["pointer","pointer"],[mp_key,item]);const js_key=proxy_convert_mp_to_js_obj_jsside(item),mp_value=Module.getValue(table_ptr+8*i+4,"i32");Module.ccall("proxy_convert_mp_to_js_obj_cside","null",["pointer","pointer"],[mp_value,item]);const js_value=proxy_convert_mp_to_js_obj_jsside(item);js_dict[js_key]=PyProxy.toJs(js_value)}}return Module._free(map_ref),Module._free(item),js_dict}return js_obj}}const py_proxy_handler={isExtensible:()=>!0,ownKeys(target){const value=Module._malloc(12);Module.ccall("proxy_c_to_js_dir","null",["number","pointer"],[target._ref,value]);const dir=proxy_convert_mp_to_js_obj_jsside_with_free(value);return PyProxy.toJs(dir).filter((attr=>!attr.startsWith("__")))},getOwnPropertyDescriptor:(target,prop)=>({value:target[prop],enumerable:!0,writable:!0,configurable:!0}),has:(target,prop)=>Module.ccall("proxy_c_to_js_has_attr","number",["number","string"],[target._ref,prop]),get(target,prop){if("_ref"===prop)return target._ref;if("then"===prop)return null;if(prop===Symbol.iterator){const iter_ref=Module.ccall("proxy_c_to_js_get_iter","number",["number"],[target._ref]);return function*(){const value=Module._malloc(12);for(;;){if(!Module.ccall("proxy_c_to_js_iternext","number",["number","pointer"],[iter_ref,value]))break;yield proxy_convert_mp_to_js_obj_jsside(value)}Module._free(value)}}const value=Module._malloc(12);return Module.ccall("proxy_c_to_js_lookup_attr","null",["number","string","pointer"],[target._ref,prop,value]),proxy_convert_mp_to_js_obj_jsside_with_free(value)},set(target,prop,value){const value_conv=Module._malloc(12);proxy_convert_js_to_mp_obj_jsside(value,value_conv);const ret=Module.ccall("proxy_c_to_js_store_attr","number",["number","string","number"],[target._ref,prop,value_conv]);return Module._free(value_conv),ret},deleteProperty:(target,prop)=>Module.ccall("proxy_c_to_js_delete_attr","number",["number","string"],[target._ref,prop])};class PyProxyThenable{constructor(ref){this._ref=ref}then(resolve,reject){const values=Module._malloc(36);return proxy_convert_js_to_mp_obj_jsside(resolve,values+12),proxy_convert_js_to_mp_obj_jsside(reject,values+24),Module.ccall("proxy_c_to_js_resume","null",["number","pointer"],[this._ref,values],{async:!0}),proxy_convert_mp_to_js_obj_jsside_with_free(values)}}const PROXY_JS_REF_NUM_STATIC=2,PROXY_KIND_MP_EXCEPTION=-1,PROXY_KIND_MP_NULL=0,PROXY_KIND_MP_NONE=1,PROXY_KIND_MP_BOOL=2,PROXY_KIND_MP_INT=3,PROXY_KIND_MP_FLOAT=4,PROXY_KIND_MP_STR=5,PROXY_KIND_MP_CALLABLE=6,PROXY_KIND_MP_GENERATOR=7,PROXY_KIND_MP_JSPROXY=9,PROXY_KIND_MP_EXISTING=10,PROXY_KIND_JS_UNDEFINED=0,PROXY_KIND_JS_NULL=1,PROXY_KIND_JS_BOOLEAN=2,PROXY_KIND_JS_INTEGER=3,PROXY_KIND_JS_DOUBLE=4,PROXY_KIND_JS_STRING=5,PROXY_KIND_JS_OBJECT=6,PROXY_KIND_JS_PYPROXY=7;class PythonError extends Error{constructor(exc_type,exc_details){super(exc_details),this.name="PythonError",this.type=exc_type}}function proxy_js_init(){globalThis.proxy_js_ref=[globalThis,void 0],globalThis.proxy_js_ref_next=PROXY_JS_REF_NUM_STATIC,globalThis.proxy_js_map=new Map,globalThis.proxy_js_existing=[void 0],globalThis.pyProxyFinalizationRegistry=new FinalizationRegistry((cRef=>{globalThis.proxy_js_map.delete(cRef),Module.ccall("proxy_c_free_obj","null",["number"],[cRef])}))}function proxy_js_add_obj(js_obj){for(;proxy_js_ref_nextfunction(target,argumentsList){let args=0;for(;argumentsList.length>0&&void 0===argumentsList[argumentsList.length-1];)argumentsList.pop();if(argumentsList.length>0){args=Module._malloc(3*argumentsList.length*4);for(const i in argumentsList)proxy_convert_js_to_mp_obj_jsside(argumentsList[i],args+3*i*4)}const value=Module._malloc(12);Module.ccall("proxy_c_to_js_call","null",["number","number","number","pointer"],[target,argumentsList.length,args,value],{async:!0}),argumentsList.length>0&&Module._free(args);const ret=proxy_convert_mp_to_js_obj_jsside_with_free(value);return ret instanceof PyProxyThenable?Promise.resolve(ret):ret}(id,args),obj._ref=id;else if(kind===PROXY_KIND_MP_GENERATOR)obj=new PyProxyThenable(id);else{const target=new PyProxy(id);obj=new Proxy(target,py_proxy_handler)}globalThis.pyProxyFinalizationRegistry.register(obj,id),globalThis.proxy_js_map.set(id,new WeakRef(obj))}return obj}function proxy_convert_mp_to_js_obj_jsside_with_free(value){const ret=proxy_convert_mp_to_js_obj_jsside(value);return Module._free(value),ret} \ No newline at end of file diff --git a/assets/blog/micropython/micropython.wasm b/assets/blog/micropython/micropython.wasm index 1c0e21c372ee68c9dd078640b8736ef54a925a8c..7bc3793557299fd65d51c6e82f103ce0ee40daa8 100755 GIT binary patch delta 118298 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 delta 55965 zcmaexXLuAh(_U@4z1`cj!3}IMTGLF25Fmu+gP7hElF(b|goK_3*kA}9gAJku44B?* z3@8)>rV|Lg8q-S%p(UXO2z(>$+CK8~JRd)hPCJ?zjYiUFG?G_M>@au1XQ>-JqsF80 zNI56qQGz!%R?;Ey^Zn1yn|eK5ALZxWeuF1jH+i!7Hcxi{#*?FWc{2T;o!sY1)&rhA zc*K*Wzj^ZP2~U>%!;>Q~!#`oTFTLVF7rf@l!q`Hr@K792?vCb3${3!!iRa0$<9Kp% zJWq~I=83~-%G5&XV~uZ&&X9>hg{mSy?C0fqPgRs6uq^hgiV8tH3kt%hq7fGVY=b}z z_Dzox5c?w9rPxB)4+~Y11PKC+tT?elcsG%ync=}ay%7Gd!s%dgIZZ5(__$D6US70t zJ)ZU{oW;}n5j{g06Yi?Wg9S^&8W6Q~hBJLn#2!}+`v_b-N2~}7-meEn0@3lD84R3w zM-A@l6^D2yO9LW-saG}}0!U>@zp5yn1126WQF#>9_X;(H*)qfA^{XKSuuNUQYG^VC zsv8UczOIJm%l{*b3IHqgg&ObtGKzo6?;}43@7F+25Cx4%&h7OBx!Po_0{)y_5~s_4 zqB)w&r3&-(bt#Ldk)=!L66Af8*tT>9{$*0>JXZLZ^ed%3PmBh6+PI38wQ;p7`-0U=w}IbW;Oc+aERHik054;bnwo zj8AORWD2@)BR#8$gZJxZ)lkB@#FfqL!E&)#S6;nN^QUO(rNnA2Y%GIX^gzE|PrT6L zL;f|SWmBH^XjvM~-jg`JWkHm>E^$rEg8gC_$PKK|@#i4By?&PDfi6DkEw;qI|)i8{Sq0tP%cY$ipWLI{;U)y{+W`_$9W?C*p|`nAD33=FPFW) zSOLkTRZUN%hwC-g`8q{j4VUYXU0W0>aq=hMGG$?d_$F6m@A$iNVn~~gOnB+T+O!e5 z6pwyh)}D~=305GmAA|#OP+v#2^0)ogo+EDxRs>hJ*=?h%=VJ9px*+I9BfNg~rD*m! z3f&Pb3$R3D3rF^~it?rvtqR4wcD{C{IMG_|iUhJo{INj_7$*V(fgwPNaqUAA$F}Rt zVSa1ZmZ$aFf6mhd?ThntfBTCpO;71i%vR3B9aG#;fX9I>%aT^BwMvQ6N3_KBPQy8T zxz6@<*t7FOUQg{3Zr5AbH8Qbb*Mb~~<;Qgmaq=~Ida3Kz_Gl{`DaWwk#0A)?TY|_0 z`DeG((!9lGEf;oK0@w&DR%0wTb{p&m7z_-)zNKT`5J=i_B{1=F_e5p;c-cGYR^sq4 zzEk0I1FHlsK^|4tL(>C#^mn28%hN~puPj1JQkzL7)3d(1nh!l1pSV3P0v#Wpo*j2U zK?!TqmyW+Jv)@yuekif@(2V5)XyN9>K})6xKW|965r7gVB;MLsnkD%*)nG~UO_d-? zkK6S3XteJ#9rl6nkqiAjn{KZoOn0M%iKIm%p*L$c+1g0BgkE2ya~caV5=x##uQnGx zF6d5J3yncKM&wbFdoW$!TiA%yM_Xlo-J7t7_Uk9~aG~Rq$jL!MJrp~Igbo(GD0M1r zH(0nXvVz*fg^yW5;&7p~%nEk?U>5|95Oyo-&E+yI52weG%VUH{{Ai}!*IFpzg(6$+ zl0}>h<_1j8i$uIg^k&bbI9_O+AH`?V{)CN-7!V0@uhgp|=yEUhA=$1;kay&QgN=*}uy zE*Nz~EHgb6Ei;s@^LX`uOf{IcE{;MKbaOfFR|dT)g2t?-{hOerf|9 zkwhvkK^pDY8(l-_^m+=_EJ2x;$yu?==|Nbv`=f#=eLY>$A64K(gr4~lt(TNl zD{}$qf6s=<=aZS|=N2yV1*RQusFdL|IPwm$X?%5S?@zg&{dK3g;dv|=0WI7fV-u}{rXL|JSE8qQ|?Vr;r)TZyOk)DK0E>|DYgxhiVP zKC=zRM;tC`F_iHMob5v%b3ih0xyY9;a(1~mlo=Qd{(LUFufa-CSZ%CSMFrr8i~S&j zR)`<*S!Bx!(aSUct`KYTOwE;IC7$_ur8tXO9oR1lsZg0?fjsQ|g7h;aGu{sLF|~1Lit|)7eid1E zNK8Q6=hF{<5gSWdLW=C&w~Q@+WKmQ9Ad-AktdH(aBzKOArIouAx#BEJ6M{(DW8zkn zyqDZLCe~IMo#R(%+2f)|;XlT1r?tKu};oRz<9Q$9b`& zcpfrER+s~9fE?9wR2kO^60 z4^FmEme_(3#hl_LnfE@G6jgjBySmgb1|3wZxK z5gicl0YG$6zz2O0&Acvd<%n9}5F2o=vjv>(i-4@X;c$KU25`;Bb+emdDPHN@n_?B- zV-E!Uz_$|U$U^}?1bUAI{73+!+SU`AbyI96$uRR_fjr!(6roLi7yAhABS&D;@$=Vp z(yEaWNRQtYJ4iay@0HsnY{9s#v`h>p4@f+ zO9Z?GS_Xzeih#jul)8=Yx@wA=$?Tr{Ku&R9oX%RPjsUb^a>|CNM{Vt-@ zd&x+T)X8%mhUJs15-z|7a%O-ML|%EMuM}2HuF-*pv_=Tzq)lvc!v5Hwk*(-2h1%2m zAE~5SeyNp*P4$_VB;1Z+60%((bXR_<9kOeO;1H-SSfMzS)h-t-omLE14|7F2v=uxDVqKx6SaGQ^M*^e$T}VE_AH-PIarImz2QVGs6+m8Bh+_eMeqn|D;CoMwg(P~n+qO^dIfEyL1Z&`+Rt|WCu z=;y_BcV%Fijl>&Oq>|h)xVMr9RF%4j9LwqDbXaw1gR^XWO@x@Y073V5aYO0>PfE!3#gQWB@aXn8+v5f8$`BJ!WeV2)spUskxn2b6;`>E`$)p? zYEhEWP%5Ugf;&XQ?wsLcq=_nVH ztQJy;fR=9|&1-s!)6iDZ5?d!TT01&vV8im6RttPA73V!1{js!?_wc=sC3{UOj*I(1 z=1!EbcZvZCmCWsB(&-b)UX%8JB2_KTl;eNbBoJcmiUj2C#jHddsRO4uwvAN81)DVN z4NwSH-9Z%@2*Xqt*L@cg^>Doy>m&S8E)(=&8!293n?u%B-d%oubM3LJs3GEZRt08d z3E&N7Ampddq=Ho-Q=XNMVv8O8;2_{$^RxH&V9Pxg^cdUYZChci>K~s;g}On8)hOp@ zTYFKc*q|5=u7hebKQAodIRKH!D}lf99c(aj5lApVjKE*}p@WVUkUpPF$-$5T+~81= zVk{ZU4)+mlrO+DiiQAoE2(le8(%&|)SYz0h*x;P=UwmK8aeoa6ssRGVKQ~?c01GHb zjKwBdUZb4fGr?kW7&8IE0Sk_GD<7}Cqpei02vo*lj9>T~j>Ca@<`ndb1Fgaw2)C1Z zGQSHaY+;K5Fgu44;ywzpxSdp#`2jf(QLGYcX(=3qOAWG0H$(2`NnD~U;$|r>@IBLFT8U7LEt5cUjt>cvSGG` z^+cgXzmigr{L6kRU?CrNWK|I(jEIAzO=!nPvUQMDNIZBXj9eHbRZ<}1eR7=y43?Vm z!p?)G_uZ`U#4Rb{2eR;#RG4lVEXfj|pfZO`8`$=E=r>X+dv;p%ope{>jhz}N{UM@V zv+4I^r79ZBY?vn10DE{2d6)#VBBTK`rH3pPW=YS`k7wwMSyCB6i@gSO3d|AvMKUnI z8A#rIB-WrKW=p*V^xIAH+Z<^tdVP>AnJWzgcNqzvC$&YZZjxd1q_yyy7M~B(BOs;4 z7f8_vrS2lVlBJrgU}>^6hJPu&SXzJ>-Ct6q>A*hexKygknz3l9q%sJydYLqkRf$+G zjdn4Q!Qyq2KU7&u(^IAG0J4@0+yI+OFxitfNMj+T;px(4yKfInr*Ae&u;Jf6pWNCk zjb{e^S5&%Ze|cH>sjTM?tQL2{I;zf!7eyF_Y1v&;F?+R{bD02RrD^OQ zX&@KG-+QI^Y_2A(AZ7N0MZ%1$OWPz|hE<1ce-W~Lzf_DX+~1SwiT%<#e-qTmXpi_b_up+N3Bg@X?;VnlZK0bWzu`n=>)(A`6%{bf+e zao34(MQV*=PmnfOq;JsZ8|2s(=}+|hIN5zws)K&MOvP&;s({#e%npQA8>U%5@A0{` z-gPM-LXi3NrWC+3r1x#<6q-Mm)cQ?&9LW7pu)YInKeoh!GnRgIN9qXbS*fySMiTS*~5 zOWuW>C9H&lixJ$5-c?YLvYD0$k|`ge^lAZlqHV=~SxEj#KzHU5Z&f9dl#h`AMU&^# zaz*511trg?$BN5eAf~fbqU1%4{qs?B3i~~>l+1LPsHNpGES*wXUdqz<%K$&1+v#QG zIE0eYNY(Oke>8C}NhvQkMah@QU*+X?=vp>uUO|q8-*iv~*(tfonEIs7 z0`uUPRK=hbt3ks8*`{~R!nb_BBr^p}v$uA{?k^be1ox}z5Fk@j+W81j`9#*QnItWOe{J2h6LV{C)Xt~R0UW-1$NZM z^aC~m(77(Y5daF0yUF#@(aWS}ce$=Gj*jXsFBQ!d^v`5Q=Sau4}EL5L@(ddiI$ zM-jc`VoYB?>LursfHm@2KRJT2IJ}?S6QRdHkt<(9zroh0*#J3Pa!m#UEdmU*wAn@k z`6>ziOQ>(=CoSV-lTIEiD@bJ!g#waA;%$$D=(?fuL-21dAPc{d`!F=xx3b`386#FM zAfm^~wB#6hHB5Mm$mw{wBl`C^sXSJWVpTehl`k;W{$QNE8$G;4UyTEmV;>ezkf%dU z0yRt1&J*QWQ3I;pWwEw51m-m|KhlV#QB&n_g zI7PR}|FAS-tNbHNr~e`c(yd!T!_i+CXRUDuQ6)ouBCt>Y?vO`8N=NRLhqJLmpY4*% zyV#eK2SHol%c6tw0}cvUYPxehPGnJCIf6d^MgEw5q>YZqpL@`nGjz#$IlnE6pD)Tq zxDAkXQEtgI<+5ddXi3^-%N92QMrO-0>=jniv6tmfMc69QOV{MtNO=k#?ge6ErAI+z z+D-X=UVHydnI9CAhd1ReyrlIl`6AmoRk$tZY@JAl+j3p>&jy-&TOJHsg)hkwZ? z+nvn%TedgM%l?*|@VzcL#on$W!(xWm0uaNd|J;26Dg0QT06Pg1cSa6OyxLG9nUCdS z90hEN--Y5s{9%k$1J}qyk?)E8QxxpW>RZima|8T9Rtwz13v*q4t0it}Yab$<$B*&HG1e#elUxF{`cpXoB8?_-|06iAi_ihjVHCRAGPnau z$MLCynlEIR8@*XW!Rhfa`ha^xm~&8oH5nQXJ`LcAHC}*2SSVxb9|y8eru~>FfjK@F z%gPdwDPaS*^1Yicwv*S{6aVk|l?%)$+Z(7vN-T3HRGG@mH1bWDGLxnL;mUUQ;n#5G z7+;$gSW0=O|3@w5D>fkNL@EoJJx8w=RU%Zrtn6Dxq_RqB@U+s3WtICPC;4Kh&-DNK z9ajMo+f0^dmx@YxR-GhNQtGhugq_m-?&-BFptGZ#B6eR!sRHzf>C*S67ay_9OOXl+v7%&{?n_s7BHkOh6WF@eH!vUJ2`RId=;IEt&4PCCu4MqF_L1 zKm#_b8%$YA^h-IE?3<&slBaKBRty-yh3N-#nT)`48Zb{8$g0EEuC<%H3peKui+1ys z7swU6Nyd848Z~gCvRPKL*Gk?eTWGnZN@IyF0N<`uAb1THfF-M-5wKttUaeG>xrM%X zjf8vTTIeHFm9pGIe{zMSrYeniKIJNXld9|y(76=4cY{(4asTAC%@nMigRtr^C1wu| zlhnW5GQC8Vmk1>uB3WBOMSi|aVzw!5(eIaN@-}53(+kpThtdzlZlYX0LjaDF_Po-v-3kS^3DoEHQ{IoTaK#K5zDFl6+Y4Msjc% z^#c2s8yw&V4g--HJ>JQbh({C)ZM{rN98o?J#*uzUlrv1v>;9_z0k%!~qe@X`(|mkX zaid_M2y3purgCO4!4k|c3_K3nJ(fN-Bt zrWmX-v#%?bW`hLcK#1<(F-Hv9k$W&90FLMPl+HE)3n5|vMQ{-Y(D%L#FzdcD3kDD^ z|3EnnOXo%^JyHS%hP>dPN_2jOSur!F*+yf$=&B%adrM&su`i8CVr05&kWkt62>OkT z_(mN^rYWvID0v%sp}5YYlb6Y9muoPSL?hKscd!&hQQ7UP1J>j=Iz)3lk~ zFxvqzDZurK4523ETCi&zOZ$Yl7NNt3h$qz54!t-|dWX8!vhvUZt}oEkwPZvAS6#F! zg=Dfcbq0|Oy1Jq#<4Es%W2#QA72zs#;5Uh>> z1P{g$vxsX5Gg9M=xJHPu=b~a!S1C}(6|{VD*8*<%94+B$C$J4r=_uDg#D>#PrCn74 zBynW_LZtaa(M5i3;E5n#-;pI!?vb3ImM!D@+r{?NR%O>`%;f#9vTGqj9{#>-sfscZ z$nKi1(&+41`kCbv0s(%n7fnDrd|c<2okr)7E_l z$mRO3{^+0Sq-g`db2^cH!_sLfG^K%SfZ*X#L;FRq=7q!7h(<02rrBMzL=)E<30;~& zPPcGHDX<%c=pu?*x>~7xtN(kvgiT-fDE+v0F|_ylIM)U@Iy8q?nB+=8XyOf; zImPv%sB@8xvL&WWcRle(sp<6JWY;DUU0F;wrnrVn=-PBrZY9V$a}jCF(gmx?*p)6A z)62+?m9BE=aXPsV<$NDDH-i*j1*$l8552w0)sQPv#Wk*Y0sVcPY+md722xsaook&C z%AErz5I%um4#;PnMEE3P4uU7^U4!hc-rNlOWf~Ab)34L{>8^TQQLb%t1v10o=|yp&5!yd+^a0 z=}`x$Os#W^=u3}!jjyVg^Qpb~8lC*5K7ecrRA1SWVyNHmG zhNbpo^KX+#b*7}nZiAJUtwREd{z(reZ%U|9jtq15Ryu83QvFOaavdNGW#I#oc|Z!M zhs&t7xY4XtR4GiKpf`myi{7lJRu)1JvOq}Fd-t^DJ%1V|s&FuUL@OXM?M?`Jv(~NB zrq$K0u%+KdGEci5?@6f|>U>^wbdC{49@d2J;%HnftddP7QZ4nR09Gmy>Zom*m#;$| zwFL8U#n(|A!J0;o)lokXl;_7KFBl<)SM{PR*`%dcEyEVL5nlD25C*X+5X&R$%-Mxi zuiBTLCBT^rY@G+xQ=cKW4D_n6wq`s1ZS~c%%y9a>zS<0i=pOPxLlunlJ>=Vl_J`#S zRfRcX>H0?MI;L!-a}#wmgSgQ|EyX^VP1WXHKRY#7m$MJ97HTW@p!VI zRCjSAlUu7b7{sC0>Qe>9?aWz<%+RDU1J#nYr+DWU zI%o)tFLrVqKTK_h{+dRw4pZj|=%2F`%#tMnw?o&?k+46rLn}3xE!ylmwG?dfeI2~wEGPGClO=`u{N~gEcG`& z9~Ydh!j39=FTFKa-4A=Bt#s{twYS6^Q=yA&@1oRvRiHqJRwwNv)%W(4TgzMS$hKbjKbQ zP9%VXgL~CtOjr;0swOXZy-zKGR?TE5r|;3m`_=Stv~VYd>35P#fiqU`@;wwhlLsm( zt02rTC&KLeaQE%}Y_aNI-aSWUnb%d_eO-KG)vva@F3Zr=+U{g~)AX^|y`C4zb=^e; zo-0$&oowfhe&jwVqjhm~c4IeqUfD7Aj%##7Q+G{)|45ohA2)N4k>qRfQot~Fk{(18 zTDwczwKG0;2TJJ4MSAix_gp0Jo=1G?B(9f%)+|8-BXHeKLDBt zhr8g1P^@bFz^)o2qgo&Ejpl>i?hedl)wGX$i=x0;l=t`nqJQn)Dql^L17Zm-2Q%%J zuiYWAVIn9m0%A`9uIR@VCq?XxVyTI z^v4_Ii*FnR|6V5tbMkN=R`y%>5!(U!a)i4+@9B?5x|`@szWxwR=LJM_N4gJb@?T)c z{YdiN27ykT;2yn787rhy9|1jLI)(dOQ~qwPBQHi zSUATPb>w z&sXOTmZAse6h?S$?HstzEps`MZ}+?RaWQ)jxKqTWb29Ni;+{vx9CUBs+nQ>>xNEsw zspn*DK&!byop{1sRz%0!g`#Vl33TGR~s-b!7DXhy;MR`>C!keU49j&qq!3P0t z$hS`LzOark+-XgBc%b zaRQG`xdwi$-_=OEIYwJ;`cGcxYYwU;Us)wcPZYdv-WQYCQRwdx0SKIN;7TaPQZ^!K zyB=C;0XC zxxgN2(MOwyPT!{Y`e<7*003!{5bN-{bFd>ymrJwBdHVQmZsAhi{ue-aOr1);Ddss z4cBgjx3=qW3?_eyXkRS z6OQ3L!sp+K;R3=J07DkSSw0vlj@AYXF7Qsnp5qNk+b;%^j4_%WL>MRHI2IJ-BR7b= z0J)78@n|u|8YAK{VlFeJM7;JhZ_TxMZ4l>Wo`~oD2SI6$V7`dw1A?DK{F4uYv17HJ z96^I|S~HGdgNQf$2Z7B&x`@*O!A22p%tJu;kJH-P;)ootwc;2qi1@;PFxUdk5^)w_ zxG3U_J{Xpc*BaRv{+yt-;27SB_|1PXSiBLj5{`vnl{g8$kh`c9#!3WbQ(z^*=Av<_k`}+d1_HE^_MKap5~} z)!VYjsdsLXHbPKsdec-=X}lIn1~1XxFAqi5bQMomeaLZ@o1x+va1SU^#ffTO%g-#) zrsd$->fjl()WNe|#oPY}Plk#!0M8B;@9@EMYpIscmf%0jw0gYJ7gc=Gw>D|H+-9B( zSgzSI$B&jfJ^oO|4}D>CwegXP9|5&LRs3fjH8OgIHi`>Px8A6Zup?G#A8@*HZXD+p@tW}RcmdUR*;<} z(nD!leua~`OtrF{M7oY)na!KdNyN_%iJCuar#Ni>Em|WEdsxSZ--7*Wivv4li?)Nq zHs7kX*wdyI7IG(MyBr6D)9FH;=#YXMfb!`%?=6vW2ZKW?GSi)UzP`Fd5mH{2zF@|Z4L6^ zi@pdz2)2!p?ZMd|&>#=KIha0|;Ub9Bbqv zpvk+nBKBC_y~n|jV&D|RM|QdWu++dyA>eVDftUGU7`!(J!_0kJ441-Q1Ml_4KpyOK zr0?0UMcU*l9niXQhHo4Awl6S{Gx;R-n}L4=a(4`T$A{d$1De~$aN?lD@I(_&G~dPW zBoj|EW30(0o(zHTIf^s-kk-(~@ar#HSI)zF6R-ad23zW>CQbzmX(mqd!O-Qfw$R3a zeswI2izdGK9}KqGvrU{07%rLkQXU2p_p38fK0B(lo`6iyyw%Qn4p3ypTa^nKvq1Tz(vv z-v={S;L-W<==@+k<;P>-;e{Oa8+1*3&#t}vx^{+>O3RPad~1`08xCKqZfH?9@R^(1 z3J#o|A7{S>JpGo#*ZNypn!TiTzoV7oTD2q)FA4PFD|b3c3B)OZG1k&RyfiSEH?sSV zHd}5dY)D zO~QR`EpJZr1IGfM9E2wa`AC|~f8g-3^}$=5w|b~Wa+33d@O%2RO)Ln) z3xaa{hAw@mHLz9T;Uj0U&kVwuz8J{BKOLIW{?yiR{%ZfF_2ksf2jTO+ut2RW*U}3? z_ySPN3c^`F)Xx5;1=-Z@|E(2=n15W!C?R!~eu5Z^_Jhsuklk<^|(|mVD-u-a4 zK%4*3Itm6ex!u;AU>GH_A+||X^`%ywBOD!qM~C>dEf?XK5IiO%#)=QY@o>M&K}Z(8 z)UI;&<6mhXas+cj@ZA3(us3D%Lhw95Fh2y(&qF{Tz0#)IZHjxX1u5)u>B1>w-fOK4 z7e;0X&h*7bvR*rad;a<@QBQlL731_zgy0jtHF6tpG6bIl`lmwhDIfZ`-e}`(`d|;RD3)hIei95(lNw>8)EflBy2erNAZwSR30CjpOPWM6m7d&X? zGyP1Ebz31bLvf}r8j>mN+$jU+hk6aWIfY%it&x{P@ujzbJG&g<5iZ?vz+6@JAnprG z{h7Q_b-VZC3gEZ`K5`({-F8LtnOmR1_2!=2Au_!Hp8ghWdCh@ss_FKnO1BPABtT$e z8QsCZyZ~PQR-L}O!`OIT-)^^}fuXnJs&uXZKKB;z8p8qp#eiodAoh`7F!hFrdxHdP z9kD!eAs$QEIG=70j?{uUwV+RXa&;@MAWkb7V{IsiHx$h4*G>8KJG_y}`StpoheHMN zAzuXKMSh2e0)cvly$GHU)`xK|niGcSguPA8?&`T=cy3sXH7^X$gLs^ru^k(t{~ZKJ zZFFcEeXq+2W+HVe>*Y}VWICX-{zfp^8Ehh4jCq9k=~FO-9!#yGUzhlYeQ-DPg2+Ck zwUrCaGBlYi_)xFugh|2t>!V_5p1Y8VaXTmHB z1I~n5ToH>Dg#+i)we`!RuEGNaZ@?W;Gy4*KV<8mjHrZESFUnoNf7I8@L2T4*64qER3@NSNScm8^IHM4o z>2pxlT)Lo{4&h61j*#A5uLhuLOX~^gLUowy8n6ixd zp^MT=o%EifcqFk9o!b>&FAF}B62|WX!}TDzwhoW>cu%K<(SzOec>;qXJ-^Vu6xXDL zk+Wau^@1T2aF9LuR2W_q)0uiPOyzs%3gXb!dg+7tP~W(TruNdW3F3++VI--K-n}?v z>ht%y1ZKV1(^;q&@yU$E6dzfR8qi` zT=%TLT-*ha_s;4W`B{#v`CUKHi+;ST|0M8S$$NUs0RHj2SNcm{^v%C|g#B^OYdyc6 zTlYr)#pGYVH$6QCf56t)x+&nB0vltuNTnE0D2WYn8#E}ubJim!tqP;}3wdBJXSp&F zo&iV%4#|A%iRGChmS-NvmtlD(%Dm`mS-??yprDXmB|UZ7$61y;m}Zvrgh^uZ>M(M- zjOPun1CZrKjyYdN&jKW-rialD?|D|qXv%up=>yL_L7uXn9gDGNl<2?@J()rw9-#$~ ziLo1uwrb>q*Ns@X%ZUjTj$>QGEsJ$DIoeZMkWWCwt{oj3h@%_@V!jxP_SAL51rc^j6fPuOZ0xBW!ia=-h328GleF^} zo@fOfgez=)!9_Ca>XtCwlXFD%DDQ{pP2L)&!v>Sx_!LmI*RP!4@x(%G^7RTIvTT5E zA(%r1ds0Id`?3!P+xbK|5o4q7G|PB@hliB1dCu=czpIIbbT}w`frNa37g|Zm_4nL} zf+{e1!oXt>PrbXESFt=gSv6dVp(DQZK-ku=NjwUL+!^3$*O}9dVss+?`ZHF6P^8e8 zjbuRA7t~)I9w|DwvFJsEa`}W&frbx`1b#V}7-n^^It+`02YZFVk}eug)Kdw>$$~9Uzz85 zjqt|pVX(@;6%uw!30a2MuM}DXWl`9`QPm(=s?|UgLIM|hIy1y%=t56hv}7DTzR(lp zL2+m4i`5NC_ zOV4J3W$2byo-%@XbB;vTwUse-z4oMwEYM-QV01+s3zm#=JhM_VUhz6BWMeO{O}=s& zH_@(fq>XBn=HXiDcDUA+DQaQ5Of_Dpoc@x023*4jta}5EXDs+-c}6gpO203mJ41|c z{w2GBu||;zyP0C&O@~Xewb+3z`5hadakBL+;|;ta!48ej3x>d4%g|eWBgJxleryQA zGgs^Yvs+PP7P9d6?s*7BQJ)(kC$6Drj#+1 z+lCpXj5fULm-x$fRULo_#8_Y9ukxtYE^X}MRfRG}CvGX)@zj>(179nT(IjA8FC zP7v}COfO?Nn}Vw)jUW~pLV=1Yka~V%jC(U4SW5z?nXn{5O~d z=#KKnVF>o#7Y3ogPAtHR_l*yb{oo=zxB{PE*1u9Z*$B0Vj3{|qh-#_;z*?B@g8d}uu9c5cfW27khi_Nie!6vX8HVWfR6qnCK~ zP#E1;%W(6DC+LZ~MhQFW<3&AVsU6p_IL6?w?2&(SGN0Es+Ho^-Q+>k&S9CU#J&g?e zHrIPbBWFL}Z}5ijHK!X)F6DDFIKU-}|&=?jz62?nm3a6KHf8Rq=w*TT7h$dtwl zF$Q*N>~*^o%93-+#$OMou?fa{m<+bjN;CK*u#G_GJ9;q5xCv9xHg2|&W3!Ea84Lt9 zW4$TO+yjgKQ7y1QX*1SwpE7ZV_H3fJBuR;m%jft#kn+yRJb-&A9y zfX?3{chjJ87jMxIH$XTtpTO#DG}`jH8Lqp-o4e5ed|D?RRnva1WUOi?kZzldnjC!5 zCZi6YD&d}#54bZyOYGKEj0Js`H`94G8((m425&a1a~$h88=W{wcw58=2Ps0G<)Au+ zhh1R3Aor>9DW?Wc-uXZRH5UvM$%41BVk~&XG>_U>KO44FL)v0Y;Z<4iOkTTktNw5B zOvV<6>cFi=W9}-LCg5psojFe^$F@3?@%^pNWc<}O!;aBdB;ZB9u(^a53wSY1p-b$y zoN|_}N81eh^{(05jZZi+Dq!l1U{;1hDGev4U69C5bLzln9gDU+G*J5?|%vSueV?u?Q&py?J`EO z1%;94FE`D~G)nR_jnN2?Mn3p?XN^I43`GCLBOIR>{X^PhI;}gG=`2Pw5T4;%Ik$C* z2qyx9B!rWE5Jd0JSxHZ1fE99fx3iKiMtHF=8sgbw@Pla*wa4hs+er2pmAO3DBE0r3 z*voqyReZk3Veh-W4tp60XZXVAvbO`_9l+jBgm?O|cVn+(+HBcp#PHrbi}2ZZA~=We zIY7X}r}8wq;(mkXo<-zr=+BDYe0|Lk2M;Lp$TAN0eokryK3svI;*bM|9J94q?tZEpK{tX7O2nU%-> z^n=E7F6`mN2kM3+l;Ro9rfsvRf;>33nND^@p#7oT-@l2n1 zsq{mJAlUv@t^kLBG2CpbJNt_xleHpV`%Zl8M7$30trzk7Jba|`VS^L^KAinANFvxr z($^0gwqJFJhcr13F>nD7m3S@tf13PLAw zvy^CB;kYpZ_5}d4{)Evz^f4?va2e2){gCL^;Spr0{|G*oI%&k0e8pF#f;g-nTmvis zudaOO3DBexVti5|GX9iNi)Rj=GP;O>kd!%X zln4M|_LL#JNNuC&dfF(?KTkLf5zX7j!<`AEDH?l&_@6Nvdw_`5gn=>yJ#IcTA? z#=vl(#+dT+!p5KF!&n~H7RJSjvqpsiu}N$*4qIUMwV=<}hiAb`d=6lR&KVW?%F*JS zQNe@~ELuZy1Tp!X(Z<6B@l8(2{c|wBS+m{ejrTZ$+UJdmL3X{d?CtY$VBgqc9DUxX z@F9G$&2q~Rx?`e%;YD=6hSnqjPl7EH17+=-4Et|uih!pG?1}fO{Jkdf$9dxugHfN6 zi?Znj19S3UT`+2MIiy}Ns&Vn(yQ#&F&<)RXy86?XxpIwG;OvK|a8&yJfoRYjE zGXeQqiD3?R7rU5ykUitimB%|C3Jc?s zU?vsDWpf}4BtR)Rui#Q{1TMmSDSj4aIOy>kV4|Z_V7%QlV$hWFw9+jDZX&R5=ycl% zEevB8s=-@=7@pApK|w_Ye!#o6pgUy7ZDR``=*@qF-4j%zy?!&2k!$P?$twl)Pi$2< zxQ?BNjs#PRcOw&b7u>}w^|iVJs;(R_^J0PgEcPf78f0~c58XfHqV0Cq*vt9J{6z|^ zZPNy>V0e#$zaRn}Aq!sK$8ZytvB#eJ@xyR42H4A;6IkX$KQ=VJ`@_Hz(9y~CPHHF_ z(N1*H?SB~a1ta-zSllM=mVph2p>u1helVCeIpNzp-S<| zfM0;u=^)Mf`yoIlij_e07XLykJvG2Rzv4hxIX{(OHiZ6$9jF&dX3dB9eTF=Pog(}o zC!QHz<{JrmZq#8{h1xtfyzFnNfR|6OinFf5#leZk`iuHm0z~+Y6#s{1lyujgugIEik7h`KIFl&<5Z;W|-<$mNRoSAL5=5+ew{yr5+wBXQbCz!W5iMq%v z%dHETr^gCDu(|CTC%_B%F&1~TQYYr@sRbz-b&9GxfN`I_C8MAFUnoCteo#fP1NxP7YcZxk0uQCH!C3inEaA_W;D+%+AJ1N?DCmJ z{PUYnf|&+_=CXMM0Z~}ipoA0*G;8rsa9NCnp*r(De4_mV&92#l~hS5t>IjG&Wa> z}jYx0$x~2U~97(E1}(6n^j~!bmx6$R_5c6tq{=PIV;E2&&*Zdt4&;#Ee{MGBgQ*z2+>{3igNZp!6zhLpZlZsFZaR^?f$dD&6Amwvzg?HbX({Zj z@))ZLW`D~EmQl7aCABk;aI)Ron`JqJ-EnuHs$@}nXS8o??~L}M9n7X25=OKyWLyUa za$W~BjtitnN7HsYb?Rt#<~#KS0VfE)l}>atZU6Ygj;8G&AK1yP#$l5MoctE-_D&9L zRwoCxLua$Y`L z3wXCL?Oc3&1iT04fxQCWn}?6?>SAj4&6;1ko0Yh5*i&6%UOxwX;q)^+a&PzZ>MzX3 z9Fl3359Gs@ju@>T=2|Ys6Ftm|JdRGWKGaECKX{n5P)~2`Cw7A^j|?=(HaPz01{)dB%e=^|HtlWNm*3dA%3D>LCW_Yoo~!KaZ5}Ad91_Ta ziCwY49DtO~>VDo=hsnY|rhTW%zR>m-N}C%#cgHw;xLhTT>}$^C9Bu7u+BXsYXW@U* z*U=4F_`mhJp)j|f*_vw;KTYvz#jO5Lg^2!Uk|)n$@V7wxuffyqH7-h8RW?ePdTkf* zc3(RqS9%!&&H#1TA>bW(>Oca&G@a8S-dQWZH0{%&BLY6+iw2%QbeQ-TYVa108erP@ zsxAxo@>{SM2iUOmp8@6%e6}Jmix#BQ2b$Gv-8($QQ3`es*=LP6hdR1fWvHWjD~CFB z493_85}L)%=_Jd-Rt$RqCU3+P8D_5L%J}Orvm)bk)^O84ud9V?y$c1HC@~foBzY)? z4tFMyOT$h3Z91lsd3@$l|6i5-=%sOHC9Vx%^S%q27kgva!{~V(&~=Cv zv)m-pzGub{GTuc!h5d~RxECPcr9KFjO|q4W)S7Je;TpR|z*~GZg>0SdXw~`2j&Q%6 z;%ML@0Uvq`cI^}g_V5(bKB(wC)q%Yr;0tfTE}Uw^(u}EQkZod~o(|E6@KPfSAQ1d{ z6a;_F5q^qZ3B%)l3rO$`z|0IuK0EH7VT!h;crek-5SaZ($Imq9+eThV0=6%Mok+|Q z+;mGPjYY!es_WI$H|JT`>z*SYe|9|eea9Kpo5fu@auDAwjgu7{piCZqD zWM-Ox;;tZ)si_yu63q(NgKLPIOJ->4H8Uf#GP5MDzUES7R%TXYnr0^d_jB$+ssFd% z@AvA~$Ir|&GtWHp%yQ<;Irrk*?TyQ`cYAa5?A_kidG>Cv#q!Vxd{5<`UTIGXUTCRs z%`rb(8QR3!?ft&eo)6#_Lg$2du)ZG=9+wald?PiRwdQUmTNqC=n6S+4h4P(A)y}U3%7A5L66&#@-YR;}OQC7L$3ht|Gqm@<6dGk&`9J)XqzE%=Tj&G6LK9zRm;CIuP~R7B z*o4lh=;@pFvO#^4MbA2&x>fg?ZT9VftKJfBdpVu*oruhO**HaXmzDh#?~h4!`jf$jEI*0%!R z@}l|rc6;1>zCE<+Et?_9E^_O5-QR|BdSeH1w+ z#;M$#<+=m%3*6555;9eOH}nzS0X`CGPIxc$U1$E0NN<~i927W<5Tzap?dmK>^x~n= z9)4En%18VrkTd@q-Xks!{VAeJ$v2U1RS>UYoaerYj0(z+3U&vrjbcL{UbiP=k`WDE9B%EN5eUnVN{97_%vfp{042a4n*%cCa9dJOT6o{}n{J3fwNAiMe(qIoM!Zoo$P*&c$jnN()M* zYO8hU=GO8~z7aZsKKU)u{7%zjD&<|VU3(?ctmD)p1|PQt#aG1FmMae0q9R1dZ2#}J zrG>XLZn8!Bl2J;#1J=5+*XK~GTp z%B)P{hI3_+<|02m=KdU8eYRDjZN}B#d<`i5?WVowY*7g!pBaH`-2ql_9{)|oUA{XQ zA68mxdTxY9dYky`Uj@{-x(P37H#^8bi_uuTxt8g!tVcU{6X;!8Zya1Ixq{*k5}#RF zuj$Mtu%fcwI<9cDZ@6sQEPcVoE5?~`i}Dba%W`d54&}5^{nFniLa>a5;I&a!Z&?$; z3duyMtLqVen+QCzlzRR;5h}eArQe(get(|`{8%0nVY;r*GMu~LueHmqzvQT1`hjm8 z*5eEn?=Z!)Kd5Eyucx>AThcmTk~btu=f-8#lG?@s`M!vXxK z{Ly1o&xj{|_&xehk}s)~-bDNJDRX8g{WjN)r~F9suIr=^b7;#?djmV`SF1YdFpF7ukGFcCG)R@oD7(a8&&)u>Xe^;qez1H!C zJN@F%9NU$u|4~EU>-%%6{;^X6#WVD!{+8BJPw3r3nwQW(emF?pOvmx@2ba`ttrach z`Hr!^QaxU&upJ=>n^$T6>F4yT4(C>0!#loEA7cd)7U}JrXP4GCXD!m(-@afOuZSxK z%Mt=SJdENm!UslKyH%A&V0eN)TM7xTP6N`1;^&{}dV!d5MB=O441A5f+nucULx3qRt zP(o#gJ7|=AZDUDZZS$ce`VA*?bI?+~n^Pp~m+Jei!02WA!KHSxZ93#Ai&5 zKfdMDE&h{u(Ltng#9CY)$mgsxH&4GqU$wk;l%K763Br%^^x9FR#{2Py(xr0Wf8`ch zS=W;jby#d3YN6GP40R_GlnS?c&kfK)nSg`U)oisWr=3?ig; zlIh(<%UfRC=NiO>Z?;?m&8@nh7(m^-v0J^9H~qubjfptO_n3*2#lre zJh`2-%yL2#@di(8eX-VB;qux}vA~%X6&S z>b0v_9ft*eW276U$39%CM+P1i<=M+>n?JAA+j6+V-zVj}QML--;-ErYRdBWMDBXs? zdM>d*o-vd3UmZ-N@T9qUwVqnVnueAkVy(=;+H3R(Ybv%`qmPbZT4C<3fhF@WFy7%- zSy39JPU>>YH%Me2ey~P=yBUT@G1=_l@qd^(v#c3=Pre>yP3GbG`s@G2s@S!*Rrjsc z)2$M3tYyiNYQI>kA1>EXBP575Dp1xaNh&VTcQ^mbO5<}n4RFOfCuc=re8pBs`**F= z<3fBZ5Q9Y)xJ&Eweh<+FzQxQp=Wh)a#aC*|M~UVeCCqsGp9`+FxZNyfDHS0~-M(U? z{`vL#fGX6C;SP){Ute7t^j%i7-rS%^hSD0+1Iior-3EPSQ>$T`^o`wj?BD1at6|F5 zETVLdG;7-ndU{o>HywZJO*3|*UfuFz_l^3sx{T2ttg;+PupIg_(iEOL`qt^>O?o5S zR^Gt5X{)(OUumtktv2gDETd;_zG<|7xzU?9>rcrv^Ereo(qE<=4zXvOw81yq%Iob` z*?yX2t=Y0V;!Eog#rYQ}%T=y?8rx1LuY}5Vn%lPM9sWxT{@9`)`$xlne^H+lhhm@M zK8^MfPML!zQrJ6XqO}s$tJodpnyvPreQm2gp_%1;XSq+sZaS5P%;DCuqWpdR<>&Ud zCsWc(`kP_04tmDWtsb|7xABRZ4Y%n_X zgQ;x4N|(N>VYWD^_cvD_WOk%XnmS?F==3{=rDvv@j`#IwGdanqVQ%SfR56#!KWpCC z7n!}1jL?nuAJQGc8R_Gus?4;M;pyh|5A;4p>eQ^Xl+4VOscOK8Nr~x`%pX3`3(d8M z^&GR=hx(9!Vd)blWvOxIDaj-evT#EHz^ExN$=>%~y`<*Ug>B z^i$?bpXkxS87Y${snL@rJ(_9;eX5T!&wQ#kF~dI7$C^)nrr%{A`Am;D-T%>_Fkk$S z-roH2KYD93=D5DD#-yxFH8yql(9shJOv<8~Oj?&=mL1pkc#nLpw{n=lC-rXTxRZLU z_E?I!>!j{BPoG3bhg13xbJHpPV{`s#y{`GjX}yyf^aWYRe4%$Y4}77=Ec;SVFuQ)K zH*$InK&haTz%%Jb|wr02Q^e8jTVN^Hgf2W7&Ka3eYfpL_XHZ04Xkun@BN2<}|Q%0(!Q8Hrsr;JGJI*#awObVOzzh^K!{=MGN z-21)$km)|J-&OyyObn(UM~t2zfk{~@{F^r6(eY`S5*nU1Vw}0`yq;{je$bQdu*Yt5 z8M`WF*u+Oi!;Gw$Y|;FBcu1)k9uvh$xr%Rzwv34CYi^6((f?+f7Tm#Tm7te zbePji^&idYzvxFJsR#QeWVtPuWTsKqaGWfixA>yo&n&x$-aCKAjjMlUKz#SB-pAYV zlFo0ICthaYOuno)(MOL+RX1l+lT`29msyj%pIy=U8>tELz4|4@cX>#~_v;t`km?uz zpi1b|w@bnRmDsmeuf7i?sf45+y%W0heZXA%yIwmm;oiP|`t(caZ#u5&;r^Yw4o&Q9 zw!Ox{oO4ZYWO}dZEllShdUWN49(@MH_foYUzEAbN&m8}U-sFxx@ku=fBq(a@(yvFK z2l^+d0eyRPQI^K|&VBnOCD@UE30+AwfBHl3=H6PhJHnz=(7HM&@?(_-nxY)Rs&0^a$i!+b?sW(}6L$7JJyP-$d9Wgp1W73_i zRp+h`^yrgh1$^AETjy4-&2=~Q#+5TB#i^96lnHT);b(qxLvL>OFVkz76U+1w=2vC< z!b;6!Rda^_w6qC#EZu56V|H~I^Ss|Vj2jL;b=dHJ%(^uaQH24CmYlnmg3>W)2k@<4_ZuI8;VshiXN7 z3-|>5dP9er2{$I52M!P~06!tCN<0{x1V=%0cOCl0wWtcR24kf4cRM%{{&ZLkby49e}*A>{YN8&-7M!R;lb@5>3g{&Y@yEIMh0NW;vdk!fZTAmwv_g3c?9hKn${H z(0j-239_#i_mhT-*_KZa1xKGG+U??bS{!$0-GQ8FI~UJ{$(svCrVW5)HT;v;n3cDnE^ zJO)mN8-l5H|9m(M+)uf0i6;@BL7wLbFNUL$XCj+Ld>WOz8S{N;=zSP9hk8BlF)IQX z@Vrp1;+c`FnPsT~4t0&bFU5eJv?PMGNqFfA^1ei&y2PJ@-zP1f7PcaP5;N{e+WvLXrj3FA8t*1qW$S09U zBRqsgT%vU+;hAs%Mz^NYTyzbhTrG@hi$|v5t@pT0Tu1*t5C24QefX71;)5wn!L}H1 zJBmk8=yTEs)8a(1i|%*~*$u+Y;M3qXX({qR@;^h_=~Q+a<;Upom4pmJ2ZFFX1 z=v#E*bx?ywFZQSZ4@S`^ByJ;f4hgfdZak=gM}DN0D{<3iDtv{)vx%QXaWWPEfngs| zVJ#|t7EY*7caRoKd?YPD-HbALssZ8ODL)KDb@E)Hp7oUd8T~7&(*Gw&c$5BKg_5_a ztUU_+@Ww?l9;9X6iLXZSaIC$T@K7)xLqDV3HCpi##x}wIL6n_GMfEVW4E##?KCqg6 zN6^!kysL>vk#{NOzh;2`8SZhYB_s|)$v0%&O~E=0va?ve8E9Dl0N0jZ@lZDg*At}2 z(E1iswg!WCpeUJ^d`63&q=LD~7h~*lbZ(=fRK~(t8g_(y@fhAWioFN%8|djv{IZ9H zXe#-GgsxbZPJs^@2cM9sJqGN;GdsyxlRO*oh(^I-RFcF%I*pfdsEi-tSC=txKV@Hp zUnl)(y6SDpj-&s-qj5(ta2NUiL;5R(TT*@wb$f0@aS)jTu(kutFH)(y>f=JZ@ii6p zLD_v|?tl?@5zYgo0DL4JKRQdmw{fX zN5aY%9_==w8o3GgBi|q^FYACh?yDUCBT_>wxw+kKL~E2kO&MWFJtHbEDOIwRXP4Yk zAJ-9;fe@G2N#l@@x6;f9>KTos{0z!_cK7jRI0GFdyoY^8F}#SP$Km}>rAj1jD0L22 zed%KK_=8;H($*=2g{Rs)4HjQKZu4|l%DIH?kI(M=%(_uVLsuz@7}O)mhz^#Fc6>&Z zQP-mq+1z1FAUviry$$am9s$Q;Tm!ft+!PjLTf&FnPH?85Qr+Qea1tDe)yc3Jcoip| z5o3n2x@ZSMtIa5BGQ^C;UWr+Lcs#!F6F15veV|;oCBAq&9i0mE6AR< z!)0YowZKk)rb7C&gngcw%LS0HsVZ}MeIq>dUM5I96ZIgBqu!|R8wuanH|k1H1~oA1 zx{9%jaI*^G`w3U_$)%SYn4t}fnjyCYO?a)gff3;ve7{ev6t%-&Nl{-|ir#4zt#r`J zD1x?@z~vK|y&K*tIgxOMl2N{rw^TLqm9*J>~g*@v9#6)@#DF6l;>z%P9Bhm-Oes zf0O6`gM95j$P4~KzRs4r)ywAoCPvM$w)A%SCpX1v^p8!9NXxivwL?aze3*>Nxru)^ zgILzf_DDLx{bc&VC*VZ5Cu_)HSf*KH@*-9SahY9P2+JDsA}li~kkqZV>?K$lZm)~x zQ@0!SWY}-M-H3XmSQOfyEmT}W{0y4U*%jTqG7y*PdkOYc;8L$rt~|Vxa9LTICzo`& z*OFGL2hH1~eN(JQv=Qyu{UExj?jRgThGJOOrsHrwsT-Ds^BjBzE``s-*I`+k{J7X? z*k-_ya0EOJcEjS7p;TE3B$Hp9@djaW&ORTft2YTqLXpjH!R6lCPdJOTw{4jpO*mlZ zdj}Rp@7igy{=7%n=he*eL58U`4!m!rnJFvBD)s#1joF3vHO%2?>KdcRt) zTZ?aoIE2rkVC7M{X;h2>gQ>Ux?k*K#h+O{d|r!N>=S7{waRQS58*{62j6u=iouKxD*b9uS%W@bD@y9^wJUXZW6uhJF;pbC`KUN z{xK{Wj>581G&8~nRG1h@EjzShl8?f{RFVWsCDIx(sRMD*@d;s{@zphv+aK*y0=oy9 z&oncdKXQ<~JMd639F511+q!Ne4?U~$iHlvI5f=WB&BtM%?&cL2FgeGt@}0KQ&6>@P z=*a(KzdGwnAJW{2lzBe2xzQ*jajL9! zteygQhOmw58=1b(uW7*3|V`Z?#Cg18gIawAtn{>+w%u&VdgcX)$ihHJ;a&|yg zSS}916~gR_Zpyjsxf$jb#V+foLb;c^8PV+oStE@K;VKov+(lZ3asOeJ6Jxkhx0Sn8 z^_yWo6>jIPVRHm59a7WgNQ+rYxH+;CYTI1LX7Q2~;119>Qd8~2M~?#~gSJ3%4hc zz%&#rfHfw{5;&6hD)<@&*NdF^RyZ1d6%K>Ri8f$%=%8&7{T7V07ne#L_f)(T< z91CBAJHSymtO2|Nj}C_y(PJ4fU!+k}VA*vg!aFLfHY$h8Q>metF){`oNJ7OOhMRO5 zZ!Hn$5ta|eZ*OTtcP_ExB9rbcB`)LVs>t!a?M+ooT%5u}WKRk|Ih-bJ)@fz*k(GOV zE8nf^!d6DzFv;74bm5*b>2I|%!maJ3QgVxb>vJCw@2A^+4pSS-)38D*nxwenw)Dsy zscd>M%Zex3EIZfoPV8rgWz}G#Z_h73#Wr5T9;>I(VL61|pT+FJtc-!|L}fD~%H)nu zF4^KZxe^Mqv|DMxj25Pi6%HY%j67c%P01)N57Wsv!{X1RRPU#)jdvX$$so;RgeW4JS#AlA^*RY#wRzD4R#y%tp#8OT8Y&uE}!Y zI6HB?&20P1GpTf2#^%S8$(qP6>}ELAPM>6Rmd%gadBlU0?QmHc`#n2-3cX-iJk?H= z$v3S+`0<;CoNBrq7G*OCOaIS=Wn6h|&W4*3pJnrGSUmEC&2!+2pFPyCt|8QLa}oY) z4`(xJdcxE3<3-ZsoF@!l$>mFfYZKqWy4HbFI7s@AZrQ;ywVqKJ&8*C0gvG&fla~oE zV6a>ypWI@k%Is#4ErOfU-JbcZNr@=jf*_YswuJ?BFr(}YaT#T)O#3dvEVRk+HR9Qf zxIM(>KKD-`2LB2wG5Aj0M z$6&}_ct7z^M$mDG2pmRm6gFUuYug+Y$~7*6_zC1^;hx0Za4??9rzKHv9^4*oihK}! z0nUU^NgU6%gcre`-~!~m;9xwQ1n(f;$+OO-_7E71;3zyCJ^^RIVOTl`j)ND#v*Gpd zAvh0~t%w||$bL-@L}c65l2u1TJ`fIrr^8XO98yHXa&H|6=Ob?qd*p<&Gl6pm_+M2c zLr*w_C5vI8~&0 z;2m&N>fIBhVpNs{5XkYye%KHzWTC+eskBJ3ipaubj4?ZQWHT4>i_3~pF}MDl+AN(&aru(&C)1Y;OKqzG-1nzv9e%P z_=o{=Gr9sJvZ-JYhUCC2;9PhKy6@hJWIT?E5;)6`T)Br|5EQ;gOPU{?;Ee(;qx>$5xxiy zgyYDU40ndd!R_HJ_ykUx4j+}h89W<33*Z9Qx+Rh>cipQ9Ttl!PK1zYD@O}!s3QwcJ zUU&uR2P7Rn44;QTfiJ?R;8e<;h4;W0;ANIlWbcKDk7g#0Pr_ zdYd=c{DRG%jdoy@&6{Dlz-_VPFWT{~cKjuqx7qTS?RcRb-)_fc%8LQ7*!-%^J8j{UJQp};3@bh@w37VwhQnH z_!4}EL3bUVhT(o0RM7XFVdSSMoraCHcRC|cx(qv58)9C}oP<7}3e zw82aAfTt63xioO4ziIdDN7GKMbjV;6OX&d;IZ_9!u^yfZ9D#KCU(DEYEbTtN9HeC`3S#}L2M7Eq7cqOlgRqoO{=DsP>3NcQqV)S-rioAbIDb^GM?mi56m zUbbTBa8MbyWW%CE(nQalKy<9YAn`(Orq2KwYlmpeQII&vyxhgu5h}*MhdcrlPc(NX z7&|;7+eJJaA<-EH^RVr_QI}&!5|6c$cB4>YTcE^5n_gCzqd`eDc|I8(*yX zeY-mcG#qi?^o952HE8j~;n9uP_c*%w=;XjAQPKTUUis$TMyoy={OX~P>KyZ4nOy1^ z=H4};)9LdqChXhw$%J#gyj6ah(5=O_I>&?h-Tuzves!bbUs*bS$N2Y0pKNgbgQGvx zO&FMP?K!h=ckY3Wz02;qvD`E9_o6pfHp&hhtJ<}HC?{}aytB{V3$Hyq@Zq|HCl@?e zuyF0^A=g^`a#xLmfl2$%zQ1!@eSJ^62HWB{Bp&>2!rsS&x;p2D9DB3*lBpk_|NX*q z!=7F^ecWrGyteo0P1RP+_;_cNHH*{Z_T?SBH}LMH8`Gkn{~+b}3qMWu^A8O*Jcjl0 ztKt_H%1^0>g!sFH0{r|9zo4)HJ)o*?7LU(CR@!L6s|44siJeI9(1um!A`zu3+TBt^j9%t4eTnKZl>@ z7w8}0^aNIN1sv?ijM98BZ{^T48I!pG&*A}nQ*PM&d4S)Hl^7fb(?JU83>t%Q;15Pb z@Crl}Z;XVoZwlp>CXxsCuwDxtjktyPC_ zCk$8$4ujL+3uG%m2k;Ac4~zz{ljcUp^$_$^&x;r|lgis-Q-6&i{o?hgcN5yk=+(`Tn zcxg?Cx#A$NCim!XM9UWsMtH-Lj6~V=mQM4n6tR!96`#T5XfO`sXY-03C;^GHk%0_Q z43<1WI>=^Ey&DvP!VSEF2TB1yq^JghWI;zw<$-*V`>Cc5f?`nev!)_ErJCZ8tf@|o zooWim21XC3>JActd$v;z1j!(=tDnjNxu8>?EPRZAxD>dT`>7@%W3!*y1PXz>%ufvj z$so3szZwNHKvAK;x(d{Ge@+nZaj6`T3yMa$)K#EHyI2EV>NqF??s+aX5F~@7sk8`; z15>~pkPB9UP2g2f1P+7a;4CNw*Fhkjt_IwoDQG**ahK{sAQ21(qd*p@_*tR_s3{J5 zT|4aX@G?*p)kTYOT+u$!%#R;5s@0yWozWU`gchzM)jai$_7ayt{7Gj{f82BoG&-bS!(w^1|w3&_q)lp?@m$i=CJ6abln|qZ+M})SS_Z#!HdYoAJ ztX-nUsua~i#i>VlA=+QPfaPbZN!wZA7=T4H%#MSMo?#_~V`nnJKoK}R(_B8txENMK z_$na3!(er2nr*IrnB&3gGrey;Y{WTSofx^<+2-$qjR`%M*#(ZNyf$~d)I+ob&@MzLuSqe{^iGRxdP#E1$tX89cIh7)I*Ukx!@hi4Fe z0_1{X(1e-NdbZi@5#xN_Mbz(4M_$4$?`ZqAiP}c(aqTm0Hu_(kZMGU}bk*`w%o#(u z&@CqKK80d0`hNBi7y!V%+$cJ#)+Z0(e`MSEMDsWo>rbIicOU9=83{aI~|_PzED z?Fptu9>-M2e6>163~0@j2y!_Jj6=;}Nw)$F=9R$JN#+*kM=4ZF0Jc^NNV)&hhPxKK#>noZhOQIV;)tto>o+pM!Hi zZsYm24%HHL0*N34=b8&sj3`$u;a+pi*HVnGVTFW?fz+wE^^eW* zR!KDq9IiqlB{}A6!;C?}$z+%avgew0h8xpdC4_&OYpxz{3<~W;zGUD5xjCkPno$sb zm9WMd7XZS58zj#&-$*m&dtRfrGPGiCxpq?fSbIW!p`F%FXq$Lq@~$>ods2H&`^Ax? z&DV};pK70LziMOEYV9%1JB*G~Kn&$KnN%*2gTOX-DfI$dvkRn2{CJtw4z;*|y2&jc z{kr@gtMk9P?*}8n`}A3(S7gjyRJ;uifses)@Fn;b{0P(rW;n>$;4rl^zqI{2 zN*2Ifzi>sa9Ndb$JjUj zrG;C$M(zb-VaYK~C4SJHDIe`)L~F5(w}7@NpCSp>wmy$>q&F82}F zNt5`5r+vo0eSr%;x#i<2EA^CJxBfTxwGL}$zFuTBFcaq(A>LPF!;&ImE}-mJa1A)v zDFgx?go8RD7IXsnKWk=OkFd+*U;me_Xv*%R1F!}~L#J{#a#~g|i^bh7IQ=0_TJZxX zdE)Y#4Vm1~Wh|$Oo#i)7)_}?6T*Le`)Cg z_C~9KSeo6uxR-d2~wqTDgH zyVDpD4ekVO!9AcW=naxV1}N_CG-p?!{$LOo2F8GiU<&YnT#ye`o}am6ShdS{ zda-n?_M-NI_L26!c1Sy{eW*>-j%r_Nk7<*&DcV%+Q7u!Oq-AM%hEJY(Zg{n5zv!y9 zs++abs`VQ6(EY=ddg~wB>$_e)WnC}lS=US7m9ixp`z}D*8M_IyfV6AiVBF7%OA=`k zZ=TZ@ioAZ-RHhhu{-%5}X0w1I4|9vDweO`_XEzjeq4I zZ2RA?=6g|c7>JG8e{xd-#HRNrb12l0b3D={-o_p_Km6gR>c}!u(>r5wwQK!jYTxiv z4L}Tt1MNU3&<*qf$shw1-(c7rs>c2Jj(=(DIPQn018ao0@K;7lf6KHw%axiI#|W4E zB}^@A?i=9&asJjLdJ5e7ILo|^4p*DlGNuEi?*%=<{a_#%3PynOARFX@(w6>9_gB9> z{?&hJ^>pss767r@{W3a%Sh<*W`g`_Mt4NdhV{3d?KlPG7zZAl}jP~}?s=q%qW-kQ} zfDgb?@Hr>}-+`Zi;+D_=8HN7d&eN;=JI3$)m!^hrV_6$m4({ku#@#NmqBwB%(c9Lt#sfH{eq)Ge+2L)p4@-&y?w7J4Zzp8G#>Kzag{&C}& z!<0S-PJpk#Iq)<14g3iVZm!)Rdz8!U*E0OFXWPFtJA^y*+Ca=UCZZ6CnGwgiU?Xly zn#8wn_L)63-DN#MyP9LTmD^`M{bL4?s8-o~tW|i+z?iM5cm?bMZ-Im02>1+~2Bko8 z7?7OlGUM*X_Lu*q?H5pT9f<9@bKxAHt)G9UtjA9wlYH^^92JYpuRQ6p-r<$QWKZ^2 zMV(6Gi=5d3-WTo(|EgL{Q%bi0?Lj=~4*G%tU{Xy|P45Bc}Qfx;B125YQ~wQW6($s)^SF=gd3h?8An`C|`1!XopB<4gi6` zdQ+7(^tDf9hO9S)yA;HlCcV5dBZ@g7K4l>F7teD z`0vhG0^cqSuV+0YD6gVqu}f8z5`3!JY_;1uaP`Th?bS(h^I~^4_@@`q+LK3KG)tw} z-`_7QuPui9upq2>(UeVKKCp9S-K}1GOuJ z>)7E?^4GP)Qua1GY!G(eln1MNH^YG{im<%iRNs<$8!idYbOuOo7p-u4*O+oCDPG~T zvj%pOOBE9L^=un^SBH=!eo9Lz-h`KrysT^x?uQ>DL`FNy%a>AKW=LD|%YbhOOO1(k zSt&0ac@3XmtjtVFCgD7hQScc!!&X>69b<`$LK!xqkUM#cxdFEnZz5e3o}kmFVbE^k zv*819Bpp@^N5RKoG4u}d%EdaH_<{#GNR-zn&$d`5F=y`JO*9>M|v14O9({6tKcYx zoMeomHG|<3C{XY<(nH`wvH-%;lDQ;dgDRyZVpt)Dm4C!QdDhRYAaQl=OV!*j=B zX<1)%;3(CJxHP5yKi({{y(2?Pmi?`wRU9S7{ zF7u<+_Vw-_G6aAk5~Wobrv~$njENz(rH|P0p*APmoMNY^+C0qW;jnlj&E^rXG_)k& zXP6juRK5?ghdv5K7)`5$x4_k45>+XD0YOTxL_4#mz!@5GZVca!B=q6SCE2Cj7H82Iz^20knV)^B7HOZH~{-g5zBrN^! zu{j%-{+wmUXWRUQ&2!+nK=z_*nbzxBu4C8V@}9J%6LDG6yTkHMU?MEnkb$sVLy}>+ z1dNh6`7>a-hD?Fw8j=lF3CV+{dq>g+=94O3=X%(he)DYO=EE`_pN6Fo z3vBr_cKlhJpR+j^mi!Ct_#&GZTWl^YpnEsu%U2wN8K?iW15Kx9 z>f^zQY~0OR>%#B$$f!I{TxRMa8D4mpPOOJ}%-oKt|hkSVrXzP4R??&ntGqPFRMiyn(fgu;oqbRa`5Z z_*C;EKS%`(!Kv%R;|3fj+>hZ?0-u1-*_D^yIu#O^O5dQIjEa4B9dem_)2@R-N$A!G z-Hr|6b%W)N { + const r = (((h >>> 3) & 0b11111) * 255) / 31; // take top 5 bits and rescale so range 0-31 becomes 0-255 + // Take bottom three bits of high byte, upper 3 bits of low, and scale from 0-63 to 0-255 + // '>>>' rights shifts without sign extension + const g = ((((h & 0b111) << 3) | (l >>> 5)) * 255) / 63; + const b = ((l & 0b11111) * 255) / 31; // lower 5 bits moved to the top + return [r, g, b]; + }; + mp.registerJsModule("console", { log: (s) => console.log(s) }); mp.registerJsModule("display", { - draw: (buf) => { + draw_GS8: (buf) => { let bytes = [...buf].flatMap((x) => [x, x, x, 255]); let image = new ImageData(new Uint8ClampedArray(bytes), 240, 240); ctx.putImageData(image, 0, 0); }, + draw_RGB565: (buf) => { + const bytes_565 = new Uint8ClampedArray([...buf]); + const bytes_rgb = new Uint8ClampedArray(240 * 240 * 4); + for (let i = 0; i < 240 * 240; i++) { + const [r, g, b] = col565_to_rgb( + bytes_565[i * 2], + bytes_565[i * 2 + 1] + ); + bytes_rgb[i * 4] = r; + bytes_rgb[i * 4 + 1] = g; + bytes_rgb[i * 4 + 2] = b; + bytes_rgb[i * 4 + 3] = 255; + } + let image = new ImageData(bytes_rgb, 240, 240); + ctx.putImageData(image, 0, 0); + }, }); return mp; } - async init_editor() { - const resp = await fetch("/assets/blog/micropython/example_micropython.py"); - const program = await resp.text(); - + async init_editor(initial_code) { // Create an initial state for the view - const initialState = cm6.createEditorState(program); + const initialState = cm6.createEditorState(initial_code); let view = cm6.createEditorView( initialState, this.shadow.getElementById("editor") @@ -31,18 +53,33 @@ class USBCPowerSupplySimulator extends HTMLElement { } async setup() { + const editor_disabled = this.hasAttribute("disable-editor"); + const console_disabled = this.hasAttribute("disable-console"); + this.render(); const canvas = this.shadow.querySelector("canvas"); const ctx = canvas.getContext("2d"); const mp_console = this.shadow.getElementById("micropython-stdout"); - const stdoutWriter = (line) => { - mp_console.innerText += line + "\n"; - mp_console.scrollTo(0, mp_console.scrollHeight); - }; + const stdoutWriter = console_disabled + ? console.log + : (line) => { + mp_console.innerText += line + "\n"; + mp_console.scrollTo(0, mp_console.scrollHeight); + }; + if (console_disabled) mp_console.style.display = "none"; - const view = await this.init_editor(); + let initial_code = ""; + if (this.hasAttribute("code")) { + const resp = await fetch(this.getAttribute("code")); + if (resp.ok) initial_code = await resp.text(); + } + if (!initial_code) initial_code = 'print("Hello, World!")'; + + const view = editor_disabled + ? { state: { doc: initial_code } } + : await this.init_editor(initial_code); const runPython = async () => { mp_console.innerText = ""; @@ -56,6 +93,7 @@ class USBCPowerSupplySimulator extends HTMLElement { const run_button = this.shadow.getElementById("run"); run_button.onclick = runPython; + if (editor_disabled) run_button.style.display = "none"; runPython(); } @@ -71,11 +109,9 @@ class USBCPowerSupplySimulator extends HTMLElement { render() { this.shadow.innerHTML = `