Guest User

Untitled

a guest
Mar 8th, 2023
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let undefVars = [
  2.   "GL",
  3.   "SDL",
  4.   "retValue",
  5.   "infocontext",
  6.   "inforate",
  7.   "mInputRegistered",
  8.   "context",
  9.   "read",
  10.   "readbuffer",
  11.   "scriptArgs",
  12.   "quit",
  13.   "printErr",
  14.   "FMOD_JS_MixFunction",
  15.   "_as_script_node",
  16.   "OutputWebAudio_resumeAudio",
  17.   "_as_output_buffer",
  18.   "mWorkletNode",
  19.   "mModulePolling",
  20.   "mModuleLoading",
  21.   "mStartInterval",
  22.   "mStopInterval",
  23.   "mSuspendInterval",
  24.   "mResumeInterval",
  25.   "mWorkletNodeConnected",
  26.   "mContext",
  27.   "mAddModuleRef",
  28.   "FMOD_JS_MixerSlowpathFunction",
  29.   "FMOD_JS_MixerFastpathFunction",
  30.   "mSpeakerChannelCount",
  31.   "mUrl",
  32.   "mOutputData",
  33.   "mSharedArrayBuffers",
  34.   "OutputAudioWorklet_resumeAudio",
  35.   "waitForAudioWorklet",
  36.   "readline",
  37.   "FinalizationGroup",
  38.   "dateNow",
  39.   "MozBlobBuilder",
  40.   "WebKitBlobBuilder",
  41.   "Fibers",
  42. ];
  43.  
  44. undefVars.forEach((undefVar) => {
  45.   if (typeof window[undefVar] === "undefined") {
  46.     window[undefVar] = undefined;
  47.   }
  48. });
  49.  
  50. var FMODModule = (function () {
  51.   var _scriptDir =
  52.     typeof document !== "undefined" && document.currentScript
  53.       ? document.currentScript.src
  54.       : undefined;
  55.   if (typeof __filename !== "undefined") _scriptDir = _scriptDir || __filename;
  56.   return function (FMODModule) {
  57.     FMODModule = FMODModule || {};
  58.  
  59.     var Module = typeof FMODModule !== "undefined" ? FMODModule : {};
  60.     var readyPromiseResolve, readyPromiseReject;
  61.     Module["ready"] = new Promise(function (resolve, reject) {
  62.       readyPromiseResolve = resolve;
  63.       readyPromiseReject = reject;
  64.     });
  65.     var moduleOverrides = {};
  66.     var key;
  67.     for (key in Module) {
  68.       if (Module.hasOwnProperty(key)) {
  69.         moduleOverrides[key] = Module[key];
  70.       }
  71.     }
  72.     var arguments_ = [];
  73.     var thisProgram = "./this.program";
  74.     var quit_ = function (status, toThrow) {
  75.       throw toThrow;
  76.     };
  77.     var ENVIRONMENT_IS_WEB = false;
  78.     var ENVIRONMENT_IS_WORKER = false;
  79.     var ENVIRONMENT_IS_NODE = false;
  80.     var ENVIRONMENT_IS_SHELL = false;
  81.     ENVIRONMENT_IS_WEB = typeof window === "object";
  82.     ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  83.     ENVIRONMENT_IS_NODE =
  84.       typeof process === "object" &&
  85.       typeof process.versions === "object" &&
  86.       typeof process.versions.node === "string";
  87.     ENVIRONMENT_IS_SHELL =
  88.       !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
  89.     var scriptDirectory = "";
  90.     function locateFile(path) {
  91.       if (Module["locateFile"]) {
  92.         return Module["locateFile"](path, scriptDirectory);
  93.       }
  94.       return scriptDirectory + path;
  95.     }
  96.     var read_, readAsync, readBinary, setWindowTitle;
  97.     var nodeFS;
  98.     var nodePath;
  99.     if (ENVIRONMENT_IS_NODE) {
  100.       if (ENVIRONMENT_IS_WORKER) {
  101.         scriptDirectory = require("path").dirname(scriptDirectory) + "/";
  102.       } else {
  103.         scriptDirectory = __dirname + "/";
  104.       }
  105.       read_ = function shell_read(filename, binary) {
  106.         if (!nodeFS) nodeFS = require("fs");
  107.         if (!nodePath) nodePath = require("path");
  108.         filename = nodePath["normalize"](filename);
  109.         return nodeFS["readFileSync"](filename, binary ? null : "utf8");
  110.       };
  111.       readBinary = function readBinary(filename) {
  112.         var ret = read_(filename, true);
  113.         if (!ret.buffer) {
  114.           ret = new Uint8Array(ret);
  115.         }
  116.         assert(ret.buffer);
  117.         return ret;
  118.       };
  119.       if (process["argv"].length > 1) {
  120.         thisProgram = process["argv"][1].replace(/\\/g, "/");
  121.       }
  122.       arguments_ = process["argv"].slice(2);
  123.       process["on"]("uncaughtException", function (ex) {
  124.         if (!(ex instanceof ExitStatus)) {
  125.           throw ex;
  126.         }
  127.       });
  128.       process["on"]("unhandledRejection", abort);
  129.       quit_ = function (status) {
  130.         process["exit"](status);
  131.       };
  132.       Module["inspect"] = function () {
  133.         return "[Emscripten Module object]";
  134.       };
  135.     } else if (ENVIRONMENT_IS_SHELL) {
  136.       if (typeof read != "undefined") {
  137.         read_ = function shell_read(f) {
  138.           return read(f);
  139.         };
  140.       }
  141.       readBinary = function readBinary(f) {
  142.         var data;
  143.         if (typeof readbuffer === "function") {
  144.           return new Uint8Array(readbuffer(f));
  145.         }
  146.         data = read(f, "binary");
  147.         assert(typeof data === "object");
  148.         return data;
  149.       };
  150.       if (typeof scriptArgs != "undefined") {
  151.         arguments_ = scriptArgs;
  152.       } else if (typeof arguments != "undefined") {
  153.         arguments_ = arguments;
  154.       }
  155.       if (typeof quit === "function") {
  156.         quit_ = function (status) {
  157.           quit(status);
  158.         };
  159.       }
  160.       if (typeof print !== "undefined") {
  161.         if (typeof console === "undefined") console = {};
  162.         console.log = print;
  163.         console.warn = console.error =
  164.           typeof printErr !== "undefined" ? printErr : print;
  165.       }
  166.     } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  167.       if (ENVIRONMENT_IS_WORKER) {
  168.         scriptDirectory = self.location.href;
  169.       } else if (typeof document !== "undefined" && document.currentScript) {
  170.         scriptDirectory = document.currentScript.src;
  171.       }
  172.       if (_scriptDir) {
  173.         scriptDirectory = _scriptDir;
  174.       }
  175.       if (scriptDirectory.indexOf("blob:") !== 0) {
  176.         scriptDirectory = scriptDirectory.substr(
  177.           0,
  178.           scriptDirectory.lastIndexOf("/") + 1
  179.         );
  180.       } else {
  181.         scriptDirectory = "";
  182.       }
  183.       {
  184.         read_ = function (url) {
  185.           var xhr = new XMLHttpRequest();
  186.           xhr.open("GET", url, false);
  187.           xhr.send(null);
  188.           return xhr.responseText;
  189.         };
  190.         if (ENVIRONMENT_IS_WORKER) {
  191.           readBinary = function (url) {
  192.             var xhr = new XMLHttpRequest();
  193.             xhr.open("GET", url, false);
  194.             xhr.responseType = "arraybuffer";
  195.             xhr.send(null);
  196.             return new Uint8Array(xhr.response);
  197.           };
  198.         }
  199.         readAsync = function (url, onload, onerror) {
  200.           var xhr = new XMLHttpRequest();
  201.           xhr.open("GET", url, true);
  202.           xhr.responseType = "arraybuffer";
  203.           xhr.onload = function () {
  204.             if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
  205.               onload(xhr.response);
  206.               return;
  207.             }
  208.             onerror();
  209.           };
  210.           xhr.onerror = onerror;
  211.           xhr.send(null);
  212.         };
  213.       }
  214.       setWindowTitle = function (title) {
  215.         document.title = title;
  216.       };
  217.     } else {
  218.     }
  219.     var out = Module["print"] || console.log.bind(console);
  220.     var err = Module["printErr"] || console.warn.bind(console);
  221.     for (key in moduleOverrides) {
  222.       if (moduleOverrides.hasOwnProperty(key)) {
  223.         Module[key] = moduleOverrides[key];
  224.       }
  225.     }
  226.     moduleOverrides = null;
  227.     if (Module["arguments"]) arguments_ = Module["arguments"];
  228.     if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
  229.     if (Module["quit"]) quit_ = Module["quit"];
  230.     var STACK_ALIGN = 16;
  231.     function alignMemory(size, factor) {
  232.       if (!factor) factor = STACK_ALIGN;
  233.       return Math.ceil(size / factor) * factor;
  234.     }
  235.     function warnOnce(text) {
  236.       if (!warnOnce.shown) warnOnce.shown = {};
  237.       if (!warnOnce.shown[text]) {
  238.         warnOnce.shown[text] = 1;
  239.         err(text);
  240.       }
  241.     }
  242.     var tempRet0 = 0;
  243.     var setTempRet0 = function (value) {
  244.       tempRet0 = value;
  245.     };
  246.     var wasmBinary;
  247.     if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"];
  248.     var noExitRuntime = Module["noExitRuntime"] || true;
  249.     if (typeof WebAssembly !== "object") {
  250.       abort("no native wasm support detected");
  251.     }
  252.     function setValue(ptr, value, type, noSafe) {
  253.       type = type || "i8";
  254.       if (type.charAt(type.length - 1) === "*") type = "i32";
  255.       switch (type) {
  256.         case "i1":
  257.           HEAP8[ptr >> 0] = value;
  258.           break;
  259.         case "i8":
  260.           HEAP8[ptr >> 0] = value;
  261.           break;
  262.         case "i16":
  263.           HEAP16[ptr >> 1] = value;
  264.           break;
  265.         case "i32":
  266.           HEAP32[ptr >> 2] = value;
  267.           break;
  268.         case "i64":
  269.           (tempI64 = [
  270.             value >>> 0,
  271.             ((tempDouble = value),
  272.             +Math.abs(tempDouble) >= 1
  273.               ? tempDouble > 0
  274.                 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) |
  275.                     0) >>>
  276.                   0
  277.                 : ~~+Math.ceil(
  278.                     (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
  279.                   ) >>> 0
  280.               : 0),
  281.           ]),
  282.             (HEAP32[ptr >> 2] = tempI64[0]),
  283.             (HEAP32[(ptr + 4) >> 2] = tempI64[1]);
  284.           break;
  285.         case "float":
  286.           HEAPF32[ptr >> 2] = value;
  287.           break;
  288.         case "double":
  289.           HEAPF64[ptr >> 3] = value;
  290.           break;
  291.         default:
  292.           abort("invalid type for setValue: " + type);
  293.       }
  294.     }
  295.     function getValue(ptr, type, noSafe) {
  296.       type = type || "i8";
  297.       if (type.charAt(type.length - 1) === "*") type = "i32";
  298.       switch (type) {
  299.         case "i1":
  300.           return HEAP8[ptr >> 0];
  301.         case "i8":
  302.           return HEAP8[ptr >> 0];
  303.         case "i16":
  304.           return HEAP16[ptr >> 1];
  305.         case "i32":
  306.           return HEAP32[ptr >> 2];
  307.         case "i64":
  308.           return HEAP32[ptr >> 2];
  309.         case "float":
  310.           return HEAPF32[ptr >> 2];
  311.         case "double":
  312.           return HEAPF64[ptr >> 3];
  313.         default:
  314.           abort("invalid type for getValue: " + type);
  315.       }
  316.       return null;
  317.     }
  318.     var wasmMemory;
  319.     var ABORT = false;
  320.     var EXITSTATUS;
  321.     function assert(condition, text) {
  322.       if (!condition) {
  323.         abort("Assertion failed: " + text);
  324.       }
  325.     }
  326.     function getCFunc(ident) {
  327.       var func = Module["_" + ident];
  328.       assert(
  329.         func,
  330.         "Cannot call unknown function " + ident + ", make sure it is exported"
  331.       );
  332.       return func;
  333.     }
  334.     function ccall(ident, returnType, argTypes, args, opts) {
  335.       var toC = {
  336.         string: function (str) {
  337.           var ret = 0;
  338.           if (str !== null && str !== undefined && str !== 0) {
  339.             var len = (str.length << 2) + 1;
  340.             ret = stackAlloc(len);
  341.             stringToUTF8(str, ret, len);
  342.           }
  343.           return ret;
  344.         },
  345.         array: function (arr) {
  346.           var ret = stackAlloc(arr.length);
  347.           writeArrayToMemory(arr, ret);
  348.           return ret;
  349.         },
  350.       };
  351.       function convertReturnValue(ret) {
  352.         if (returnType === "string") return UTF8ToString(ret);
  353.         if (returnType === "boolean") return Boolean(ret);
  354.         return ret;
  355.       }
  356.       var func = getCFunc(ident);
  357.       var cArgs = [];
  358.       var stack = 0;
  359.       if (args) {
  360.         for (var i = 0; i < args.length; i++) {
  361.           var converter = toC[argTypes[i]];
  362.           if (converter) {
  363.             if (stack === 0) stack = stackSave();
  364.             cArgs[i] = converter(args[i]);
  365.           } else {
  366.             cArgs[i] = args[i];
  367.           }
  368.         }
  369.       }
  370.       var ret = func.apply(null, cArgs);
  371.       var asyncMode = opts && opts.async;
  372.       var runningAsync = typeof Asyncify === "object" && Asyncify.currData;
  373.       var prevRunningAsync =
  374.         typeof Asyncify === "object" && Asyncify.asyncFinalizers.length > 0;
  375.       if (runningAsync && !prevRunningAsync) {
  376.         return new Promise(function (resolve) {
  377.           Asyncify.asyncFinalizers.push(function (ret) {
  378.             if (stack !== 0) stackRestore(stack);
  379.             resolve(convertReturnValue(ret));
  380.           });
  381.         });
  382.       }
  383.       ret = convertReturnValue(ret);
  384.       if (stack !== 0) stackRestore(stack);
  385.       if (opts && opts.async) return Promise.resolve(ret);
  386.       return ret;
  387.     }
  388.     function cwrap(ident, returnType, argTypes, opts) {
  389.       argTypes = argTypes || [];
  390.       var numericArgs = argTypes.every(function (type) {
  391.         return type === "number";
  392.       });
  393.       var numericRet = returnType !== "string";
  394.       if (numericRet && numericArgs && !opts) {
  395.         return getCFunc(ident);
  396.       }
  397.       return function () {
  398.         return ccall(ident, returnType, argTypes, arguments, opts);
  399.       };
  400.     }
  401.     var UTF8Decoder =
  402.       typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  403.     function UTF8ArrayToString(heap, idx, maxBytesToRead) {
  404.       var endIdx = idx + maxBytesToRead;
  405.       var endPtr = idx;
  406.       var str = "";
  407.       while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
  408.       if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
  409.         return UTF8Decoder.decode(heap.subarray(idx, endPtr));
  410.       } else {
  411.         while (idx < endPtr) {
  412.           var u0 = heap[idx++];
  413.           if (!(u0 & 128)) {
  414.             str += String.fromCharCode(u0);
  415.             continue;
  416.           }
  417.           var u1 = heap[idx++] & 63;
  418.           if ((u0 & 224) == 192) {
  419.             str += String.fromCharCode(((u0 & 31) << 6) | u1);
  420.             continue;
  421.           }
  422.           var u2 = heap[idx++] & 63;
  423.           if ((u0 & 240) == 224) {
  424.             u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
  425.           } else {
  426.             u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);
  427.           }
  428.           if (u0 < 65536) {
  429.             str += String.fromCharCode(u0);
  430.           } else {
  431.             var ch = u0 - 65536;
  432.             str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
  433.           }
  434.         }
  435.       }
  436.       return str;
  437.     }
  438.     function UTF8ToString(ptr, maxBytesToRead) {
  439.       return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
  440.     }
  441.     function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
  442.       if (!(maxBytesToWrite > 0)) return 0;
  443.       var startIdx = outIdx;
  444.       var endIdx = outIdx + maxBytesToWrite - 1;
  445.       for (var i = 0; i < str.length; ++i) {
  446.         var u = str.charCodeAt(i);
  447.         if (u >= 55296 && u <= 57343) {
  448.           var u1 = str.charCodeAt(++i);
  449.           u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);
  450.         }
  451.         if (u <= 127) {
  452.           if (outIdx >= endIdx) break;
  453.           heap[outIdx++] = u;
  454.         } else if (u <= 2047) {
  455.           if (outIdx + 1 >= endIdx) break;
  456.           heap[outIdx++] = 192 | (u >> 6);
  457.           heap[outIdx++] = 128 | (u & 63);
  458.         } else if (u <= 65535) {
  459.           if (outIdx + 2 >= endIdx) break;
  460.           heap[outIdx++] = 224 | (u >> 12);
  461.           heap[outIdx++] = 128 | ((u >> 6) & 63);
  462.           heap[outIdx++] = 128 | (u & 63);
  463.         } else {
  464.           if (outIdx + 3 >= endIdx) break;
  465.           heap[outIdx++] = 240 | (u >> 18);
  466.           heap[outIdx++] = 128 | ((u >> 12) & 63);
  467.           heap[outIdx++] = 128 | ((u >> 6) & 63);
  468.           heap[outIdx++] = 128 | (u & 63);
  469.         }
  470.       }
  471.       heap[outIdx] = 0;
  472.       return outIdx - startIdx;
  473.     }
  474.     function stringToUTF8(str, outPtr, maxBytesToWrite) {
  475.       return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
  476.     }
  477.     function lengthBytesUTF8(str) {
  478.       var len = 0;
  479.       for (var i = 0; i < str.length; ++i) {
  480.         var u = str.charCodeAt(i);
  481.         if (u >= 55296 && u <= 57343)
  482.           u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023);
  483.         if (u <= 127) ++len;
  484.         else if (u <= 2047) len += 2;
  485.         else if (u <= 65535) len += 3;
  486.         else len += 4;
  487.       }
  488.       return len;
  489.     }
  490.     var UTF16Decoder =
  491.       typeof TextDecoder !== "undefined"
  492.         ? new TextDecoder("utf-16le")
  493.         : undefined;
  494.     function UTF16ToString(ptr, maxBytesToRead) {
  495.       var endPtr = ptr;
  496.       var idx = endPtr >> 1;
  497.       var maxIdx = idx + maxBytesToRead / 2;
  498.       while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
  499.       endPtr = idx << 1;
  500.       if (endPtr - ptr > 32 && UTF16Decoder) {
  501.         return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
  502.       } else {
  503.         var str = "";
  504.         for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
  505.           var codeUnit = HEAP16[(ptr + i * 2) >> 1];
  506.           if (codeUnit == 0) break;
  507.           str += String.fromCharCode(codeUnit);
  508.         }
  509.         return str;
  510.       }
  511.     }
  512.     function stringToUTF16(str, outPtr, maxBytesToWrite) {
  513.       if (maxBytesToWrite === undefined) {
  514.         maxBytesToWrite = 2147483647;
  515.       }
  516.       if (maxBytesToWrite < 2) return 0;
  517.       maxBytesToWrite -= 2;
  518.       var startPtr = outPtr;
  519.       var numCharsToWrite =
  520.         maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;
  521.       for (var i = 0; i < numCharsToWrite; ++i) {
  522.         var codeUnit = str.charCodeAt(i);
  523.         HEAP16[outPtr >> 1] = codeUnit;
  524.         outPtr += 2;
  525.       }
  526.       HEAP16[outPtr >> 1] = 0;
  527.       return outPtr - startPtr;
  528.     }
  529.     function lengthBytesUTF16(str) {
  530.       return str.length * 2;
  531.     }
  532.     function UTF32ToString(ptr, maxBytesToRead) {
  533.       var i = 0;
  534.       var str = "";
  535.       while (!(i >= maxBytesToRead / 4)) {
  536.         var utf32 = HEAP32[(ptr + i * 4) >> 2];
  537.         if (utf32 == 0) break;
  538.         ++i;
  539.         if (utf32 >= 65536) {
  540.           var ch = utf32 - 65536;
  541.           str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
  542.         } else {
  543.           str += String.fromCharCode(utf32);
  544.         }
  545.       }
  546.       return str;
  547.     }
  548.     function stringToUTF32(str, outPtr, maxBytesToWrite) {
  549.       if (maxBytesToWrite === undefined) {
  550.         maxBytesToWrite = 2147483647;
  551.       }
  552.       if (maxBytesToWrite < 4) return 0;
  553.       var startPtr = outPtr;
  554.       var endPtr = startPtr + maxBytesToWrite - 4;
  555.       for (var i = 0; i < str.length; ++i) {
  556.         var codeUnit = str.charCodeAt(i);
  557.         if (codeUnit >= 55296 && codeUnit <= 57343) {
  558.           var trailSurrogate = str.charCodeAt(++i);
  559.           codeUnit =
  560.             (65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023);
  561.         }
  562.         HEAP32[outPtr >> 2] = codeUnit;
  563.         outPtr += 4;
  564.         if (outPtr + 4 > endPtr) break;
  565.       }
  566.       HEAP32[outPtr >> 2] = 0;
  567.       return outPtr - startPtr;
  568.     }
  569.     function lengthBytesUTF32(str) {
  570.       var len = 0;
  571.       for (var i = 0; i < str.length; ++i) {
  572.         var codeUnit = str.charCodeAt(i);
  573.         if (codeUnit >= 55296 && codeUnit <= 57343) ++i;
  574.         len += 4;
  575.       }
  576.       return len;
  577.     }
  578.     function writeArrayToMemory(array, buffer) {
  579.       HEAP8.set(array, buffer);
  580.     }
  581.     function alignUp(x, multiple) {
  582.       if (x % multiple > 0) {
  583.         x += multiple - (x % multiple);
  584.       }
  585.       return x;
  586.     }
  587.     var buffer,
  588.       HEAP8,
  589.       HEAPU8,
  590.       HEAP16,
  591.       HEAPU16,
  592.       HEAP32,
  593.       HEAPU32,
  594.       HEAPF32,
  595.       HEAPF64;
  596.     function updateGlobalBufferAndViews(buf) {
  597.       buffer = buf;
  598.       Module["HEAP8"] = HEAP8 = new Int8Array(buf);
  599.       Module["HEAP16"] = HEAP16 = new Int16Array(buf);
  600.       Module["HEAP32"] = HEAP32 = new Int32Array(buf);
  601.       Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf);
  602.       Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf);
  603.       Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf);
  604.       Module["HEAPF32"] = HEAPF32 = new Float32Array(buf);
  605.       Module["HEAPF64"] = HEAPF64 = new Float64Array(buf);
  606.     }
  607.     var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216;
  608.     var wasmTable;
  609.     var __ATPRERUN__ = [];
  610.     var __ATINIT__ = [];
  611.     var __ATPOSTRUN__ = [];
  612.     var runtimeInitialized = false;
  613.     var runtimeExited = false;
  614.     function preRun() {
  615.       if (Module["preRun"]) {
  616.         if (typeof Module["preRun"] == "function")
  617.           Module["preRun"] = [Module["preRun"]];
  618.         while (Module["preRun"].length) {
  619.           addOnPreRun(Module["preRun"].shift());
  620.         }
  621.       }
  622.       callRuntimeCallbacks(__ATPRERUN__);
  623.     }
  624.     function initRuntime() {
  625.       runtimeInitialized = true;
  626.       if (!Module["noFSInit"] && !FS.init.initialized) FS.init();
  627.       TTY.init();
  628.       callRuntimeCallbacks(__ATINIT__);
  629.     }
  630.     function exitRuntime() {
  631.       runtimeExited = true;
  632.     }
  633.     function postRun() {
  634.       if (Module["postRun"]) {
  635.         if (typeof Module["postRun"] == "function")
  636.           Module["postRun"] = [Module["postRun"]];
  637.         while (Module["postRun"].length) {
  638.           addOnPostRun(Module["postRun"].shift());
  639.         }
  640.       }
  641.       callRuntimeCallbacks(__ATPOSTRUN__);
  642.     }
  643.     function addOnPreRun(cb) {
  644.       __ATPRERUN__.unshift(cb);
  645.     }
  646.     function addOnInit(cb) {
  647.       __ATINIT__.unshift(cb);
  648.     }
  649.     function addOnPostRun(cb) {
  650.       __ATPOSTRUN__.unshift(cb);
  651.     }
  652.     var runDependencies = 0;
  653.     var runDependencyWatcher = null;
  654.     var dependenciesFulfilled = null;
  655.     function getUniqueRunDependency(id) {
  656.       return id;
  657.     }
  658.     function addRunDependency(id) {
  659.       runDependencies++;
  660.       if (Module["monitorRunDependencies"]) {
  661.         Module["monitorRunDependencies"](runDependencies);
  662.       }
  663.     }
  664.     function removeRunDependency(id) {
  665.       runDependencies--;
  666.       if (Module["monitorRunDependencies"]) {
  667.         Module["monitorRunDependencies"](runDependencies);
  668.       }
  669.       if (runDependencies == 0) {
  670.         if (runDependencyWatcher !== null) {
  671.           clearInterval(runDependencyWatcher);
  672.           runDependencyWatcher = null;
  673.         }
  674.         if (dependenciesFulfilled) {
  675.           var callback = dependenciesFulfilled;
  676.           dependenciesFulfilled = null;
  677.           callback();
  678.         }
  679.       }
  680.     }
  681.     Module["preloadedImages"] = {};
  682.     Module["preloadedAudios"] = {};
  683.     function abort(what) {
  684.       if (Module["onAbort"]) {
  685.         Module["onAbort"](what);
  686.       }
  687.       what += "";
  688.       err(what);
  689.       ABORT = true;
  690.       EXITSTATUS = 1;
  691.       what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
  692.       var e = new WebAssembly.RuntimeError(what);
  693.       readyPromiseReject(e);
  694.       throw e;
  695.     }
  696.     var dataURIPrefix = "data:application/octet-stream;base64,";
  697.     function isDataURI(filename) {
  698.       return filename.startsWith(dataURIPrefix);
  699.     }
  700.     function isFileURI(filename) {
  701.       return filename.startsWith("file://");
  702.     }
  703.     var wasmBinaryFile = "fmodstudio.wasm";
  704.     if (!isDataURI(wasmBinaryFile)) {
  705.       wasmBinaryFile = locateFile(wasmBinaryFile);
  706.     }
  707.     function getBinary(file) {
  708.       try {
  709.         if (file == wasmBinaryFile && wasmBinary) {
  710.           return new Uint8Array(wasmBinary);
  711.         }
  712.         if (readBinary) {
  713.           return readBinary(file);
  714.         } else {
  715.           throw "both async and sync fetching of the wasm failed";
  716.         }
  717.       } catch (err) {
  718.         abort(err);
  719.       }
  720.     }
  721.     function getBinaryPromise() {
  722.       if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
  723.         if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) {
  724.           return fetch(wasmBinaryFile, { credentials: "same-origin" })
  725.             .then(function (response) {
  726.               if (!response["ok"]) {
  727.                 throw (
  728.                   "failed to load wasm binary file at '" + wasmBinaryFile + "'"
  729.                 );
  730.               }
  731.               return response["arrayBuffer"]();
  732.             })
  733.             .catch(function () {
  734.               return getBinary(wasmBinaryFile);
  735.             });
  736.         } else {
  737.           if (readAsync) {
  738.             return new Promise(function (resolve, reject) {
  739.               readAsync(
  740.                 wasmBinaryFile,
  741.                 function (response) {
  742.                   resolve(new Uint8Array(response));
  743.                 },
  744.                 reject
  745.               );
  746.             });
  747.           }
  748.         }
  749.       }
  750.       return Promise.resolve().then(function () {
  751.         return getBinary(wasmBinaryFile);
  752.       });
  753.     }
  754.     function createWasm() {
  755.       var info = { a: asmLibraryArg };
  756.       function receiveInstance(instance, module) {
  757.         var exports = instance.exports;
  758.         exports = Asyncify.instrumentWasmExports(exports);
  759.         Module["asm"] = exports;
  760.         wasmMemory = Module["asm"]["Q"];
  761.         updateGlobalBufferAndViews(wasmMemory.buffer);
  762.         wasmTable = Module["asm"]["S"];
  763.         addOnInit(Module["asm"]["R"]);
  764.         removeRunDependency("wasm-instantiate");
  765.       }
  766.       addRunDependency("wasm-instantiate");
  767.       function receiveInstantiationResult(result) {
  768.         receiveInstance(result["instance"]);
  769.       }
  770.       function instantiateArrayBuffer(receiver) {
  771.         return getBinaryPromise()
  772.           .then(function (binary) {
  773.             var result = WebAssembly.instantiate(binary, info);
  774.             return result;
  775.           })
  776.           .then(receiver, function (reason) {
  777.             err("failed to asynchronously prepare wasm: " + reason);
  778.             abort(reason);
  779.           });
  780.       }
  781.       function instantiateAsync() {
  782.         if (
  783.           !wasmBinary &&
  784.           typeof WebAssembly.instantiateStreaming === "function" &&
  785.           !isDataURI(wasmBinaryFile) &&
  786.           !isFileURI(wasmBinaryFile) &&
  787.           typeof fetch === "function"
  788.         ) {
  789.           return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(
  790.             function (response) {
  791.               var result = WebAssembly.instantiateStreaming(response, info);
  792.               return result.then(receiveInstantiationResult, function (reason) {
  793.                 err("wasm streaming compile failed: " + reason);
  794.                 err("falling back to ArrayBuffer instantiation");
  795.                 return instantiateArrayBuffer(receiveInstantiationResult);
  796.               });
  797.             }
  798.           );
  799.         } else {
  800.           return instantiateArrayBuffer(receiveInstantiationResult);
  801.         }
  802.       }
  803.       if (Module["instantiateWasm"]) {
  804.         try {
  805.           var exports = Module["instantiateWasm"](info, receiveInstance);
  806.           exports = Asyncify.instrumentWasmExports(exports);
  807.           return exports;
  808.         } catch (e) {
  809.           err("Module.instantiateWasm callback failed with error: " + e);
  810.           return false;
  811.         }
  812.       }
  813.       instantiateAsync().catch(readyPromiseReject);
  814.       return {};
  815.     }
  816.     var tempDouble;
  817.     var tempI64;
  818.     var ASM_CONSTS = {
  819.       284148: function () {
  820.         contextForCheck = new (window.AudioContext ||
  821.           window.webkitAudioContext)();
  822.         if (!contextForCheck) {
  823.           return 0;
  824.         }
  825.         retValue = 0;
  826.         if (self.AudioWorkletNode) {
  827.           if (contextForCheck.audioWorklet.addModule) {
  828.             retValue = 1;
  829.           }
  830.         }
  831.         contextForCheck.close();
  832.         null;
  833.         return retValue;
  834.       },
  835.       284437: function () {
  836.         infocontext = new (window.AudioContext || window.webkitAudioContext)();
  837.         if (!infocontext) {
  838.           return 0;
  839.         }
  840.         inforate = infocontext.sampleRate;
  841.         infocontext.close();
  842.         null;
  843.         return inforate;
  844.       },
  845.       284638: function () {
  846.         mInputRegistered = false;
  847.       },
  848.       284668: function () {
  849.         context = new (window.AudioContext || window.webkitAudioContext)();
  850.         if (!context) {
  851.           return 0;
  852.         }
  853.         FMOD_JS_MixFunction = Module.cwrap("FMOD_JS_MixFunction", "void", [
  854.           "number",
  855.         ]);
  856.         return context.sampleRate;
  857.       },
  858.       284874: function ($0, $1) {
  859.         _as_script_node = context.createScriptProcessor($1, 0, $0);
  860.       },
  861.       284938: function () {
  862.         window.addEventListener("touchend", OutputWebAudio_resumeAudio, false);
  863.         window.addEventListener("click", OutputWebAudio_resumeAudio, false);
  864.         mInputRegistered = true;
  865.       },
  866.       285108: function () {
  867.         if (mInputRegistered) {
  868.           mInputRegistered = false;
  869.           window.removeEventListener(
  870.             "click",
  871.             OutputWebAudio_resumeAudio,
  872.             false
  873.           );
  874.           window.removeEventListener(
  875.             "touchend",
  876.             OutputWebAudio_resumeAudio,
  877.             false
  878.           );
  879.         }
  880.       },
  881.       285311: function () {
  882.         _as_script_node.connect(context.destination);
  883.         _as_script_node.onaudioprocess = function (audioProcessingEvent) {
  884.           _as_output_buffer = audioProcessingEvent.outputBuffer;
  885.           FMOD_JS_MixFunction(_as_output_buffer.getChannelData(0).length);
  886.         };
  887.       },
  888.       285549: function () {
  889.         _as_script_node.disconnect(context.destination);
  890.       },
  891.       285602: function ($0, $1, $2, $3) {
  892.         var data = HEAPF32.subarray($0 / 4, $0 / 4 + $2 * $3);
  893.         for (var channel = 0; channel < $3; channel++) {
  894.           var outputData = _as_output_buffer.getChannelData(channel);
  895.           for (var sample = 0; sample < $2; sample++) {
  896.             outputData[sample + $1] = data[sample * $3 + channel];
  897.           }
  898.         }
  899.       },
  900.       285877: function () {
  901.         context.suspend();
  902.       },
  903.       285900: function () {
  904.         context.resume();
  905.       },
  906.       285922: function () {
  907.         infocontext = new (window.AudioContext || window.webkitAudioContext)();
  908.         if (!infocontext) {
  909.           return 0;
  910.         }
  911.         inforate = infocontext.sampleRate;
  912.         infocontext.close();
  913.         null;
  914.         return inforate;
  915.       },
  916.       286123: function () {
  917.         mWorkletNode = null;
  918.         mModulePolling = false;
  919.         mModuleLoading = false;
  920.         mStartInterval = null;
  921.         mStopInterval = null;
  922.         mSuspendInterval = null;
  923.         mResumeInterval = null;
  924.         mWorkletNodeConnected = false;
  925.         mInputRegistered = false;
  926.         mContext = new (window.AudioContext || window.webkitAudioContext)();
  927.         if (!mContext) {
  928.           return 0;
  929.         }
  930.         mContext.destination.channelCount =
  931.           mContext.destination.maxChannelCount;
  932.         return mContext.destination.maxChannelCount;
  933.       },
  934.       286564: function ($0) {
  935.         const initAddModuleRef = $0;
  936.         if (!initAddModuleRef) {
  937.           mAddModuleRef = 0;
  938.         }
  939.         if (!self.AudioWorkletNode) {
  940.           return -1;
  941.         }
  942.         if (!mContext.audioWorklet.addModule) {
  943.           return -2;
  944.         }
  945.         FMOD_JS_MixerSlowpathFunction = Module.cwrap(
  946.           "FMOD_JS_MixerSlowpathFunction",
  947.           "void",
  948.           []
  949.         );
  950.         FMOD_JS_MixerFastpathFunction = Module.cwrap(
  951.           "FMOD_JS_MixerFastpathFunction",
  952.           "void",
  953.           ["number"]
  954.         );
  955.         return mContext.sampleRate;
  956.       },
  957.       286957: function ($0, $1) {
  958.         mSpeakerChannelCount = $0;
  959.         const bufferLength = $1;
  960.         mUrl = null;
  961.         mOutputData = null;
  962.         mSharedArrayBuffers = false;
  963.         if (self.SharedArrayBuffer) {
  964.           if (self.crossOriginIsolated) {
  965.             mSharedArrayBuffers = true;
  966.           }
  967.         }
  968.         if (!mSharedArrayBuffers) {
  969.           const slowCodePath = new Blob(
  970.             [
  971.               "class AudioProcessor extends AudioWorkletProcessor",
  972.               "{",
  973.               "constructor(options)",
  974.               "{",
  975.               "super();",
  976.               "this.payload = [null, null];",
  977.               "this.bufferFlag = 0;",
  978.               "this.dataFlag = 0;",
  979.               "this.bufferIndex = 0;",
  980.               "this.bufferSize = 0;",
  981.               "this.channelCount = options.outputChannelCount;",
  982.               "this.port.onmessage = (event) => {",
  983.               "const { data } = event;",
  984.               "if (data)",
  985.               "{",
  986.               "this.payload[this.dataFlag] = new Float32Array(data);",
  987.               "this.bufferSize = data.length / this.channelCount;",
  988.               "}",
  989.               "else",
  990.               "{",
  991.               "this.payload[this.dataFlag] = null;",
  992.               "}",
  993.               "this.dataFlag ^= 1;",
  994.               "};",
  995.               "}",
  996.               "process(inputs, outputs, parameters)",
  997.               "{",
  998.               "const output = outputs[0];",
  999.               "if (this.payload[this.bufferFlag]) {",
  1000.               "if (this.bufferIndex === 0) {",
  1001.               "this.port.postMessage(this.bufferSize);",
  1002.               "}",
  1003.               "const bufferSliceEnd = this.bufferSize / output[0].length;",
  1004.               "const sliceOffset = output[0].length * this.bufferIndex;",
  1005.               "for (let channel = 0; channel < output.length; ++channel) {",
  1006.               "const outputChannel = output[channel];",
  1007.               "const indexOffset = this.bufferSize * channel + sliceOffset;",
  1008.               "outputChannel.set(new Float32Array(this.payload[this.bufferFlag].slice(0 + indexOffset, outputChannel.length + indexOffset)));",
  1009.               "}",
  1010.               "this.bufferIndex++;",
  1011.               "if (this.bufferIndex === bufferSliceEnd) {",
  1012.               "this.bufferIndex = 0;",
  1013.               "this.bufferFlag ^= 1;",
  1014.               "}",
  1015.               "}",
  1016.               "return true;",
  1017.               "}",
  1018.               "}",
  1019.               "registerProcessor('audio-processor', AudioProcessor);",
  1020.             ],
  1021.             { type: "application/javascript" }
  1022.           );
  1023.           mUrl = URL.createObjectURL(slowCodePath);
  1024.           mOutputData = new Float32Array(mSpeakerChannelCount * bufferLength);
  1025.         } else {
  1026.           const fastCodePath = new Blob(
  1027.             [
  1028.               "class AudioProcessor extends AudioWorkletProcessor",
  1029.               "{",
  1030.               "constructor(options)",
  1031.               "{",
  1032.               "super();",
  1033.               "this.payload = null;",
  1034.               "this.bufferFlag = 0;",
  1035.               "this.bufferIndex = 0;",
  1036.               "this.bufferSize = 0;",
  1037.               "this.bufferOffset = 0;",
  1038.               "this.channelCount = options.outputChannelCount;",
  1039.               "this.port.onmessage = (event) => {",
  1040.               "const { data } = event;",
  1041.               "if (data)",
  1042.               "{",
  1043.               "this.payload = data;",
  1044.               "this.bufferSize = this.payload.length / (this.channelCount * 2);",
  1045.               "this.bufferOffset = this.payload.length / 2;",
  1046.               "}",
  1047.               "else",
  1048.               "{",
  1049.               "this.payload = null;",
  1050.               "}",
  1051.               "};",
  1052.               "}",
  1053.               "process(inputs, outputs, parameters)",
  1054.               "{",
  1055.               "const output = outputs[0];",
  1056.               "if (this.payload) {",
  1057.               "if (this.bufferIndex === 0) {",
  1058.               "this.port.postMessage(this.bufferFlag ^ 1);",
  1059.               "}",
  1060.               "const bufferSliceEnd = this.bufferSize / output[0].length;",
  1061.               "const sliceOffset = output[0].length * this.bufferIndex + this.bufferOffset * this.bufferFlag;",
  1062.               "for (let channel = 0; channel < output.length; ++channel) {",
  1063.               "const outputChannel = output[channel];",
  1064.               "const indexOffset = this.bufferSize * channel + sliceOffset;",
  1065.               "outputChannel.set(new Float32Array(this.payload.slice(0 + indexOffset, outputChannel.length + indexOffset)));",
  1066.               "}",
  1067.               "this.bufferIndex++;",
  1068.               "if (this.bufferIndex === bufferSliceEnd) {",
  1069.               "this.bufferIndex = 0;",
  1070.               "this.bufferFlag ^= 1;",
  1071.               "}",
  1072.               "}",
  1073.               "return true;",
  1074.               "}",
  1075.               "}",
  1076.               "registerProcessor('audio-processor', AudioProcessor);",
  1077.             ],
  1078.             { type: "application/javascript" }
  1079.           );
  1080.           mUrl = URL.createObjectURL(fastCodePath);
  1081.           mOutputData = new Float32Array(
  1082.             new SharedArrayBuffer(
  1083.               Float32Array.BYTES_PER_ELEMENT *
  1084.                 mSpeakerChannelCount *
  1085.                 bufferLength *
  1086.                 2
  1087.             )
  1088.           );
  1089.         }
  1090.         mModulePolling = true;
  1091.         return mSharedArrayBuffers;
  1092.       },
  1093.       290484: function () {
  1094.         window.addEventListener(
  1095.           "touchend",
  1096.           OutputAudioWorklet_resumeAudio,
  1097.           false
  1098.         );
  1099.         window.addEventListener("click", OutputAudioWorklet_resumeAudio, false);
  1100.         mInputRegistered = true;
  1101.       },
  1102.       290662: function () {
  1103.         if (mStartInterval) {
  1104.           clearInterval(mStartInterval);
  1105.         }
  1106.         if (mStopInterval) {
  1107.           clearInterval(mStopInterval);
  1108.         }
  1109.         if (mSuspendInterval) {
  1110.           clearInterval(mSuspendInterval);
  1111.         }
  1112.         if (mResumeInterval) {
  1113.           clearInterval(mResumeInterval);
  1114.         }
  1115.         if (mWorkletNode) {
  1116.           if (mWorkletNodeConnected) {
  1117.             mWorkletNode.disconnect();
  1118.           }
  1119.           null;
  1120.         }
  1121.         if (mContext) {
  1122.           mContext.close();
  1123.           null;
  1124.         }
  1125.         if (mInputRegistered) {
  1126.           mInputRegistered = false;
  1127.           window.removeEventListener(
  1128.             "click",
  1129.             OutputAudioWorklet_resumeAudio,
  1130.             false
  1131.           );
  1132.           window.removeEventListener(
  1133.             "touchend",
  1134.             OutputAudioWorklet_resumeAudio,
  1135.             false
  1136.           );
  1137.         }
  1138.       },
  1139.       291251: function () {
  1140.         mStartInterval = waitForAudioWorklet(
  1141.           function () {
  1142.             return mWorkletNode === null && mModulePolling;
  1143.           },
  1144.           function () {
  1145.             if (mWorkletNode) {
  1146.               mWorkletNode.connect(mContext.destination);
  1147.               mWorkletNodeConnected = true;
  1148.             }
  1149.           }
  1150.         );
  1151.       },
  1152.       291469: function () {
  1153.         mStopInterval = waitForAudioWorklet(
  1154.           function () {
  1155.             return (
  1156.               (mWorkletNode === null && mModulePolling) ||
  1157.               !mWorkletNodeConnected
  1158.             );
  1159.           },
  1160.           function () {
  1161.             if (mWorkletNode) {
  1162.               mWorkletNode.disconnect();
  1163.               mWorkletNodeConnected = false;
  1164.             }
  1165.           }
  1166.         );
  1167.       },
  1168.       291696: function ($0, $1, $2) {
  1169.         const buffer = $0;
  1170.         const bufferLength = $1;
  1171.         const speakerModeChannels = $2;
  1172.         var data = HEAPF32.subarray(
  1173.           buffer / 4,
  1174.           buffer / 4 + bufferLength * speakerModeChannels
  1175.         );
  1176.         for (var channel = 0; channel < speakerModeChannels; channel++) {
  1177.           const offset = channel * bufferLength;
  1178.           for (var sample = 0; sample < bufferLength; sample++) {
  1179.             mOutputData[sample + offset] =
  1180.               data[sample * speakerModeChannels + channel];
  1181.           }
  1182.         }
  1183.       },
  1184.       292116: function ($0, $1, $2, $3) {
  1185.         const buffer = $0;
  1186.         const bufferLength = $1;
  1187.         const speakerModeChannels = $2;
  1188.         const frameFlag = $3;
  1189.         var data = HEAPF32.subarray(
  1190.           buffer / 4,
  1191.           buffer / 4 + bufferLength * speakerModeChannels
  1192.         );
  1193.         const arrayOffset = speakerModeChannels * frameFlag * bufferLength;
  1194.         for (var channel = 0; channel < speakerModeChannels; channel++) {
  1195.           const offset = channel * bufferLength + arrayOffset;
  1196.           for (var sample = 0; sample < bufferLength; sample++) {
  1197.             mOutputData[sample + offset] =
  1198.               data[sample * speakerModeChannels + channel];
  1199.           }
  1200.         }
  1201.       },
  1202.       292640: function () {
  1203.         if (mContext) {
  1204.           mContext.suspend();
  1205.         }
  1206.       },
  1207.       292682: function () {
  1208.         if (mContext) {
  1209.           mContext.resume();
  1210.         }
  1211.       },
  1212.     };
  1213.     function callRuntimeCallbacks(callbacks) {
  1214.       while (callbacks.length > 0) {
  1215.         var callback = callbacks.shift();
  1216.         if (typeof callback == "function") {
  1217.           callback(Module);
  1218.           continue;
  1219.         }
  1220.         var func = callback.func;
  1221.         if (typeof func === "number") {
  1222.           if (callback.arg === undefined) {
  1223.             (function () {
  1224.               dynCall_v.call(null, func);
  1225.             })();
  1226.           } else {
  1227.             (function (a1) {
  1228.               dynCall_vi.apply(null, [func, a1]);
  1229.             })(callback.arg);
  1230.           }
  1231.         } else {
  1232.           func(callback.arg === undefined ? null : callback.arg);
  1233.         }
  1234.       }
  1235.     }
  1236.     var runtimeKeepaliveCounter = 0;
  1237.     function keepRuntimeAlive() {
  1238.       return noExitRuntime || runtimeKeepaliveCounter > 0;
  1239.     }
  1240.     function setErrNo(value) {
  1241.       HEAP32[___errno_location() >> 2] = value;
  1242.       return value;
  1243.     }
  1244.     var PATH = {
  1245.       splitPath: function (filename) {
  1246.         var splitPathRe =
  1247.           /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1248.         return splitPathRe.exec(filename).slice(1);
  1249.       },
  1250.       normalizeArray: function (parts, allowAboveRoot) {
  1251.         var up = 0;
  1252.         for (var i = parts.length - 1; i >= 0; i--) {
  1253.           var last = parts[i];
  1254.           if (last === ".") {
  1255.             parts.splice(i, 1);
  1256.           } else if (last === "..") {
  1257.             parts.splice(i, 1);
  1258.             up++;
  1259.           } else if (up) {
  1260.             parts.splice(i, 1);
  1261.             up--;
  1262.           }
  1263.         }
  1264.         if (allowAboveRoot) {
  1265.           for (; up; up--) {
  1266.             parts.unshift("..");
  1267.           }
  1268.         }
  1269.         return parts;
  1270.       },
  1271.       normalize: function (path) {
  1272.         var isAbsolute = path.charAt(0) === "/",
  1273.           trailingSlash = path.substr(-1) === "/";
  1274.         path = PATH.normalizeArray(
  1275.           path.split("/").filter(function (p) {
  1276.             return !!p;
  1277.           }),
  1278.           !isAbsolute
  1279.         ).join("/");
  1280.         if (!path && !isAbsolute) {
  1281.           path = ".";
  1282.         }
  1283.         if (path && trailingSlash) {
  1284.           path += "/";
  1285.         }
  1286.         return (isAbsolute ? "/" : "") + path;
  1287.       },
  1288.       dirname: function (path) {
  1289.         var result = PATH.splitPath(path),
  1290.           root = result[0],
  1291.           dir = result[1];
  1292.         if (!root && !dir) {
  1293.           return ".";
  1294.         }
  1295.         if (dir) {
  1296.           dir = dir.substr(0, dir.length - 1);
  1297.         }
  1298.         return root + dir;
  1299.       },
  1300.       basename: function (path) {
  1301.         if (path === "/") return "/";
  1302.         path = PATH.normalize(path);
  1303.         path = path.replace(/\/$/, "");
  1304.         var lastSlash = path.lastIndexOf("/");
  1305.         if (lastSlash === -1) return path;
  1306.         return path.substr(lastSlash + 1);
  1307.       },
  1308.       extname: function (path) {
  1309.         return PATH.splitPath(path)[3];
  1310.       },
  1311.       join: function () {
  1312.         var paths = Array.prototype.slice.call(arguments, 0);
  1313.         return PATH.normalize(paths.join("/"));
  1314.       },
  1315.       join2: function (l, r) {
  1316.         return PATH.normalize(l + "/" + r);
  1317.       },
  1318.     };
  1319.     function getRandomDevice() {
  1320.       if (
  1321.         typeof crypto === "object" &&
  1322.         typeof crypto["getRandomValues"] === "function"
  1323.       ) {
  1324.         var randomBuffer = new Uint8Array(1);
  1325.         return function () {
  1326.           crypto.getRandomValues(randomBuffer);
  1327.           return randomBuffer[0];
  1328.         };
  1329.       } else if (ENVIRONMENT_IS_NODE) {
  1330.         try {
  1331.           var crypto_module = require("crypto");
  1332.           return function () {
  1333.             return crypto_module["randomBytes"](1)[0];
  1334.           };
  1335.         } catch (e) {}
  1336.       }
  1337.       return function () {
  1338.         abort("randomDevice");
  1339.       };
  1340.     }
  1341.     var PATH_FS = {
  1342.       resolve: function () {
  1343.         var resolvedPath = "",
  1344.           resolvedAbsolute = false;
  1345.         for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1346.           var path = i >= 0 ? arguments[i] : FS.cwd();
  1347.           if (typeof path !== "string") {
  1348.             throw new TypeError("Arguments to path.resolve must be strings");
  1349.           } else if (!path) {
  1350.             return "";
  1351.           }
  1352.           resolvedPath = path + "/" + resolvedPath;
  1353.           resolvedAbsolute = path.charAt(0) === "/";
  1354.         }
  1355.         resolvedPath = PATH.normalizeArray(
  1356.           resolvedPath.split("/").filter(function (p) {
  1357.             return !!p;
  1358.           }),
  1359.           !resolvedAbsolute
  1360.         ).join("/");
  1361.         return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
  1362.       },
  1363.       relative: function (from, to) {
  1364.         from = PATH_FS.resolve(from).substr(1);
  1365.         to = PATH_FS.resolve(to).substr(1);
  1366.         function trim(arr) {
  1367.           var start = 0;
  1368.           for (; start < arr.length; start++) {
  1369.             if (arr[start] !== "") break;
  1370.           }
  1371.           var end = arr.length - 1;
  1372.           for (; end >= 0; end--) {
  1373.             if (arr[end] !== "") break;
  1374.           }
  1375.           if (start > end) return [];
  1376.           return arr.slice(start, end - start + 1);
  1377.         }
  1378.         var fromParts = trim(from.split("/"));
  1379.         var toParts = trim(to.split("/"));
  1380.         var length = Math.min(fromParts.length, toParts.length);
  1381.         var samePartsLength = length;
  1382.         for (var i = 0; i < length; i++) {
  1383.           if (fromParts[i] !== toParts[i]) {
  1384.             samePartsLength = i;
  1385.             break;
  1386.           }
  1387.         }
  1388.         var outputParts = [];
  1389.         for (var i = samePartsLength; i < fromParts.length; i++) {
  1390.           outputParts.push("..");
  1391.         }
  1392.         outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1393.         return outputParts.join("/");
  1394.       },
  1395.     };
  1396.     var TTY = {
  1397.       ttys: [],
  1398.       init: function () {},
  1399.       shutdown: function () {},
  1400.       register: function (dev, ops) {
  1401.         TTY.ttys[dev] = { input: [], output: [], ops: ops };
  1402.         FS.registerDevice(dev, TTY.stream_ops);
  1403.       },
  1404.       stream_ops: {
  1405.         open: function (stream) {
  1406.           var tty = TTY.ttys[stream.node.rdev];
  1407.           if (!tty) {
  1408.             throw new FS.ErrnoError(43);
  1409.           }
  1410.           stream.tty = tty;
  1411.           stream.seekable = false;
  1412.         },
  1413.         close: function (stream) {
  1414.           stream.tty.ops.flush(stream.tty);
  1415.         },
  1416.         flush: function (stream) {
  1417.           stream.tty.ops.flush(stream.tty);
  1418.         },
  1419.         read: function (stream, buffer, offset, length, pos) {
  1420.           if (!stream.tty || !stream.tty.ops.get_char) {
  1421.             throw new FS.ErrnoError(60);
  1422.           }
  1423.           var bytesRead = 0;
  1424.           for (var i = 0; i < length; i++) {
  1425.             var result;
  1426.             try {
  1427.               result = stream.tty.ops.get_char(stream.tty);
  1428.             } catch (e) {
  1429.               throw new FS.ErrnoError(29);
  1430.             }
  1431.             if (result === undefined && bytesRead === 0) {
  1432.               throw new FS.ErrnoError(6);
  1433.             }
  1434.             if (result === null || result === undefined) break;
  1435.             bytesRead++;
  1436.             buffer[offset + i] = result;
  1437.           }
  1438.           if (bytesRead) {
  1439.             stream.node.timestamp = Date.now();
  1440.           }
  1441.           return bytesRead;
  1442.         },
  1443.         write: function (stream, buffer, offset, length, pos) {
  1444.           if (!stream.tty || !stream.tty.ops.put_char) {
  1445.             throw new FS.ErrnoError(60);
  1446.           }
  1447.           try {
  1448.             for (var i = 0; i < length; i++) {
  1449.               stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
  1450.             }
  1451.           } catch (e) {
  1452.             throw new FS.ErrnoError(29);
  1453.           }
  1454.           if (length) {
  1455.             stream.node.timestamp = Date.now();
  1456.           }
  1457.           return i;
  1458.         },
  1459.       },
  1460.       default_tty_ops: {
  1461.         get_char: function (tty) {
  1462.           if (!tty.input.length) {
  1463.             var result = null;
  1464.             if (ENVIRONMENT_IS_NODE) {
  1465.               var BUFSIZE = 256;
  1466.               var buf = Buffer.alloc
  1467.                 ? Buffer.alloc(BUFSIZE)
  1468.                 : new Buffer(BUFSIZE);
  1469.               var bytesRead = 0;
  1470.               try {
  1471.                 bytesRead = nodeFS.readSync(
  1472.                   process.stdin.fd,
  1473.                   buf,
  1474.                   0,
  1475.                   BUFSIZE,
  1476.                   null
  1477.                 );
  1478.               } catch (e) {
  1479.                 if (e.toString().includes("EOF")) bytesRead = 0;
  1480.                 else throw e;
  1481.               }
  1482.               if (bytesRead > 0) {
  1483.                 result = buf.slice(0, bytesRead).toString("utf-8");
  1484.               } else {
  1485.                 result = null;
  1486.               }
  1487.             } else if (
  1488.               typeof window != "undefined" &&
  1489.               typeof window.prompt == "function"
  1490.             ) {
  1491.               result = window.prompt("Input: ");
  1492.               if (result !== null) {
  1493.                 result += "\n";
  1494.               }
  1495.             } else if (typeof readline == "function") {
  1496.               result = readline();
  1497.               if (result !== null) {
  1498.                 result += "\n";
  1499.               }
  1500.             }
  1501.             if (!result) {
  1502.               return null;
  1503.             }
  1504.             tty.input = intArrayFromString(result, true);
  1505.           }
  1506.           return tty.input.shift();
  1507.         },
  1508.         put_char: function (tty, val) {
  1509.           if (val === null || val === 10) {
  1510.             out(UTF8ArrayToString(tty.output, 0));
  1511.             tty.output = [];
  1512.           } else {
  1513.             if (val != 0) tty.output.push(val);
  1514.           }
  1515.         },
  1516.         flush: function (tty) {
  1517.           if (tty.output && tty.output.length > 0) {
  1518.             out(UTF8ArrayToString(tty.output, 0));
  1519.             tty.output = [];
  1520.           }
  1521.         },
  1522.       },
  1523.       default_tty1_ops: {
  1524.         put_char: function (tty, val) {
  1525.           if (val === null || val === 10) {
  1526.             err(UTF8ArrayToString(tty.output, 0));
  1527.             tty.output = [];
  1528.           } else {
  1529.             if (val != 0) tty.output.push(val);
  1530.           }
  1531.         },
  1532.         flush: function (tty) {
  1533.           if (tty.output && tty.output.length > 0) {
  1534.             err(UTF8ArrayToString(tty.output, 0));
  1535.             tty.output = [];
  1536.           }
  1537.         },
  1538.       },
  1539.     };
  1540.     function mmapAlloc(size) {
  1541.       var alignedSize = alignMemory(size, 65536);
  1542.       var ptr = _malloc(alignedSize);
  1543.       while (size < alignedSize) HEAP8[ptr + size++] = 0;
  1544.       return ptr;
  1545.     }
  1546.     var MEMFS = {
  1547.       ops_table: null,
  1548.       mount: function (mount) {
  1549.         return MEMFS.createNode(null, "/", 16384 | 511, 0);
  1550.       },
  1551.       createNode: function (parent, name, mode, dev) {
  1552.         if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1553.           throw new FS.ErrnoError(63);
  1554.         }
  1555.         if (!MEMFS.ops_table) {
  1556.           MEMFS.ops_table = {
  1557.             dir: {
  1558.               node: {
  1559.                 getattr: MEMFS.node_ops.getattr,
  1560.                 setattr: MEMFS.node_ops.setattr,
  1561.                 lookup: MEMFS.node_ops.lookup,
  1562.                 mknod: MEMFS.node_ops.mknod,
  1563.                 rename: MEMFS.node_ops.rename,
  1564.                 unlink: MEMFS.node_ops.unlink,
  1565.                 rmdir: MEMFS.node_ops.rmdir,
  1566.                 readdir: MEMFS.node_ops.readdir,
  1567.                 symlink: MEMFS.node_ops.symlink,
  1568.               },
  1569.               stream: { llseek: MEMFS.stream_ops.llseek },
  1570.             },
  1571.             file: {
  1572.               node: {
  1573.                 getattr: MEMFS.node_ops.getattr,
  1574.                 setattr: MEMFS.node_ops.setattr,
  1575.               },
  1576.               stream: {
  1577.                 llseek: MEMFS.stream_ops.llseek,
  1578.                 read: MEMFS.stream_ops.read,
  1579.                 write: MEMFS.stream_ops.write,
  1580.                 allocate: MEMFS.stream_ops.allocate,
  1581.                 mmap: MEMFS.stream_ops.mmap,
  1582.                 msync: MEMFS.stream_ops.msync,
  1583.               },
  1584.             },
  1585.             link: {
  1586.               node: {
  1587.                 getattr: MEMFS.node_ops.getattr,
  1588.                 setattr: MEMFS.node_ops.setattr,
  1589.                 readlink: MEMFS.node_ops.readlink,
  1590.               },
  1591.               stream: {},
  1592.             },
  1593.             chrdev: {
  1594.               node: {
  1595.                 getattr: MEMFS.node_ops.getattr,
  1596.                 setattr: MEMFS.node_ops.setattr,
  1597.               },
  1598.               stream: FS.chrdev_stream_ops,
  1599.             },
  1600.           };
  1601.         }
  1602.         var node = FS.createNode(parent, name, mode, dev);
  1603.         if (FS.isDir(node.mode)) {
  1604.           node.node_ops = MEMFS.ops_table.dir.node;
  1605.           node.stream_ops = MEMFS.ops_table.dir.stream;
  1606.           node.contents = {};
  1607.         } else if (FS.isFile(node.mode)) {
  1608.           node.node_ops = MEMFS.ops_table.file.node;
  1609.           node.stream_ops = MEMFS.ops_table.file.stream;
  1610.           node.usedBytes = 0;
  1611.           node.contents = null;
  1612.         } else if (FS.isLink(node.mode)) {
  1613.           node.node_ops = MEMFS.ops_table.link.node;
  1614.           node.stream_ops = MEMFS.ops_table.link.stream;
  1615.         } else if (FS.isChrdev(node.mode)) {
  1616.           node.node_ops = MEMFS.ops_table.chrdev.node;
  1617.           node.stream_ops = MEMFS.ops_table.chrdev.stream;
  1618.         }
  1619.         node.timestamp = Date.now();
  1620.         if (parent) {
  1621.           parent.contents[name] = node;
  1622.           parent.timestamp = node.timestamp;
  1623.         }
  1624.         return node;
  1625.       },
  1626.       getFileDataAsTypedArray: function (node) {
  1627.         if (!node.contents) return new Uint8Array(0);
  1628.         if (node.contents.subarray)
  1629.           return node.contents.subarray(0, node.usedBytes);
  1630.         return new Uint8Array(node.contents);
  1631.       },
  1632.       expandFileStorage: function (node, newCapacity) {
  1633.         var prevCapacity = node.contents ? node.contents.length : 0;
  1634.         if (prevCapacity >= newCapacity) return;
  1635.         var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  1636.         newCapacity = Math.max(
  1637.           newCapacity,
  1638.           (prevCapacity *
  1639.             (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>>
  1640.             0
  1641.         );
  1642.         if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
  1643.         var oldContents = node.contents;
  1644.         node.contents = new Uint8Array(newCapacity);
  1645.         if (node.usedBytes > 0)
  1646.           node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  1647.       },
  1648.       resizeFileStorage: function (node, newSize) {
  1649.         if (node.usedBytes == newSize) return;
  1650.         if (newSize == 0) {
  1651.           node.contents = null;
  1652.           node.usedBytes = 0;
  1653.         } else {
  1654.           var oldContents = node.contents;
  1655.           node.contents = new Uint8Array(newSize);
  1656.           if (oldContents) {
  1657.             node.contents.set(
  1658.               oldContents.subarray(0, Math.min(newSize, node.usedBytes))
  1659.             );
  1660.           }
  1661.           node.usedBytes = newSize;
  1662.         }
  1663.       },
  1664.       node_ops: {
  1665.         getattr: function (node) {
  1666.           var attr = {};
  1667.           attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  1668.           attr.ino = node.id;
  1669.           attr.mode = node.mode;
  1670.           attr.nlink = 1;
  1671.           attr.uid = 0;
  1672.           attr.gid = 0;
  1673.           attr.rdev = node.rdev;
  1674.           if (FS.isDir(node.mode)) {
  1675.             attr.size = 4096;
  1676.           } else if (FS.isFile(node.mode)) {
  1677.             attr.size = node.usedBytes;
  1678.           } else if (FS.isLink(node.mode)) {
  1679.             attr.size = node.link.length;
  1680.           } else {
  1681.             attr.size = 0;
  1682.           }
  1683.           attr.atime = new Date(node.timestamp);
  1684.           attr.mtime = new Date(node.timestamp);
  1685.           attr.ctime = new Date(node.timestamp);
  1686.           attr.blksize = 4096;
  1687.           attr.blocks = Math.ceil(attr.size / attr.blksize);
  1688.           return attr;
  1689.         },
  1690.         setattr: function (node, attr) {
  1691.           if (attr.mode !== undefined) {
  1692.             node.mode = attr.mode;
  1693.           }
  1694.           if (attr.timestamp !== undefined) {
  1695.             node.timestamp = attr.timestamp;
  1696.           }
  1697.           if (attr.size !== undefined) {
  1698.             MEMFS.resizeFileStorage(node, attr.size);
  1699.           }
  1700.         },
  1701.         lookup: function (parent, name) {
  1702.           throw FS.genericErrors[44];
  1703.         },
  1704.         mknod: function (parent, name, mode, dev) {
  1705.           return MEMFS.createNode(parent, name, mode, dev);
  1706.         },
  1707.         rename: function (old_node, new_dir, new_name) {
  1708.           if (FS.isDir(old_node.mode)) {
  1709.             var new_node;
  1710.             try {
  1711.               new_node = FS.lookupNode(new_dir, new_name);
  1712.             } catch (e) {}
  1713.             if (new_node) {
  1714.               for (var i in new_node.contents) {
  1715.                 throw new FS.ErrnoError(55);
  1716.               }
  1717.             }
  1718.           }
  1719.           delete old_node.parent.contents[old_node.name];
  1720.           old_node.parent.timestamp = Date.now();
  1721.           old_node.name = new_name;
  1722.           new_dir.contents[new_name] = old_node;
  1723.           new_dir.timestamp = old_node.parent.timestamp;
  1724.           old_node.parent = new_dir;
  1725.         },
  1726.         unlink: function (parent, name) {
  1727.           delete parent.contents[name];
  1728.           parent.timestamp = Date.now();
  1729.         },
  1730.         rmdir: function (parent, name) {
  1731.           var node = FS.lookupNode(parent, name);
  1732.           for (var i in node.contents) {
  1733.             throw new FS.ErrnoError(55);
  1734.           }
  1735.           delete parent.contents[name];
  1736.           parent.timestamp = Date.now();
  1737.         },
  1738.         readdir: function (node) {
  1739.           var entries = [".", ".."];
  1740.           for (var key in node.contents) {
  1741.             if (!node.contents.hasOwnProperty(key)) {
  1742.               continue;
  1743.             }
  1744.             entries.push(key);
  1745.           }
  1746.           return entries;
  1747.         },
  1748.         symlink: function (parent, newname, oldpath) {
  1749.           var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  1750.           node.link = oldpath;
  1751.           return node;
  1752.         },
  1753.         readlink: function (node) {
  1754.           if (!FS.isLink(node.mode)) {
  1755.             throw new FS.ErrnoError(28);
  1756.           }
  1757.           return node.link;
  1758.         },
  1759.       },
  1760.       stream_ops: {
  1761.         read: function (stream, buffer, offset, length, position) {
  1762.           var contents = stream.node.contents;
  1763.           if (position >= stream.node.usedBytes) return 0;
  1764.           var size = Math.min(stream.node.usedBytes - position, length);
  1765.           if (size > 8 && contents.subarray) {
  1766.             buffer.set(contents.subarray(position, position + size), offset);
  1767.           } else {
  1768.             for (var i = 0; i < size; i++)
  1769.               buffer[offset + i] = contents[position + i];
  1770.           }
  1771.           return size;
  1772.         },
  1773.         write: function (stream, buffer, offset, length, position, canOwn) {
  1774.           if (buffer.buffer === HEAP8.buffer) {
  1775.             canOwn = false;
  1776.           }
  1777.           if (!length) return 0;
  1778.           var node = stream.node;
  1779.           node.timestamp = Date.now();
  1780.           if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  1781.             if (canOwn) {
  1782.               node.contents = buffer.subarray(offset, offset + length);
  1783.               node.usedBytes = length;
  1784.               return length;
  1785.             } else if (node.usedBytes === 0 && position === 0) {
  1786.               node.contents = buffer.slice(offset, offset + length);
  1787.               node.usedBytes = length;
  1788.               return length;
  1789.             } else if (position + length <= node.usedBytes) {
  1790.               node.contents.set(
  1791.                 buffer.subarray(offset, offset + length),
  1792.                 position
  1793.               );
  1794.               return length;
  1795.             }
  1796.           }
  1797.           MEMFS.expandFileStorage(node, position + length);
  1798.           if (node.contents.subarray && buffer.subarray) {
  1799.             node.contents.set(
  1800.               buffer.subarray(offset, offset + length),
  1801.               position
  1802.             );
  1803.           } else {
  1804.             for (var i = 0; i < length; i++) {
  1805.               node.contents[position + i] = buffer[offset + i];
  1806.             }
  1807.           }
  1808.           node.usedBytes = Math.max(node.usedBytes, position + length);
  1809.           return length;
  1810.         },
  1811.         llseek: function (stream, offset, whence) {
  1812.           var position = offset;
  1813.           if (whence === 1) {
  1814.             position += stream.position;
  1815.           } else if (whence === 2) {
  1816.             if (FS.isFile(stream.node.mode)) {
  1817.               position += stream.node.usedBytes;
  1818.             }
  1819.           }
  1820.           if (position < 0) {
  1821.             throw new FS.ErrnoError(28);
  1822.           }
  1823.           return position;
  1824.         },
  1825.         allocate: function (stream, offset, length) {
  1826.           MEMFS.expandFileStorage(stream.node, offset + length);
  1827.           stream.node.usedBytes = Math.max(
  1828.             stream.node.usedBytes,
  1829.             offset + length
  1830.           );
  1831.         },
  1832.         mmap: function (stream, address, length, position, prot, flags) {
  1833.           if (address !== 0) {
  1834.             throw new FS.ErrnoError(28);
  1835.           }
  1836.           if (!FS.isFile(stream.node.mode)) {
  1837.             throw new FS.ErrnoError(43);
  1838.           }
  1839.           var ptr;
  1840.           var allocated;
  1841.           var contents = stream.node.contents;
  1842.           if (!(flags & 2) && contents.buffer === buffer) {
  1843.             allocated = false;
  1844.             ptr = contents.byteOffset;
  1845.           } else {
  1846.             if (position > 0 || position + length < contents.length) {
  1847.               if (contents.subarray) {
  1848.                 contents = contents.subarray(position, position + length);
  1849.               } else {
  1850.                 contents = Array.prototype.slice.call(
  1851.                   contents,
  1852.                   position,
  1853.                   position + length
  1854.                 );
  1855.               }
  1856.             }
  1857.             allocated = true;
  1858.             ptr = mmapAlloc(length);
  1859.             if (!ptr) {
  1860.               throw new FS.ErrnoError(48);
  1861.             }
  1862.             HEAP8.set(contents, ptr);
  1863.           }
  1864.           return { ptr: ptr, allocated: allocated };
  1865.         },
  1866.         msync: function (stream, buffer, offset, length, mmapFlags) {
  1867.           if (!FS.isFile(stream.node.mode)) {
  1868.             throw new FS.ErrnoError(43);
  1869.           }
  1870.           if (mmapFlags & 2) {
  1871.             return 0;
  1872.           }
  1873.           var bytesWritten = MEMFS.stream_ops.write(
  1874.             stream,
  1875.             buffer,
  1876.             0,
  1877.             length,
  1878.             offset,
  1879.             false
  1880.           );
  1881.           return 0;
  1882.         },
  1883.       },
  1884.     };
  1885.     var FS = {
  1886.       root: null,
  1887.       mounts: [],
  1888.       devices: {},
  1889.       streams: [],
  1890.       nextInode: 1,
  1891.       nameTable: null,
  1892.       currentPath: "/",
  1893.       initialized: false,
  1894.       ignorePermissions: true,
  1895.       trackingDelegate: {},
  1896.       tracking: { openFlags: { READ: 1, WRITE: 2 } },
  1897.       ErrnoError: null,
  1898.       genericErrors: {},
  1899.       filesystems: null,
  1900.       syncFSRequests: 0,
  1901.       lookupPath: function (path, opts) {
  1902.         path = PATH_FS.resolve(FS.cwd(), path);
  1903.         opts = opts || {};
  1904.         if (!path) return { path: "", node: null };
  1905.         var defaults = { follow_mount: true, recurse_count: 0 };
  1906.         for (var key in defaults) {
  1907.           if (opts[key] === undefined) {
  1908.             opts[key] = defaults[key];
  1909.           }
  1910.         }
  1911.         if (opts.recurse_count > 8) {
  1912.           throw new FS.ErrnoError(32);
  1913.         }
  1914.         var parts = PATH.normalizeArray(
  1915.           path.split("/").filter(function (p) {
  1916.             return !!p;
  1917.           }),
  1918.           false
  1919.         );
  1920.         var current = FS.root;
  1921.         var current_path = "/";
  1922.         for (var i = 0; i < parts.length; i++) {
  1923.           var islast = i === parts.length - 1;
  1924.           if (islast && opts.parent) {
  1925.             break;
  1926.           }
  1927.           current = FS.lookupNode(current, parts[i]);
  1928.           current_path = PATH.join2(current_path, parts[i]);
  1929.           if (FS.isMountpoint(current)) {
  1930.             if (!islast || (islast && opts.follow_mount)) {
  1931.               current = current.mounted.root;
  1932.             }
  1933.           }
  1934.           if (!islast || opts.follow) {
  1935.             var count = 0;
  1936.             while (FS.isLink(current.mode)) {
  1937.               var link = FS.readlink(current_path);
  1938.               current_path = PATH_FS.resolve(PATH.dirname(current_path), link);
  1939.               var lookup = FS.lookupPath(current_path, {
  1940.                 recurse_count: opts.recurse_count,
  1941.               });
  1942.               current = lookup.node;
  1943.               if (count++ > 40) {
  1944.                 throw new FS.ErrnoError(32);
  1945.               }
  1946.             }
  1947.           }
  1948.         }
  1949.         return { path: current_path, node: current };
  1950.       },
  1951.       getPath: function (node) {
  1952.         var path;
  1953.         while (true) {
  1954.           if (FS.isRoot(node)) {
  1955.             var mount = node.mount.mountpoint;
  1956.             if (!path) return mount;
  1957.             return mount[mount.length - 1] !== "/"
  1958.               ? mount + "/" + path
  1959.               : mount + path;
  1960.           }
  1961.           path = path ? node.name + "/" + path : node.name;
  1962.           node = node.parent;
  1963.         }
  1964.       },
  1965.       hashName: function (parentid, name) {
  1966.         var hash = 0;
  1967.         for (var i = 0; i < name.length; i++) {
  1968.           hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
  1969.         }
  1970.         return ((parentid + hash) >>> 0) % FS.nameTable.length;
  1971.       },
  1972.       hashAddNode: function (node) {
  1973.         var hash = FS.hashName(node.parent.id, node.name);
  1974.         node.name_next = FS.nameTable[hash];
  1975.         FS.nameTable[hash] = node;
  1976.       },
  1977.       hashRemoveNode: function (node) {
  1978.         var hash = FS.hashName(node.parent.id, node.name);
  1979.         if (FS.nameTable[hash] === node) {
  1980.           FS.nameTable[hash] = node.name_next;
  1981.         } else {
  1982.           var current = FS.nameTable[hash];
  1983.           while (current) {
  1984.             if (current.name_next === node) {
  1985.               current.name_next = node.name_next;
  1986.               break;
  1987.             }
  1988.             current = current.name_next;
  1989.           }
  1990.         }
  1991.       },
  1992.       lookupNode: function (parent, name) {
  1993.         var errCode = FS.mayLookup(parent);
  1994.         if (errCode) {
  1995.           throw new FS.ErrnoError(errCode, parent);
  1996.         }
  1997.         var hash = FS.hashName(parent.id, name);
  1998.         for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  1999.           var nodeName = node.name;
  2000.           if (node.parent.id === parent.id && nodeName === name) {
  2001.             return node;
  2002.           }
  2003.         }
  2004.         return FS.lookup(parent, name);
  2005.       },
  2006.       createNode: function (parent, name, mode, rdev) {
  2007.         var node = new FS.FSNode(parent, name, mode, rdev);
  2008.         FS.hashAddNode(node);
  2009.         return node;
  2010.       },
  2011.       destroyNode: function (node) {
  2012.         FS.hashRemoveNode(node);
  2013.       },
  2014.       isRoot: function (node) {
  2015.         return node === node.parent;
  2016.       },
  2017.       isMountpoint: function (node) {
  2018.         return !!node.mounted;
  2019.       },
  2020.       isFile: function (mode) {
  2021.         return (mode & 61440) === 32768;
  2022.       },
  2023.       isDir: function (mode) {
  2024.         return (mode & 61440) === 16384;
  2025.       },
  2026.       isLink: function (mode) {
  2027.         return (mode & 61440) === 40960;
  2028.       },
  2029.       isChrdev: function (mode) {
  2030.         return (mode & 61440) === 8192;
  2031.       },
  2032.       isBlkdev: function (mode) {
  2033.         return (mode & 61440) === 24576;
  2034.       },
  2035.       isFIFO: function (mode) {
  2036.         return (mode & 61440) === 4096;
  2037.       },
  2038.       isSocket: function (mode) {
  2039.         return (mode & 49152) === 49152;
  2040.       },
  2041.       flagModes: { r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090 },
  2042.       modeStringToFlags: function (str) {
  2043.         var flags = FS.flagModes[str];
  2044.         if (typeof flags === "undefined") {
  2045.           throw new Error("Unknown file open mode: " + str);
  2046.         }
  2047.         return flags;
  2048.       },
  2049.       flagsToPermissionString: function (flag) {
  2050.         var perms = ["r", "w", "rw"][flag & 3];
  2051.         if (flag & 512) {
  2052.           perms += "w";
  2053.         }
  2054.         return perms;
  2055.       },
  2056.       nodePermissions: function (node, perms) {
  2057.         if (FS.ignorePermissions) {
  2058.           return 0;
  2059.         }
  2060.         if (perms.includes("r") && !(node.mode & 292)) {
  2061.           return 2;
  2062.         } else if (perms.includes("w") && !(node.mode & 146)) {
  2063.           return 2;
  2064.         } else if (perms.includes("x") && !(node.mode & 73)) {
  2065.           return 2;
  2066.         }
  2067.         return 0;
  2068.       },
  2069.       mayLookup: function (dir) {
  2070.         var errCode = FS.nodePermissions(dir, "x");
  2071.         if (errCode) return errCode;
  2072.         if (!dir.node_ops.lookup) return 2;
  2073.         return 0;
  2074.       },
  2075.       mayCreate: function (dir, name) {
  2076.         try {
  2077.           var node = FS.lookupNode(dir, name);
  2078.           return 20;
  2079.         } catch (e) {}
  2080.         return FS.nodePermissions(dir, "wx");
  2081.       },
  2082.       mayDelete: function (dir, name, isdir) {
  2083.         var node;
  2084.         try {
  2085.           node = FS.lookupNode(dir, name);
  2086.         } catch (e) {
  2087.           return e.errno;
  2088.         }
  2089.         var errCode = FS.nodePermissions(dir, "wx");
  2090.         if (errCode) {
  2091.           return errCode;
  2092.         }
  2093.         if (isdir) {
  2094.           if (!FS.isDir(node.mode)) {
  2095.             return 54;
  2096.           }
  2097.           if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  2098.             return 10;
  2099.           }
  2100.         } else {
  2101.           if (FS.isDir(node.mode)) {
  2102.             return 31;
  2103.           }
  2104.         }
  2105.         return 0;
  2106.       },
  2107.       mayOpen: function (node, flags) {
  2108.         if (!node) {
  2109.           return 44;
  2110.         }
  2111.         if (FS.isLink(node.mode)) {
  2112.           return 32;
  2113.         } else if (FS.isDir(node.mode)) {
  2114.           if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  2115.             return 31;
  2116.           }
  2117.         }
  2118.         return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
  2119.       },
  2120.       MAX_OPEN_FDS: 4096,
  2121.       nextfd: function (fd_start, fd_end) {
  2122.         fd_start = fd_start || 0;
  2123.         fd_end = fd_end || FS.MAX_OPEN_FDS;
  2124.         for (var fd = fd_start; fd <= fd_end; fd++) {
  2125.           if (!FS.streams[fd]) {
  2126.             return fd;
  2127.           }
  2128.         }
  2129.         throw new FS.ErrnoError(33);
  2130.       },
  2131.       getStream: function (fd) {
  2132.         return FS.streams[fd];
  2133.       },
  2134.       createStream: function (stream, fd_start, fd_end) {
  2135.         if (!FS.FSStream) {
  2136.           FS.FSStream = function () {};
  2137.           FS.FSStream.prototype = {
  2138.             object: {
  2139.               get: function () {
  2140.                 return this.node;
  2141.               },
  2142.               set: function (val) {
  2143.                 this.node = val;
  2144.               },
  2145.             },
  2146.             isRead: {
  2147.               get: function () {
  2148.                 return (this.flags & 2097155) !== 1;
  2149.               },
  2150.             },
  2151.             isWrite: {
  2152.               get: function () {
  2153.                 return (this.flags & 2097155) !== 0;
  2154.               },
  2155.             },
  2156.             isAppend: {
  2157.               get: function () {
  2158.                 return this.flags & 1024;
  2159.               },
  2160.             },
  2161.           };
  2162.         }
  2163.         var newStream = new FS.FSStream();
  2164.         for (var p in stream) {
  2165.           newStream[p] = stream[p];
  2166.         }
  2167.         stream = newStream;
  2168.         var fd = FS.nextfd(fd_start, fd_end);
  2169.         stream.fd = fd;
  2170.         FS.streams[fd] = stream;
  2171.         return stream;
  2172.       },
  2173.       closeStream: function (fd) {
  2174.         FS.streams[fd] = null;
  2175.       },
  2176.       chrdev_stream_ops: {
  2177.         open: function (stream) {
  2178.           var device = FS.getDevice(stream.node.rdev);
  2179.           stream.stream_ops = device.stream_ops;
  2180.           if (stream.stream_ops.open) {
  2181.             stream.stream_ops.open(stream);
  2182.           }
  2183.         },
  2184.         llseek: function () {
  2185.           throw new FS.ErrnoError(70);
  2186.         },
  2187.       },
  2188.       major: function (dev) {
  2189.         return dev >> 8;
  2190.       },
  2191.       minor: function (dev) {
  2192.         return dev & 255;
  2193.       },
  2194.       makedev: function (ma, mi) {
  2195.         return (ma << 8) | mi;
  2196.       },
  2197.       registerDevice: function (dev, ops) {
  2198.         FS.devices[dev] = { stream_ops: ops };
  2199.       },
  2200.       getDevice: function (dev) {
  2201.         return FS.devices[dev];
  2202.       },
  2203.       getMounts: function (mount) {
  2204.         var mounts = [];
  2205.         var check = [mount];
  2206.         while (check.length) {
  2207.           var m = check.pop();
  2208.           mounts.push(m);
  2209.           check.push.apply(check, m.mounts);
  2210.         }
  2211.         return mounts;
  2212.       },
  2213.       syncfs: function (populate, callback) {
  2214.         if (typeof populate === "function") {
  2215.           callback = populate;
  2216.           populate = false;
  2217.         }
  2218.         FS.syncFSRequests++;
  2219.         if (FS.syncFSRequests > 1) {
  2220.           err(
  2221.             "warning: " +
  2222.               FS.syncFSRequests +
  2223.               " FS.syncfs operations in flight at once, probably just doing extra work"
  2224.           );
  2225.         }
  2226.         var mounts = FS.getMounts(FS.root.mount);
  2227.         var completed = 0;
  2228.         function doCallback(errCode) {
  2229.           FS.syncFSRequests--;
  2230.           return callback(errCode);
  2231.         }
  2232.         function done(errCode) {
  2233.           if (errCode) {
  2234.             if (!done.errored) {
  2235.               done.errored = true;
  2236.               return doCallback(errCode);
  2237.             }
  2238.             return;
  2239.           }
  2240.           if (++completed >= mounts.length) {
  2241.             doCallback(null);
  2242.           }
  2243.         }
  2244.         mounts.forEach(function (mount) {
  2245.           if (!mount.type.syncfs) {
  2246.             return done(null);
  2247.           }
  2248.           mount.type.syncfs(mount, populate, done);
  2249.         });
  2250.       },
  2251.       mount: function (type, opts, mountpoint) {
  2252.         var root = mountpoint === "/";
  2253.         var pseudo = !mountpoint;
  2254.         var node;
  2255.         if (root && FS.root) {
  2256.           throw new FS.ErrnoError(10);
  2257.         } else if (!root && !pseudo) {
  2258.           var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
  2259.           mountpoint = lookup.path;
  2260.           node = lookup.node;
  2261.           if (FS.isMountpoint(node)) {
  2262.             throw new FS.ErrnoError(10);
  2263.           }
  2264.           if (!FS.isDir(node.mode)) {
  2265.             throw new FS.ErrnoError(54);
  2266.           }
  2267.         }
  2268.         var mount = {
  2269.           type: type,
  2270.           opts: opts,
  2271.           mountpoint: mountpoint,
  2272.           mounts: [],
  2273.         };
  2274.         var mountRoot = type.mount(mount);
  2275.         mountRoot.mount = mount;
  2276.         mount.root = mountRoot;
  2277.         if (root) {
  2278.           FS.root = mountRoot;
  2279.         } else if (node) {
  2280.           node.mounted = mount;
  2281.           if (node.mount) {
  2282.             node.mount.mounts.push(mount);
  2283.           }
  2284.         }
  2285.         return mountRoot;
  2286.       },
  2287.       unmount: function (mountpoint) {
  2288.         var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
  2289.         if (!FS.isMountpoint(lookup.node)) {
  2290.           throw new FS.ErrnoError(28);
  2291.         }
  2292.         var node = lookup.node;
  2293.         var mount = node.mounted;
  2294.         var mounts = FS.getMounts(mount);
  2295.         Object.keys(FS.nameTable).forEach(function (hash) {
  2296.           var current = FS.nameTable[hash];
  2297.           while (current) {
  2298.             var next = current.name_next;
  2299.             if (mounts.includes(current.mount)) {
  2300.               FS.destroyNode(current);
  2301.             }
  2302.             current = next;
  2303.           }
  2304.         });
  2305.         node.mounted = null;
  2306.         var idx = node.mount.mounts.indexOf(mount);
  2307.         node.mount.mounts.splice(idx, 1);
  2308.       },
  2309.       lookup: function (parent, name) {
  2310.         return parent.node_ops.lookup(parent, name);
  2311.       },
  2312.       mknod: function (path, mode, dev) {
  2313.         var lookup = FS.lookupPath(path, { parent: true });
  2314.         var parent = lookup.node;
  2315.         var name = PATH.basename(path);
  2316.         if (!name || name === "." || name === "..") {
  2317.           throw new FS.ErrnoError(28);
  2318.         }
  2319.         var errCode = FS.mayCreate(parent, name);
  2320.         if (errCode) {
  2321.           throw new FS.ErrnoError(errCode);
  2322.         }
  2323.         if (!parent.node_ops.mknod) {
  2324.           throw new FS.ErrnoError(63);
  2325.         }
  2326.         return parent.node_ops.mknod(parent, name, mode, dev);
  2327.       },
  2328.       create: function (path, mode) {
  2329.         mode = mode !== undefined ? mode : 438;
  2330.         mode &= 4095;
  2331.         mode |= 32768;
  2332.         return FS.mknod(path, mode, 0);
  2333.       },
  2334.       mkdir: function (path, mode) {
  2335.         mode = mode !== undefined ? mode : 511;
  2336.         mode &= 511 | 512;
  2337.         mode |= 16384;
  2338.         return FS.mknod(path, mode, 0);
  2339.       },
  2340.       mkdirTree: function (path, mode) {
  2341.         var dirs = path.split("/");
  2342.         var d = "";
  2343.         for (var i = 0; i < dirs.length; ++i) {
  2344.           if (!dirs[i]) continue;
  2345.           d += "/" + dirs[i];
  2346.           try {
  2347.             FS.mkdir(d, mode);
  2348.           } catch (e) {
  2349.             if (e.errno != 20) throw e;
  2350.           }
  2351.         }
  2352.       },
  2353.       mkdev: function (path, mode, dev) {
  2354.         if (typeof dev === "undefined") {
  2355.           dev = mode;
  2356.           mode = 438;
  2357.         }
  2358.         mode |= 8192;
  2359.         return FS.mknod(path, mode, dev);
  2360.       },
  2361.       symlink: function (oldpath, newpath) {
  2362.         if (!PATH_FS.resolve(oldpath)) {
  2363.           throw new FS.ErrnoError(44);
  2364.         }
  2365.         var lookup = FS.lookupPath(newpath, { parent: true });
  2366.         var parent = lookup.node;
  2367.         if (!parent) {
  2368.           throw new FS.ErrnoError(44);
  2369.         }
  2370.         var newname = PATH.basename(newpath);
  2371.         var errCode = FS.mayCreate(parent, newname);
  2372.         if (errCode) {
  2373.           throw new FS.ErrnoError(errCode);
  2374.         }
  2375.         if (!parent.node_ops.symlink) {
  2376.           throw new FS.ErrnoError(63);
  2377.         }
  2378.         return parent.node_ops.symlink(parent, newname, oldpath);
  2379.       },
  2380.       rename: function (old_path, new_path) {
  2381.         var old_dirname = PATH.dirname(old_path);
  2382.         var new_dirname = PATH.dirname(new_path);
  2383.         var old_name = PATH.basename(old_path);
  2384.         var new_name = PATH.basename(new_path);
  2385.         var lookup, old_dir, new_dir;
  2386.         lookup = FS.lookupPath(old_path, { parent: true });
  2387.         old_dir = lookup.node;
  2388.         lookup = FS.lookupPath(new_path, { parent: true });
  2389.         new_dir = lookup.node;
  2390.         if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
  2391.         if (old_dir.mount !== new_dir.mount) {
  2392.           throw new FS.ErrnoError(75);
  2393.         }
  2394.         var old_node = FS.lookupNode(old_dir, old_name);
  2395.         var relative = PATH_FS.relative(old_path, new_dirname);
  2396.         if (relative.charAt(0) !== ".") {
  2397.           throw new FS.ErrnoError(28);
  2398.         }
  2399.         relative = PATH_FS.relative(new_path, old_dirname);
  2400.         if (relative.charAt(0) !== ".") {
  2401.           throw new FS.ErrnoError(55);
  2402.         }
  2403.         var new_node;
  2404.         try {
  2405.           new_node = FS.lookupNode(new_dir, new_name);
  2406.         } catch (e) {}
  2407.         if (old_node === new_node) {
  2408.           return;
  2409.         }
  2410.         var isdir = FS.isDir(old_node.mode);
  2411.         var errCode = FS.mayDelete(old_dir, old_name, isdir);
  2412.         if (errCode) {
  2413.           throw new FS.ErrnoError(errCode);
  2414.         }
  2415.         errCode = new_node
  2416.           ? FS.mayDelete(new_dir, new_name, isdir)
  2417.           : FS.mayCreate(new_dir, new_name);
  2418.         if (errCode) {
  2419.           throw new FS.ErrnoError(errCode);
  2420.         }
  2421.         if (!old_dir.node_ops.rename) {
  2422.           throw new FS.ErrnoError(63);
  2423.         }
  2424.         if (
  2425.           FS.isMountpoint(old_node) ||
  2426.           (new_node && FS.isMountpoint(new_node))
  2427.         ) {
  2428.           throw new FS.ErrnoError(10);
  2429.         }
  2430.         if (new_dir !== old_dir) {
  2431.           errCode = FS.nodePermissions(old_dir, "w");
  2432.           if (errCode) {
  2433.             throw new FS.ErrnoError(errCode);
  2434.           }
  2435.         }
  2436.         try {
  2437.           if (FS.trackingDelegate["willMovePath"]) {
  2438.             FS.trackingDelegate["willMovePath"](old_path, new_path);
  2439.           }
  2440.         } catch (e) {
  2441.           err(
  2442.             "FS.trackingDelegate['willMovePath']('" +
  2443.               old_path +
  2444.               "', '" +
  2445.               new_path +
  2446.               "') threw an exception: " +
  2447.               e.message
  2448.           );
  2449.         }
  2450.         FS.hashRemoveNode(old_node);
  2451.         try {
  2452.           old_dir.node_ops.rename(old_node, new_dir, new_name);
  2453.         } catch (e) {
  2454.           throw e;
  2455.         } finally {
  2456.           FS.hashAddNode(old_node);
  2457.         }
  2458.         try {
  2459.           if (FS.trackingDelegate["onMovePath"])
  2460.             FS.trackingDelegate["onMovePath"](old_path, new_path);
  2461.         } catch (e) {
  2462.           err(
  2463.             "FS.trackingDelegate['onMovePath']('" +
  2464.               old_path +
  2465.               "', '" +
  2466.               new_path +
  2467.               "') threw an exception: " +
  2468.               e.message
  2469.           );
  2470.         }
  2471.       },
  2472.       rmdir: function (path) {
  2473.         var lookup = FS.lookupPath(path, { parent: true });
  2474.         var parent = lookup.node;
  2475.         var name = PATH.basename(path);
  2476.         var node = FS.lookupNode(parent, name);
  2477.         var errCode = FS.mayDelete(parent, name, true);
  2478.         if (errCode) {
  2479.           throw new FS.ErrnoError(errCode);
  2480.         }
  2481.         if (!parent.node_ops.rmdir) {
  2482.           throw new FS.ErrnoError(63);
  2483.         }
  2484.         if (FS.isMountpoint(node)) {
  2485.           throw new FS.ErrnoError(10);
  2486.         }
  2487.         try {
  2488.           if (FS.trackingDelegate["willDeletePath"]) {
  2489.             FS.trackingDelegate["willDeletePath"](path);
  2490.           }
  2491.         } catch (e) {
  2492.           err(
  2493.             "FS.trackingDelegate['willDeletePath']('" +
  2494.               path +
  2495.               "') threw an exception: " +
  2496.               e.message
  2497.           );
  2498.         }
  2499.         parent.node_ops.rmdir(parent, name);
  2500.         FS.destroyNode(node);
  2501.         try {
  2502.           if (FS.trackingDelegate["onDeletePath"])
  2503.             FS.trackingDelegate["onDeletePath"](path);
  2504.         } catch (e) {
  2505.           err(
  2506.             "FS.trackingDelegate['onDeletePath']('" +
  2507.               path +
  2508.               "') threw an exception: " +
  2509.               e.message
  2510.           );
  2511.         }
  2512.       },
  2513.       readdir: function (path) {
  2514.         var lookup = FS.lookupPath(path, { follow: true });
  2515.         var node = lookup.node;
  2516.         if (!node.node_ops.readdir) {
  2517.           throw new FS.ErrnoError(54);
  2518.         }
  2519.         return node.node_ops.readdir(node);
  2520.       },
  2521.       unlink: function (path) {
  2522.         var lookup = FS.lookupPath(path, { parent: true });
  2523.         var parent = lookup.node;
  2524.         var name = PATH.basename(path);
  2525.         var node = FS.lookupNode(parent, name);
  2526.         var errCode = FS.mayDelete(parent, name, false);
  2527.         if (errCode) {
  2528.           throw new FS.ErrnoError(errCode);
  2529.         }
  2530.         if (!parent.node_ops.unlink) {
  2531.           throw new FS.ErrnoError(63);
  2532.         }
  2533.         if (FS.isMountpoint(node)) {
  2534.           throw new FS.ErrnoError(10);
  2535.         }
  2536.         try {
  2537.           if (FS.trackingDelegate["willDeletePath"]) {
  2538.             FS.trackingDelegate["willDeletePath"](path);
  2539.           }
  2540.         } catch (e) {
  2541.           err(
  2542.             "FS.trackingDelegate['willDeletePath']('" +
  2543.               path +
  2544.               "') threw an exception: " +
  2545.               e.message
  2546.           );
  2547.         }
  2548.         parent.node_ops.unlink(parent, name);
  2549.         FS.destroyNode(node);
  2550.         try {
  2551.           if (FS.trackingDelegate["onDeletePath"])
  2552.             FS.trackingDelegate["onDeletePath"](path);
  2553.         } catch (e) {
  2554.           err(
  2555.             "FS.trackingDelegate['onDeletePath']('" +
  2556.               path +
  2557.               "') threw an exception: " +
  2558.               e.message
  2559.           );
  2560.         }
  2561.       },
  2562.       readlink: function (path) {
  2563.         var lookup = FS.lookupPath(path);
  2564.         var link = lookup.node;
  2565.         if (!link) {
  2566.           throw new FS.ErrnoError(44);
  2567.         }
  2568.         if (!link.node_ops.readlink) {
  2569.           throw new FS.ErrnoError(28);
  2570.         }
  2571.         return PATH_FS.resolve(
  2572.           FS.getPath(link.parent),
  2573.           link.node_ops.readlink(link)
  2574.         );
  2575.       },
  2576.       stat: function (path, dontFollow) {
  2577.         var lookup = FS.lookupPath(path, { follow: !dontFollow });
  2578.         var node = lookup.node;
  2579.         if (!node) {
  2580.           throw new FS.ErrnoError(44);
  2581.         }
  2582.         if (!node.node_ops.getattr) {
  2583.           throw new FS.ErrnoError(63);
  2584.         }
  2585.         return node.node_ops.getattr(node);
  2586.       },
  2587.       lstat: function (path) {
  2588.         return FS.stat(path, true);
  2589.       },
  2590.       chmod: function (path, mode, dontFollow) {
  2591.         var node;
  2592.         if (typeof path === "string") {
  2593.           var lookup = FS.lookupPath(path, { follow: !dontFollow });
  2594.           node = lookup.node;
  2595.         } else {
  2596.           node = path;
  2597.         }
  2598.         if (!node.node_ops.setattr) {
  2599.           throw new FS.ErrnoError(63);
  2600.         }
  2601.         node.node_ops.setattr(node, {
  2602.           mode: (mode & 4095) | (node.mode & ~4095),
  2603.           timestamp: Date.now(),
  2604.         });
  2605.       },
  2606.       lchmod: function (path, mode) {
  2607.         FS.chmod(path, mode, true);
  2608.       },
  2609.       fchmod: function (fd, mode) {
  2610.         var stream = FS.getStream(fd);
  2611.         if (!stream) {
  2612.           throw new FS.ErrnoError(8);
  2613.         }
  2614.         FS.chmod(stream.node, mode);
  2615.       },
  2616.       chown: function (path, uid, gid, dontFollow) {
  2617.         var node;
  2618.         if (typeof path === "string") {
  2619.           var lookup = FS.lookupPath(path, { follow: !dontFollow });
  2620.           node = lookup.node;
  2621.         } else {
  2622.           node = path;
  2623.         }
  2624.         if (!node.node_ops.setattr) {
  2625.           throw new FS.ErrnoError(63);
  2626.         }
  2627.         node.node_ops.setattr(node, { timestamp: Date.now() });
  2628.       },
  2629.       lchown: function (path, uid, gid) {
  2630.         FS.chown(path, uid, gid, true);
  2631.       },
  2632.       fchown: function (fd, uid, gid) {
  2633.         var stream = FS.getStream(fd);
  2634.         if (!stream) {
  2635.           throw new FS.ErrnoError(8);
  2636.         }
  2637.         FS.chown(stream.node, uid, gid);
  2638.       },
  2639.       truncate: function (path, len) {
  2640.         if (len < 0) {
  2641.           throw new FS.ErrnoError(28);
  2642.         }
  2643.         var node;
  2644.         if (typeof path === "string") {
  2645.           var lookup = FS.lookupPath(path, { follow: true });
  2646.           node = lookup.node;
  2647.         } else {
  2648.           node = path;
  2649.         }
  2650.         if (!node.node_ops.setattr) {
  2651.           throw new FS.ErrnoError(63);
  2652.         }
  2653.         if (FS.isDir(node.mode)) {
  2654.           throw new FS.ErrnoError(31);
  2655.         }
  2656.         if (!FS.isFile(node.mode)) {
  2657.           throw new FS.ErrnoError(28);
  2658.         }
  2659.         var errCode = FS.nodePermissions(node, "w");
  2660.         if (errCode) {
  2661.           throw new FS.ErrnoError(errCode);
  2662.         }
  2663.         node.node_ops.setattr(node, { size: len, timestamp: Date.now() });
  2664.       },
  2665.       ftruncate: function (fd, len) {
  2666.         var stream = FS.getStream(fd);
  2667.         if (!stream) {
  2668.           throw new FS.ErrnoError(8);
  2669.         }
  2670.         if ((stream.flags & 2097155) === 0) {
  2671.           throw new FS.ErrnoError(28);
  2672.         }
  2673.         FS.truncate(stream.node, len);
  2674.       },
  2675.       utime: function (path, atime, mtime) {
  2676.         var lookup = FS.lookupPath(path, { follow: true });
  2677.         var node = lookup.node;
  2678.         node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) });
  2679.       },
  2680.       open: function (path, flags, mode, fd_start, fd_end) {
  2681.         if (path === "") {
  2682.           throw new FS.ErrnoError(44);
  2683.         }
  2684.         flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  2685.         mode = typeof mode === "undefined" ? 438 : mode;
  2686.         if (flags & 64) {
  2687.           mode = (mode & 4095) | 32768;
  2688.         } else {
  2689.           mode = 0;
  2690.         }
  2691.         var node;
  2692.         if (typeof path === "object") {
  2693.           node = path;
  2694.         } else {
  2695.           path = PATH.normalize(path);
  2696.           try {
  2697.             var lookup = FS.lookupPath(path, { follow: !(flags & 131072) });
  2698.             node = lookup.node;
  2699.           } catch (e) {}
  2700.         }
  2701.         var created = false;
  2702.         if (flags & 64) {
  2703.           if (node) {
  2704.             if (flags & 128) {
  2705.               throw new FS.ErrnoError(20);
  2706.             }
  2707.           } else {
  2708.             node = FS.mknod(path, mode, 0);
  2709.             created = true;
  2710.           }
  2711.         }
  2712.         if (!node) {
  2713.           throw new FS.ErrnoError(44);
  2714.         }
  2715.         if (FS.isChrdev(node.mode)) {
  2716.           flags &= ~512;
  2717.         }
  2718.         if (flags & 65536 && !FS.isDir(node.mode)) {
  2719.           throw new FS.ErrnoError(54);
  2720.         }
  2721.         if (!created) {
  2722.           var errCode = FS.mayOpen(node, flags);
  2723.           if (errCode) {
  2724.             throw new FS.ErrnoError(errCode);
  2725.           }
  2726.         }
  2727.         if (flags & 512) {
  2728.           FS.truncate(node, 0);
  2729.         }
  2730.         flags &= ~(128 | 512 | 131072);
  2731.         var stream = FS.createStream(
  2732.           {
  2733.             node: node,
  2734.             path: FS.getPath(node),
  2735.             flags: flags,
  2736.             seekable: true,
  2737.             position: 0,
  2738.             stream_ops: node.stream_ops,
  2739.             ungotten: [],
  2740.             error: false,
  2741.           },
  2742.           fd_start,
  2743.           fd_end
  2744.         );
  2745.         if (stream.stream_ops.open) {
  2746.           stream.stream_ops.open(stream);
  2747.         }
  2748.         if (Module["logReadFiles"] && !(flags & 1)) {
  2749.           if (!FS.readFiles) FS.readFiles = {};
  2750.           if (!(path in FS.readFiles)) {
  2751.             FS.readFiles[path] = 1;
  2752.             err("FS.trackingDelegate error on read file: " + path);
  2753.           }
  2754.         }
  2755.         try {
  2756.           if (FS.trackingDelegate["onOpenFile"]) {
  2757.             var trackingFlags = 0;
  2758.             if ((flags & 2097155) !== 1) {
  2759.               trackingFlags |= FS.tracking.openFlags.READ;
  2760.             }
  2761.             if ((flags & 2097155) !== 0) {
  2762.               trackingFlags |= FS.tracking.openFlags.WRITE;
  2763.             }
  2764.             FS.trackingDelegate["onOpenFile"](path, trackingFlags);
  2765.           }
  2766.         } catch (e) {
  2767.           err(
  2768.             "FS.trackingDelegate['onOpenFile']('" +
  2769.               path +
  2770.               "', flags) threw an exception: " +
  2771.               e.message
  2772.           );
  2773.         }
  2774.         return stream;
  2775.       },
  2776.       close: function (stream) {
  2777.         if (FS.isClosed(stream)) {
  2778.           throw new FS.ErrnoError(8);
  2779.         }
  2780.         if (stream.getdents) stream.getdents = null;
  2781.         try {
  2782.           if (stream.stream_ops.close) {
  2783.             stream.stream_ops.close(stream);
  2784.           }
  2785.         } catch (e) {
  2786.           throw e;
  2787.         } finally {
  2788.           FS.closeStream(stream.fd);
  2789.         }
  2790.         stream.fd = null;
  2791.       },
  2792.       isClosed: function (stream) {
  2793.         return stream.fd === null;
  2794.       },
  2795.       llseek: function (stream, offset, whence) {
  2796.         if (FS.isClosed(stream)) {
  2797.           throw new FS.ErrnoError(8);
  2798.         }
  2799.         if (!stream.seekable || !stream.stream_ops.llseek) {
  2800.           throw new FS.ErrnoError(70);
  2801.         }
  2802.         if (whence != 0 && whence != 1 && whence != 2) {
  2803.           throw new FS.ErrnoError(28);
  2804.         }
  2805.         stream.position = stream.stream_ops.llseek(stream, offset, whence);
  2806.         stream.ungotten = [];
  2807.         return stream.position;
  2808.       },
  2809.       read: function (stream, buffer, offset, length, position) {
  2810.         if (length < 0 || position < 0) {
  2811.           throw new FS.ErrnoError(28);
  2812.         }
  2813.         if (FS.isClosed(stream)) {
  2814.           throw new FS.ErrnoError(8);
  2815.         }
  2816.         if ((stream.flags & 2097155) === 1) {
  2817.           throw new FS.ErrnoError(8);
  2818.         }
  2819.         if (FS.isDir(stream.node.mode)) {
  2820.           throw new FS.ErrnoError(31);
  2821.         }
  2822.         if (!stream.stream_ops.read) {
  2823.           throw new FS.ErrnoError(28);
  2824.         }
  2825.         var seeking = typeof position !== "undefined";
  2826.         if (!seeking) {
  2827.           position = stream.position;
  2828.         } else if (!stream.seekable) {
  2829.           throw new FS.ErrnoError(70);
  2830.         }
  2831.         var bytesRead = stream.stream_ops.read(
  2832.           stream,
  2833.           buffer,
  2834.           offset,
  2835.           length,
  2836.           position
  2837.         );
  2838.         if (!seeking) stream.position += bytesRead;
  2839.         return bytesRead;
  2840.       },
  2841.       write: function (stream, buffer, offset, length, position, canOwn) {
  2842.         if (length < 0 || position < 0) {
  2843.           throw new FS.ErrnoError(28);
  2844.         }
  2845.         if (FS.isClosed(stream)) {
  2846.           throw new FS.ErrnoError(8);
  2847.         }
  2848.         if ((stream.flags & 2097155) === 0) {
  2849.           throw new FS.ErrnoError(8);
  2850.         }
  2851.         if (FS.isDir(stream.node.mode)) {
  2852.           throw new FS.ErrnoError(31);
  2853.         }
  2854.         if (!stream.stream_ops.write) {
  2855.           throw new FS.ErrnoError(28);
  2856.         }
  2857.         if (stream.seekable && stream.flags & 1024) {
  2858.           FS.llseek(stream, 0, 2);
  2859.         }
  2860.         var seeking = typeof position !== "undefined";
  2861.         if (!seeking) {
  2862.           position = stream.position;
  2863.         } else if (!stream.seekable) {
  2864.           throw new FS.ErrnoError(70);
  2865.         }
  2866.         var bytesWritten = stream.stream_ops.write(
  2867.           stream,
  2868.           buffer,
  2869.           offset,
  2870.           length,
  2871.           position,
  2872.           canOwn
  2873.         );
  2874.         if (!seeking) stream.position += bytesWritten;
  2875.         try {
  2876.           if (stream.path && FS.trackingDelegate["onWriteToFile"])
  2877.             FS.trackingDelegate["onWriteToFile"](stream.path);
  2878.         } catch (e) {
  2879.           err(
  2880.             "FS.trackingDelegate['onWriteToFile']('" +
  2881.               stream.path +
  2882.               "') threw an exception: " +
  2883.               e.message
  2884.           );
  2885.         }
  2886.         return bytesWritten;
  2887.       },
  2888.       allocate: function (stream, offset, length) {
  2889.         if (FS.isClosed(stream)) {
  2890.           throw new FS.ErrnoError(8);
  2891.         }
  2892.         if (offset < 0 || length <= 0) {
  2893.           throw new FS.ErrnoError(28);
  2894.         }
  2895.         if ((stream.flags & 2097155) === 0) {
  2896.           throw new FS.ErrnoError(8);
  2897.         }
  2898.         if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  2899.           throw new FS.ErrnoError(43);
  2900.         }
  2901.         if (!stream.stream_ops.allocate) {
  2902.           throw new FS.ErrnoError(138);
  2903.         }
  2904.         stream.stream_ops.allocate(stream, offset, length);
  2905.       },
  2906.       mmap: function (stream, address, length, position, prot, flags) {
  2907.         if (
  2908.           (prot & 2) !== 0 &&
  2909.           (flags & 2) === 0 &&
  2910.           (stream.flags & 2097155) !== 2
  2911.         ) {
  2912.           throw new FS.ErrnoError(2);
  2913.         }
  2914.         if ((stream.flags & 2097155) === 1) {
  2915.           throw new FS.ErrnoError(2);
  2916.         }
  2917.         if (!stream.stream_ops.mmap) {
  2918.           throw new FS.ErrnoError(43);
  2919.         }
  2920.         return stream.stream_ops.mmap(
  2921.           stream,
  2922.           address,
  2923.           length,
  2924.           position,
  2925.           prot,
  2926.           flags
  2927.         );
  2928.       },
  2929.       msync: function (stream, buffer, offset, length, mmapFlags) {
  2930.         if (!stream || !stream.stream_ops.msync) {
  2931.           return 0;
  2932.         }
  2933.         return stream.stream_ops.msync(
  2934.           stream,
  2935.           buffer,
  2936.           offset,
  2937.           length,
  2938.           mmapFlags
  2939.         );
  2940.       },
  2941.       munmap: function (stream) {
  2942.         return 0;
  2943.       },
  2944.       ioctl: function (stream, cmd, arg) {
  2945.         if (!stream.stream_ops.ioctl) {
  2946.           throw new FS.ErrnoError(59);
  2947.         }
  2948.         return stream.stream_ops.ioctl(stream, cmd, arg);
  2949.       },
  2950.       readFile: function (path, opts) {
  2951.         opts = opts || {};
  2952.         opts.flags = opts.flags || 0;
  2953.         opts.encoding = opts.encoding || "binary";
  2954.         if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  2955.           throw new Error('Invalid encoding type "' + opts.encoding + '"');
  2956.         }
  2957.         var ret;
  2958.         var stream = FS.open(path, opts.flags);
  2959.         var stat = FS.stat(path);
  2960.         var length = stat.size;
  2961.         var buf = new Uint8Array(length);
  2962.         FS.read(stream, buf, 0, length, 0);
  2963.         if (opts.encoding === "utf8") {
  2964.           ret = UTF8ArrayToString(buf, 0);
  2965.         } else if (opts.encoding === "binary") {
  2966.           ret = buf;
  2967.         }
  2968.         FS.close(stream);
  2969.         return ret;
  2970.       },
  2971.       writeFile: function (path, data, opts) {
  2972.         opts = opts || {};
  2973.         opts.flags = opts.flags || 577;
  2974.         var stream = FS.open(path, opts.flags, opts.mode);
  2975.         if (typeof data === "string") {
  2976.           var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  2977.           var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  2978.           FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
  2979.         } else if (ArrayBuffer.isView(data)) {
  2980.           FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
  2981.         } else {
  2982.           throw new Error("Unsupported data type");
  2983.         }
  2984.         FS.close(stream);
  2985.       },
  2986.       cwd: function () {
  2987.         return FS.currentPath;
  2988.       },
  2989.       chdir: function (path) {
  2990.         var lookup = FS.lookupPath(path, { follow: true });
  2991.         if (lookup.node === null) {
  2992.           throw new FS.ErrnoError(44);
  2993.         }
  2994.         if (!FS.isDir(lookup.node.mode)) {
  2995.           throw new FS.ErrnoError(54);
  2996.         }
  2997.         var errCode = FS.nodePermissions(lookup.node, "x");
  2998.         if (errCode) {
  2999.           throw new FS.ErrnoError(errCode);
  3000.         }
  3001.         FS.currentPath = lookup.path;
  3002.       },
  3003.       createDefaultDirectories: function () {
  3004.         FS.mkdir("/tmp");
  3005.         FS.mkdir("/home");
  3006.         FS.mkdir("/home/web_user");
  3007.       },
  3008.       createDefaultDevices: function () {
  3009.         FS.mkdir("/dev");
  3010.         FS.registerDevice(FS.makedev(1, 3), {
  3011.           read: function () {
  3012.             return 0;
  3013.           },
  3014.           write: function (stream, buffer, offset, length, pos) {
  3015.             return length;
  3016.           },
  3017.         });
  3018.         FS.mkdev("/dev/null", FS.makedev(1, 3));
  3019.         TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  3020.         TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  3021.         FS.mkdev("/dev/tty", FS.makedev(5, 0));
  3022.         FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  3023.         var random_device = getRandomDevice();
  3024.         FS.createDevice("/dev", "random", random_device);
  3025.         FS.createDevice("/dev", "urandom", random_device);
  3026.         FS.mkdir("/dev/shm");
  3027.         FS.mkdir("/dev/shm/tmp");
  3028.       },
  3029.       createSpecialDirectories: function () {
  3030.         FS.mkdir("/proc");
  3031.         var proc_self = FS.mkdir("/proc/self");
  3032.         FS.mkdir("/proc/self/fd");
  3033.         FS.mount(
  3034.           {
  3035.             mount: function () {
  3036.               var node = FS.createNode(proc_self, "fd", 16384 | 511, 73);
  3037.               node.node_ops = {
  3038.                 lookup: function (parent, name) {
  3039.                   var fd = +name;
  3040.                   var stream = FS.getStream(fd);
  3041.                   if (!stream) throw new FS.ErrnoError(8);
  3042.                   var ret = {
  3043.                     parent: null,
  3044.                     mount: { mountpoint: "fake" },
  3045.                     node_ops: {
  3046.                       readlink: function () {
  3047.                         return stream.path;
  3048.                       },
  3049.                     },
  3050.                   };
  3051.                   ret.parent = ret;
  3052.                   return ret;
  3053.                 },
  3054.               };
  3055.               return node;
  3056.             },
  3057.           },
  3058.           {},
  3059.           "/proc/self/fd"
  3060.         );
  3061.       },
  3062.       createStandardStreams: function () {
  3063.         if (Module["stdin"]) {
  3064.           FS.createDevice("/dev", "stdin", Module["stdin"]);
  3065.         } else {
  3066.           FS.symlink("/dev/tty", "/dev/stdin");
  3067.         }
  3068.         if (Module["stdout"]) {
  3069.           FS.createDevice("/dev", "stdout", null, Module["stdout"]);
  3070.         } else {
  3071.           FS.symlink("/dev/tty", "/dev/stdout");
  3072.         }
  3073.         if (Module["stderr"]) {
  3074.           FS.createDevice("/dev", "stderr", null, Module["stderr"]);
  3075.         } else {
  3076.           FS.symlink("/dev/tty1", "/dev/stderr");
  3077.         }
  3078.         var stdin = FS.open("/dev/stdin", 0);
  3079.         var stdout = FS.open("/dev/stdout", 1);
  3080.         var stderr = FS.open("/dev/stderr", 1);
  3081.       },
  3082.       ensureErrnoError: function () {
  3083.         if (FS.ErrnoError) return;
  3084.         FS.ErrnoError = function ErrnoError(errno, node) {
  3085.           this.node = node;
  3086.           this.setErrno = function (errno) {
  3087.             this.errno = errno;
  3088.           };
  3089.           this.setErrno(errno);
  3090.           this.message = "FS error";
  3091.         };
  3092.         FS.ErrnoError.prototype = new Error();
  3093.         FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  3094.         [44].forEach(function (code) {
  3095.           FS.genericErrors[code] = new FS.ErrnoError(code);
  3096.           FS.genericErrors[code].stack = "<generic error, no stack>";
  3097.         });
  3098.       },
  3099.       staticInit: function () {
  3100.         FS.ensureErrnoError();
  3101.         FS.nameTable = new Array(4096);
  3102.         FS.mount(MEMFS, {}, "/");
  3103.         FS.createDefaultDirectories();
  3104.         FS.createDefaultDevices();
  3105.         FS.createSpecialDirectories();
  3106.         FS.filesystems = { MEMFS: MEMFS };
  3107.       },
  3108.       init: function (input, output, error) {
  3109.         FS.init.initialized = true;
  3110.         FS.ensureErrnoError();
  3111.         Module["stdin"] = input || Module["stdin"];
  3112.         Module["stdout"] = output || Module["stdout"];
  3113.         Module["stderr"] = error || Module["stderr"];
  3114.         FS.createStandardStreams();
  3115.       },
  3116.       quit: function () {
  3117.         FS.init.initialized = false;
  3118.         var fflush = Module["_fflush"];
  3119.         if (fflush) fflush(0);
  3120.         for (var i = 0; i < FS.streams.length; i++) {
  3121.           var stream = FS.streams[i];
  3122.           if (!stream) {
  3123.             continue;
  3124.           }
  3125.           FS.close(stream);
  3126.         }
  3127.       },
  3128.       getMode: function (canRead, canWrite) {
  3129.         var mode = 0;
  3130.         if (canRead) mode |= 292 | 73;
  3131.         if (canWrite) mode |= 146;
  3132.         return mode;
  3133.       },
  3134.       findObject: function (path, dontResolveLastLink) {
  3135.         var ret = FS.analyzePath(path, dontResolveLastLink);
  3136.         if (ret.exists) {
  3137.           return ret.object;
  3138.         } else {
  3139.           return null;
  3140.         }
  3141.       },
  3142.       analyzePath: function (path, dontResolveLastLink) {
  3143.         try {
  3144.           var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
  3145.           path = lookup.path;
  3146.         } catch (e) {}
  3147.         var ret = {
  3148.           isRoot: false,
  3149.           exists: false,
  3150.           error: 0,
  3151.           name: null,
  3152.           path: null,
  3153.           object: null,
  3154.           parentExists: false,
  3155.           parentPath: null,
  3156.           parentObject: null,
  3157.         };
  3158.         try {
  3159.           var lookup = FS.lookupPath(path, { parent: true });
  3160.           ret.parentExists = true;
  3161.           ret.parentPath = lookup.path;
  3162.           ret.parentObject = lookup.node;
  3163.           ret.name = PATH.basename(path);
  3164.           lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
  3165.           ret.exists = true;
  3166.           ret.path = lookup.path;
  3167.           ret.object = lookup.node;
  3168.           ret.name = lookup.node.name;
  3169.           ret.isRoot = lookup.path === "/";
  3170.         } catch (e) {
  3171.           ret.error = e.errno;
  3172.         }
  3173.         return ret;
  3174.       },
  3175.       createPath: function (parent, path, canRead, canWrite) {
  3176.         parent = typeof parent === "string" ? parent : FS.getPath(parent);
  3177.         var parts = path.split("/").reverse();
  3178.         while (parts.length) {
  3179.           var part = parts.pop();
  3180.           if (!part) continue;
  3181.           var current = PATH.join2(parent, part);
  3182.           try {
  3183.             FS.mkdir(current);
  3184.           } catch (e) {}
  3185.           parent = current;
  3186.         }
  3187.         return current;
  3188.       },
  3189.       createFile: function (parent, name, properties, canRead, canWrite) {
  3190.         var path = PATH.join2(
  3191.           typeof parent === "string" ? parent : FS.getPath(parent),
  3192.           name
  3193.         );
  3194.         var mode = FS.getMode(canRead, canWrite);
  3195.         return FS.create(path, mode);
  3196.       },
  3197.       createDataFile: function (parent, name, data, canRead, canWrite, canOwn) {
  3198.         var path = name
  3199.           ? PATH.join2(
  3200.               typeof parent === "string" ? parent : FS.getPath(parent),
  3201.               name
  3202.             )
  3203.           : parent;
  3204.         var mode = FS.getMode(canRead, canWrite);
  3205.         var node = FS.create(path, mode);
  3206.         if (data) {
  3207.           if (typeof data === "string") {
  3208.             var arr = new Array(data.length);
  3209.             for (var i = 0, len = data.length; i < len; ++i)
  3210.               arr[i] = data.charCodeAt(i);
  3211.             data = arr;
  3212.           }
  3213.           FS.chmod(node, mode | 146);
  3214.           var stream = FS.open(node, 577);
  3215.           FS.write(stream, data, 0, data.length, 0, canOwn);
  3216.           FS.close(stream);
  3217.           FS.chmod(node, mode);
  3218.         }
  3219.         return node;
  3220.       },
  3221.       createDevice: function (parent, name, input, output) {
  3222.         var path = PATH.join2(
  3223.           typeof parent === "string" ? parent : FS.getPath(parent),
  3224.           name
  3225.         );
  3226.         var mode = FS.getMode(!!input, !!output);
  3227.         if (!FS.createDevice.major) FS.createDevice.major = 64;
  3228.         var dev = FS.makedev(FS.createDevice.major++, 0);
  3229.         FS.registerDevice(dev, {
  3230.           open: function (stream) {
  3231.             stream.seekable = false;
  3232.           },
  3233.           close: function (stream) {
  3234.             if (output && output.buffer && output.buffer.length) {
  3235.               output(10);
  3236.             }
  3237.           },
  3238.           read: function (stream, buffer, offset, length, pos) {
  3239.             var bytesRead = 0;
  3240.             for (var i = 0; i < length; i++) {
  3241.               var result;
  3242.               try {
  3243.                 result = input();
  3244.               } catch (e) {
  3245.                 throw new FS.ErrnoError(29);
  3246.               }
  3247.               if (result === undefined && bytesRead === 0) {
  3248.                 throw new FS.ErrnoError(6);
  3249.               }
  3250.               if (result === null || result === undefined) break;
  3251.               bytesRead++;
  3252.               buffer[offset + i] = result;
  3253.             }
  3254.             if (bytesRead) {
  3255.               stream.node.timestamp = Date.now();
  3256.             }
  3257.             return bytesRead;
  3258.           },
  3259.           write: function (stream, buffer, offset, length, pos) {
  3260.             for (var i = 0; i < length; i++) {
  3261.               try {
  3262.                 output(buffer[offset + i]);
  3263.               } catch (e) {
  3264.                 throw new FS.ErrnoError(29);
  3265.               }
  3266.             }
  3267.             if (length) {
  3268.               stream.node.timestamp = Date.now();
  3269.             }
  3270.             return i;
  3271.           },
  3272.         });
  3273.         return FS.mkdev(path, mode, dev);
  3274.       },
  3275.       forceLoadFile: function (obj) {
  3276.         if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
  3277.           return true;
  3278.         if (typeof XMLHttpRequest !== "undefined") {
  3279.           throw new Error(
  3280.             "Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."
  3281.           );
  3282.         } else if (read_) {
  3283.           try {
  3284.             obj.contents = intArrayFromString(read_(obj.url), true);
  3285.             obj.usedBytes = obj.contents.length;
  3286.           } catch (e) {
  3287.             throw new FS.ErrnoError(29);
  3288.           }
  3289.         } else {
  3290.           throw new Error("Cannot load without read() or XMLHttpRequest.");
  3291.         }
  3292.       },
  3293.       createLazyFile: function (parent, name, url, canRead, canWrite) {
  3294.         function LazyUint8Array() {
  3295.           this.lengthKnown = false;
  3296.           this.chunks = [];
  3297.         }
  3298.         LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  3299.           if (idx > this.length - 1 || idx < 0) {
  3300.             return undefined;
  3301.           }
  3302.           var chunkOffset = idx % this.chunkSize;
  3303.           var chunkNum = (idx / this.chunkSize) | 0;
  3304.           return this.getter(chunkNum)[chunkOffset];
  3305.         };
  3306.         LazyUint8Array.prototype.setDataGetter =
  3307.           function LazyUint8Array_setDataGetter(getter) {
  3308.             this.getter = getter;
  3309.           };
  3310.         LazyUint8Array.prototype.cacheLength =
  3311.           function LazyUint8Array_cacheLength() {
  3312.             var xhr = new XMLHttpRequest();
  3313.             xhr.open("HEAD", url, false);
  3314.             xhr.send(null);
  3315.             if (
  3316.               !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
  3317.             )
  3318.               throw new Error(
  3319.                 "Couldn't load " + url + ". Status: " + xhr.status
  3320.               );
  3321.             var datalength = Number(xhr.getResponseHeader("Content-length"));
  3322.             var header;
  3323.             var hasByteServing =
  3324.               (header = xhr.getResponseHeader("Accept-Ranges")) &&
  3325.               header === "bytes";
  3326.             var usesGzip =
  3327.               (header = xhr.getResponseHeader("Content-Encoding")) &&
  3328.               header === "gzip";
  3329.             var chunkSize = 1024 * 1024;
  3330.             if (!hasByteServing) chunkSize = datalength;
  3331.             var doXHR = function (from, to) {
  3332.               if (from > to)
  3333.                 throw new Error(
  3334.                   "invalid range (" +
  3335.                     from +
  3336.                     ", " +
  3337.                     to +
  3338.                     ") or no bytes requested!"
  3339.                 );
  3340.               if (to > datalength - 1)
  3341.                 throw new Error(
  3342.                   "only " + datalength + " bytes available! programmer error!"
  3343.                 );
  3344.               var xhr = new XMLHttpRequest();
  3345.               xhr.open("GET", url, false);
  3346.               if (datalength !== chunkSize)
  3347.                 xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  3348.               if (typeof Uint8Array != "undefined")
  3349.                 xhr.responseType = "arraybuffer";
  3350.               if (xhr.overrideMimeType) {
  3351.                 xhr.overrideMimeType("text/plain; charset=x-user-defined");
  3352.               }
  3353.               xhr.send(null);
  3354.               if (
  3355.                 !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
  3356.               )
  3357.                 throw new Error(
  3358.                   "Couldn't load " + url + ". Status: " + xhr.status
  3359.                 );
  3360.               if (xhr.response !== undefined) {
  3361.                 return new Uint8Array(xhr.response || []);
  3362.               } else {
  3363.                 return intArrayFromString(xhr.responseText || "", true);
  3364.               }
  3365.             };
  3366.             var lazyArray = this;
  3367.             lazyArray.setDataGetter(function (chunkNum) {
  3368.               var start = chunkNum * chunkSize;
  3369.               var end = (chunkNum + 1) * chunkSize - 1;
  3370.               end = Math.min(end, datalength - 1);
  3371.               if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  3372.                 lazyArray.chunks[chunkNum] = doXHR(start, end);
  3373.               }
  3374.               if (typeof lazyArray.chunks[chunkNum] === "undefined")
  3375.                 throw new Error("doXHR failed!");
  3376.               return lazyArray.chunks[chunkNum];
  3377.             });
  3378.             if (usesGzip || !datalength) {
  3379.               chunkSize = datalength = 1;
  3380.               datalength = this.getter(0).length;
  3381.               chunkSize = datalength;
  3382.               out(
  3383.                 "LazyFiles on gzip forces download of the whole file when length is accessed"
  3384.               );
  3385.             }
  3386.             this._length = datalength;
  3387.             this._chunkSize = chunkSize;
  3388.             this.lengthKnown = true;
  3389.           };
  3390.         if (typeof XMLHttpRequest !== "undefined") {
  3391.           if (!ENVIRONMENT_IS_WORKER)
  3392.             throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  3393.           var lazyArray = new LazyUint8Array();
  3394.           Object.defineProperties(lazyArray, {
  3395.             length: {
  3396.               get: function () {
  3397.                 if (!this.lengthKnown) {
  3398.                   this.cacheLength();
  3399.                 }
  3400.                 return this._length;
  3401.               },
  3402.             },
  3403.             chunkSize: {
  3404.               get: function () {
  3405.                 if (!this.lengthKnown) {
  3406.                   this.cacheLength();
  3407.                 }
  3408.                 return this._chunkSize;
  3409.               },
  3410.             },
  3411.           });
  3412.           var properties = { isDevice: false, contents: lazyArray };
  3413.         } else {
  3414.           var properties = { isDevice: false, url: url };
  3415.         }
  3416.         var node = FS.createFile(parent, name, properties, canRead, canWrite);
  3417.         if (properties.contents) {
  3418.           node.contents = properties.contents;
  3419.         } else if (properties.url) {
  3420.           node.contents = null;
  3421.           node.url = properties.url;
  3422.         }
  3423.         Object.defineProperties(node, {
  3424.           usedBytes: {
  3425.             get: function () {
  3426.               return this.contents.length;
  3427.             },
  3428.           },
  3429.         });
  3430.         var stream_ops = {};
  3431.         var keys = Object.keys(node.stream_ops);
  3432.         keys.forEach(function (key) {
  3433.           var fn = node.stream_ops[key];
  3434.           stream_ops[key] = function forceLoadLazyFile() {
  3435.             FS.forceLoadFile(node);
  3436.             return fn.apply(null, arguments);
  3437.           };
  3438.         });
  3439.         stream_ops.read = function stream_ops_read(
  3440.           stream,
  3441.           buffer,
  3442.           offset,
  3443.           length,
  3444.           position
  3445.         ) {
  3446.           FS.forceLoadFile(node);
  3447.           var contents = stream.node.contents;
  3448.           if (position >= contents.length) return 0;
  3449.           var size = Math.min(contents.length - position, length);
  3450.           if (contents.slice) {
  3451.             for (var i = 0; i < size; i++) {
  3452.               buffer[offset + i] = contents[position + i];
  3453.             }
  3454.           } else {
  3455.             for (var i = 0; i < size; i++) {
  3456.               buffer[offset + i] = contents.get(position + i);
  3457.             }
  3458.           }
  3459.           return size;
  3460.         };
  3461.         node.stream_ops = stream_ops;
  3462.         return node;
  3463.       },
  3464.       createPreloadedFile: function (
  3465.         parent,
  3466.         name,
  3467.         url,
  3468.         canRead,
  3469.         canWrite,
  3470.         onload,
  3471.         onerror,
  3472.         dontCreateFile,
  3473.         canOwn,
  3474.         preFinish
  3475.       ) {
  3476.         Browser.init();
  3477.         var fullname = name
  3478.           ? PATH_FS.resolve(PATH.join2(parent, name))
  3479.           : parent;
  3480.         var dep = getUniqueRunDependency("cp " + fullname);
  3481.         function processData(byteArray) {
  3482.           function finish(byteArray) {
  3483.             if (preFinish) preFinish();
  3484.             if (!dontCreateFile) {
  3485.               FS.createDataFile(
  3486.                 parent,
  3487.                 name,
  3488.                 byteArray,
  3489.                 canRead,
  3490.                 canWrite,
  3491.                 canOwn
  3492.               );
  3493.             }
  3494.             if (onload) onload();
  3495.             removeRunDependency(dep);
  3496.           }
  3497.           var handled = false;
  3498.           Module["preloadPlugins"].forEach(function (plugin) {
  3499.             if (handled) return;
  3500.             if (plugin["canHandle"](fullname)) {
  3501.               plugin["handle"](byteArray, fullname, finish, function () {
  3502.                 if (onerror) onerror();
  3503.                 removeRunDependency(dep);
  3504.               });
  3505.               handled = true;
  3506.             }
  3507.           });
  3508.           if (!handled) finish(byteArray);
  3509.         }
  3510.         addRunDependency(dep);
  3511.         if (typeof url == "string") {
  3512.           Browser.asyncLoad(
  3513.             url,
  3514.             function (byteArray) {
  3515.               processData(byteArray);
  3516.             },
  3517.             onerror
  3518.           );
  3519.         } else {
  3520.           processData(url);
  3521.         }
  3522.       },
  3523.       indexedDB: function () {
  3524.         return (
  3525.           window.indexedDB ||
  3526.           window.mozIndexedDB ||
  3527.           window.webkitIndexedDB ||
  3528.           window.msIndexedDB
  3529.         );
  3530.       },
  3531.       DB_NAME: function () {
  3532.         return "EM_FS_" + window.location.pathname;
  3533.       },
  3534.       DB_VERSION: 20,
  3535.       DB_STORE_NAME: "FILE_DATA",
  3536.       saveFilesToDB: function (paths, onload, onerror) {
  3537.         onload = onload || function () {};
  3538.         onerror = onerror || function () {};
  3539.         var indexedDB = FS.indexedDB();
  3540.         try {
  3541.           var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  3542.         } catch (e) {
  3543.           return onerror(e);
  3544.         }
  3545.         openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  3546.           out("creating db");
  3547.           var db = openRequest.result;
  3548.           db.createObjectStore(FS.DB_STORE_NAME);
  3549.         };
  3550.         openRequest.onsuccess = function openRequest_onsuccess() {
  3551.           var db = openRequest.result;
  3552.           var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  3553.           var files = transaction.objectStore(FS.DB_STORE_NAME);
  3554.           var ok = 0,
  3555.             fail = 0,
  3556.             total = paths.length;
  3557.           function finish() {
  3558.             if (fail == 0) onload();
  3559.             else onerror();
  3560.           }
  3561.           paths.forEach(function (path) {
  3562.             var putRequest = files.put(
  3563.               FS.analyzePath(path).object.contents,
  3564.               path
  3565.             );
  3566.             putRequest.onsuccess = function putRequest_onsuccess() {
  3567.               ok++;
  3568.               if (ok + fail == total) finish();
  3569.             };
  3570.             putRequest.onerror = function putRequest_onerror() {
  3571.               fail++;
  3572.               if (ok + fail == total) finish();
  3573.             };
  3574.           });
  3575.           transaction.onerror = onerror;
  3576.         };
  3577.         openRequest.onerror = onerror;
  3578.       },
  3579.       loadFilesFromDB: function (paths, onload, onerror) {
  3580.         onload = onload || function () {};
  3581.         onerror = onerror || function () {};
  3582.         var indexedDB = FS.indexedDB();
  3583.         try {
  3584.           var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  3585.         } catch (e) {
  3586.           return onerror(e);
  3587.         }
  3588.         openRequest.onupgradeneeded = onerror;
  3589.         openRequest.onsuccess = function openRequest_onsuccess() {
  3590.           var db = openRequest.result;
  3591.           try {
  3592.             var transaction = db.transaction([FS.DB_STORE_NAME], "readonly");
  3593.           } catch (e) {
  3594.             onerror(e);
  3595.             return;
  3596.           }
  3597.           var files = transaction.objectStore(FS.DB_STORE_NAME);
  3598.           var ok = 0,
  3599.             fail = 0,
  3600.             total = paths.length;
  3601.           function finish() {
  3602.             if (fail == 0) onload();
  3603.             else onerror();
  3604.           }
  3605.           paths.forEach(function (path) {
  3606.             var getRequest = files.get(path);
  3607.             getRequest.onsuccess = function getRequest_onsuccess() {
  3608.               if (FS.analyzePath(path).exists) {
  3609.                 FS.unlink(path);
  3610.               }
  3611.               FS.createDataFile(
  3612.                 PATH.dirname(path),
  3613.                 PATH.basename(path),
  3614.                 getRequest.result,
  3615.                 true,
  3616.                 true,
  3617.                 true
  3618.               );
  3619.               ok++;
  3620.               if (ok + fail == total) finish();
  3621.             };
  3622.             getRequest.onerror = function getRequest_onerror() {
  3623.               fail++;
  3624.               if (ok + fail == total) finish();
  3625.             };
  3626.           });
  3627.           transaction.onerror = onerror;
  3628.         };
  3629.         openRequest.onerror = onerror;
  3630.       },
  3631.     };
  3632.     var SYSCALLS = {
  3633.       mappings: {},
  3634.       DEFAULT_POLLMASK: 5,
  3635.       umask: 511,
  3636.       calculateAt: function (dirfd, path, allowEmpty) {
  3637.         if (path[0] === "/") {
  3638.           return path;
  3639.         }
  3640.         var dir;
  3641.         if (dirfd === -100) {
  3642.           dir = FS.cwd();
  3643.         } else {
  3644.           var dirstream = FS.getStream(dirfd);
  3645.           if (!dirstream) throw new FS.ErrnoError(8);
  3646.           dir = dirstream.path;
  3647.         }
  3648.         if (path.length == 0) {
  3649.           if (!allowEmpty) {
  3650.             throw new FS.ErrnoError(44);
  3651.           }
  3652.           return dir;
  3653.         }
  3654.         return PATH.join2(dir, path);
  3655.       },
  3656.       doStat: function (func, path, buf) {
  3657.         try {
  3658.           var stat = func(path);
  3659.         } catch (e) {
  3660.           if (
  3661.             e &&
  3662.             e.node &&
  3663.             PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))
  3664.           ) {
  3665.             return -54;
  3666.           }
  3667.           throw e;
  3668.         }
  3669.         HEAP32[buf >> 2] = stat.dev;
  3670.         HEAP32[(buf + 4) >> 2] = 0;
  3671.         HEAP32[(buf + 8) >> 2] = stat.ino;
  3672.         HEAP32[(buf + 12) >> 2] = stat.mode;
  3673.         HEAP32[(buf + 16) >> 2] = stat.nlink;
  3674.         HEAP32[(buf + 20) >> 2] = stat.uid;
  3675.         HEAP32[(buf + 24) >> 2] = stat.gid;
  3676.         HEAP32[(buf + 28) >> 2] = stat.rdev;
  3677.         HEAP32[(buf + 32) >> 2] = 0;
  3678.         (tempI64 = [
  3679.           stat.size >>> 0,
  3680.           ((tempDouble = stat.size),
  3681.           +Math.abs(tempDouble) >= 1
  3682.             ? tempDouble > 0
  3683.               ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) |
  3684.                   0) >>>
  3685.                 0
  3686.               : ~~+Math.ceil(
  3687.                   (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
  3688.                 ) >>> 0
  3689.             : 0),
  3690.         ]),
  3691.           (HEAP32[(buf + 40) >> 2] = tempI64[0]),
  3692.           (HEAP32[(buf + 44) >> 2] = tempI64[1]);
  3693.         HEAP32[(buf + 48) >> 2] = 4096;
  3694.         HEAP32[(buf + 52) >> 2] = stat.blocks;
  3695.         HEAP32[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0;
  3696.         HEAP32[(buf + 60) >> 2] = 0;
  3697.         HEAP32[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0;
  3698.         HEAP32[(buf + 68) >> 2] = 0;
  3699.         HEAP32[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0;
  3700.         HEAP32[(buf + 76) >> 2] = 0;
  3701.         (tempI64 = [
  3702.           stat.ino >>> 0,
  3703.           ((tempDouble = stat.ino),
  3704.           +Math.abs(tempDouble) >= 1
  3705.             ? tempDouble > 0
  3706.               ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) |
  3707.                   0) >>>
  3708.                 0
  3709.               : ~~+Math.ceil(
  3710.                   (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
  3711.                 ) >>> 0
  3712.             : 0),
  3713.         ]),
  3714.           (HEAP32[(buf + 80) >> 2] = tempI64[0]),
  3715.           (HEAP32[(buf + 84) >> 2] = tempI64[1]);
  3716.         return 0;
  3717.       },
  3718.       doMsync: function (addr, stream, len, flags, offset) {
  3719.         var buffer = HEAPU8.slice(addr, addr + len);
  3720.         FS.msync(stream, buffer, offset, len, flags);
  3721.       },
  3722.       doMkdir: function (path, mode) {
  3723.         path = PATH.normalize(path);
  3724.         if (path[path.length - 1] === "/")
  3725.           path = path.substr(0, path.length - 1);
  3726.         FS.mkdir(path, mode, 0);
  3727.         return 0;
  3728.       },
  3729.       doMknod: function (path, mode, dev) {
  3730.         switch (mode & 61440) {
  3731.           case 32768:
  3732.           case 8192:
  3733.           case 24576:
  3734.           case 4096:
  3735.           case 49152:
  3736.             break;
  3737.           default:
  3738.             return -28;
  3739.         }
  3740.         FS.mknod(path, mode, dev);
  3741.         return 0;
  3742.       },
  3743.       doReadlink: function (path, buf, bufsize) {
  3744.         if (bufsize <= 0) return -28;
  3745.         var ret = FS.readlink(path);
  3746.         var len = Math.min(bufsize, lengthBytesUTF8(ret));
  3747.         var endChar = HEAP8[buf + len];
  3748.         stringToUTF8(ret, buf, bufsize + 1);
  3749.         HEAP8[buf + len] = endChar;
  3750.         return len;
  3751.       },
  3752.       doAccess: function (path, amode) {
  3753.         if (amode & ~7) {
  3754.           return -28;
  3755.         }
  3756.         var node;
  3757.         var lookup = FS.lookupPath(path, { follow: true });
  3758.         node = lookup.node;
  3759.         if (!node) {
  3760.           return -44;
  3761.         }
  3762.         var perms = "";
  3763.         if (amode & 4) perms += "r";
  3764.         if (amode & 2) perms += "w";
  3765.         if (amode & 1) perms += "x";
  3766.         if (perms && FS.nodePermissions(node, perms)) {
  3767.           return -2;
  3768.         }
  3769.         return 0;
  3770.       },
  3771.       doDup: function (path, flags, suggestFD) {
  3772.         var suggest = FS.getStream(suggestFD);
  3773.         if (suggest) FS.close(suggest);
  3774.         return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
  3775.       },
  3776.       doReadv: function (stream, iov, iovcnt, offset) {
  3777.         var ret = 0;
  3778.         for (var i = 0; i < iovcnt; i++) {
  3779.           var ptr = HEAP32[(iov + i * 8) >> 2];
  3780.           var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
  3781.           var curr = FS.read(stream, HEAP8, ptr, len, offset);
  3782.           if (curr < 0) return -1;
  3783.           ret += curr;
  3784.           if (curr < len) break;
  3785.         }
  3786.         return ret;
  3787.       },
  3788.       doWritev: function (stream, iov, iovcnt, offset) {
  3789.         var ret = 0;
  3790.         for (var i = 0; i < iovcnt; i++) {
  3791.           var ptr = HEAP32[(iov + i * 8) >> 2];
  3792.           var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
  3793.           var curr = FS.write(stream, HEAP8, ptr, len, offset);
  3794.           if (curr < 0) return -1;
  3795.           ret += curr;
  3796.         }
  3797.         return ret;
  3798.       },
  3799.       varargs: undefined,
  3800.       get: function () {
  3801.         SYSCALLS.varargs += 4;
  3802.         var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2];
  3803.         return ret;
  3804.       },
  3805.       getStr: function (ptr) {
  3806.         var ret = UTF8ToString(ptr);
  3807.         return ret;
  3808.       },
  3809.       getStreamFromFD: function (fd) {
  3810.         var stream = FS.getStream(fd);
  3811.         if (!stream) throw new FS.ErrnoError(8);
  3812.         return stream;
  3813.       },
  3814.       get64: function (low, high) {
  3815.         return low;
  3816.       },
  3817.     };
  3818.     function ___sys_fcntl64(fd, cmd, varargs) {
  3819.       SYSCALLS.varargs = varargs;
  3820.       try {
  3821.         var stream = SYSCALLS.getStreamFromFD(fd);
  3822.         switch (cmd) {
  3823.           case 0: {
  3824.             var arg = SYSCALLS.get();
  3825.             if (arg < 0) {
  3826.               return -28;
  3827.             }
  3828.             var newStream;
  3829.             newStream = FS.open(stream.path, stream.flags, 0, arg);
  3830.             return newStream.fd;
  3831.           }
  3832.           case 1:
  3833.           case 2:
  3834.             return 0;
  3835.           case 3:
  3836.             return stream.flags;
  3837.           case 4: {
  3838.             var arg = SYSCALLS.get();
  3839.             stream.flags |= arg;
  3840.             return 0;
  3841.           }
  3842.           case 12: {
  3843.             var arg = SYSCALLS.get();
  3844.             var offset = 0;
  3845.             HEAP16[(arg + offset) >> 1] = 2;
  3846.             return 0;
  3847.           }
  3848.           case 13:
  3849.           case 14:
  3850.             return 0;
  3851.           case 16:
  3852.           case 8:
  3853.             return -28;
  3854.           case 9:
  3855.             setErrNo(28);
  3856.             return -1;
  3857.           default: {
  3858.             return -28;
  3859.           }
  3860.         }
  3861.       } catch (e) {
  3862.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  3863.           abort(e);
  3864.         return -e.errno;
  3865.       }
  3866.     }
  3867.     function ___sys_ioctl(fd, op, varargs) {
  3868.       SYSCALLS.varargs = varargs;
  3869.       try {
  3870.         var stream = SYSCALLS.getStreamFromFD(fd);
  3871.         switch (op) {
  3872.           case 21509:
  3873.           case 21505: {
  3874.             if (!stream.tty) return -59;
  3875.             return 0;
  3876.           }
  3877.           case 21510:
  3878.           case 21511:
  3879.           case 21512:
  3880.           case 21506:
  3881.           case 21507:
  3882.           case 21508: {
  3883.             if (!stream.tty) return -59;
  3884.             return 0;
  3885.           }
  3886.           case 21519: {
  3887.             if (!stream.tty) return -59;
  3888.             var argp = SYSCALLS.get();
  3889.             HEAP32[argp >> 2] = 0;
  3890.             return 0;
  3891.           }
  3892.           case 21520: {
  3893.             if (!stream.tty) return -59;
  3894.             return -28;
  3895.           }
  3896.           case 21531: {
  3897.             var argp = SYSCALLS.get();
  3898.             return FS.ioctl(stream, op, argp);
  3899.           }
  3900.           case 21523: {
  3901.             if (!stream.tty) return -59;
  3902.             return 0;
  3903.           }
  3904.           case 21524: {
  3905.             if (!stream.tty) return -59;
  3906.             return 0;
  3907.           }
  3908.           default:
  3909.             abort("bad ioctl syscall " + op);
  3910.         }
  3911.       } catch (e) {
  3912.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  3913.           abort(e);
  3914.         return -e.errno;
  3915.       }
  3916.     }
  3917.     function ___sys_open(path, flags, varargs) {
  3918.       SYSCALLS.varargs = varargs;
  3919.       try {
  3920.         var pathname = SYSCALLS.getStr(path);
  3921.         var mode = varargs ? SYSCALLS.get() : 0;
  3922.         var stream = FS.open(pathname, flags, mode);
  3923.         return stream.fd;
  3924.       } catch (e) {
  3925.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  3926.           abort(e);
  3927.         return -e.errno;
  3928.       }
  3929.     }
  3930.     function __embind_register_bigint(
  3931.       primitiveType,
  3932.       name,
  3933.       size,
  3934.       minRange,
  3935.       maxRange
  3936.     ) {}
  3937.     function getShiftFromSize(size) {
  3938.       switch (size) {
  3939.         case 1:
  3940.           return 0;
  3941.         case 2:
  3942.           return 1;
  3943.         case 4:
  3944.           return 2;
  3945.         case 8:
  3946.           return 3;
  3947.         default:
  3948.           throw new TypeError("Unknown type size: " + size);
  3949.       }
  3950.     }
  3951.     function embind_init_charCodes() {
  3952.       var codes = new Array(256);
  3953.       for (var i = 0; i < 256; ++i) {
  3954.         codes[i] = String.fromCharCode(i);
  3955.       }
  3956.       embind_charCodes = codes;
  3957.     }
  3958.     var embind_charCodes = undefined;
  3959.     function readLatin1String(ptr) {
  3960.       var ret = "";
  3961.       var c = ptr;
  3962.       while (HEAPU8[c]) {
  3963.         ret += embind_charCodes[HEAPU8[c++]];
  3964.       }
  3965.       return ret;
  3966.     }
  3967.     var awaitingDependencies = {};
  3968.     var registeredTypes = {};
  3969.     var typeDependencies = {};
  3970.     var char_0 = 48;
  3971.     var char_9 = 57;
  3972.     function makeLegalFunctionName(name) {
  3973.       if (undefined === name) {
  3974.         return "_unknown";
  3975.       }
  3976.       name = name.replace(/[^a-zA-Z0-9_]/g, "$");
  3977.       var f = name.charCodeAt(0);
  3978.       if (f >= char_0 && f <= char_9) {
  3979.         return "_" + name;
  3980.       } else {
  3981.         return name;
  3982.       }
  3983.     }
  3984.     function createNamedFunction(name, body) {
  3985.       name = makeLegalFunctionName(name);
  3986.       return new Function(
  3987.         "body",
  3988.         "return function " +
  3989.           name +
  3990.           "() {\n" +
  3991.           '    "use strict";' +
  3992.           "    return body.apply(this, arguments);\n" +
  3993.           "};\n"
  3994.       )(body);
  3995.     }
  3996.     function extendError(baseErrorType, errorName) {
  3997.       var errorClass = createNamedFunction(errorName, function (message) {
  3998.         this.name = errorName;
  3999.         this.message = message;
  4000.         var stack = new Error(message).stack;
  4001.         if (stack !== undefined) {
  4002.           this.stack =
  4003.             this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, "");
  4004.         }
  4005.       });
  4006.       errorClass.prototype = Object.create(baseErrorType.prototype);
  4007.       errorClass.prototype.constructor = errorClass;
  4008.       errorClass.prototype.toString = function () {
  4009.         if (this.message === undefined) {
  4010.           return this.name;
  4011.         } else {
  4012.           return this.name + ": " + this.message;
  4013.         }
  4014.       };
  4015.       return errorClass;
  4016.     }
  4017.     var BindingError = undefined;
  4018.     function throwBindingError(message) {
  4019.       throw new BindingError(message);
  4020.     }
  4021.     var InternalError = undefined;
  4022.     function throwInternalError(message) {
  4023.       throw new InternalError(message);
  4024.     }
  4025.     function whenDependentTypesAreResolved(
  4026.       myTypes,
  4027.       dependentTypes,
  4028.       getTypeConverters
  4029.     ) {
  4030.       myTypes.forEach(function (type) {
  4031.         typeDependencies[type] = dependentTypes;
  4032.       });
  4033.       function onComplete(typeConverters) {
  4034.         var myTypeConverters = getTypeConverters(typeConverters);
  4035.         if (myTypeConverters.length !== myTypes.length) {
  4036.           throwInternalError("Mismatched type converter count");
  4037.         }
  4038.         for (var i = 0; i < myTypes.length; ++i) {
  4039.           registerType(myTypes[i], myTypeConverters[i]);
  4040.         }
  4041.       }
  4042.       var typeConverters = new Array(dependentTypes.length);
  4043.       var unregisteredTypes = [];
  4044.       var registered = 0;
  4045.       dependentTypes.forEach(function (dt, i) {
  4046.         if (registeredTypes.hasOwnProperty(dt)) {
  4047.           typeConverters[i] = registeredTypes[dt];
  4048.         } else {
  4049.           unregisteredTypes.push(dt);
  4050.           if (!awaitingDependencies.hasOwnProperty(dt)) {
  4051.             awaitingDependencies[dt] = [];
  4052.           }
  4053.           awaitingDependencies[dt].push(function () {
  4054.             typeConverters[i] = registeredTypes[dt];
  4055.             ++registered;
  4056.             if (registered === unregisteredTypes.length) {
  4057.               onComplete(typeConverters);
  4058.             }
  4059.           });
  4060.         }
  4061.       });
  4062.       if (0 === unregisteredTypes.length) {
  4063.         onComplete(typeConverters);
  4064.       }
  4065.     }
  4066.     function registerType(rawType, registeredInstance, options) {
  4067.       options = options || {};
  4068.       if (!("argPackAdvance" in registeredInstance)) {
  4069.         throw new TypeError(
  4070.           "registerType registeredInstance requires argPackAdvance"
  4071.         );
  4072.       }
  4073.       var name = registeredInstance.name;
  4074.       if (!rawType) {
  4075.         throwBindingError(
  4076.           'type "' + name + '" must have a positive integer typeid pointer'
  4077.         );
  4078.       }
  4079.       if (registeredTypes.hasOwnProperty(rawType)) {
  4080.         if (options.ignoreDuplicateRegistrations) {
  4081.           return;
  4082.         } else {
  4083.           throwBindingError("Cannot register type '" + name + "' twice");
  4084.         }
  4085.       }
  4086.       registeredTypes[rawType] = registeredInstance;
  4087.       delete typeDependencies[rawType];
  4088.       if (awaitingDependencies.hasOwnProperty(rawType)) {
  4089.         var callbacks = awaitingDependencies[rawType];
  4090.         delete awaitingDependencies[rawType];
  4091.         callbacks.forEach(function (cb) {
  4092.           cb();
  4093.         });
  4094.       }
  4095.     }
  4096.     function __embind_register_bool(
  4097.       rawType,
  4098.       name,
  4099.       size,
  4100.       trueValue,
  4101.       falseValue
  4102.     ) {
  4103.       var shift = getShiftFromSize(size);
  4104.       name = readLatin1String(name);
  4105.       registerType(rawType, {
  4106.         name: name,
  4107.         fromWireType: function (wt) {
  4108.           return !!wt;
  4109.         },
  4110.         toWireType: function (destructors, o) {
  4111.           return o ? trueValue : falseValue;
  4112.         },
  4113.         argPackAdvance: 8,
  4114.         readValueFromPointer: function (pointer) {
  4115.           var heap;
  4116.           if (size === 1) {
  4117.             heap = HEAP8;
  4118.           } else if (size === 2) {
  4119.             heap = HEAP16;
  4120.           } else if (size === 4) {
  4121.             heap = HEAP32;
  4122.           } else {
  4123.             throw new TypeError("Unknown boolean type size: " + name);
  4124.           }
  4125.           return this["fromWireType"](heap[pointer >> shift]);
  4126.         },
  4127.         destructorFunction: null,
  4128.       });
  4129.     }
  4130.     function ClassHandle_isAliasOf(other) {
  4131.       if (!(this instanceof ClassHandle)) {
  4132.         return false;
  4133.       }
  4134.       if (!(other instanceof ClassHandle)) {
  4135.         return false;
  4136.       }
  4137.       var leftClass = this.$$.ptrType.registeredClass;
  4138.       var left = this.$$.ptr;
  4139.       var rightClass = other.$$.ptrType.registeredClass;
  4140.       var right = other.$$.ptr;
  4141.       while (leftClass.baseClass) {
  4142.         left = leftClass.upcast(left);
  4143.         leftClass = leftClass.baseClass;
  4144.       }
  4145.       while (rightClass.baseClass) {
  4146.         right = rightClass.upcast(right);
  4147.         rightClass = rightClass.baseClass;
  4148.       }
  4149.       return leftClass === rightClass && left === right;
  4150.     }
  4151.     function shallowCopyInternalPointer(o) {
  4152.       return {
  4153.         count: o.count,
  4154.         deleteScheduled: o.deleteScheduled,
  4155.         preservePointerOnDelete: o.preservePointerOnDelete,
  4156.         ptr: o.ptr,
  4157.         ptrType: o.ptrType,
  4158.         smartPtr: o.smartPtr,
  4159.         smartPtrType: o.smartPtrType,
  4160.       };
  4161.     }
  4162.     function throwInstanceAlreadyDeleted(obj) {
  4163.       function getInstanceTypeName(handle) {
  4164.         return handle.$$.ptrType.registeredClass.name;
  4165.       }
  4166.       throwBindingError(getInstanceTypeName(obj) + " instance already deleted");
  4167.     }
  4168.     var finalizationGroup = false;
  4169.     function detachFinalizer(handle) {}
  4170.     function runDestructor($$) {
  4171.       if ($$.smartPtr) {
  4172.         $$.smartPtrType.rawDestructor($$.smartPtr);
  4173.       } else {
  4174.         $$.ptrType.registeredClass.rawDestructor($$.ptr);
  4175.       }
  4176.     }
  4177.     function releaseClassHandle($$) {
  4178.       $$.count.value -= 1;
  4179.       var toDelete = 0 === $$.count.value;
  4180.       if (toDelete) {
  4181.         runDestructor($$);
  4182.       }
  4183.     }
  4184.     function attachFinalizer(handle) {
  4185.       if ("undefined" === typeof FinalizationGroup) {
  4186.         attachFinalizer = function (handle) {
  4187.           return handle;
  4188.         };
  4189.         return handle;
  4190.       }
  4191.       finalizationGroup = new FinalizationGroup(function (iter) {
  4192.         for (var result = iter.next(); !result.done; result = iter.next()) {
  4193.           var $$ = result.value;
  4194.           if (!$$.ptr) {
  4195.             console.warn("object already deleted: " + $$.ptr);
  4196.           } else {
  4197.             releaseClassHandle($$);
  4198.           }
  4199.         }
  4200.       });
  4201.       attachFinalizer = function (handle) {
  4202.         finalizationGroup.register(handle, handle.$$, handle.$$);
  4203.         return handle;
  4204.       };
  4205.       detachFinalizer = function (handle) {
  4206.         finalizationGroup.unregister(handle.$$);
  4207.       };
  4208.       return attachFinalizer(handle);
  4209.     }
  4210.     function ClassHandle_clone() {
  4211.       if (!this.$$.ptr) {
  4212.         throwInstanceAlreadyDeleted(this);
  4213.       }
  4214.       if (this.$$.preservePointerOnDelete) {
  4215.         this.$$.count.value += 1;
  4216.         return this;
  4217.       } else {
  4218.         var clone = attachFinalizer(
  4219.           Object.create(Object.getPrototypeOf(this), {
  4220.             $$: { value: shallowCopyInternalPointer(this.$$) },
  4221.           })
  4222.         );
  4223.         clone.$$.count.value += 1;
  4224.         clone.$$.deleteScheduled = false;
  4225.         return clone;
  4226.       }
  4227.     }
  4228.     function ClassHandle_delete() {
  4229.       if (!this.$$.ptr) {
  4230.         throwInstanceAlreadyDeleted(this);
  4231.       }
  4232.       if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  4233.         throwBindingError("Object already scheduled for deletion");
  4234.       }
  4235.       detachFinalizer(this);
  4236.       releaseClassHandle(this.$$);
  4237.       if (!this.$$.preservePointerOnDelete) {
  4238.         this.$$.smartPtr = undefined;
  4239.         this.$$.ptr = undefined;
  4240.       }
  4241.     }
  4242.     function ClassHandle_isDeleted() {
  4243.       return !this.$$.ptr;
  4244.     }
  4245.     var delayFunction = undefined;
  4246.     var deletionQueue = [];
  4247.     function flushPendingDeletes() {
  4248.       while (deletionQueue.length) {
  4249.         var obj = deletionQueue.pop();
  4250.         obj.$$.deleteScheduled = false;
  4251.         obj["delete"]();
  4252.       }
  4253.     }
  4254.     function ClassHandle_deleteLater() {
  4255.       if (!this.$$.ptr) {
  4256.         throwInstanceAlreadyDeleted(this);
  4257.       }
  4258.       if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  4259.         throwBindingError("Object already scheduled for deletion");
  4260.       }
  4261.       deletionQueue.push(this);
  4262.       if (deletionQueue.length === 1 && delayFunction) {
  4263.         delayFunction(flushPendingDeletes);
  4264.       }
  4265.       this.$$.deleteScheduled = true;
  4266.       return this;
  4267.     }
  4268.     function init_ClassHandle() {
  4269.       ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf;
  4270.       ClassHandle.prototype["clone"] = ClassHandle_clone;
  4271.       ClassHandle.prototype["delete"] = ClassHandle_delete;
  4272.       ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted;
  4273.       ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater;
  4274.     }
  4275.     function ClassHandle() {}
  4276.     var registeredPointers = {};
  4277.     function ensureOverloadTable(proto, methodName, humanName) {
  4278.       if (undefined === proto[methodName].overloadTable) {
  4279.         var prevFunc = proto[methodName];
  4280.         proto[methodName] = function () {
  4281.           if (
  4282.             !proto[methodName].overloadTable.hasOwnProperty(arguments.length)
  4283.           ) {
  4284.             throwBindingError(
  4285.               "Function '" +
  4286.                 humanName +
  4287.                 "' called with an invalid number of arguments (" +
  4288.                 arguments.length +
  4289.                 ") - expects one of (" +
  4290.                 proto[methodName].overloadTable +
  4291.                 ")!"
  4292.             );
  4293.           }
  4294.           return proto[methodName].overloadTable[arguments.length].apply(
  4295.             this,
  4296.             arguments
  4297.           );
  4298.         };
  4299.         proto[methodName].overloadTable = [];
  4300.         proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
  4301.       }
  4302.     }
  4303.     function exposePublicSymbol(name, value, numArguments) {
  4304.       if (Module.hasOwnProperty(name)) {
  4305.         if (
  4306.           undefined === numArguments ||
  4307.           (undefined !== Module[name].overloadTable &&
  4308.             undefined !== Module[name].overloadTable[numArguments])
  4309.         ) {
  4310.           throwBindingError("Cannot register public name '" + name + "' twice");
  4311.         }
  4312.         ensureOverloadTable(Module, name, name);
  4313.         if (Module.hasOwnProperty(numArguments)) {
  4314.           throwBindingError(
  4315.             "Cannot register multiple overloads of a function with the same number of arguments (" +
  4316.               numArguments +
  4317.               ")!"
  4318.           );
  4319.         }
  4320.         Module[name].overloadTable[numArguments] = value;
  4321.       } else {
  4322.         Module[name] = value;
  4323.         if (undefined !== numArguments) {
  4324.           Module[name].numArguments = numArguments;
  4325.         }
  4326.       }
  4327.     }
  4328.     function RegisteredClass(
  4329.       name,
  4330.       constructor,
  4331.       instancePrototype,
  4332.       rawDestructor,
  4333.       baseClass,
  4334.       getActualType,
  4335.       upcast,
  4336.       downcast
  4337.     ) {
  4338.       this.name = name;
  4339.       this.constructor = constructor;
  4340.       this.instancePrototype = instancePrototype;
  4341.       this.rawDestructor = rawDestructor;
  4342.       this.baseClass = baseClass;
  4343.       this.getActualType = getActualType;
  4344.       this.upcast = upcast;
  4345.       this.downcast = downcast;
  4346.       this.pureVirtualFunctions = [];
  4347.     }
  4348.     function upcastPointer(ptr, ptrClass, desiredClass) {
  4349.       while (ptrClass !== desiredClass) {
  4350.         if (!ptrClass.upcast) {
  4351.           throwBindingError(
  4352.             "Expected null or instance of " +
  4353.               desiredClass.name +
  4354.               ", got an instance of " +
  4355.               ptrClass.name
  4356.           );
  4357.         }
  4358.         ptr = ptrClass.upcast(ptr);
  4359.         ptrClass = ptrClass.baseClass;
  4360.       }
  4361.       return ptr;
  4362.     }
  4363.     function constNoSmartPtrRawPointerToWireType(destructors, handle) {
  4364.       if (handle === null) {
  4365.         if (this.isReference) {
  4366.           throwBindingError("null is not a valid " + this.name);
  4367.         }
  4368.         return 0;
  4369.       }
  4370.       if (!handle.$$) {
  4371.         throwBindingError(
  4372.           'Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name
  4373.         );
  4374.       }
  4375.       if (!handle.$$.ptr) {
  4376.         throwBindingError(
  4377.           "Cannot pass deleted object as a pointer of type " + this.name
  4378.         );
  4379.       }
  4380.       var handleClass = handle.$$.ptrType.registeredClass;
  4381.       var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  4382.       return ptr;
  4383.     }
  4384.     function genericPointerToWireType(destructors, handle) {
  4385.       var ptr;
  4386.       if (handle === null) {
  4387.         if (this.isReference) {
  4388.           throwBindingError("null is not a valid " + this.name);
  4389.         }
  4390.         if (this.isSmartPointer) {
  4391.           ptr = this.rawConstructor();
  4392.           if (destructors !== null) {
  4393.             destructors.push(this.rawDestructor, ptr);
  4394.           }
  4395.           return ptr;
  4396.         } else {
  4397.           return 0;
  4398.         }
  4399.       }
  4400.       if (!handle.$$) {
  4401.         throwBindingError(
  4402.           'Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name
  4403.         );
  4404.       }
  4405.       if (!handle.$$.ptr) {
  4406.         throwBindingError(
  4407.           "Cannot pass deleted object as a pointer of type " + this.name
  4408.         );
  4409.       }
  4410.       if (!this.isConst && handle.$$.ptrType.isConst) {
  4411.         throwBindingError(
  4412.           "Cannot convert argument of type " +
  4413.             (handle.$$.smartPtrType
  4414.               ? handle.$$.smartPtrType.name
  4415.               : handle.$$.ptrType.name) +
  4416.             " to parameter type " +
  4417.             this.name
  4418.         );
  4419.       }
  4420.       var handleClass = handle.$$.ptrType.registeredClass;
  4421.       ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  4422.       if (this.isSmartPointer) {
  4423.         if (undefined === handle.$$.smartPtr) {
  4424.           throwBindingError("Passing raw pointer to smart pointer is illegal");
  4425.         }
  4426.         switch (this.sharingPolicy) {
  4427.           case 0:
  4428.             if (handle.$$.smartPtrType === this) {
  4429.               ptr = handle.$$.smartPtr;
  4430.             } else {
  4431.               throwBindingError(
  4432.                 "Cannot convert argument of type " +
  4433.                   (handle.$$.smartPtrType
  4434.                     ? handle.$$.smartPtrType.name
  4435.                     : handle.$$.ptrType.name) +
  4436.                   " to parameter type " +
  4437.                   this.name
  4438.               );
  4439.             }
  4440.             break;
  4441.           case 1:
  4442.             ptr = handle.$$.smartPtr;
  4443.             break;
  4444.           case 2:
  4445.             if (handle.$$.smartPtrType === this) {
  4446.               ptr = handle.$$.smartPtr;
  4447.             } else {
  4448.               var clonedHandle = handle["clone"]();
  4449.               ptr = this.rawShare(
  4450.                 ptr,
  4451.                 __emval_register(function () {
  4452.                   clonedHandle["delete"]();
  4453.                 })
  4454.               );
  4455.               if (destructors !== null) {
  4456.                 destructors.push(this.rawDestructor, ptr);
  4457.               }
  4458.             }
  4459.             break;
  4460.           default:
  4461.             throwBindingError("Unsupporting sharing policy");
  4462.         }
  4463.       }
  4464.       return ptr;
  4465.     }
  4466.     function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
  4467.       if (handle === null) {
  4468.         if (this.isReference) {
  4469.           throwBindingError("null is not a valid " + this.name);
  4470.         }
  4471.         return 0;
  4472.       }
  4473.       if (!handle.$$) {
  4474.         throwBindingError(
  4475.           'Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name
  4476.         );
  4477.       }
  4478.       if (!handle.$$.ptr) {
  4479.         throwBindingError(
  4480.           "Cannot pass deleted object as a pointer of type " + this.name
  4481.         );
  4482.       }
  4483.       if (handle.$$.ptrType.isConst) {
  4484.         throwBindingError(
  4485.           "Cannot convert argument of type " +
  4486.             handle.$$.ptrType.name +
  4487.             " to parameter type " +
  4488.             this.name
  4489.         );
  4490.       }
  4491.       var handleClass = handle.$$.ptrType.registeredClass;
  4492.       var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  4493.       return ptr;
  4494.     }
  4495.     function simpleReadValueFromPointer(pointer) {
  4496.       return this["fromWireType"](HEAPU32[pointer >> 2]);
  4497.     }
  4498.     function RegisteredPointer_getPointee(ptr) {
  4499.       if (this.rawGetPointee) {
  4500.         ptr = this.rawGetPointee(ptr);
  4501.       }
  4502.       return ptr;
  4503.     }
  4504.     function RegisteredPointer_destructor(ptr) {
  4505.       if (this.rawDestructor) {
  4506.         this.rawDestructor(ptr);
  4507.       }
  4508.     }
  4509.     function RegisteredPointer_deleteObject(handle) {
  4510.       if (handle !== null) {
  4511.         handle["delete"]();
  4512.       }
  4513.     }
  4514.     function downcastPointer(ptr, ptrClass, desiredClass) {
  4515.       if (ptrClass === desiredClass) {
  4516.         return ptr;
  4517.       }
  4518.       if (undefined === desiredClass.baseClass) {
  4519.         return null;
  4520.       }
  4521.       var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);
  4522.       if (rv === null) {
  4523.         return null;
  4524.       }
  4525.       return desiredClass.downcast(rv);
  4526.     }
  4527.     function getInheritedInstanceCount() {
  4528.       return Object.keys(registeredInstances).length;
  4529.     }
  4530.     function getLiveInheritedInstances() {
  4531.       var rv = [];
  4532.       for (var k in registeredInstances) {
  4533.         if (registeredInstances.hasOwnProperty(k)) {
  4534.           rv.push(registeredInstances[k]);
  4535.         }
  4536.       }
  4537.       return rv;
  4538.     }
  4539.     function setDelayFunction(fn) {
  4540.       delayFunction = fn;
  4541.       if (deletionQueue.length && delayFunction) {
  4542.         delayFunction(flushPendingDeletes);
  4543.       }
  4544.     }
  4545.     function init_embind() {
  4546.       Module["getInheritedInstanceCount"] = getInheritedInstanceCount;
  4547.       Module["getLiveInheritedInstances"] = getLiveInheritedInstances;
  4548.       Module["flushPendingDeletes"] = flushPendingDeletes;
  4549.       Module["setDelayFunction"] = setDelayFunction;
  4550.     }
  4551.     var registeredInstances = {};
  4552.     function getBasestPointer(class_, ptr) {
  4553.       if (ptr === undefined) {
  4554.         throwBindingError("ptr should not be undefined");
  4555.       }
  4556.       while (class_.baseClass) {
  4557.         ptr = class_.upcast(ptr);
  4558.         class_ = class_.baseClass;
  4559.       }
  4560.       return ptr;
  4561.     }
  4562.     function getInheritedInstance(class_, ptr) {
  4563.       ptr = getBasestPointer(class_, ptr);
  4564.       return registeredInstances[ptr];
  4565.     }
  4566.     function makeClassHandle(prototype, record) {
  4567.       if (!record.ptrType || !record.ptr) {
  4568.         throwInternalError("makeClassHandle requires ptr and ptrType");
  4569.       }
  4570.       var hasSmartPtrType = !!record.smartPtrType;
  4571.       var hasSmartPtr = !!record.smartPtr;
  4572.       if (hasSmartPtrType !== hasSmartPtr) {
  4573.         throwInternalError("Both smartPtrType and smartPtr must be specified");
  4574.       }
  4575.       record.count = { value: 1 };
  4576.       return attachFinalizer(
  4577.         Object.create(prototype, { $$: { value: record } })
  4578.       );
  4579.     }
  4580.     function RegisteredPointer_fromWireType(ptr) {
  4581.       var rawPointer = this.getPointee(ptr);
  4582.       if (!rawPointer) {
  4583.         this.destructor(ptr);
  4584.         return null;
  4585.       }
  4586.       var registeredInstance = getInheritedInstance(
  4587.         this.registeredClass,
  4588.         rawPointer
  4589.       );
  4590.       if (undefined !== registeredInstance) {
  4591.         if (0 === registeredInstance.$$.count.value) {
  4592.           registeredInstance.$$.ptr = rawPointer;
  4593.           registeredInstance.$$.smartPtr = ptr;
  4594.           return registeredInstance["clone"]();
  4595.         } else {
  4596.           var rv = registeredInstance["clone"]();
  4597.           this.destructor(ptr);
  4598.           return rv;
  4599.         }
  4600.       }
  4601.       function makeDefaultHandle() {
  4602.         if (this.isSmartPointer) {
  4603.           return makeClassHandle(this.registeredClass.instancePrototype, {
  4604.             ptrType: this.pointeeType,
  4605.             ptr: rawPointer,
  4606.             smartPtrType: this,
  4607.             smartPtr: ptr,
  4608.           });
  4609.         } else {
  4610.           return makeClassHandle(this.registeredClass.instancePrototype, {
  4611.             ptrType: this,
  4612.             ptr: ptr,
  4613.           });
  4614.         }
  4615.       }
  4616.       var actualType = this.registeredClass.getActualType(rawPointer);
  4617.       var registeredPointerRecord = registeredPointers[actualType];
  4618.       if (!registeredPointerRecord) {
  4619.         return makeDefaultHandle.call(this);
  4620.       }
  4621.       var toType;
  4622.       if (this.isConst) {
  4623.         toType = registeredPointerRecord.constPointerType;
  4624.       } else {
  4625.         toType = registeredPointerRecord.pointerType;
  4626.       }
  4627.       var dp = downcastPointer(
  4628.         rawPointer,
  4629.         this.registeredClass,
  4630.         toType.registeredClass
  4631.       );
  4632.       if (dp === null) {
  4633.         return makeDefaultHandle.call(this);
  4634.       }
  4635.       if (this.isSmartPointer) {
  4636.         return makeClassHandle(toType.registeredClass.instancePrototype, {
  4637.           ptrType: toType,
  4638.           ptr: dp,
  4639.           smartPtrType: this,
  4640.           smartPtr: ptr,
  4641.         });
  4642.       } else {
  4643.         return makeClassHandle(toType.registeredClass.instancePrototype, {
  4644.           ptrType: toType,
  4645.           ptr: dp,
  4646.         });
  4647.       }
  4648.     }
  4649.     function init_RegisteredPointer() {
  4650.       RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
  4651.       RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
  4652.       RegisteredPointer.prototype["argPackAdvance"] = 8;
  4653.       RegisteredPointer.prototype["readValueFromPointer"] =
  4654.         simpleReadValueFromPointer;
  4655.       RegisteredPointer.prototype["deleteObject"] =
  4656.         RegisteredPointer_deleteObject;
  4657.       RegisteredPointer.prototype["fromWireType"] =
  4658.         RegisteredPointer_fromWireType;
  4659.     }
  4660.     function RegisteredPointer(
  4661.       name,
  4662.       registeredClass,
  4663.       isReference,
  4664.       isConst,
  4665.       isSmartPointer,
  4666.       pointeeType,
  4667.       sharingPolicy,
  4668.       rawGetPointee,
  4669.       rawConstructor,
  4670.       rawShare,
  4671.       rawDestructor
  4672.     ) {
  4673.       this.name = name;
  4674.       this.registeredClass = registeredClass;
  4675.       this.isReference = isReference;
  4676.       this.isConst = isConst;
  4677.       this.isSmartPointer = isSmartPointer;
  4678.       this.pointeeType = pointeeType;
  4679.       this.sharingPolicy = sharingPolicy;
  4680.       this.rawGetPointee = rawGetPointee;
  4681.       this.rawConstructor = rawConstructor;
  4682.       this.rawShare = rawShare;
  4683.       this.rawDestructor = rawDestructor;
  4684.       if (!isSmartPointer && registeredClass.baseClass === undefined) {
  4685.         if (isConst) {
  4686.           this["toWireType"] = constNoSmartPtrRawPointerToWireType;
  4687.           this.destructorFunction = null;
  4688.         } else {
  4689.           this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType;
  4690.           this.destructorFunction = null;
  4691.         }
  4692.       } else {
  4693.         this["toWireType"] = genericPointerToWireType;
  4694.       }
  4695.     }
  4696.     function replacePublicSymbol(name, value, numArguments) {
  4697.       if (!Module.hasOwnProperty(name)) {
  4698.         throwInternalError("Replacing nonexistant public symbol");
  4699.       }
  4700.       if (
  4701.         undefined !== Module[name].overloadTable &&
  4702.         undefined !== numArguments
  4703.       ) {
  4704.         Module[name].overloadTable[numArguments] = value;
  4705.       } else {
  4706.         Module[name] = value;
  4707.         Module[name].argCount = numArguments;
  4708.       }
  4709.     }
  4710.     function dynCallLegacy(sig, ptr, args) {
  4711.       var f = Module["dynCall_" + sig];
  4712.       return args && args.length
  4713.         ? f.apply(null, [ptr].concat(args))
  4714.         : f.call(null, ptr);
  4715.     }
  4716.     function dynCall(sig, ptr, args) {
  4717.       return dynCallLegacy(sig, ptr, args);
  4718.     }
  4719.     function getDynCaller(sig, ptr) {
  4720.       var argCache = [];
  4721.       return function () {
  4722.         argCache.length = arguments.length;
  4723.         for (var i = 0; i < arguments.length; i++) {
  4724.           argCache[i] = arguments[i];
  4725.         }
  4726.         return dynCall(sig, ptr, argCache);
  4727.       };
  4728.     }
  4729.     function embind__requireFunction(signature, rawFunction) {
  4730.       signature = readLatin1String(signature);
  4731.       function makeDynCaller() {
  4732.         return getDynCaller(signature, rawFunction);
  4733.       }
  4734.       var fp = makeDynCaller();
  4735.       if (typeof fp !== "function") {
  4736.         throwBindingError(
  4737.           "unknown function pointer with signature " +
  4738.             signature +
  4739.             ": " +
  4740.             rawFunction
  4741.         );
  4742.       }
  4743.       return fp;
  4744.     }
  4745.     var UnboundTypeError = undefined;
  4746.     function getTypeName(type) {
  4747.       var ptr = ___getTypeName(type);
  4748.       var rv = readLatin1String(ptr);
  4749.       _free(ptr);
  4750.       return rv;
  4751.     }
  4752.     function throwUnboundTypeError(message, types) {
  4753.       var unboundTypes = [];
  4754.       var seen = {};
  4755.       function visit(type) {
  4756.         if (seen[type]) {
  4757.           return;
  4758.         }
  4759.         if (registeredTypes[type]) {
  4760.           return;
  4761.         }
  4762.         if (typeDependencies[type]) {
  4763.           typeDependencies[type].forEach(visit);
  4764.           return;
  4765.         }
  4766.         unboundTypes.push(type);
  4767.         seen[type] = true;
  4768.       }
  4769.       types.forEach(visit);
  4770.       throw new UnboundTypeError(
  4771.         message + ": " + unboundTypes.map(getTypeName).join([", "])
  4772.       );
  4773.     }
  4774.     function __embind_register_class(
  4775.       rawType,
  4776.       rawPointerType,
  4777.       rawConstPointerType,
  4778.       baseClassRawType,
  4779.       getActualTypeSignature,
  4780.       getActualType,
  4781.       upcastSignature,
  4782.       upcast,
  4783.       downcastSignature,
  4784.       downcast,
  4785.       name,
  4786.       destructorSignature,
  4787.       rawDestructor
  4788.     ) {
  4789.       name = readLatin1String(name);
  4790.       getActualType = embind__requireFunction(
  4791.         getActualTypeSignature,
  4792.         getActualType
  4793.       );
  4794.       if (upcast) {
  4795.         upcast = embind__requireFunction(upcastSignature, upcast);
  4796.       }
  4797.       if (downcast) {
  4798.         downcast = embind__requireFunction(downcastSignature, downcast);
  4799.       }
  4800.       rawDestructor = embind__requireFunction(
  4801.         destructorSignature,
  4802.         rawDestructor
  4803.       );
  4804.       var legalFunctionName = makeLegalFunctionName(name);
  4805.       exposePublicSymbol(legalFunctionName, function () {
  4806.         throwUnboundTypeError(
  4807.           "Cannot construct " + name + " due to unbound types",
  4808.           [baseClassRawType]
  4809.         );
  4810.       });
  4811.       whenDependentTypesAreResolved(
  4812.         [rawType, rawPointerType, rawConstPointerType],
  4813.         baseClassRawType ? [baseClassRawType] : [],
  4814.         function (base) {
  4815.           base = base[0];
  4816.           var baseClass;
  4817.           var basePrototype;
  4818.           if (baseClassRawType) {
  4819.             baseClass = base.registeredClass;
  4820.             basePrototype = baseClass.instancePrototype;
  4821.           } else {
  4822.             basePrototype = ClassHandle.prototype;
  4823.           }
  4824.           var constructor = createNamedFunction(legalFunctionName, function () {
  4825.             if (Object.getPrototypeOf(this) !== instancePrototype) {
  4826.               throw new BindingError("Use 'new' to construct " + name);
  4827.             }
  4828.             if (undefined === registeredClass.constructor_body) {
  4829.               throw new BindingError(name + " has no accessible constructor");
  4830.             }
  4831.             var body = registeredClass.constructor_body[arguments.length];
  4832.             if (undefined === body) {
  4833.               throw new BindingError(
  4834.                 "Tried to invoke ctor of " +
  4835.                   name +
  4836.                   " with invalid number of parameters (" +
  4837.                   arguments.length +
  4838.                   ") - expected (" +
  4839.                   Object.keys(registeredClass.constructor_body).toString() +
  4840.                   ") parameters instead!"
  4841.               );
  4842.             }
  4843.             return body.apply(this, arguments);
  4844.           });
  4845.           var instancePrototype = Object.create(basePrototype, {
  4846.             constructor: { value: constructor },
  4847.           });
  4848.           constructor.prototype = instancePrototype;
  4849.           var registeredClass = new RegisteredClass(
  4850.             name,
  4851.             constructor,
  4852.             instancePrototype,
  4853.             rawDestructor,
  4854.             baseClass,
  4855.             getActualType,
  4856.             upcast,
  4857.             downcast
  4858.           );
  4859.           var referenceConverter = new RegisteredPointer(
  4860.             name,
  4861.             registeredClass,
  4862.             true,
  4863.             false,
  4864.             false
  4865.           );
  4866.           var pointerConverter = new RegisteredPointer(
  4867.             name + "*",
  4868.             registeredClass,
  4869.             false,
  4870.             false,
  4871.             false
  4872.           );
  4873.           var constPointerConverter = new RegisteredPointer(
  4874.             name + " const*",
  4875.             registeredClass,
  4876.             false,
  4877.             true,
  4878.             false
  4879.           );
  4880.           registeredPointers[rawType] = {
  4881.             pointerType: pointerConverter,
  4882.             constPointerType: constPointerConverter,
  4883.           };
  4884.           replacePublicSymbol(legalFunctionName, constructor);
  4885.           return [referenceConverter, pointerConverter, constPointerConverter];
  4886.         }
  4887.       );
  4888.     }
  4889.     function new_(constructor, argumentList) {
  4890.       if (!(constructor instanceof Function)) {
  4891.         throw new TypeError(
  4892.           "new_ called with constructor type " +
  4893.             typeof constructor +
  4894.             " which is not a function"
  4895.         );
  4896.       }
  4897.       var dummy = createNamedFunction(
  4898.         constructor.name || "unknownFunctionName",
  4899.         function () {}
  4900.       );
  4901.       dummy.prototype = constructor.prototype;
  4902.       var obj = new dummy();
  4903.       var r = constructor.apply(obj, argumentList);
  4904.       return r instanceof Object ? r : obj;
  4905.     }
  4906.     function runDestructors(destructors) {
  4907.       while (destructors.length) {
  4908.         var ptr = destructors.pop();
  4909.         var del = destructors.pop();
  4910.         del(ptr);
  4911.       }
  4912.     }
  4913.     function craftInvokerFunction(
  4914.       humanName,
  4915.       argTypes,
  4916.       classType,
  4917.       cppInvokerFunc,
  4918.       cppTargetFunc
  4919.     ) {
  4920.       var argCount = argTypes.length;
  4921.       if (argCount < 2) {
  4922.         throwBindingError(
  4923.           "argTypes array size mismatch! Must at least get return value and 'this' types!"
  4924.         );
  4925.       }
  4926.       var isClassMethodFunc = argTypes[1] !== null && classType !== null;
  4927.       var needsDestructorStack = false;
  4928.       for (var i = 1; i < argTypes.length; ++i) {
  4929.         if (
  4930.           argTypes[i] !== null &&
  4931.           argTypes[i].destructorFunction === undefined
  4932.         ) {
  4933.           needsDestructorStack = true;
  4934.           break;
  4935.         }
  4936.       }
  4937.       var returns = argTypes[0].name !== "void";
  4938.       var argsList = "";
  4939.       var argsListWired = "";
  4940.       for (var i = 0; i < argCount - 2; ++i) {
  4941.         argsList += (i !== 0 ? ", " : "") + "arg" + i;
  4942.         argsListWired += (i !== 0 ? ", " : "") + "arg" + i + "Wired";
  4943.       }
  4944.       var invokerFnBody =
  4945.         "return function " +
  4946.         makeLegalFunctionName(humanName) +
  4947.         "(" +
  4948.         argsList +
  4949.         ") {\n" +
  4950.         "if (arguments.length !== " +
  4951.         (argCount - 2) +
  4952.         ") {\n" +
  4953.         "throwBindingError('function " +
  4954.         humanName +
  4955.         " called with ' + arguments.length + ' arguments, expected " +
  4956.         (argCount - 2) +
  4957.         " args!');\n" +
  4958.         "}\n";
  4959.       if (needsDestructorStack) {
  4960.         invokerFnBody += "var destructors = [];\n";
  4961.       }
  4962.       var dtorStack = needsDestructorStack ? "destructors" : "null";
  4963.       var args1 = [
  4964.         "throwBindingError",
  4965.         "invoker",
  4966.         "fn",
  4967.         "runDestructors",
  4968.         "retType",
  4969.         "classParam",
  4970.       ];
  4971.       var args2 = [
  4972.         throwBindingError,
  4973.         cppInvokerFunc,
  4974.         cppTargetFunc,
  4975.         runDestructors,
  4976.         argTypes[0],
  4977.         argTypes[1],
  4978.       ];
  4979.       if (isClassMethodFunc) {
  4980.         invokerFnBody +=
  4981.           "var thisWired = classParam.toWireType(" + dtorStack + ", this);\n";
  4982.       }
  4983.       for (var i = 0; i < argCount - 2; ++i) {
  4984.         invokerFnBody +=
  4985.           "var arg" +
  4986.           i +
  4987.           "Wired = argType" +
  4988.           i +
  4989.           ".toWireType(" +
  4990.           dtorStack +
  4991.           ", arg" +
  4992.           i +
  4993.           "); // " +
  4994.           argTypes[i + 2].name +
  4995.           "\n";
  4996.         args1.push("argType" + i);
  4997.         args2.push(argTypes[i + 2]);
  4998.       }
  4999.       if (isClassMethodFunc) {
  5000.         argsListWired =
  5001.           "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired;
  5002.       }
  5003.       invokerFnBody +=
  5004.         (returns ? "var rv = " : "") +
  5005.         "invoker(fn" +
  5006.         (argsListWired.length > 0 ? ", " : "") +
  5007.         argsListWired +
  5008.         ");\n";
  5009.       if (needsDestructorStack) {
  5010.         invokerFnBody += "runDestructors(destructors);\n";
  5011.       } else {
  5012.         for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
  5013.           var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired";
  5014.           if (argTypes[i].destructorFunction !== null) {
  5015.             invokerFnBody +=
  5016.               paramName +
  5017.               "_dtor(" +
  5018.               paramName +
  5019.               "); // " +
  5020.               argTypes[i].name +
  5021.               "\n";
  5022.             args1.push(paramName + "_dtor");
  5023.             args2.push(argTypes[i].destructorFunction);
  5024.           }
  5025.         }
  5026.       }
  5027.       if (returns) {
  5028.         invokerFnBody +=
  5029.           "var ret = retType.fromWireType(rv);\n" + "return ret;\n";
  5030.       } else {
  5031.       }
  5032.       invokerFnBody += "}\n";
  5033.       args1.push(invokerFnBody);
  5034.       var invokerFunction = new_(Function, args1).apply(null, args2);
  5035.       return invokerFunction;
  5036.     }
  5037.     function heap32VectorToArray(count, firstElement) {
  5038.       var array = [];
  5039.       for (var i = 0; i < count; i++) {
  5040.         array.push(HEAP32[(firstElement >> 2) + i]);
  5041.       }
  5042.       return array;
  5043.     }
  5044.     function __embind_register_class_function(
  5045.       rawClassType,
  5046.       methodName,
  5047.       argCount,
  5048.       rawArgTypesAddr,
  5049.       invokerSignature,
  5050.       rawInvoker,
  5051.       context,
  5052.       isPureVirtual
  5053.     ) {
  5054.       var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  5055.       methodName = readLatin1String(methodName);
  5056.       rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
  5057.       whenDependentTypesAreResolved([], [rawClassType], function (classType) {
  5058.         classType = classType[0];
  5059.         var humanName = classType.name + "." + methodName;
  5060.         if (isPureVirtual) {
  5061.           classType.registeredClass.pureVirtualFunctions.push(methodName);
  5062.         }
  5063.         function unboundTypesHandler() {
  5064.           throwUnboundTypeError(
  5065.             "Cannot call " + humanName + " due to unbound types",
  5066.             rawArgTypes
  5067.           );
  5068.         }
  5069.         var proto = classType.registeredClass.instancePrototype;
  5070.         var method = proto[methodName];
  5071.         if (
  5072.           undefined === method ||
  5073.           (undefined === method.overloadTable &&
  5074.             method.className !== classType.name &&
  5075.             method.argCount === argCount - 2)
  5076.         ) {
  5077.           unboundTypesHandler.argCount = argCount - 2;
  5078.           unboundTypesHandler.className = classType.name;
  5079.           proto[methodName] = unboundTypesHandler;
  5080.         } else {
  5081.           ensureOverloadTable(proto, methodName, humanName);
  5082.           proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;
  5083.         }
  5084.         whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {
  5085.           var memberFunction = craftInvokerFunction(
  5086.             humanName,
  5087.             argTypes,
  5088.             classType,
  5089.             rawInvoker,
  5090.             context
  5091.           );
  5092.           if (undefined === proto[methodName].overloadTable) {
  5093.             memberFunction.argCount = argCount - 2;
  5094.             proto[methodName] = memberFunction;
  5095.           } else {
  5096.             proto[methodName].overloadTable[argCount - 2] = memberFunction;
  5097.           }
  5098.           return [];
  5099.         });
  5100.         return [];
  5101.       });
  5102.     }
  5103.     function __embind_register_constant(name, type, value) {
  5104.       name = readLatin1String(name);
  5105.       whenDependentTypesAreResolved([], [type], function (type) {
  5106.         type = type[0];
  5107.         Module[name] = type["fromWireType"](value);
  5108.         return [];
  5109.       });
  5110.     }
  5111.     var emval_free_list = [];
  5112.     var emval_handle_array = [
  5113.       {},
  5114.       { value: undefined },
  5115.       { value: null },
  5116.       { value: true },
  5117.       { value: false },
  5118.     ];
  5119.     function __emval_decref(handle) {
  5120.       if (handle > 4 && 0 === --emval_handle_array[handle].refcount) {
  5121.         emval_handle_array[handle] = undefined;
  5122.         emval_free_list.push(handle);
  5123.       }
  5124.     }
  5125.     function count_emval_handles() {
  5126.       var count = 0;
  5127.       for (var i = 5; i < emval_handle_array.length; ++i) {
  5128.         if (emval_handle_array[i] !== undefined) {
  5129.           ++count;
  5130.         }
  5131.       }
  5132.       return count;
  5133.     }
  5134.     function get_first_emval() {
  5135.       for (var i = 5; i < emval_handle_array.length; ++i) {
  5136.         if (emval_handle_array[i] !== undefined) {
  5137.           return emval_handle_array[i];
  5138.         }
  5139.       }
  5140.       return null;
  5141.     }
  5142.     function init_emval() {
  5143.       Module["count_emval_handles"] = count_emval_handles;
  5144.       Module["get_first_emval"] = get_first_emval;
  5145.     }
  5146.     function __emval_register(value) {
  5147.       switch (value) {
  5148.         case undefined: {
  5149.           return 1;
  5150.         }
  5151.         case null: {
  5152.           return 2;
  5153.         }
  5154.         case true: {
  5155.           return 3;
  5156.         }
  5157.         case false: {
  5158.           return 4;
  5159.         }
  5160.         default: {
  5161.           var handle = emval_free_list.length
  5162.             ? emval_free_list.pop()
  5163.             : emval_handle_array.length;
  5164.           emval_handle_array[handle] = { refcount: 1, value: value };
  5165.           return handle;
  5166.         }
  5167.       }
  5168.     }
  5169.     function __embind_register_emval(rawType, name) {
  5170.       name = readLatin1String(name);
  5171.       registerType(rawType, {
  5172.         name: name,
  5173.         fromWireType: function (handle) {
  5174.           var rv = emval_handle_array[handle].value;
  5175.           __emval_decref(handle);
  5176.           return rv;
  5177.         },
  5178.         toWireType: function (destructors, value) {
  5179.           return __emval_register(value);
  5180.         },
  5181.         argPackAdvance: 8,
  5182.         readValueFromPointer: simpleReadValueFromPointer,
  5183.         destructorFunction: null,
  5184.       });
  5185.     }
  5186.     function _embind_repr(v) {
  5187.       if (v === null) {
  5188.         return "null";
  5189.       }
  5190.       var t = typeof v;
  5191.       if (t === "object" || t === "array" || t === "function") {
  5192.         return v.toString();
  5193.       } else {
  5194.         return "" + v;
  5195.       }
  5196.     }
  5197.     function floatReadValueFromPointer(name, shift) {
  5198.       switch (shift) {
  5199.         case 2:
  5200.           return function (pointer) {
  5201.             return this["fromWireType"](HEAPF32[pointer >> 2]);
  5202.           };
  5203.         case 3:
  5204.           return function (pointer) {
  5205.             return this["fromWireType"](HEAPF64[pointer >> 3]);
  5206.           };
  5207.         default:
  5208.           throw new TypeError("Unknown float type: " + name);
  5209.       }
  5210.     }
  5211.     function __embind_register_float(rawType, name, size) {
  5212.       var shift = getShiftFromSize(size);
  5213.       name = readLatin1String(name);
  5214.       registerType(rawType, {
  5215.         name: name,
  5216.         fromWireType: function (value) {
  5217.           return value;
  5218.         },
  5219.         toWireType: function (destructors, value) {
  5220.           if (typeof value !== "number" && typeof value !== "boolean") {
  5221.             throw new TypeError(
  5222.               'Cannot convert "' + _embind_repr(value) + '" to ' + this.name
  5223.             );
  5224.           }
  5225.           return value;
  5226.         },
  5227.         argPackAdvance: 8,
  5228.         readValueFromPointer: floatReadValueFromPointer(name, shift),
  5229.         destructorFunction: null,
  5230.       });
  5231.     }
  5232.     function __embind_register_function(
  5233.       name,
  5234.       argCount,
  5235.       rawArgTypesAddr,
  5236.       signature,
  5237.       rawInvoker,
  5238.       fn
  5239.     ) {
  5240.       var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  5241.       name = readLatin1String(name);
  5242.       rawInvoker = embind__requireFunction(signature, rawInvoker);
  5243.       exposePublicSymbol(
  5244.         name,
  5245.         function () {
  5246.           throwUnboundTypeError(
  5247.             "Cannot call " + name + " due to unbound types",
  5248.             argTypes
  5249.           );
  5250.         },
  5251.         argCount - 1
  5252.       );
  5253.       whenDependentTypesAreResolved([], argTypes, function (argTypes) {
  5254.         var invokerArgsArray = [argTypes[0], null].concat(argTypes.slice(1));
  5255.         replacePublicSymbol(
  5256.           name,
  5257.           craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn),
  5258.           argCount - 1
  5259.         );
  5260.         return [];
  5261.       });
  5262.     }
  5263.     function integerReadValueFromPointer(name, shift, signed) {
  5264.       switch (shift) {
  5265.         case 0:
  5266.           return signed
  5267.             ? function readS8FromPointer(pointer) {
  5268.                 return HEAP8[pointer];
  5269.               }
  5270.             : function readU8FromPointer(pointer) {
  5271.                 return HEAPU8[pointer];
  5272.               };
  5273.         case 1:
  5274.           return signed
  5275.             ? function readS16FromPointer(pointer) {
  5276.                 return HEAP16[pointer >> 1];
  5277.               }
  5278.             : function readU16FromPointer(pointer) {
  5279.                 return HEAPU16[pointer >> 1];
  5280.               };
  5281.         case 2:
  5282.           return signed
  5283.             ? function readS32FromPointer(pointer) {
  5284.                 return HEAP32[pointer >> 2];
  5285.               }
  5286.             : function readU32FromPointer(pointer) {
  5287.                 return HEAPU32[pointer >> 2];
  5288.               };
  5289.         default:
  5290.           throw new TypeError("Unknown integer type: " + name);
  5291.       }
  5292.     }
  5293.     function __embind_register_integer(
  5294.       primitiveType,
  5295.       name,
  5296.       size,
  5297.       minRange,
  5298.       maxRange
  5299.     ) {
  5300.       name = readLatin1String(name);
  5301.       if (maxRange === -1) {
  5302.         maxRange = 4294967295;
  5303.       }
  5304.       var shift = getShiftFromSize(size);
  5305.       var fromWireType = function (value) {
  5306.         return value;
  5307.       };
  5308.       if (minRange === 0) {
  5309.         var bitshift = 32 - 8 * size;
  5310.         fromWireType = function (value) {
  5311.           return (value << bitshift) >>> bitshift;
  5312.         };
  5313.       }
  5314.       var isUnsignedType = name.includes("unsigned");
  5315.       registerType(primitiveType, {
  5316.         name: name,
  5317.         fromWireType: fromWireType,
  5318.         toWireType: function (destructors, value) {
  5319.           if (typeof value !== "number" && typeof value !== "boolean") {
  5320.             throw new TypeError(
  5321.               'Cannot convert "' + _embind_repr(value) + '" to ' + this.name
  5322.             );
  5323.           }
  5324.           if (value < minRange || value > maxRange) {
  5325.             throw new TypeError(
  5326.               'Passing a number "' +
  5327.                 _embind_repr(value) +
  5328.                 '" from JS side to C/C++ side to an argument of type "' +
  5329.                 name +
  5330.                 '", which is outside the valid range [' +
  5331.                 minRange +
  5332.                 ", " +
  5333.                 maxRange +
  5334.                 "]!"
  5335.             );
  5336.           }
  5337.           return isUnsignedType ? value >>> 0 : value | 0;
  5338.         },
  5339.         argPackAdvance: 8,
  5340.         readValueFromPointer: integerReadValueFromPointer(
  5341.           name,
  5342.           shift,
  5343.           minRange !== 0
  5344.         ),
  5345.         destructorFunction: null,
  5346.       });
  5347.     }
  5348.     function __embind_register_memory_view(rawType, dataTypeIndex, name) {
  5349.       var typeMapping = [
  5350.         Int8Array,
  5351.         Uint8Array,
  5352.         Int16Array,
  5353.         Uint16Array,
  5354.         Int32Array,
  5355.         Uint32Array,
  5356.         Float32Array,
  5357.         Float64Array,
  5358.       ];
  5359.       var TA = typeMapping[dataTypeIndex];
  5360.       function decodeMemoryView(handle) {
  5361.         handle = handle >> 2;
  5362.         var heap = HEAPU32;
  5363.         var size = heap[handle];
  5364.         var data = heap[handle + 1];
  5365.         return new TA(buffer, data, size);
  5366.       }
  5367.       name = readLatin1String(name);
  5368.       registerType(
  5369.         rawType,
  5370.         {
  5371.           name: name,
  5372.           fromWireType: decodeMemoryView,
  5373.           argPackAdvance: 8,
  5374.           readValueFromPointer: decodeMemoryView,
  5375.         },
  5376.         { ignoreDuplicateRegistrations: true }
  5377.       );
  5378.     }
  5379.     function __embind_register_std_string(rawType, name) {
  5380.       name = readLatin1String(name);
  5381.       var stdStringIsUTF8 = name === "std::string";
  5382.       registerType(rawType, {
  5383.         name: name,
  5384.         fromWireType: function (value) {
  5385.           var length = HEAPU32[value >> 2];
  5386.           var str;
  5387.           if (stdStringIsUTF8) {
  5388.             var decodeStartPtr = value + 4;
  5389.             for (var i = 0; i <= length; ++i) {
  5390.               var currentBytePtr = value + 4 + i;
  5391.               if (i == length || HEAPU8[currentBytePtr] == 0) {
  5392.                 var maxRead = currentBytePtr - decodeStartPtr;
  5393.                 var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
  5394.                 if (str === undefined) {
  5395.                   str = stringSegment;
  5396.                 } else {
  5397.                   str += String.fromCharCode(0);
  5398.                   str += stringSegment;
  5399.                 }
  5400.                 decodeStartPtr = currentBytePtr + 1;
  5401.               }
  5402.             }
  5403.           } else {
  5404.             var a = new Array(length);
  5405.             for (var i = 0; i < length; ++i) {
  5406.               a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);
  5407.             }
  5408.             str = a.join("");
  5409.           }
  5410.           _free(value);
  5411.           return str;
  5412.         },
  5413.         toWireType: function (destructors, value) {
  5414.           if (value instanceof ArrayBuffer) {
  5415.             value = new Uint8Array(value);
  5416.           }
  5417.           var getLength;
  5418.           var valueIsOfTypeString = typeof value === "string";
  5419.           if (
  5420.             !(
  5421.               valueIsOfTypeString ||
  5422.               value instanceof Uint8Array ||
  5423.               value instanceof Uint8ClampedArray ||
  5424.               value instanceof Int8Array
  5425.             )
  5426.           ) {
  5427.             throwBindingError("Cannot pass non-string to std::string");
  5428.           }
  5429.           if (stdStringIsUTF8 && valueIsOfTypeString) {
  5430.             getLength = function () {
  5431.               return lengthBytesUTF8(value);
  5432.             };
  5433.           } else {
  5434.             getLength = function () {
  5435.               return value.length;
  5436.             };
  5437.           }
  5438.           var length = getLength();
  5439.           var ptr = _malloc(4 + length + 1);
  5440.           HEAPU32[ptr >> 2] = length;
  5441.           if (stdStringIsUTF8 && valueIsOfTypeString) {
  5442.             stringToUTF8(value, ptr + 4, length + 1);
  5443.           } else {
  5444.             if (valueIsOfTypeString) {
  5445.               for (var i = 0; i < length; ++i) {
  5446.                 var charCode = value.charCodeAt(i);
  5447.                 if (charCode > 255) {
  5448.                   _free(ptr);
  5449.                   throwBindingError(
  5450.                     "String has UTF-16 code units that do not fit in 8 bits"
  5451.                   );
  5452.                 }
  5453.                 HEAPU8[ptr + 4 + i] = charCode;
  5454.               }
  5455.             } else {
  5456.               for (var i = 0; i < length; ++i) {
  5457.                 HEAPU8[ptr + 4 + i] = value[i];
  5458.               }
  5459.             }
  5460.           }
  5461.           if (destructors !== null) {
  5462.             destructors.push(_free, ptr);
  5463.           }
  5464.           return ptr;
  5465.         },
  5466.         argPackAdvance: 8,
  5467.         readValueFromPointer: simpleReadValueFromPointer,
  5468.         destructorFunction: function (ptr) {
  5469.           _free(ptr);
  5470.         },
  5471.       });
  5472.     }
  5473.     function __embind_register_std_wstring(rawType, charSize, name) {
  5474.       name = readLatin1String(name);
  5475.       var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
  5476.       if (charSize === 2) {
  5477.         decodeString = UTF16ToString;
  5478.         encodeString = stringToUTF16;
  5479.         lengthBytesUTF = lengthBytesUTF16;
  5480.         getHeap = function () {
  5481.           return HEAPU16;
  5482.         };
  5483.         shift = 1;
  5484.       } else if (charSize === 4) {
  5485.         decodeString = UTF32ToString;
  5486.         encodeString = stringToUTF32;
  5487.         lengthBytesUTF = lengthBytesUTF32;
  5488.         getHeap = function () {
  5489.           return HEAPU32;
  5490.         };
  5491.         shift = 2;
  5492.       }
  5493.       registerType(rawType, {
  5494.         name: name,
  5495.         fromWireType: function (value) {
  5496.           var length = HEAPU32[value >> 2];
  5497.           var HEAP = getHeap();
  5498.           var str;
  5499.           var decodeStartPtr = value + 4;
  5500.           for (var i = 0; i <= length; ++i) {
  5501.             var currentBytePtr = value + 4 + i * charSize;
  5502.             if (i == length || HEAP[currentBytePtr >> shift] == 0) {
  5503.               var maxReadBytes = currentBytePtr - decodeStartPtr;
  5504.               var stringSegment = decodeString(decodeStartPtr, maxReadBytes);
  5505.               if (str === undefined) {
  5506.                 str = stringSegment;
  5507.               } else {
  5508.                 str += String.fromCharCode(0);
  5509.                 str += stringSegment;
  5510.               }
  5511.               decodeStartPtr = currentBytePtr + charSize;
  5512.             }
  5513.           }
  5514.           _free(value);
  5515.           return str;
  5516.         },
  5517.         toWireType: function (destructors, value) {
  5518.           if (!(typeof value === "string")) {
  5519.             throwBindingError(
  5520.               "Cannot pass non-string to C++ string type " + name
  5521.             );
  5522.           }
  5523.           var length = lengthBytesUTF(value);
  5524.           var ptr = _malloc(4 + length + charSize);
  5525.           HEAPU32[ptr >> 2] = length >> shift;
  5526.           encodeString(value, ptr + 4, length + charSize);
  5527.           if (destructors !== null) {
  5528.             destructors.push(_free, ptr);
  5529.           }
  5530.           return ptr;
  5531.         },
  5532.         argPackAdvance: 8,
  5533.         readValueFromPointer: simpleReadValueFromPointer,
  5534.         destructorFunction: function (ptr) {
  5535.           _free(ptr);
  5536.         },
  5537.       });
  5538.     }
  5539.     function __embind_register_void(rawType, name) {
  5540.       name = readLatin1String(name);
  5541.       registerType(rawType, {
  5542.         isVoid: true,
  5543.         name: name,
  5544.         argPackAdvance: 0,
  5545.         fromWireType: function () {
  5546.           return undefined;
  5547.         },
  5548.         toWireType: function (destructors, o) {
  5549.           return undefined;
  5550.         },
  5551.       });
  5552.     }
  5553.     function requireHandle(handle) {
  5554.       if (!handle) {
  5555.         throwBindingError("Cannot use deleted val. handle = " + handle);
  5556.       }
  5557.       return emval_handle_array[handle].value;
  5558.     }
  5559.     function requireRegisteredType(rawType, humanName) {
  5560.       var impl = registeredTypes[rawType];
  5561.       if (undefined === impl) {
  5562.         throwBindingError(
  5563.           humanName + " has unknown type " + getTypeName(rawType)
  5564.         );
  5565.       }
  5566.       return impl;
  5567.     }
  5568.     function __emval_as(handle, returnType, destructorsRef) {
  5569.       handle = requireHandle(handle);
  5570.       returnType = requireRegisteredType(returnType, "emval::as");
  5571.       var destructors = [];
  5572.       var rd = __emval_register(destructors);
  5573.       HEAP32[destructorsRef >> 2] = rd;
  5574.       return returnType["toWireType"](destructors, handle);
  5575.     }
  5576.     function __emval_lookupTypes(argCount, argTypes) {
  5577.       var a = new Array(argCount);
  5578.       for (var i = 0; i < argCount; ++i) {
  5579.         a[i] = requireRegisteredType(
  5580.           HEAP32[(argTypes >> 2) + i],
  5581.           "parameter " + i
  5582.         );
  5583.       }
  5584.       return a;
  5585.     }
  5586.     function __emval_call(handle, argCount, argTypes, argv) {
  5587.       handle = requireHandle(handle);
  5588.       var types = __emval_lookupTypes(argCount, argTypes);
  5589.       var args = new Array(argCount);
  5590.       for (var i = 0; i < argCount; ++i) {
  5591.         var type = types[i];
  5592.         args[i] = type["readValueFromPointer"](argv);
  5593.         argv += type["argPackAdvance"];
  5594.       }
  5595.       var rv = handle.apply(undefined, args);
  5596.       return __emval_register(rv);
  5597.     }
  5598.     var emval_symbols = {};
  5599.     function getStringOrSymbol(address) {
  5600.       var symbol = emval_symbols[address];
  5601.       if (symbol === undefined) {
  5602.         return readLatin1String(address);
  5603.       } else {
  5604.         return symbol;
  5605.       }
  5606.     }
  5607.     function __emval_get_module_property(name) {
  5608.       name = getStringOrSymbol(name);
  5609.       return __emval_register(Module[name]);
  5610.     }
  5611.     function __emval_get_property(handle, key) {
  5612.       handle = requireHandle(handle);
  5613.       key = requireHandle(key);
  5614.       return __emval_register(handle[key]);
  5615.     }
  5616.     function __emval_incref(handle) {
  5617.       if (handle > 4) {
  5618.         emval_handle_array[handle].refcount += 1;
  5619.       }
  5620.     }
  5621.     function __emval_new_array() {
  5622.       return __emval_register([]);
  5623.     }
  5624.     function __emval_new_cstring(v) {
  5625.       return __emval_register(getStringOrSymbol(v));
  5626.     }
  5627.     function __emval_new_object() {
  5628.       return __emval_register({});
  5629.     }
  5630.     function __emval_run_destructors(handle) {
  5631.       var destructors = emval_handle_array[handle].value;
  5632.       runDestructors(destructors);
  5633.       __emval_decref(handle);
  5634.     }
  5635.     function __emval_set_property(handle, key, value) {
  5636.       handle = requireHandle(handle);
  5637.       key = requireHandle(key);
  5638.       value = requireHandle(value);
  5639.       handle[key] = value;
  5640.     }
  5641.     function __emval_take_value(type, argv) {
  5642.       type = requireRegisteredType(type, "_emval_take_value");
  5643.       var v = type["readValueFromPointer"](argv);
  5644.       return __emval_register(v);
  5645.     }
  5646.     function __emval_typeof(handle) {
  5647.       handle = requireHandle(handle);
  5648.       return __emval_register(typeof handle);
  5649.     }
  5650.     function _abort() {
  5651.       abort();
  5652.     }
  5653.     var readAsmConstArgsArray = [];
  5654.     function readAsmConstArgs(sigPtr, buf) {
  5655.       readAsmConstArgsArray.length = 0;
  5656.       var ch;
  5657.       buf >>= 2;
  5658.       while ((ch = HEAPU8[sigPtr++])) {
  5659.         var double = ch < 105;
  5660.         if (double && buf & 1) buf++;
  5661.         readAsmConstArgsArray.push(double ? HEAPF64[buf++ >> 1] : HEAP32[buf]);
  5662.         ++buf;
  5663.       }
  5664.       return readAsmConstArgsArray;
  5665.     }
  5666.     function _emscripten_asm_const_int(code, sigPtr, argbuf) {
  5667.       var args = readAsmConstArgs(sigPtr, argbuf);
  5668.       return ASM_CONSTS[code].apply(null, args);
  5669.     }
  5670.     function _emscripten_set_main_loop_timing(mode, value) {
  5671.       Browser.mainLoop.timingMode = mode;
  5672.       Browser.mainLoop.timingValue = value;
  5673.       if (!Browser.mainLoop.func) {
  5674.         return 1;
  5675.       }
  5676.       if (!Browser.mainLoop.running) {
  5677.         Browser.mainLoop.running = true;
  5678.       }
  5679.       if (mode == 0) {
  5680.         Browser.mainLoop.scheduler =
  5681.           function Browser_mainLoop_scheduler_setTimeout() {
  5682.             var timeUntilNextTick =
  5683.               Math.max(
  5684.                 0,
  5685.                 Browser.mainLoop.tickStartTime + value - _emscripten_get_now()
  5686.               ) | 0;
  5687.             setTimeout(Browser.mainLoop.runner, timeUntilNextTick);
  5688.           };
  5689.         Browser.mainLoop.method = "timeout";
  5690.       } else if (mode == 1) {
  5691.         Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() {
  5692.           Browser.requestAnimationFrame(Browser.mainLoop.runner);
  5693.         };
  5694.         Browser.mainLoop.method = "rAF";
  5695.       } else if (mode == 2) {
  5696.         if (typeof setImmediate === "undefined") {
  5697.           var setImmediates = [];
  5698.           var emscriptenMainLoopMessageId = "setimmediate";
  5699.           var Browser_setImmediate_messageHandler = function (event) {
  5700.             if (
  5701.               event.data === emscriptenMainLoopMessageId ||
  5702.               event.data.target === emscriptenMainLoopMessageId
  5703.             ) {
  5704.               event.stopPropagation();
  5705.               setImmediates.shift()();
  5706.             }
  5707.           };
  5708.           addEventListener(
  5709.             "message",
  5710.             Browser_setImmediate_messageHandler,
  5711.             true
  5712.           );
  5713.           setImmediate = function Browser_emulated_setImmediate(func) {
  5714.             setImmediates.push(func);
  5715.             if (ENVIRONMENT_IS_WORKER) {
  5716.               if (Module["setImmediates"] === undefined)
  5717.                 Module["setImmediates"] = [];
  5718.               Module["setImmediates"].push(func);
  5719.               postMessage({ target: emscriptenMainLoopMessageId });
  5720.             } else postMessage(emscriptenMainLoopMessageId, "*");
  5721.           };
  5722.         }
  5723.         Browser.mainLoop.scheduler =
  5724.           function Browser_mainLoop_scheduler_setImmediate() {
  5725.             setImmediate(Browser.mainLoop.runner);
  5726.           };
  5727.         Browser.mainLoop.method = "immediate";
  5728.       }
  5729.       return 0;
  5730.     }
  5731.     var _emscripten_get_now;
  5732.     if (ENVIRONMENT_IS_NODE) {
  5733.       _emscripten_get_now = function () {
  5734.         var t = process["hrtime"]();
  5735.         return t[0] * 1e3 + t[1] / 1e6;
  5736.       };
  5737.     } else if (typeof dateNow !== "undefined") {
  5738.       _emscripten_get_now = dateNow;
  5739.     } else
  5740.       _emscripten_get_now = function () {
  5741.         return performance.now();
  5742.       };
  5743.     function _exit(status) {
  5744.       exit(status);
  5745.     }
  5746.     function maybeExit() {
  5747.       if (!keepRuntimeAlive()) {
  5748.         try {
  5749.           _exit(EXITSTATUS);
  5750.         } catch (e) {
  5751.           if (e instanceof ExitStatus) {
  5752.             return;
  5753.           }
  5754.           throw e;
  5755.         }
  5756.       }
  5757.     }
  5758.     function setMainLoop(
  5759.       browserIterationFunc,
  5760.       fps,
  5761.       simulateInfiniteLoop,
  5762.       arg,
  5763.       noSetTiming
  5764.     ) {
  5765.       assert(
  5766.         !Browser.mainLoop.func,
  5767.         "emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."
  5768.       );
  5769.       Browser.mainLoop.func = browserIterationFunc;
  5770.       Browser.mainLoop.arg = arg;
  5771.       var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop;
  5772.       function checkIsRunning() {
  5773.         if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) {
  5774.           maybeExit();
  5775.           return false;
  5776.         }
  5777.         return true;
  5778.       }
  5779.       Browser.mainLoop.running = false;
  5780.       Browser.mainLoop.runner = function Browser_mainLoop_runner() {
  5781.         if (ABORT) return;
  5782.         if (Browser.mainLoop.queue.length > 0) {
  5783.           var start = Date.now();
  5784.           var blocker = Browser.mainLoop.queue.shift();
  5785.           blocker.func(blocker.arg);
  5786.           if (Browser.mainLoop.remainingBlockers) {
  5787.             var remaining = Browser.mainLoop.remainingBlockers;
  5788.             var next =
  5789.               remaining % 1 == 0 ? remaining - 1 : Math.floor(remaining);
  5790.             if (blocker.counted) {
  5791.               Browser.mainLoop.remainingBlockers = next;
  5792.             } else {
  5793.               next = next + 0.5;
  5794.               Browser.mainLoop.remainingBlockers = (8 * remaining + next) / 9;
  5795.             }
  5796.           }
  5797.           console.log(
  5798.             'main loop blocker "' +
  5799.               blocker.name +
  5800.               '" took ' +
  5801.               (Date.now() - start) +
  5802.               " ms"
  5803.           );
  5804.           Browser.mainLoop.updateStatus();
  5805.           if (!checkIsRunning()) return;
  5806.           setTimeout(Browser.mainLoop.runner, 0);
  5807.           return;
  5808.         }
  5809.         if (!checkIsRunning()) return;
  5810.         Browser.mainLoop.currentFrameNumber =
  5811.           (Browser.mainLoop.currentFrameNumber + 1) | 0;
  5812.         if (
  5813.           Browser.mainLoop.timingMode == 1 &&
  5814.           Browser.mainLoop.timingValue > 1 &&
  5815.           Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue !=
  5816.             0
  5817.         ) {
  5818.           Browser.mainLoop.scheduler();
  5819.           return;
  5820.         } else if (Browser.mainLoop.timingMode == 0) {
  5821.           Browser.mainLoop.tickStartTime = _emscripten_get_now();
  5822.         }
  5823.         Browser.mainLoop.runIter(browserIterationFunc);
  5824.         if (!checkIsRunning()) return;
  5825.         if (typeof SDL === "object" && SDL.audio && SDL.audio.queueNewAudioData)
  5826.           SDL.audio.queueNewAudioData();
  5827.         Browser.mainLoop.scheduler();
  5828.       };
  5829.       if (!noSetTiming) {
  5830.         if (fps && fps > 0) _emscripten_set_main_loop_timing(0, 1e3 / fps);
  5831.         else _emscripten_set_main_loop_timing(1, 1);
  5832.         Browser.mainLoop.scheduler();
  5833.       }
  5834.       if (simulateInfiniteLoop) {
  5835.         throw "unwind";
  5836.       }
  5837.     }
  5838.     function callUserCallback(func, synchronous) {
  5839.       if (ABORT) {
  5840.         return;
  5841.       }
  5842.       if (synchronous) {
  5843.         func();
  5844.         return;
  5845.       }
  5846.       try {
  5847.         func();
  5848.       } catch (e) {
  5849.         if (e instanceof ExitStatus) {
  5850.           return;
  5851.         } else if (e !== "unwind") {
  5852.           if (e && typeof e === "object" && e.stack)
  5853.             err("exception thrown: " + [e, e.stack]);
  5854.           throw e;
  5855.         }
  5856.       }
  5857.     }
  5858.     var Browser = {
  5859.       mainLoop: {
  5860.         running: false,
  5861.         scheduler: null,
  5862.         method: "",
  5863.         currentlyRunningMainloop: 0,
  5864.         func: null,
  5865.         arg: 0,
  5866.         timingMode: 0,
  5867.         timingValue: 0,
  5868.         currentFrameNumber: 0,
  5869.         queue: [],
  5870.         pause: function () {
  5871.           Browser.mainLoop.scheduler = null;
  5872.           Browser.mainLoop.currentlyRunningMainloop++;
  5873.         },
  5874.         resume: function () {
  5875.           Browser.mainLoop.currentlyRunningMainloop++;
  5876.           var timingMode = Browser.mainLoop.timingMode;
  5877.           var timingValue = Browser.mainLoop.timingValue;
  5878.           var func = Browser.mainLoop.func;
  5879.           Browser.mainLoop.func = null;
  5880.           setMainLoop(func, 0, false, Browser.mainLoop.arg, true);
  5881.           _emscripten_set_main_loop_timing(timingMode, timingValue);
  5882.           Browser.mainLoop.scheduler();
  5883.         },
  5884.         updateStatus: function () {
  5885.           if (Module["setStatus"]) {
  5886.             var message = Module["statusMessage"] || "Please wait...";
  5887.             var remaining = Browser.mainLoop.remainingBlockers;
  5888.             var expected = Browser.mainLoop.expectedBlockers;
  5889.             if (remaining) {
  5890.               if (remaining < expected) {
  5891.                 Module["setStatus"](
  5892.                   message + " (" + (expected - remaining) + "/" + expected + ")"
  5893.                 );
  5894.               } else {
  5895.                 Module["setStatus"](message);
  5896.               }
  5897.             } else {
  5898.               Module["setStatus"]("");
  5899.             }
  5900.           }
  5901.         },
  5902.         runIter: function (func) {
  5903.           if (ABORT) return;
  5904.           if (Module["preMainLoop"]) {
  5905.             var preRet = Module["preMainLoop"]();
  5906.             if (preRet === false) {
  5907.               return;
  5908.             }
  5909.           }
  5910.           callUserCallback(func);
  5911.           if (Module["postMainLoop"]) Module["postMainLoop"]();
  5912.         },
  5913.       },
  5914.       isFullscreen: false,
  5915.       pointerLock: false,
  5916.       moduleContextCreatedCallbacks: [],
  5917.       workers: [],
  5918.       init: function () {
  5919.         if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
  5920.         if (Browser.initted) return;
  5921.         Browser.initted = true;
  5922.         try {
  5923.           new Blob();
  5924.           Browser.hasBlobConstructor = true;
  5925.         } catch (e) {
  5926.           Browser.hasBlobConstructor = false;
  5927.           console.log(
  5928.             "warning: no blob constructor, cannot create blobs with mimetypes"
  5929.           );
  5930.         }
  5931.         Browser.BlobBuilder =
  5932.           typeof MozBlobBuilder != "undefined"
  5933.             ? MozBlobBuilder
  5934.             : typeof WebKitBlobBuilder != "undefined"
  5935.             ? WebKitBlobBuilder
  5936.             : !Browser.hasBlobConstructor
  5937.             ? console.log("warning: no BlobBuilder")
  5938.             : null;
  5939.         Browser.URLObject =
  5940.           typeof window != "undefined"
  5941.             ? window.URL
  5942.               ? window.URL
  5943.               : window.webkitURL
  5944.             : undefined;
  5945.         if (
  5946.           !Module.noImageDecoding &&
  5947.           typeof Browser.URLObject === "undefined"
  5948.         ) {
  5949.           console.log(
  5950.             "warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."
  5951.           );
  5952.           Module.noImageDecoding = true;
  5953.         }
  5954.         var imagePlugin = {};
  5955.         imagePlugin["canHandle"] = function imagePlugin_canHandle(name) {
  5956.           return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
  5957.         };
  5958.         imagePlugin["handle"] = function imagePlugin_handle(
  5959.           byteArray,
  5960.           name,
  5961.           onload,
  5962.           onerror
  5963.         ) {
  5964.           var b = null;
  5965.           if (Browser.hasBlobConstructor) {
  5966.             try {
  5967.               b = new Blob([byteArray], { type: Browser.getMimetype(name) });
  5968.               if (b.size !== byteArray.length) {
  5969.                 b = new Blob([new Uint8Array(byteArray).buffer], {
  5970.                   type: Browser.getMimetype(name),
  5971.                 });
  5972.               }
  5973.             } catch (e) {
  5974.               warnOnce(
  5975.                 "Blob constructor present but fails: " +
  5976.                   e +
  5977.                   "; falling back to blob builder"
  5978.               );
  5979.             }
  5980.           }
  5981.           if (!b) {
  5982.             var bb = new Browser.BlobBuilder();
  5983.             bb.append(new Uint8Array(byteArray).buffer);
  5984.             b = bb.getBlob();
  5985.           }
  5986.           var url = Browser.URLObject.createObjectURL(b);
  5987.           var img = new Image();
  5988.           img.onload = function img_onload() {
  5989.             assert(img.complete, "Image " + name + " could not be decoded");
  5990.             var canvas = document.createElement("canvas");
  5991.             canvas.width = img.width;
  5992.             canvas.height = img.height;
  5993.             var ctx = canvas.getContext("2d");
  5994.             ctx.drawImage(img, 0, 0);
  5995.             Module["preloadedImages"][name] = canvas;
  5996.             Browser.URLObject.revokeObjectURL(url);
  5997.             if (onload) onload(byteArray);
  5998.           };
  5999.           img.onerror = function img_onerror(event) {
  6000.             console.log("Image " + url + " could not be decoded");
  6001.             if (onerror) onerror();
  6002.           };
  6003.           img.src = url;
  6004.         };
  6005.         Module["preloadPlugins"].push(imagePlugin);
  6006.         var audioPlugin = {};
  6007.         audioPlugin["canHandle"] = function audioPlugin_canHandle(name) {
  6008.           return (
  6009.             !Module.noAudioDecoding &&
  6010.             name.substr(-4) in { ".ogg": 1, ".wav": 1, ".mp3": 1 }
  6011.           );
  6012.         };
  6013.         audioPlugin["handle"] = function audioPlugin_handle(
  6014.           byteArray,
  6015.           name,
  6016.           onload,
  6017.           onerror
  6018.         ) {
  6019.           var done = false;
  6020.           function finish(audio) {
  6021.             if (done) return;
  6022.             done = true;
  6023.             Module["preloadedAudios"][name] = audio;
  6024.             if (onload) onload(byteArray);
  6025.           }
  6026.           function fail() {
  6027.             if (done) return;
  6028.             done = true;
  6029.             Module["preloadedAudios"][name] = new Audio();
  6030.             if (onerror) onerror();
  6031.           }
  6032.           if (Browser.hasBlobConstructor) {
  6033.             try {
  6034.               var b = new Blob([byteArray], {
  6035.                 type: Browser.getMimetype(name),
  6036.               });
  6037.             } catch (e) {
  6038.               return fail();
  6039.             }
  6040.             var url = Browser.URLObject.createObjectURL(b);
  6041.             var audio = new Audio();
  6042.             audio.addEventListener(
  6043.               "canplaythrough",
  6044.               function () {
  6045.                 finish(audio);
  6046.               },
  6047.               false
  6048.             );
  6049.             audio.onerror = function audio_onerror(event) {
  6050.               if (done) return;
  6051.               console.log(
  6052.                 "warning: browser could not fully decode audio " +
  6053.                   name +
  6054.                   ", trying slower base64 approach"
  6055.               );
  6056.               function encode64(data) {
  6057.                 var BASE =
  6058.                   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  6059.                 var PAD = "=";
  6060.                 var ret = "";
  6061.                 var leftchar = 0;
  6062.                 var leftbits = 0;
  6063.                 for (var i = 0; i < data.length; i++) {
  6064.                   leftchar = (leftchar << 8) | data[i];
  6065.                   leftbits += 8;
  6066.                   while (leftbits >= 6) {
  6067.                     var curr = (leftchar >> (leftbits - 6)) & 63;
  6068.                     leftbits -= 6;
  6069.                     ret += BASE[curr];
  6070.                   }
  6071.                 }
  6072.                 if (leftbits == 2) {
  6073.                   ret += BASE[(leftchar & 3) << 4];
  6074.                   ret += PAD + PAD;
  6075.                 } else if (leftbits == 4) {
  6076.                   ret += BASE[(leftchar & 15) << 2];
  6077.                   ret += PAD;
  6078.                 }
  6079.                 return ret;
  6080.               }
  6081.               audio.src =
  6082.                 "data:audio/x-" +
  6083.                 name.substr(-3) +
  6084.                 ";base64," +
  6085.                 encode64(byteArray);
  6086.               finish(audio);
  6087.             };
  6088.             audio.src = url;
  6089.             Browser.safeSetTimeout(function () {
  6090.               finish(audio);
  6091.             }, 1e4);
  6092.           } else {
  6093.             return fail();
  6094.           }
  6095.         };
  6096.         Module["preloadPlugins"].push(audioPlugin);
  6097.         function pointerLockChange() {
  6098.           Browser.pointerLock =
  6099.             document["pointerLockElement"] === Module["canvas"] ||
  6100.             document["mozPointerLockElement"] === Module["canvas"] ||
  6101.             document["webkitPointerLockElement"] === Module["canvas"] ||
  6102.             document["msPointerLockElement"] === Module["canvas"];
  6103.         }
  6104.         var canvas = Module["canvas"];
  6105.         if (canvas) {
  6106.           canvas.requestPointerLock =
  6107.             canvas["requestPointerLock"] ||
  6108.             canvas["mozRequestPointerLock"] ||
  6109.             canvas["webkitRequestPointerLock"] ||
  6110.             canvas["msRequestPointerLock"] ||
  6111.             function () {};
  6112.           canvas.exitPointerLock =
  6113.             document["exitPointerLock"] ||
  6114.             document["mozExitPointerLock"] ||
  6115.             document["webkitExitPointerLock"] ||
  6116.             document["msExitPointerLock"] ||
  6117.             function () {};
  6118.           canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
  6119.           document.addEventListener(
  6120.             "pointerlockchange",
  6121.             pointerLockChange,
  6122.             false
  6123.           );
  6124.           document.addEventListener(
  6125.             "mozpointerlockchange",
  6126.             pointerLockChange,
  6127.             false
  6128.           );
  6129.           document.addEventListener(
  6130.             "webkitpointerlockchange",
  6131.             pointerLockChange,
  6132.             false
  6133.           );
  6134.           document.addEventListener(
  6135.             "mspointerlockchange",
  6136.             pointerLockChange,
  6137.             false
  6138.           );
  6139.           if (Module["elementPointerLock"]) {
  6140.             canvas.addEventListener(
  6141.               "click",
  6142.               function (ev) {
  6143.                 if (
  6144.                   !Browser.pointerLock &&
  6145.                   Module["canvas"].requestPointerLock
  6146.                 ) {
  6147.                   Module["canvas"].requestPointerLock();
  6148.                   ev.preventDefault();
  6149.                 }
  6150.               },
  6151.               false
  6152.             );
  6153.           }
  6154.         }
  6155.       },
  6156.       createContext: function (
  6157.         canvas,
  6158.         useWebGL,
  6159.         setInModule,
  6160.         webGLContextAttributes
  6161.       ) {
  6162.         if (useWebGL && Module.ctx && canvas == Module.canvas)
  6163.           return Module.ctx;
  6164.         var ctx;
  6165.         var contextHandle;
  6166.         if (useWebGL) {
  6167.           var contextAttributes = {
  6168.             antialias: false,
  6169.             alpha: false,
  6170.             majorVersion: 1,
  6171.           };
  6172.           if (webGLContextAttributes) {
  6173.             for (var attribute in webGLContextAttributes) {
  6174.               contextAttributes[attribute] = webGLContextAttributes[attribute];
  6175.             }
  6176.           }
  6177.           if (typeof GL !== "undefined") {
  6178.             contextHandle = GL.createContext(canvas, contextAttributes);
  6179.             if (contextHandle) {
  6180.               ctx = GL.getContext(contextHandle).GLctx;
  6181.             }
  6182.           }
  6183.         } else {
  6184.           ctx = canvas.getContext("2d");
  6185.         }
  6186.         if (!ctx) return null;
  6187.         if (setInModule) {
  6188.           if (!useWebGL)
  6189.             assert(
  6190.               typeof GLctx === "undefined",
  6191.               "cannot set in module if GLctx is used, but we are a non-GL context that would replace it"
  6192.             );
  6193.           Module.ctx = ctx;
  6194.           if (useWebGL) GL.makeContextCurrent(contextHandle);
  6195.           Module.useWebGL = useWebGL;
  6196.           Browser.moduleContextCreatedCallbacks.forEach(function (callback) {
  6197.             callback();
  6198.           });
  6199.           Browser.init();
  6200.         }
  6201.         return ctx;
  6202.       },
  6203.       destroyContext: function (canvas, useWebGL, setInModule) {},
  6204.       fullscreenHandlersInstalled: false,
  6205.       lockPointer: undefined,
  6206.       resizeCanvas: undefined,
  6207.       requestFullscreen: function (lockPointer, resizeCanvas) {
  6208.         Browser.lockPointer = lockPointer;
  6209.         Browser.resizeCanvas = resizeCanvas;
  6210.         if (typeof Browser.lockPointer === "undefined")
  6211.           Browser.lockPointer = true;
  6212.         if (typeof Browser.resizeCanvas === "undefined")
  6213.           Browser.resizeCanvas = false;
  6214.         var canvas = Module["canvas"];
  6215.         function fullscreenChange() {
  6216.           Browser.isFullscreen = false;
  6217.           var canvasContainer = canvas.parentNode;
  6218.           if (
  6219.             (document["fullscreenElement"] ||
  6220.               document["mozFullScreenElement"] ||
  6221.               document["msFullscreenElement"] ||
  6222.               document["webkitFullscreenElement"] ||
  6223.               document["webkitCurrentFullScreenElement"]) === canvasContainer
  6224.           ) {
  6225.             canvas.exitFullscreen = Browser.exitFullscreen;
  6226.             if (Browser.lockPointer) canvas.requestPointerLock();
  6227.             Browser.isFullscreen = true;
  6228.             if (Browser.resizeCanvas) {
  6229.               Browser.setFullscreenCanvasSize();
  6230.             } else {
  6231.               Browser.updateCanvasDimensions(canvas);
  6232.             }
  6233.           } else {
  6234.             canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
  6235.             canvasContainer.parentNode.removeChild(canvasContainer);
  6236.             if (Browser.resizeCanvas) {
  6237.               Browser.setWindowedCanvasSize();
  6238.             } else {
  6239.               Browser.updateCanvasDimensions(canvas);
  6240.             }
  6241.           }
  6242.           if (Module["onFullScreen"])
  6243.             Module["onFullScreen"](Browser.isFullscreen);
  6244.           if (Module["onFullscreen"])
  6245.             Module["onFullscreen"](Browser.isFullscreen);
  6246.         }
  6247.         if (!Browser.fullscreenHandlersInstalled) {
  6248.           Browser.fullscreenHandlersInstalled = true;
  6249.           document.addEventListener(
  6250.             "fullscreenchange",
  6251.             fullscreenChange,
  6252.             false
  6253.           );
  6254.           document.addEventListener(
  6255.             "mozfullscreenchange",
  6256.             fullscreenChange,
  6257.             false
  6258.           );
  6259.           document.addEventListener(
  6260.             "webkitfullscreenchange",
  6261.             fullscreenChange,
  6262.             false
  6263.           );
  6264.           document.addEventListener(
  6265.             "MSFullscreenChange",
  6266.             fullscreenChange,
  6267.             false
  6268.           );
  6269.         }
  6270.         var canvasContainer = document.createElement("div");
  6271.         canvas.parentNode.insertBefore(canvasContainer, canvas);
  6272.         canvasContainer.appendChild(canvas);
  6273.         canvasContainer.requestFullscreen =
  6274.           canvasContainer["requestFullscreen"] ||
  6275.           canvasContainer["mozRequestFullScreen"] ||
  6276.           canvasContainer["msRequestFullscreen"] ||
  6277.           (canvasContainer["webkitRequestFullscreen"]
  6278.             ? function () {
  6279.                 canvasContainer["webkitRequestFullscreen"](
  6280.                   Element["ALLOW_KEYBOARD_INPUT"]
  6281.                 );
  6282.               }
  6283.             : null) ||
  6284.           (canvasContainer["webkitRequestFullScreen"]
  6285.             ? function () {
  6286.                 canvasContainer["webkitRequestFullScreen"](
  6287.                   Element["ALLOW_KEYBOARD_INPUT"]
  6288.                 );
  6289.               }
  6290.             : null);
  6291.         canvasContainer.requestFullscreen();
  6292.       },
  6293.       exitFullscreen: function () {
  6294.         if (!Browser.isFullscreen) {
  6295.           return false;
  6296.         }
  6297.         var CFS =
  6298.           document["exitFullscreen"] ||
  6299.           document["cancelFullScreen"] ||
  6300.           document["mozCancelFullScreen"] ||
  6301.           document["msExitFullscreen"] ||
  6302.           document["webkitCancelFullScreen"] ||
  6303.           function () {};
  6304.         CFS.apply(document, []);
  6305.         return true;
  6306.       },
  6307.       nextRAF: 0,
  6308.       fakeRequestAnimationFrame: function (func) {
  6309.         var now = Date.now();
  6310.         if (Browser.nextRAF === 0) {
  6311.           Browser.nextRAF = now + 1e3 / 60;
  6312.         } else {
  6313.           while (now + 2 >= Browser.nextRAF) {
  6314.             Browser.nextRAF += 1e3 / 60;
  6315.           }
  6316.         }
  6317.         var delay = Math.max(Browser.nextRAF - now, 0);
  6318.         setTimeout(func, delay);
  6319.       },
  6320.       requestAnimationFrame: function (func) {
  6321.         if (typeof requestAnimationFrame === "function") {
  6322.           requestAnimationFrame(func);
  6323.           return;
  6324.         }
  6325.         var RAF = Browser.fakeRequestAnimationFrame;
  6326.         RAF(func);
  6327.       },
  6328.       safeRequestAnimationFrame: function (func) {
  6329.         return Browser.requestAnimationFrame(function () {
  6330.           callUserCallback(func);
  6331.         });
  6332.       },
  6333.       safeSetTimeout: function (func, timeout) {
  6334.         return setTimeout(function () {
  6335.           callUserCallback(func);
  6336.         }, timeout);
  6337.       },
  6338.       getMimetype: function (name) {
  6339.         return {
  6340.           jpg: "image/jpeg",
  6341.           jpeg: "image/jpeg",
  6342.           png: "image/png",
  6343.           bmp: "image/bmp",
  6344.           ogg: "audio/ogg",
  6345.           wav: "audio/wav",
  6346.           mp3: "audio/mpeg",
  6347.         }[name.substr(name.lastIndexOf(".") + 1)];
  6348.       },
  6349.       getUserMedia: function (func) {
  6350.         if (!window.getUserMedia) {
  6351.           window.getUserMedia =
  6352.             navigator["getUserMedia"] || navigator["mozGetUserMedia"];
  6353.         }
  6354.         window.getUserMedia(func);
  6355.       },
  6356.       getMovementX: function (event) {
  6357.         return (
  6358.           event["movementX"] ||
  6359.           event["mozMovementX"] ||
  6360.           event["webkitMovementX"] ||
  6361.           0
  6362.         );
  6363.       },
  6364.       getMovementY: function (event) {
  6365.         return (
  6366.           event["movementY"] ||
  6367.           event["mozMovementY"] ||
  6368.           event["webkitMovementY"] ||
  6369.           0
  6370.         );
  6371.       },
  6372.       getMouseWheelDelta: function (event) {
  6373.         var delta = 0;
  6374.         switch (event.type) {
  6375.           case "DOMMouseScroll":
  6376.             delta = event.detail / 3;
  6377.             break;
  6378.           case "mousewheel":
  6379.             delta = event.wheelDelta / 120;
  6380.             break;
  6381.           case "wheel":
  6382.             delta = event.deltaY;
  6383.             switch (event.deltaMode) {
  6384.               case 0:
  6385.                 delta /= 100;
  6386.                 break;
  6387.               case 1:
  6388.                 delta /= 3;
  6389.                 break;
  6390.               case 2:
  6391.                 delta *= 80;
  6392.                 break;
  6393.               default:
  6394.                 throw "unrecognized mouse wheel delta mode: " + event.deltaMode;
  6395.             }
  6396.             break;
  6397.           default:
  6398.             throw "unrecognized mouse wheel event: " + event.type;
  6399.         }
  6400.         return delta;
  6401.       },
  6402.       mouseX: 0,
  6403.       mouseY: 0,
  6404.       mouseMovementX: 0,
  6405.       mouseMovementY: 0,
  6406.       touches: {},
  6407.       lastTouches: {},
  6408.       calculateMouseEvent: function (event) {
  6409.         if (Browser.pointerLock) {
  6410.           if (event.type != "mousemove" && "mozMovementX" in event) {
  6411.             Browser.mouseMovementX = Browser.mouseMovementY = 0;
  6412.           } else {
  6413.             Browser.mouseMovementX = Browser.getMovementX(event);
  6414.             Browser.mouseMovementY = Browser.getMovementY(event);
  6415.           }
  6416.           if (typeof SDL != "undefined") {
  6417.             Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
  6418.             Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
  6419.           } else {
  6420.             Browser.mouseX += Browser.mouseMovementX;
  6421.             Browser.mouseY += Browser.mouseMovementY;
  6422.           }
  6423.         } else {
  6424.           var rect = Module["canvas"].getBoundingClientRect();
  6425.           var cw = Module["canvas"].width;
  6426.           var ch = Module["canvas"].height;
  6427.           var scrollX =
  6428.             typeof window.scrollX !== "undefined"
  6429.               ? window.scrollX
  6430.               : window.pageXOffset;
  6431.           var scrollY =
  6432.             typeof window.scrollY !== "undefined"
  6433.               ? window.scrollY
  6434.               : window.pageYOffset;
  6435.           if (
  6436.             event.type === "touchstart" ||
  6437.             event.type === "touchend" ||
  6438.             event.type === "touchmove"
  6439.           ) {
  6440.             var touch = event.touch;
  6441.             if (touch === undefined) {
  6442.               return;
  6443.             }
  6444.             var adjustedX = touch.pageX - (scrollX + rect.left);
  6445.             var adjustedY = touch.pageY - (scrollY + rect.top);
  6446.             adjustedX = adjustedX * (cw / rect.width);
  6447.             adjustedY = adjustedY * (ch / rect.height);
  6448.             var coords = { x: adjustedX, y: adjustedY };
  6449.             if (event.type === "touchstart") {
  6450.               Browser.lastTouches[touch.identifier] = coords;
  6451.               Browser.touches[touch.identifier] = coords;
  6452.             } else if (
  6453.               event.type === "touchend" ||
  6454.               event.type === "touchmove"
  6455.             ) {
  6456.               var last = Browser.touches[touch.identifier];
  6457.               if (!last) last = coords;
  6458.               Browser.lastTouches[touch.identifier] = last;
  6459.               Browser.touches[touch.identifier] = coords;
  6460.             }
  6461.             return;
  6462.           }
  6463.           var x = event.pageX - (scrollX + rect.left);
  6464.           var y = event.pageY - (scrollY + rect.top);
  6465.           x = x * (cw / rect.width);
  6466.           y = y * (ch / rect.height);
  6467.           Browser.mouseMovementX = x - Browser.mouseX;
  6468.           Browser.mouseMovementY = y - Browser.mouseY;
  6469.           Browser.mouseX = x;
  6470.           Browser.mouseY = y;
  6471.         }
  6472.       },
  6473.       asyncLoad: function (url, onload, onerror, noRunDep) {
  6474.         var dep = !noRunDep ? getUniqueRunDependency("al " + url) : "";
  6475.         readAsync(
  6476.           url,
  6477.           function (arrayBuffer) {
  6478.             assert(
  6479.               arrayBuffer,
  6480.               'Loading data file "' + url + '" failed (no arrayBuffer).'
  6481.             );
  6482.             onload(new Uint8Array(arrayBuffer));
  6483.             if (dep) removeRunDependency(dep);
  6484.           },
  6485.           function (event) {
  6486.             if (onerror) {
  6487.               onerror();
  6488.             } else {
  6489.               throw 'Loading data file "' + url + '" failed.';
  6490.             }
  6491.           }
  6492.         );
  6493.         if (dep) addRunDependency(dep);
  6494.       },
  6495.       resizeListeners: [],
  6496.       updateResizeListeners: function () {
  6497.         var canvas = Module["canvas"];
  6498.         Browser.resizeListeners.forEach(function (listener) {
  6499.           listener(canvas.width, canvas.height);
  6500.         });
  6501.       },
  6502.       setCanvasSize: function (width, height, noUpdates) {
  6503.         var canvas = Module["canvas"];
  6504.         Browser.updateCanvasDimensions(canvas, width, height);
  6505.         if (!noUpdates) Browser.updateResizeListeners();
  6506.       },
  6507.       windowedWidth: 0,
  6508.       windowedHeight: 0,
  6509.       setFullscreenCanvasSize: function () {
  6510.         if (typeof SDL != "undefined") {
  6511.           var flags = HEAPU32[SDL.screen >> 2];
  6512.           flags = flags | 8388608;
  6513.           HEAP32[SDL.screen >> 2] = flags;
  6514.         }
  6515.         Browser.updateCanvasDimensions(Module["canvas"]);
  6516.         Browser.updateResizeListeners();
  6517.       },
  6518.       setWindowedCanvasSize: function () {
  6519.         if (typeof SDL != "undefined") {
  6520.           var flags = HEAPU32[SDL.screen >> 2];
  6521.           flags = flags & ~8388608;
  6522.           HEAP32[SDL.screen >> 2] = flags;
  6523.         }
  6524.         Browser.updateCanvasDimensions(Module["canvas"]);
  6525.         Browser.updateResizeListeners();
  6526.       },
  6527.       updateCanvasDimensions: function (canvas, wNative, hNative) {
  6528.         if (wNative && hNative) {
  6529.           canvas.widthNative = wNative;
  6530.           canvas.heightNative = hNative;
  6531.         } else {
  6532.           wNative = canvas.widthNative;
  6533.           hNative = canvas.heightNative;
  6534.         }
  6535.         var w = wNative;
  6536.         var h = hNative;
  6537.         if (Module["forcedAspectRatio"] && Module["forcedAspectRatio"] > 0) {
  6538.           if (w / h < Module["forcedAspectRatio"]) {
  6539.             w = Math.round(h * Module["forcedAspectRatio"]);
  6540.           } else {
  6541.             h = Math.round(w / Module["forcedAspectRatio"]);
  6542.           }
  6543.         }
  6544.         if (
  6545.           (document["fullscreenElement"] ||
  6546.             document["mozFullScreenElement"] ||
  6547.             document["msFullscreenElement"] ||
  6548.             document["webkitFullscreenElement"] ||
  6549.             document["webkitCurrentFullScreenElement"]) === canvas.parentNode &&
  6550.           typeof screen != "undefined"
  6551.         ) {
  6552.           var factor = Math.min(screen.width / w, screen.height / h);
  6553.           w = Math.round(w * factor);
  6554.           h = Math.round(h * factor);
  6555.         }
  6556.         if (Browser.resizeCanvas) {
  6557.           if (canvas.width != w) canvas.width = w;
  6558.           if (canvas.height != h) canvas.height = h;
  6559.           if (typeof canvas.style != "undefined") {
  6560.             canvas.style.removeProperty("width");
  6561.             canvas.style.removeProperty("height");
  6562.           }
  6563.         } else {
  6564.           if (canvas.width != wNative) canvas.width = wNative;
  6565.           if (canvas.height != hNative) canvas.height = hNative;
  6566.           if (typeof canvas.style != "undefined") {
  6567.             if (w != wNative || h != hNative) {
  6568.               canvas.style.setProperty("width", w + "px", "important");
  6569.               canvas.style.setProperty("height", h + "px", "important");
  6570.             } else {
  6571.               canvas.style.removeProperty("width");
  6572.               canvas.style.removeProperty("height");
  6573.             }
  6574.           }
  6575.         }
  6576.       },
  6577.       wgetRequests: {},
  6578.       nextWgetRequestHandle: 0,
  6579.       getNextWgetRequestHandle: function () {
  6580.         var handle = Browser.nextWgetRequestHandle;
  6581.         Browser.nextWgetRequestHandle++;
  6582.         return handle;
  6583.       },
  6584.     };
  6585.     function _emscripten_async_call(func, arg, millis) {
  6586.       function wrapper() {
  6587.         (function (a1) {
  6588.           dynCall_vi.apply(null, [func, a1]);
  6589.         })(arg);
  6590.       }
  6591.       if (millis >= 0) {
  6592.         Browser.safeSetTimeout(wrapper, millis);
  6593.       } else {
  6594.         Browser.safeRequestAnimationFrame(wrapper);
  6595.       }
  6596.     }
  6597.     function _emscripten_memcpy_big(dest, src, num) {
  6598.       HEAPU8.copyWithin(dest, src, src + num);
  6599.     }
  6600.     function emscripten_realloc_buffer(size) {
  6601.       try {
  6602.         wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);
  6603.         updateGlobalBufferAndViews(wasmMemory.buffer);
  6604.         return 1;
  6605.       } catch (e) {}
  6606.     }
  6607.     function _emscripten_resize_heap(requestedSize) {
  6608.       var oldSize = HEAPU8.length;
  6609.       requestedSize = requestedSize >>> 0;
  6610.       var maxHeapSize = 2147483648;
  6611.       if (requestedSize > maxHeapSize) {
  6612.         return false;
  6613.       }
  6614.       for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
  6615.         var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
  6616.         overGrownHeapSize = Math.min(
  6617.           overGrownHeapSize,
  6618.           requestedSize + 100663296
  6619.         );
  6620.         var newSize = Math.min(
  6621.           maxHeapSize,
  6622.           alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)
  6623.         );
  6624.         var replacement = emscripten_realloc_buffer(newSize);
  6625.         if (replacement) {
  6626.           return true;
  6627.         }
  6628.       }
  6629.       return false;
  6630.     }
  6631.     function _emscripten_run_script(ptr) {
  6632.       eval(UTF8ToString(ptr));
  6633.     }
  6634.     function _emscripten_thread_sleep(msecs) {
  6635.       var start = _emscripten_get_now();
  6636.       while (_emscripten_get_now() - start < msecs) {}
  6637.     }
  6638.     function _fd_close(fd) {
  6639.       try {
  6640.         var stream = SYSCALLS.getStreamFromFD(fd);
  6641.         FS.close(stream);
  6642.         return 0;
  6643.       } catch (e) {
  6644.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  6645.           abort(e);
  6646.         return e.errno;
  6647.       }
  6648.     }
  6649.     function _fd_read(fd, iov, iovcnt, pnum) {
  6650.       try {
  6651.         var stream = SYSCALLS.getStreamFromFD(fd);
  6652.         var num = SYSCALLS.doReadv(stream, iov, iovcnt);
  6653.         HEAP32[pnum >> 2] = num;
  6654.         return 0;
  6655.       } catch (e) {
  6656.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  6657.           abort(e);
  6658.         return e.errno;
  6659.       }
  6660.     }
  6661.     function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
  6662.       try {
  6663.         var stream = SYSCALLS.getStreamFromFD(fd);
  6664.         var HIGH_OFFSET = 4294967296;
  6665.         var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0);
  6666.         var DOUBLE_LIMIT = 9007199254740992;
  6667.         if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
  6668.           return -61;
  6669.         }
  6670.         FS.llseek(stream, offset, whence);
  6671.         (tempI64 = [
  6672.           stream.position >>> 0,
  6673.           ((tempDouble = stream.position),
  6674.           +Math.abs(tempDouble) >= 1
  6675.             ? tempDouble > 0
  6676.               ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) |
  6677.                   0) >>>
  6678.                 0
  6679.               : ~~+Math.ceil(
  6680.                   (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
  6681.                 ) >>> 0
  6682.             : 0),
  6683.         ]),
  6684.           (HEAP32[newOffset >> 2] = tempI64[0]),
  6685.           (HEAP32[(newOffset + 4) >> 2] = tempI64[1]);
  6686.         if (stream.getdents && offset === 0 && whence === 0)
  6687.           stream.getdents = null;
  6688.         return 0;
  6689.       } catch (e) {
  6690.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  6691.           abort(e);
  6692.         return e.errno;
  6693.       }
  6694.     }
  6695.     function _fd_write(fd, iov, iovcnt, pnum) {
  6696.       try {
  6697.         var stream = SYSCALLS.getStreamFromFD(fd);
  6698.         var num = SYSCALLS.doWritev(stream, iov, iovcnt);
  6699.         HEAP32[pnum >> 2] = num;
  6700.         return 0;
  6701.       } catch (e) {
  6702.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  6703.           abort(e);
  6704.         return e.errno;
  6705.       }
  6706.     }
  6707.     function _setTempRet0(val) {
  6708.       setTempRet0(val);
  6709.     }
  6710.     function runAndAbortIfError(func) {
  6711.       try {
  6712.         return func();
  6713.       } catch (e) {
  6714.         abort(e);
  6715.       }
  6716.     }
  6717.     var Asyncify = {
  6718.       State: { Normal: 0, Unwinding: 1, Rewinding: 2 },
  6719.       state: 0,
  6720.       StackSize: 4096,
  6721.       currData: null,
  6722.       handleSleepReturnValue: 0,
  6723.       exportCallStack: [],
  6724.       callStackNameToId: {},
  6725.       callStackIdToName: {},
  6726.       callStackId: 0,
  6727.       afterUnwind: null,
  6728.       asyncFinalizers: [],
  6729.       sleepCallbacks: [],
  6730.       getCallStackId: function (funcName) {
  6731.         var id = Asyncify.callStackNameToId[funcName];
  6732.         if (id === undefined) {
  6733.           id = Asyncify.callStackId++;
  6734.           Asyncify.callStackNameToId[funcName] = id;
  6735.           Asyncify.callStackIdToName[id] = funcName;
  6736.         }
  6737.         return id;
  6738.       },
  6739.       instrumentWasmExports: function (exports) {
  6740.         var ret = {};
  6741.         for (var x in exports) {
  6742.           (function (x) {
  6743.             var original = exports[x];
  6744.             if (typeof original === "function") {
  6745.               ret[x] = function () {
  6746.                 Asyncify.exportCallStack.push(x);
  6747.                 try {
  6748.                   return original.apply(null, arguments);
  6749.                 } finally {
  6750.                   if (ABORT) return;
  6751.                   var y = Asyncify.exportCallStack.pop();
  6752.                   assert(y === x);
  6753.                   Asyncify.maybeStopUnwind();
  6754.                 }
  6755.               };
  6756.             } else {
  6757.               ret[x] = original;
  6758.             }
  6759.           })(x);
  6760.         }
  6761.         return ret;
  6762.       },
  6763.       maybeStopUnwind: function () {
  6764.         if (
  6765.           Asyncify.currData &&
  6766.           Asyncify.state === Asyncify.State.Unwinding &&
  6767.           Asyncify.exportCallStack.length === 0
  6768.         ) {
  6769.           Asyncify.state = Asyncify.State.Normal;
  6770.           runAndAbortIfError(Module["_asyncify_stop_unwind"]);
  6771.           if (typeof Fibers !== "undefined") {
  6772.             Fibers.trampoline();
  6773.           }
  6774.           if (Asyncify.afterUnwind) {
  6775.             Asyncify.afterUnwind();
  6776.             Asyncify.afterUnwind = null;
  6777.           }
  6778.         }
  6779.       },
  6780.       allocateData: function () {
  6781.         var ptr = _malloc(12 + Asyncify.StackSize);
  6782.         Asyncify.setDataHeader(ptr, ptr + 12, Asyncify.StackSize);
  6783.         Asyncify.setDataRewindFunc(ptr);
  6784.         return ptr;
  6785.       },
  6786.       setDataHeader: function (ptr, stack, stackSize) {
  6787.         HEAP32[ptr >> 2] = stack;
  6788.         HEAP32[(ptr + 4) >> 2] = stack + stackSize;
  6789.       },
  6790.       setDataRewindFunc: function (ptr) {
  6791.         var bottomOfCallStack = Asyncify.exportCallStack[0];
  6792.         var rewindId = Asyncify.getCallStackId(bottomOfCallStack);
  6793.         HEAP32[(ptr + 8) >> 2] = rewindId;
  6794.       },
  6795.       getDataRewindFunc: function (ptr) {
  6796.         var id = HEAP32[(ptr + 8) >> 2];
  6797.         var name = Asyncify.callStackIdToName[id];
  6798.         var func = Module["asm"][name];
  6799.         return func;
  6800.       },
  6801.       handleSleep: function (startAsync) {
  6802.         if (ABORT) return;
  6803.         noExitRuntime = true;
  6804.         if (Asyncify.state === Asyncify.State.Normal) {
  6805.           var reachedCallback = false;
  6806.           var reachedAfterCallback = false;
  6807.           startAsync(function (handleSleepReturnValue) {
  6808.             if (ABORT) return;
  6809.             Asyncify.handleSleepReturnValue = handleSleepReturnValue || 0;
  6810.             reachedCallback = true;
  6811.             if (!reachedAfterCallback) {
  6812.               return;
  6813.             }
  6814.             Asyncify.state = Asyncify.State.Rewinding;
  6815.             runAndAbortIfError(function () {
  6816.               Module["_asyncify_start_rewind"](Asyncify.currData);
  6817.             });
  6818.             if (typeof Browser !== "undefined" && Browser.mainLoop.func) {
  6819.               Browser.mainLoop.resume();
  6820.             }
  6821.             var start = Asyncify.getDataRewindFunc(Asyncify.currData);
  6822.             var asyncWasmReturnValue = start();
  6823.             if (!Asyncify.currData) {
  6824.               var asyncFinalizers = Asyncify.asyncFinalizers;
  6825.               Asyncify.asyncFinalizers = [];
  6826.               asyncFinalizers.forEach(function (func) {
  6827.                 func(asyncWasmReturnValue);
  6828.               });
  6829.             }
  6830.           });
  6831.           reachedAfterCallback = true;
  6832.           if (!reachedCallback) {
  6833.             Asyncify.state = Asyncify.State.Unwinding;
  6834.             Asyncify.currData = Asyncify.allocateData();
  6835.             runAndAbortIfError(function () {
  6836.               Module["_asyncify_start_unwind"](Asyncify.currData);
  6837.             });
  6838.             if (typeof Browser !== "undefined" && Browser.mainLoop.func) {
  6839.               Browser.mainLoop.pause();
  6840.             }
  6841.           }
  6842.         } else if (Asyncify.state === Asyncify.State.Rewinding) {
  6843.           Asyncify.state = Asyncify.State.Normal;
  6844.           runAndAbortIfError(Module["_asyncify_stop_rewind"]);
  6845.           _free(Asyncify.currData);
  6846.           Asyncify.currData = null;
  6847.           Asyncify.sleepCallbacks.forEach(function (func) {
  6848.             func();
  6849.           });
  6850.         } else {
  6851.           abort("invalid state: " + Asyncify.state);
  6852.         }
  6853.         return Asyncify.handleSleepReturnValue;
  6854.       },
  6855.       handleAsync: function (startAsync) {
  6856.         return Asyncify.handleSleep(function (wakeUp) {
  6857.           startAsync().then(wakeUp);
  6858.         });
  6859.       },
  6860.     };
  6861.     var FSNode = function (parent, name, mode, rdev) {
  6862.       if (!parent) {
  6863.         parent = this;
  6864.       }
  6865.       this.parent = parent;
  6866.       this.mount = parent.mount;
  6867.       this.mounted = null;
  6868.       this.id = FS.nextInode++;
  6869.       this.name = name;
  6870.       this.mode = mode;
  6871.       this.node_ops = {};
  6872.       this.stream_ops = {};
  6873.       this.rdev = rdev;
  6874.     };
  6875.     var readMode = 292 | 73;
  6876.     var writeMode = 146;
  6877.     Object.defineProperties(FSNode.prototype, {
  6878.       read: {
  6879.         get: function () {
  6880.           return (this.mode & readMode) === readMode;
  6881.         },
  6882.         set: function (val) {
  6883.           val ? (this.mode |= readMode) : (this.mode &= ~readMode);
  6884.         },
  6885.       },
  6886.       write: {
  6887.         get: function () {
  6888.           return (this.mode & writeMode) === writeMode;
  6889.         },
  6890.         set: function (val) {
  6891.           val ? (this.mode |= writeMode) : (this.mode &= ~writeMode);
  6892.         },
  6893.       },
  6894.       isFolder: {
  6895.         get: function () {
  6896.           return FS.isDir(this.mode);
  6897.         },
  6898.       },
  6899.       isDevice: {
  6900.         get: function () {
  6901.           return FS.isChrdev(this.mode);
  6902.         },
  6903.       },
  6904.     });
  6905.     FS.FSNode = FSNode;
  6906.     FS.staticInit();
  6907.     Module["FS_createPath"] = FS.createPath;
  6908.     Module["FS_createDataFile"] = FS.createDataFile;
  6909.     Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  6910.     Module["FS_createLazyFile"] = FS.createLazyFile;
  6911.     Module["FS_createDevice"] = FS.createDevice;
  6912.     Module["FS_unlink"] = FS.unlink;
  6913.     embind_init_charCodes();
  6914.     BindingError = Module["BindingError"] = extendError(Error, "BindingError");
  6915.     InternalError = Module["InternalError"] = extendError(
  6916.       Error,
  6917.       "InternalError"
  6918.     );
  6919.     init_ClassHandle();
  6920.     init_RegisteredPointer();
  6921.     init_embind();
  6922.     UnboundTypeError = Module["UnboundTypeError"] = extendError(
  6923.       Error,
  6924.       "UnboundTypeError"
  6925.     );
  6926.     init_emval();
  6927.     Module["requestFullscreen"] = function Module_requestFullscreen(
  6928.       lockPointer,
  6929.       resizeCanvas
  6930.     ) {
  6931.       Browser.requestFullscreen(lockPointer, resizeCanvas);
  6932.     };
  6933.     Module["requestAnimationFrame"] = function Module_requestAnimationFrame(
  6934.       func
  6935.     ) {
  6936.       Browser.requestAnimationFrame(func);
  6937.     };
  6938.     Module["setCanvasSize"] = function Module_setCanvasSize(
  6939.       width,
  6940.       height,
  6941.       noUpdates
  6942.     ) {
  6943.       Browser.setCanvasSize(width, height, noUpdates);
  6944.     };
  6945.     Module["pauseMainLoop"] = function Module_pauseMainLoop() {
  6946.       Browser.mainLoop.pause();
  6947.     };
  6948.     Module["resumeMainLoop"] = function Module_resumeMainLoop() {
  6949.       Browser.mainLoop.resume();
  6950.     };
  6951.     Module["getUserMedia"] = function Module_getUserMedia() {
  6952.       Browser.getUserMedia();
  6953.     };
  6954.     Module["createContext"] = function Module_createContext(
  6955.       canvas,
  6956.       useWebGL,
  6957.       setInModule,
  6958.       webGLContextAttributes
  6959.     ) {
  6960.       return Browser.createContext(
  6961.         canvas,
  6962.         useWebGL,
  6963.         setInModule,
  6964.         webGLContextAttributes
  6965.       );
  6966.     };
  6967.     function intArrayFromString(stringy, dontAddNull, length) {
  6968.       var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  6969.       var u8array = new Array(len);
  6970.       var numBytesWritten = stringToUTF8Array(
  6971.         stringy,
  6972.         u8array,
  6973.         0,
  6974.         u8array.length
  6975.       );
  6976.       if (dontAddNull) u8array.length = numBytesWritten;
  6977.       return u8array;
  6978.     }
  6979.     var asmLibraryArg = {
  6980.       r: ___sys_fcntl64,
  6981.       G: ___sys_ioctl,
  6982.       H: ___sys_open,
  6983.       B: __embind_register_bigint,
  6984.       J: __embind_register_bool,
  6985.       e: __embind_register_class,
  6986.       a: __embind_register_class_function,
  6987.       j: __embind_register_constant,
  6988.       I: __embind_register_emval,
  6989.       t: __embind_register_float,
  6990.       g: __embind_register_function,
  6991.       i: __embind_register_integer,
  6992.       h: __embind_register_memory_view,
  6993.       u: __embind_register_std_string,
  6994.       m: __embind_register_std_wstring,
  6995.       K: __embind_register_void,
  6996.       f: __emval_as,
  6997.       P: __emval_call,
  6998.       l: __emval_decref,
  6999.       L: __emval_get_module_property,
  7000.       o: __emval_get_property,
  7001.       k: __emval_incref,
  7002.       x: __emval_new_array,
  7003.       N: __emval_new_cstring,
  7004.       O: __emval_new_object,
  7005.       M: __emval_run_destructors,
  7006.       b: __emval_set_property,
  7007.       c: __emval_take_value,
  7008.       z: __emval_typeof,
  7009.       v: _abort,
  7010.       d: _emscripten_asm_const_int,
  7011.       y: _emscripten_async_call,
  7012.       w: _emscripten_get_now,
  7013.       C: _emscripten_memcpy_big,
  7014.       D: _emscripten_resize_heap,
  7015.       n: _emscripten_run_script,
  7016.       E: _emscripten_thread_sleep,
  7017.       s: _fd_close,
  7018.       F: _fd_read,
  7019.       A: _fd_seek,
  7020.       q: _fd_write,
  7021.       p: _setTempRet0,
  7022.     };
  7023.     var asm = createWasm();
  7024.     var ___wasm_call_ctors = (Module["___wasm_call_ctors"] = function () {
  7025.       return (___wasm_call_ctors = Module["___wasm_call_ctors"] =
  7026.         Module["asm"]["R"]).apply(null, arguments);
  7027.     });
  7028.     var _malloc = (Module["_malloc"] = function () {
  7029.       return (_malloc = Module["_malloc"] = Module["asm"]["T"]).apply(
  7030.         null,
  7031.         arguments
  7032.       );
  7033.     });
  7034.     var _free = (Module["_free"] = function () {
  7035.       return (_free = Module["_free"] = Module["asm"]["U"]).apply(
  7036.         null,
  7037.         arguments
  7038.       );
  7039.     });
  7040.     var _FMOD_JS_MixFunction = (Module["_FMOD_JS_MixFunction"] = function () {
  7041.       return (_FMOD_JS_MixFunction = Module["_FMOD_JS_MixFunction"] =
  7042.         Module["asm"]["V"]).apply(null, arguments);
  7043.     });
  7044.     var _FMOD_JS_MixerSlowpathFunction = (Module[
  7045.       "_FMOD_JS_MixerSlowpathFunction"
  7046.     ] = function () {
  7047.       return (_FMOD_JS_MixerSlowpathFunction = Module[
  7048.         "_FMOD_JS_MixerSlowpathFunction"
  7049.       ] =
  7050.         Module["asm"]["W"]).apply(null, arguments);
  7051.     });
  7052.     var _FMOD_JS_MixerFastpathFunction = (Module[
  7053.       "_FMOD_JS_MixerFastpathFunction"
  7054.     ] = function () {
  7055.       return (_FMOD_JS_MixerFastpathFunction = Module[
  7056.         "_FMOD_JS_MixerFastpathFunction"
  7057.       ] =
  7058.         Module["asm"]["X"]).apply(null, arguments);
  7059.     });
  7060.     var ___getTypeName = (Module["___getTypeName"] = function () {
  7061.       return (___getTypeName = Module["___getTypeName"] =
  7062.         Module["asm"]["Y"]).apply(null, arguments);
  7063.     });
  7064.     var ___embind_register_native_and_builtin_types = (Module[
  7065.       "___embind_register_native_and_builtin_types"
  7066.     ] = function () {
  7067.       return (___embind_register_native_and_builtin_types = Module[
  7068.         "___embind_register_native_and_builtin_types"
  7069.       ] =
  7070.         Module["asm"]["Z"]).apply(null, arguments);
  7071.     });
  7072.     var ___errno_location = (Module["___errno_location"] = function () {
  7073.       return (___errno_location = Module["___errno_location"] =
  7074.         Module["asm"]["_"]).apply(null, arguments);
  7075.     });
  7076.     var stackSave = (Module["stackSave"] = function () {
  7077.       return (stackSave = Module["stackSave"] = Module["asm"]["$"]).apply(
  7078.         null,
  7079.         arguments
  7080.       );
  7081.     });
  7082.     var stackRestore = (Module["stackRestore"] = function () {
  7083.       return (stackRestore = Module["stackRestore"] =
  7084.         Module["asm"]["aa"]).apply(null, arguments);
  7085.     });
  7086.     var stackAlloc = (Module["stackAlloc"] = function () {
  7087.       return (stackAlloc = Module["stackAlloc"] = Module["asm"]["ba"]).apply(
  7088.         null,
  7089.         arguments
  7090.       );
  7091.     });
  7092.     var dynCall_iiiii = (Module["dynCall_iiiii"] = function () {
  7093.       return (dynCall_iiiii = Module["dynCall_iiiii"] =
  7094.         Module["asm"]["ca"]).apply(null, arguments);
  7095.     });
  7096.     var dynCall_v = (Module["dynCall_v"] = function () {
  7097.       return (dynCall_v = Module["dynCall_v"] = Module["asm"]["da"]).apply(
  7098.         null,
  7099.         arguments
  7100.       );
  7101.     });
  7102.     var dynCall_iiii = (Module["dynCall_iiii"] = function () {
  7103.       return (dynCall_iiii = Module["dynCall_iiii"] =
  7104.         Module["asm"]["ea"]).apply(null, arguments);
  7105.     });
  7106.     var dynCall_ii = (Module["dynCall_ii"] = function () {
  7107.       return (dynCall_ii = Module["dynCall_ii"] = Module["asm"]["fa"]).apply(
  7108.         null,
  7109.         arguments
  7110.       );
  7111.     });
  7112.     var dynCall_vi = (Module["dynCall_vi"] = function () {
  7113.       return (dynCall_vi = Module["dynCall_vi"] = Module["asm"]["ga"]).apply(
  7114.         null,
  7115.         arguments
  7116.       );
  7117.     });
  7118.     var dynCall_iii = (Module["dynCall_iii"] = function () {
  7119.       return (dynCall_iii = Module["dynCall_iii"] = Module["asm"]["ha"]).apply(
  7120.         null,
  7121.         arguments
  7122.       );
  7123.     });
  7124.     var dynCall_iiiiii = (Module["dynCall_iiiiii"] = function () {
  7125.       return (dynCall_iiiiii = Module["dynCall_iiiiii"] =
  7126.         Module["asm"]["ia"]).apply(null, arguments);
  7127.     });
  7128.     var dynCall_iiif = (Module["dynCall_iiif"] = function () {
  7129.       return (dynCall_iiif = Module["dynCall_iiif"] =
  7130.         Module["asm"]["ja"]).apply(null, arguments);
  7131.     });
  7132.     var dynCall_vii = (Module["dynCall_vii"] = function () {
  7133.       return (dynCall_vii = Module["dynCall_vii"] = Module["asm"]["ka"]).apply(
  7134.         null,
  7135.         arguments
  7136.       );
  7137.     });
  7138.     var dynCall_iiifj = (Module["dynCall_iiifj"] = function () {
  7139.       return (dynCall_iiifj = Module["dynCall_iiifj"] =
  7140.         Module["asm"]["la"]).apply(null, arguments);
  7141.     });
  7142.     var dynCall_fii = (Module["dynCall_fii"] = function () {
  7143.       return (dynCall_fii = Module["dynCall_fii"] = Module["asm"]["ma"]).apply(
  7144.         null,
  7145.         arguments
  7146.       );
  7147.     });
  7148.     var dynCall_iif = (Module["dynCall_iif"] = function () {
  7149.       return (dynCall_iif = Module["dynCall_iif"] = Module["asm"]["na"]).apply(
  7150.         null,
  7151.         arguments
  7152.       );
  7153.     });
  7154.     var dynCall_iiiiiii = (Module["dynCall_iiiiiii"] = function () {
  7155.       return (dynCall_iiiiiii = Module["dynCall_iiiiiii"] =
  7156.         Module["asm"]["oa"]).apply(null, arguments);
  7157.     });
  7158.     var dynCall_iiji = (Module["dynCall_iiji"] = function () {
  7159.       return (dynCall_iiji = Module["dynCall_iiji"] =
  7160.         Module["asm"]["pa"]).apply(null, arguments);
  7161.     });
  7162.     var dynCall_fi = (Module["dynCall_fi"] = function () {
  7163.       return (dynCall_fi = Module["dynCall_fi"] = Module["asm"]["qa"]).apply(
  7164.         null,
  7165.         arguments
  7166.       );
  7167.     });
  7168.     var dynCall_iij = (Module["dynCall_iij"] = function () {
  7169.       return (dynCall_iij = Module["dynCall_iij"] = Module["asm"]["ra"]).apply(
  7170.         null,
  7171.         arguments
  7172.       );
  7173.     });
  7174.     var dynCall_iiiff = (Module["dynCall_iiiff"] = function () {
  7175.       return (dynCall_iiiff = Module["dynCall_iiiff"] =
  7176.         Module["asm"]["sa"]).apply(null, arguments);
  7177.     });
  7178.     var dynCall_ji = (Module["dynCall_ji"] = function () {
  7179.       return (dynCall_ji = Module["dynCall_ji"] = Module["asm"]["ta"]).apply(
  7180.         null,
  7181.         arguments
  7182.       );
  7183.     });
  7184.     var dynCall_iijjifi = (Module["dynCall_iijjifi"] = function () {
  7185.       return (dynCall_iijjifi = Module["dynCall_iijjifi"] =
  7186.         Module["asm"]["ua"]).apply(null, arguments);
  7187.     });
  7188.     var dynCall_iijjifii = (Module["dynCall_iijjifii"] = function () {
  7189.       return (dynCall_iijjifii = Module["dynCall_iijjifii"] =
  7190.         Module["asm"]["va"]).apply(null, arguments);
  7191.     });
  7192.     var dynCall_iijj = (Module["dynCall_iijj"] = function () {
  7193.       return (dynCall_iijj = Module["dynCall_iijj"] =
  7194.         Module["asm"]["wa"]).apply(null, arguments);
  7195.     });
  7196.     var dynCall_iiiiiiii = (Module["dynCall_iiiiiiii"] = function () {
  7197.       return (dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] =
  7198.         Module["asm"]["xa"]).apply(null, arguments);
  7199.     });
  7200.     var dynCall_iiff = (Module["dynCall_iiff"] = function () {
  7201.       return (dynCall_iiff = Module["dynCall_iiff"] =
  7202.         Module["asm"]["ya"]).apply(null, arguments);
  7203.     });
  7204.     var dynCall_iifi = (Module["dynCall_iifi"] = function () {
  7205.       return (dynCall_iifi = Module["dynCall_iifi"] =
  7206.         Module["asm"]["za"]).apply(null, arguments);
  7207.     });
  7208.     var dynCall_iiffffffff = (Module["dynCall_iiffffffff"] = function () {
  7209.       return (dynCall_iiffffffff = Module["dynCall_iiffffffff"] =
  7210.         Module["asm"]["Aa"]).apply(null, arguments);
  7211.     });
  7212.     var dynCall_iijji = (Module["dynCall_iijji"] = function () {
  7213.       return (dynCall_iijji = Module["dynCall_iijji"] =
  7214.         Module["asm"]["Ba"]).apply(null, arguments);
  7215.     });
  7216.     var dynCall_iijf = (Module["dynCall_iijf"] = function () {
  7217.       return (dynCall_iijf = Module["dynCall_iijf"] =
  7218.         Module["asm"]["Ca"]).apply(null, arguments);
  7219.     });
  7220.     var dynCall_iifff = (Module["dynCall_iifff"] = function () {
  7221.       return (dynCall_iifff = Module["dynCall_iifff"] =
  7222.         Module["asm"]["Da"]).apply(null, arguments);
  7223.     });
  7224.     var dynCall_iiffi = (Module["dynCall_iiffi"] = function () {
  7225.       return (dynCall_iiffi = Module["dynCall_iiffi"] =
  7226.         Module["asm"]["Ea"]).apply(null, arguments);
  7227.     });
  7228.     var dynCall_iiiiiiiiii = (Module["dynCall_iiiiiiiiii"] = function () {
  7229.       return (dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] =
  7230.         Module["asm"]["Fa"]).apply(null, arguments);
  7231.     });
  7232.     var dynCall_viiiiii = (Module["dynCall_viiiiii"] = function () {
  7233.       return (dynCall_viiiiii = Module["dynCall_viiiiii"] =
  7234.         Module["asm"]["Ga"]).apply(null, arguments);
  7235.     });
  7236.     var dynCall_viii = (Module["dynCall_viii"] = function () {
  7237.       return (dynCall_viii = Module["dynCall_viii"] =
  7238.         Module["asm"]["Ha"]).apply(null, arguments);
  7239.     });
  7240.     var dynCall_iiiffi = (Module["dynCall_iiiffi"] = function () {
  7241.       return (dynCall_iiiffi = Module["dynCall_iiiffi"] =
  7242.         Module["asm"]["Ia"]).apply(null, arguments);
  7243.     });
  7244.     var dynCall_iiifffii = (Module["dynCall_iiifffii"] = function () {
  7245.       return (dynCall_iiifffii = Module["dynCall_iiifffii"] =
  7246.         Module["asm"]["Ja"]).apply(null, arguments);
  7247.     });
  7248.     var dynCall_iiiifffffiii = (Module["dynCall_iiiifffffiii"] = function () {
  7249.       return (dynCall_iiiifffffiii = Module["dynCall_iiiifffffiii"] =
  7250.         Module["asm"]["Ka"]).apply(null, arguments);
  7251.     });
  7252.     var dynCall_iiiffffii = (Module["dynCall_iiiffffii"] = function () {
  7253.       return (dynCall_iiiffffii = Module["dynCall_iiiffffii"] =
  7254.         Module["asm"]["La"]).apply(null, arguments);
  7255.     });
  7256.     var dynCall_iiifffffii = (Module["dynCall_iiifffffii"] = function () {
  7257.       return (dynCall_iiifffffii = Module["dynCall_iiifffffii"] =
  7258.         Module["asm"]["Ma"]).apply(null, arguments);
  7259.     });
  7260.     var dynCall_iiifffi = (Module["dynCall_iiifffi"] = function () {
  7261.       return (dynCall_iiifffi = Module["dynCall_iiifffi"] =
  7262.         Module["asm"]["Na"]).apply(null, arguments);
  7263.     });
  7264.     var dynCall_viiii = (Module["dynCall_viiii"] = function () {
  7265.       return (dynCall_viiii = Module["dynCall_viiii"] =
  7266.         Module["asm"]["Oa"]).apply(null, arguments);
  7267.     });
  7268.     var dynCall_viiiiiiffffff = (Module["dynCall_viiiiiiffffff"] = function () {
  7269.       return (dynCall_viiiiiiffffff = Module["dynCall_viiiiiiffffff"] =
  7270.         Module["asm"]["Pa"]).apply(null, arguments);
  7271.     });
  7272.     var dynCall_viiiiiii = (Module["dynCall_viiiiiii"] = function () {
  7273.       return (dynCall_viiiiiii = Module["dynCall_viiiiiii"] =
  7274.         Module["asm"]["Qa"]).apply(null, arguments);
  7275.     });
  7276.     var dynCall_viiiiif = (Module["dynCall_viiiiif"] = function () {
  7277.       return (dynCall_viiiiif = Module["dynCall_viiiiif"] =
  7278.         Module["asm"]["Ra"]).apply(null, arguments);
  7279.     });
  7280.     var dynCall_iiiiffi = (Module["dynCall_iiiiffi"] = function () {
  7281.       return (dynCall_iiiiffi = Module["dynCall_iiiiffi"] =
  7282.         Module["asm"]["Sa"]).apply(null, arguments);
  7283.     });
  7284.     var dynCall_iiiiiiiiiiiii = (Module["dynCall_iiiiiiiiiiiii"] = function () {
  7285.       return (dynCall_iiiiiiiiiiiii = Module["dynCall_iiiiiiiiiiiii"] =
  7286.         Module["asm"]["Ta"]).apply(null, arguments);
  7287.     });
  7288.     var dynCall_iiiiiffi = (Module["dynCall_iiiiiffi"] = function () {
  7289.       return (dynCall_iiiiiffi = Module["dynCall_iiiiiffi"] =
  7290.         Module["asm"]["Ua"]).apply(null, arguments);
  7291.     });
  7292.     var dynCall_viiiiiiiifffii = (Module["dynCall_viiiiiiiifffii"] =
  7293.       function () {
  7294.         return (dynCall_viiiiiiiifffii = Module["dynCall_viiiiiiiifffii"] =
  7295.           Module["asm"]["Va"]).apply(null, arguments);
  7296.       });
  7297.     var dynCall_fif = (Module["dynCall_fif"] = function () {
  7298.       return (dynCall_fif = Module["dynCall_fif"] = Module["asm"]["Wa"]).apply(
  7299.         null,
  7300.         arguments
  7301.       );
  7302.     });
  7303.     var dynCall_viiiii = (Module["dynCall_viiiii"] = function () {
  7304.       return (dynCall_viiiii = Module["dynCall_viiiii"] =
  7305.         Module["asm"]["Xa"]).apply(null, arguments);
  7306.     });
  7307.     var dynCall_viiiiiiiiifff = (Module["dynCall_viiiiiiiiifff"] = function () {
  7308.       return (dynCall_viiiiiiiiifff = Module["dynCall_viiiiiiiiifff"] =
  7309.         Module["asm"]["Ya"]).apply(null, arguments);
  7310.     });
  7311.     var dynCall_iiiiiiiiiiii = (Module["dynCall_iiiiiiiiiiii"] = function () {
  7312.       return (dynCall_iiiiiiiiiiii = Module["dynCall_iiiiiiiiiiii"] =
  7313.         Module["asm"]["Za"]).apply(null, arguments);
  7314.     });
  7315.     var dynCall_iiiiiiiii = (Module["dynCall_iiiiiiiii"] = function () {
  7316.       return (dynCall_iiiiiiiii = Module["dynCall_iiiiiiiii"] =
  7317.         Module["asm"]["_a"]).apply(null, arguments);
  7318.     });
  7319.     var dynCall_iiidii = (Module["dynCall_iiidii"] = function () {
  7320.       return (dynCall_iiidii = Module["dynCall_iiidii"] =
  7321.         Module["asm"]["$a"]).apply(null, arguments);
  7322.     });
  7323.     var dynCall_iiifff = (Module["dynCall_iiifff"] = function () {
  7324.       return (dynCall_iiifff = Module["dynCall_iiifff"] =
  7325.         Module["asm"]["ab"]).apply(null, arguments);
  7326.     });
  7327.     var dynCall_iiiidii = (Module["dynCall_iiiidii"] = function () {
  7328.       return (dynCall_iiiidii = Module["dynCall_iiiidii"] =
  7329.         Module["asm"]["bb"]).apply(null, arguments);
  7330.     });
  7331.     var dynCall_iiifi = (Module["dynCall_iiifi"] = function () {
  7332.       return (dynCall_iiifi = Module["dynCall_iiifi"] =
  7333.         Module["asm"]["cb"]).apply(null, arguments);
  7334.     });
  7335.     var dynCall_iiiif = (Module["dynCall_iiiif"] = function () {
  7336.       return (dynCall_iiiif = Module["dynCall_iiiif"] =
  7337.         Module["asm"]["db"]).apply(null, arguments);
  7338.     });
  7339.     var dynCall_iiddi = (Module["dynCall_iiddi"] = function () {
  7340.       return (dynCall_iiddi = Module["dynCall_iiddi"] =
  7341.         Module["asm"]["eb"]).apply(null, arguments);
  7342.     });
  7343.     var dynCall_iidf = (Module["dynCall_iidf"] = function () {
  7344.       return (dynCall_iidf = Module["dynCall_iidf"] =
  7345.         Module["asm"]["fb"]).apply(null, arguments);
  7346.     });
  7347.     var dynCall_iidd = (Module["dynCall_iidd"] = function () {
  7348.       return (dynCall_iidd = Module["dynCall_iidd"] =
  7349.         Module["asm"]["gb"]).apply(null, arguments);
  7350.     });
  7351.     var dynCall_iiiffffffff = (Module["dynCall_iiiffffffff"] = function () {
  7352.       return (dynCall_iiiffffffff = Module["dynCall_iiiffffffff"] =
  7353.         Module["asm"]["hb"]).apply(null, arguments);
  7354.     });
  7355.     var dynCall_iiiddi = (Module["dynCall_iiiddi"] = function () {
  7356.       return (dynCall_iiiddi = Module["dynCall_iiiddi"] =
  7357.         Module["asm"]["ib"]).apply(null, arguments);
  7358.     });
  7359.     var dynCall_iiidf = (Module["dynCall_iiidf"] = function () {
  7360.       return (dynCall_iiidf = Module["dynCall_iiidf"] =
  7361.         Module["asm"]["jb"]).apply(null, arguments);
  7362.     });
  7363.     var dynCall_iiidd = (Module["dynCall_iiidd"] = function () {
  7364.       return (dynCall_iiidd = Module["dynCall_iiidd"] =
  7365.         Module["asm"]["kb"]).apply(null, arguments);
  7366.     });
  7367.     var dynCall_iiiiff = (Module["dynCall_iiiiff"] = function () {
  7368.       return (dynCall_iiiiff = Module["dynCall_iiiiff"] =
  7369.         Module["asm"]["lb"]).apply(null, arguments);
  7370.     });
  7371.     var dynCall_iiiifi = (Module["dynCall_iiiifi"] = function () {
  7372.       return (dynCall_iiiifi = Module["dynCall_iiiifi"] =
  7373.         Module["asm"]["mb"]).apply(null, arguments);
  7374.     });
  7375.     var dynCall_iidiiii = (Module["dynCall_iidiiii"] = function () {
  7376.       return (dynCall_iidiiii = Module["dynCall_iidiiii"] =
  7377.         Module["asm"]["nb"]).apply(null, arguments);
  7378.     });
  7379.     var dynCall_jiji = (Module["dynCall_jiji"] = function () {
  7380.       return (dynCall_jiji = Module["dynCall_jiji"] =
  7381.         Module["asm"]["ob"]).apply(null, arguments);
  7382.     });
  7383.     var _asyncify_start_unwind = (Module["_asyncify_start_unwind"] =
  7384.       function () {
  7385.         return (_asyncify_start_unwind = Module["_asyncify_start_unwind"] =
  7386.           Module["asm"]["pb"]).apply(null, arguments);
  7387.       });
  7388.     var _asyncify_stop_unwind = (Module["_asyncify_stop_unwind"] = function () {
  7389.       return (_asyncify_stop_unwind = Module["_asyncify_stop_unwind"] =
  7390.         Module["asm"]["qb"]).apply(null, arguments);
  7391.     });
  7392.     var _asyncify_start_rewind = (Module["_asyncify_start_rewind"] =
  7393.       function () {
  7394.         return (_asyncify_start_rewind = Module["_asyncify_start_rewind"] =
  7395.           Module["asm"]["rb"]).apply(null, arguments);
  7396.       });
  7397.     var _asyncify_stop_rewind = (Module["_asyncify_stop_rewind"] = function () {
  7398.       return (_asyncify_stop_rewind = Module["_asyncify_stop_rewind"] =
  7399.         Module["asm"]["sb"]).apply(null, arguments);
  7400.     });
  7401.     Module["cwrap"] = cwrap;
  7402.     Module["setValue"] = setValue;
  7403.     Module["getValue"] = getValue;
  7404.     Module["addRunDependency"] = addRunDependency;
  7405.     Module["removeRunDependency"] = removeRunDependency;
  7406.     Module["FS_createPath"] = FS.createPath;
  7407.     Module["FS_createDataFile"] = FS.createDataFile;
  7408.     Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  7409.     Module["FS_createLazyFile"] = FS.createLazyFile;
  7410.     Module["FS_createDevice"] = FS.createDevice;
  7411.     Module["FS_unlink"] = FS.unlink;
  7412.     var calledRun;
  7413.     function ExitStatus(status) {
  7414.       this.name = "ExitStatus";
  7415.       this.message = "Program terminated with exit(" + status + ")";
  7416.       this.status = status;
  7417.     }
  7418.     dependenciesFulfilled = function runCaller() {
  7419.       if (!calledRun) run();
  7420.       if (!calledRun) dependenciesFulfilled = runCaller;
  7421.     };
  7422.     function run(args) {
  7423.       args = args || arguments_;
  7424.       if (runDependencies > 0) {
  7425.         return;
  7426.       }
  7427.       preRun();
  7428.       if (runDependencies > 0) {
  7429.         return;
  7430.       }
  7431.       function doRun() {
  7432.         if (calledRun) return;
  7433.         calledRun = true;
  7434.         Module["calledRun"] = true;
  7435.         if (ABORT) return;
  7436.         initRuntime();
  7437.         readyPromiseResolve(Module);
  7438.         if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
  7439.         postRun();
  7440.       }
  7441.       if (Module["setStatus"]) {
  7442.         Module["setStatus"]("Running...");
  7443.         setTimeout(function () {
  7444.           setTimeout(function () {
  7445.             Module["setStatus"]("");
  7446.           }, 1);
  7447.           doRun();
  7448.         }, 1);
  7449.       } else {
  7450.         doRun();
  7451.       }
  7452.     }
  7453.     Module["run"] = run;
  7454.     function exit(status, implicit) {
  7455.       EXITSTATUS = status;
  7456.       if (implicit && keepRuntimeAlive() && status === 0) {
  7457.         return;
  7458.       }
  7459.       if (keepRuntimeAlive()) {
  7460.       } else {
  7461.         exitRuntime();
  7462.         if (Module["onExit"]) Module["onExit"](status);
  7463.         ABORT = true;
  7464.       }
  7465.       quit_(status, new ExitStatus(status));
  7466.     }
  7467.     if (Module["preInit"]) {
  7468.       if (typeof Module["preInit"] == "function")
  7469.         Module["preInit"] = [Module["preInit"]];
  7470.       while (Module["preInit"].length > 0) {
  7471.         Module["preInit"].pop()();
  7472.       }
  7473.     }
  7474.     run();
  7475.  
  7476.     return FMODModule.ready;
  7477.   };
  7478. })();
  7479. if (typeof exports === "object" && typeof module === "object")
  7480.   module.exports = FMODModule;
  7481. else if (typeof define === "function" && define["amd"])
  7482.   define([], function () {
  7483.     return FMODModule;
  7484.   });
  7485. else if (typeof exports === "object") exports["FMODModule"] = FMODModule;
  7486.  
  7487. globalThis.FMODModule = FMODModule;
  7488.  
Add Comment
Please, Sign In to add comment