Advertisement
Guest User

Untitled

a guest
Dec 9th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. self.CoinImp = self.CoinImp || {};
  2. self.CoinImp.CONFIG = {
  3.     LIB_URL: "https://www.coinimp.com/scripts/",
  4.     ASMJS_NAME: "cn-asmjs.min.js",
  5.     REQUIRES_AUTH: false,
  6.     WEBSOCKET_SHARDS: [["wss://www.coinimp.com:8892/proxy"]],
  7.     CAPTCHA_URL: "https://www.coinimp.com/captcha/",
  8.     MINER_URL: "https://www.coinimp.com/media/miner.html",
  9.     AUTH_URL: "https://authedmine.com/authenticate.html"
  10. };
  11. var Module = {
  12.     locateFile: (function (path) {
  13.         return CoinImp.CONFIG.LIB_URL + path
  14.     })
  15. };
  16. var Module;
  17. if (!Module) Module = (typeof Module !== "undefined" ? Module : null) || {};
  18. var moduleOverrides = {};
  19. for (var key in Module) {
  20.     if (Module.hasOwnProperty(key)) {
  21.         moduleOverrides[key] = Module[key]
  22.     }
  23. }
  24. var ENVIRONMENT_IS_WEB = false;
  25. var ENVIRONMENT_IS_WORKER = false;
  26. var ENVIRONMENT_IS_NODE = false;
  27. var ENVIRONMENT_IS_SHELL = false;
  28. if (Module["ENVIRONMENT"]) {
  29.     if (Module["ENVIRONMENT"] === "WEB") {
  30.         ENVIRONMENT_IS_WEB = true
  31.     } else if (Module["ENVIRONMENT"] === "WORKER") {
  32.         ENVIRONMENT_IS_WORKER = true
  33.     } else if (Module["ENVIRONMENT"] === "NODE") {
  34.         ENVIRONMENT_IS_NODE = true
  35.     } else if (Module["ENVIRONMENT"] === "SHELL") {
  36.         ENVIRONMENT_IS_SHELL = true
  37.     } else {
  38.         throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")
  39.     }
  40. } else {
  41.     ENVIRONMENT_IS_WEB = typeof window === "object";
  42.     ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  43.     ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
  44.     ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
  45. }
  46. if (ENVIRONMENT_IS_NODE) {
  47.     if (!Module["print"]) Module["print"] = console.log;
  48.     if (!Module["printErr"]) Module["printErr"] = console.warn;
  49.     var nodeFS;
  50.     var nodePath;
  51.     Module["read"] = function shell_read(filename, binary) {
  52.         if (!nodeFS) nodeFS = require("fs");
  53.         if (!nodePath) nodePath = require("path");
  54.         filename = nodePath["normalize"](filename);
  55.         var ret = nodeFS["readFileSync"](filename);
  56.         return binary ? ret : ret.toString()
  57.     };
  58.     Module["readBinary"] = function readBinary(filename) {
  59.         var ret = Module["read"](filename, true);
  60.         if (!ret.buffer) {
  61.             ret = new Uint8Array(ret)
  62.         }
  63.         assert(ret.buffer);
  64.         return ret
  65.     };
  66.     Module["load"] = function load(f) {
  67.         globalEval(read(f))
  68.     };
  69.     if (!Module["thisProgram"]) {
  70.         if (process["argv"].length > 1) {
  71.             Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/")
  72.         } else {
  73.             Module["thisProgram"] = "unknown-program"
  74.         }
  75.     }
  76.     Module["arguments"] = process["argv"].slice(2);
  77.     if (typeof module !== "undefined") {
  78.         module["exports"] = Module
  79.     }
  80.     process["on"]("uncaughtException", (function (ex) {
  81.         if (!(ex instanceof ExitStatus)) {
  82.             throw ex
  83.         }
  84.     }));
  85.     Module["inspect"] = (function () {
  86.         return "[Emscripten Module object]"
  87.     })
  88. } else if (ENVIRONMENT_IS_SHELL) {
  89.     if (!Module["print"]) Module["print"] = print;
  90.     if (typeof printErr != "undefined") Module["printErr"] = printErr;
  91.     if (typeof read != "undefined") {
  92.         Module["read"] = read
  93.     } else {
  94.         Module["read"] = function shell_read() {
  95.             throw"no read() available"
  96.         }
  97.     }
  98.     Module["readBinary"] = function readBinary(f) {
  99.         if (typeof readbuffer === "function") {
  100.             return new Uint8Array(readbuffer(f))
  101.         }
  102.         var data = read(f, "binary");
  103.         assert(typeof data === "object");
  104.         return data
  105.     };
  106.     if (typeof scriptArgs != "undefined") {
  107.         Module["arguments"] = scriptArgs
  108.     } else if (typeof arguments != "undefined") {
  109.         Module["arguments"] = arguments
  110.     }
  111.     if (typeof quit === "function") {
  112.         Module["quit"] = (function (status, toThrow) {
  113.             quit(status)
  114.         })
  115.     }
  116. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  117.     Module["read"] = function shell_read(url) {
  118.         var xhr = new XMLHttpRequest;
  119.         xhr.open("GET", url, false);
  120.         xhr.send(null);
  121.         return xhr.responseText
  122.     };
  123.     if (ENVIRONMENT_IS_WORKER) {
  124.         Module["readBinary"] = function readBinary(url) {
  125.             var xhr = new XMLHttpRequest;
  126.             xhr.open("GET", url, false);
  127.             xhr.responseType = "arraybuffer";
  128.             xhr.send(null);
  129.             return new Uint8Array(xhr.response)
  130.         }
  131.     }
  132.     Module["readAsync"] = function readAsync(url, onload, onerror) {
  133.         var xhr = new XMLHttpRequest;
  134.         xhr.open("GET", url, true);
  135.         xhr.responseType = "arraybuffer";
  136.         xhr.onload = function xhr_onload() {
  137.             if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  138.                 onload(xhr.response)
  139.             } else {
  140.                 onerror()
  141.             }
  142.         };
  143.         xhr.onerror = onerror;
  144.         xhr.send(null)
  145.     };
  146.     if (typeof arguments != "undefined") {
  147.         Module["arguments"] = arguments
  148.     }
  149.     if (typeof console !== "undefined") {
  150.         if (!Module["print"]) Module["print"] = function shell_print(x) {
  151.             console.log(x)
  152.         };
  153.         if (!Module["printErr"]) Module["printErr"] = function shell_printErr(x) {
  154.             console.warn(x)
  155.         }
  156.     } else {
  157.         var TRY_USE_DUMP = false;
  158.         if (!Module["print"]) Module["print"] = TRY_USE_DUMP && typeof dump !== "undefined" ? (function (x) {
  159.             dump(x)
  160.         }) : (function (x) {
  161.         })
  162.     }
  163.     if (ENVIRONMENT_IS_WORKER) {
  164.         Module["load"] = importScripts
  165.     }
  166.     if (typeof Module["setWindowTitle"] === "undefined") {
  167.         Module["setWindowTitle"] = (function (title) {
  168.             document.title = title
  169.         })
  170.     }
  171. } else {
  172.     throw"Unknown runtime environment. Where are we?"
  173. }
  174.  
  175. function globalEval(x) {
  176.     eval.call(null, x)
  177. }
  178.  
  179. if (!Module["load"] && Module["read"]) {
  180.     Module["load"] = function load(f) {
  181.         globalEval(Module["read"](f))
  182.     }
  183. }
  184. if (!Module["print"]) {
  185.     Module["print"] = (function () {
  186.     })
  187. }
  188. if (!Module["printErr"]) {
  189.     Module["printErr"] = Module["print"]
  190. }
  191. if (!Module["arguments"]) {
  192.     Module["arguments"] = []
  193. }
  194. if (!Module["thisProgram"]) {
  195.     Module["thisProgram"] = "./this.program"
  196. }
  197. if (!Module["quit"]) {
  198.     Module["quit"] = (function (status, toThrow) {
  199.         throw toThrow
  200.     })
  201. }
  202. Module.print = Module["print"];
  203. Module.printErr = Module["printErr"];
  204. Module["preRun"] = [];
  205. Module["postRun"] = [];
  206. for (var key in moduleOverrides) {
  207.     if (moduleOverrides.hasOwnProperty(key)) {
  208.         Module[key] = moduleOverrides[key]
  209.     }
  210. }
  211. moduleOverrides = undefined;
  212. var Runtime = {
  213.     setTempRet0: (function (value) {
  214.         tempRet0 = value;
  215.         return value
  216.     }), getTempRet0: (function () {
  217.         return tempRet0
  218.     }), stackSave: (function () {
  219.         return STACKTOP
  220.     }), stackRestore: (function (stackTop) {
  221.         STACKTOP = stackTop
  222.     }), getNativeTypeSize: (function (type) {
  223.         switch (type) {
  224.             case"i1":
  225.             case"i8":
  226.                 return 1;
  227.             case"i16":
  228.                 return 2;
  229.             case"i32":
  230.                 return 4;
  231.             case"i64":
  232.                 return 8;
  233.             case"float":
  234.                 return 4;
  235.             case"double":
  236.                 return 8;
  237.             default: {
  238.                 if (type[type.length - 1] === "*") {
  239.                     return Runtime.QUANTUM_SIZE
  240.                 } else if (type[0] === "i") {
  241.                     var bits = parseInt(type.substr(1));
  242.                     assert(bits % 8 === 0);
  243.                     return bits / 8
  244.                 } else {
  245.                     return 0
  246.                 }
  247.             }
  248.         }
  249.     }), getNativeFieldSize: (function (type) {
  250.         return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE)
  251.     }), STACK_ALIGN: 16, prepVararg: (function (ptr, type) {
  252.         if (type === "double" || type === "i64") {
  253.             if (ptr & 7) {
  254.                 assert((ptr & 7) === 4);
  255.                 ptr += 4
  256.             }
  257.         } else {
  258.             assert((ptr & 3) === 0)
  259.         }
  260.         return ptr
  261.     }), getAlignSize: (function (type, size, vararg) {
  262.         if (!vararg && (type == "i64" || type == "double")) return 8;
  263.         if (!type) return Math.min(size, 8);
  264.         return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE)
  265.     }), dynCall: (function (sig, ptr, args) {
  266.         if (args && args.length) {
  267.             return Module["dynCall_" + sig].apply(null, [ptr].concat(args))
  268.         } else {
  269.             return Module["dynCall_" + sig].call(null, ptr)
  270.         }
  271.     }), functionPointers: [], addFunction: (function (func) {
  272.         for (var i = 0; i < Runtime.functionPointers.length; i++) {
  273.             if (!Runtime.functionPointers[i]) {
  274.                 Runtime.functionPointers[i] = func;
  275.                 return 2 * (1 + i)
  276.             }
  277.         }
  278.         throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."
  279.     }), removeFunction: (function (index) {
  280.         Runtime.functionPointers[(index - 2) / 2] = null
  281.     }), warnOnce: (function (text) {
  282.         if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
  283.         if (!Runtime.warnOnce.shown[text]) {
  284.             Runtime.warnOnce.shown[text] = 1;
  285.             Module.printErr(text)
  286.         }
  287.     }), funcWrappers: {}, getFuncWrapper: (function (func, sig) {
  288.         assert(sig);
  289.         if (!Runtime.funcWrappers[sig]) {
  290.             Runtime.funcWrappers[sig] = {}
  291.         }
  292.         var sigCache = Runtime.funcWrappers[sig];
  293.         if (!sigCache[func]) {
  294.             if (sig.length === 1) {
  295.                 sigCache[func] = function dynCall_wrapper() {
  296.                     return Runtime.dynCall(sig, func)
  297.                 }
  298.             } else if (sig.length === 2) {
  299.                 sigCache[func] = function dynCall_wrapper(arg) {
  300.                     return Runtime.dynCall(sig, func, [arg])
  301.                 }
  302.             } else {
  303.                 sigCache[func] = function dynCall_wrapper() {
  304.                     return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments))
  305.                 }
  306.             }
  307.         }
  308.         return sigCache[func]
  309.     }), getCompilerSetting: (function (name) {
  310.         throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"
  311.     }), stackAlloc: (function (size) {
  312.         var ret = STACKTOP;
  313.         STACKTOP = STACKTOP + size | 0;
  314.         STACKTOP = STACKTOP + 15 & -16;
  315.         return ret
  316.     }), staticAlloc: (function (size) {
  317.         var ret = STATICTOP;
  318.         STATICTOP = STATICTOP + size | 0;
  319.         STATICTOP = STATICTOP + 15 & -16;
  320.         return ret
  321.     }), dynamicAlloc: (function (size) {
  322.         var ret = HEAP32[DYNAMICTOP_PTR >> 2];
  323.         var end = (ret + size + 15 | 0) & -16;
  324.         HEAP32[DYNAMICTOP_PTR >> 2] = end;
  325.         if (end >= TOTAL_MEMORY) {
  326.             var success = enlargeMemory();
  327.             if (!success) {
  328.                 HEAP32[DYNAMICTOP_PTR >> 2] = ret;
  329.                 return 0
  330.             }
  331.         }
  332.         return ret
  333.     }), alignMemory: (function (size, quantum) {
  334.         var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);
  335.         return ret
  336.     }), makeBigInt: (function (low, high, unsigned) {
  337.         var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * 4294967296 : +(low >>> 0) + +(high | 0) * 4294967296;
  338.         return ret
  339.     }), GLOBAL_BASE: 1024, QUANTUM_SIZE: 4, __dummy__: 0
  340. };
  341. Module["Runtime"] = Runtime;
  342. var ABORT = 0;
  343. var EXITSTATUS = 0;
  344.  
  345. function assert(condition, text) {
  346.     if (!condition) {
  347.         abort("Assertion failed: " + text)
  348.     }
  349. }
  350.  
  351. function getCFunc(ident) {
  352.     var func = Module["_" + ident];
  353.     if (!func) {
  354.         try {
  355.             func = eval("_" + ident)
  356.         } catch (e) {
  357.         }
  358.     }
  359.     assert(func, "Cannot call unknown function " + ident + " (perhaps LLVM optimizations or closure removed it?)");
  360.     return func
  361. }
  362.  
  363. var cwrap, ccall;
  364. ((function () {
  365.     var JSfuncs = {
  366.         "stackSave": (function () {
  367.             Runtime.stackSave()
  368.         }), "stackRestore": (function () {
  369.             Runtime.stackRestore()
  370.         }), "arrayToC": (function (arr) {
  371.             var ret = Runtime.stackAlloc(arr.length);
  372.             writeArrayToMemory(arr, ret);
  373.             return ret
  374.         }), "stringToC": (function (str) {
  375.             var ret = 0;
  376.             if (str !== null && str !== undefined && str !== 0) {
  377.                 var len = (str.length << 2) + 1;
  378.                 ret = Runtime.stackAlloc(len);
  379.                 stringToUTF8(str, ret, len)
  380.             }
  381.             return ret
  382.         })
  383.     };
  384.     var toC = {"string": JSfuncs["stringToC"], "array": JSfuncs["arrayToC"]};
  385.     ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {
  386.         var func = getCFunc(ident);
  387.         var cArgs = [];
  388.         var stack = 0;
  389.         if (args) {
  390.             for (var i = 0; i < args.length; i++) {
  391.                 var converter = toC[argTypes[i]];
  392.                 if (converter) {
  393.                     if (stack === 0) stack = Runtime.stackSave();
  394.                     cArgs[i] = converter(args[i])
  395.                 } else {
  396.                     cArgs[i] = args[i]
  397.                 }
  398.             }
  399.         }
  400.         var ret = func.apply(null, cArgs);
  401.         if (returnType === "string") ret = Pointer_stringify(ret);
  402.         if (stack !== 0) {
  403.             if (opts && opts.async) {
  404.                 EmterpreterAsync.asyncFinalizers.push((function () {
  405.                     Runtime.stackRestore(stack)
  406.                 }));
  407.                 return
  408.             }
  409.             Runtime.stackRestore(stack)
  410.         }
  411.         return ret
  412.     };
  413.     var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;
  414.  
  415.     function parseJSFunc(jsfunc) {
  416.         var parsed = jsfunc.toString().match(sourceRegex).slice(1);
  417.         return {arguments: parsed[0], body: parsed[1], returnValue: parsed[2]}
  418.     }
  419.  
  420.     var JSsource = null;
  421.  
  422.     function ensureJSsource() {
  423.         if (!JSsource) {
  424.             JSsource = {};
  425.             for (var fun in JSfuncs) {
  426.                 if (JSfuncs.hasOwnProperty(fun)) {
  427.                     JSsource[fun] = parseJSFunc(JSfuncs[fun])
  428.                 }
  429.             }
  430.         }
  431.     }
  432.  
  433.     cwrap = function cwrap(ident, returnType, argTypes) {
  434.         argTypes = argTypes || [];
  435.         var cfunc = getCFunc(ident);
  436.         var numericArgs = argTypes.every((function (type) {
  437.             return type === "number"
  438.         }));
  439.         var numericRet = returnType !== "string";
  440.         if (numericRet && numericArgs) {
  441.             return cfunc
  442.         }
  443.         var argNames = argTypes.map((function (x, i) {
  444.             return "$" + i
  445.         }));
  446.         var funcstr = "(function(" + argNames.join(",") + ") {";
  447.         var nargs = argTypes.length;
  448.         if (!numericArgs) {
  449.             ensureJSsource();
  450.             funcstr += "var stack = " + JSsource["stackSave"].body + ";";
  451.             for (var i = 0; i < nargs; i++) {
  452.                 var arg = argNames[i], type = argTypes[i];
  453.                 if (type === "number") continue;
  454.                 var convertCode = JSsource[type + "ToC"];
  455.                 funcstr += "var " + convertCode.arguments + " = " + arg + ";";
  456.                 funcstr += convertCode.body + ";";
  457.                 funcstr += arg + "=(" + convertCode.returnValue + ");"
  458.             }
  459.         }
  460.         var cfuncname = parseJSFunc((function () {
  461.             return cfunc
  462.         })).returnValue;
  463.         funcstr += "var ret = " + cfuncname + "(" + argNames.join(",") + ");";
  464.         if (!numericRet) {
  465.             var strgfy = parseJSFunc((function () {
  466.                 return Pointer_stringify
  467.             })).returnValue;
  468.             funcstr += "ret = " + strgfy + "(ret);"
  469.         }
  470.         if (!numericArgs) {
  471.             ensureJSsource();
  472.             funcstr += JSsource["stackRestore"].body.replace("()", "(stack)") + ";"
  473.         }
  474.         funcstr += "return ret})";
  475.         return eval(funcstr)
  476.     }
  477. }))();
  478. Module["ccall"] = ccall;
  479. Module["cwrap"] = cwrap;
  480.  
  481. function setValue(ptr, value, type, noSafe) {
  482.     type = type || "i8";
  483.     if (type.charAt(type.length - 1) === "*") type = "i32";
  484.     switch (type) {
  485.         case"i1":
  486.             HEAP8[ptr >> 0] = value;
  487.             break;
  488.         case"i8":
  489.             HEAP8[ptr >> 0] = value;
  490.             break;
  491.         case"i16":
  492.             HEAP16[ptr >> 1] = value;
  493.             break;
  494.         case"i32":
  495.             HEAP32[ptr >> 2] = value;
  496.             break;
  497.         case"i64":
  498.             tempI64 = [value >>> 0, (tempDouble = value, +Math_abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1];
  499.             break;
  500.         case"float":
  501.             HEAPF32[ptr >> 2] = value;
  502.             break;
  503.         case"double":
  504.             HEAPF64[ptr >> 3] = value;
  505.             break;
  506.         default:
  507.             abort("invalid type for setValue: " + type)
  508.     }
  509. }
  510.  
  511. Module["setValue"] = setValue;
  512.  
  513. function getValue(ptr, type, noSafe) {
  514.     type = type || "i8";
  515.     if (type.charAt(type.length - 1) === "*") type = "i32";
  516.     switch (type) {
  517.         case"i1":
  518.             return HEAP8[ptr >> 0];
  519.         case"i8":
  520.             return HEAP8[ptr >> 0];
  521.         case"i16":
  522.             return HEAP16[ptr >> 1];
  523.         case"i32":
  524.             return HEAP32[ptr >> 2];
  525.         case"i64":
  526.             return HEAP32[ptr >> 2];
  527.         case"float":
  528.             return HEAPF32[ptr >> 2];
  529.         case"double":
  530.             return HEAPF64[ptr >> 3];
  531.         default:
  532.             abort("invalid type for setValue: " + type)
  533.     }
  534.     return null
  535. }
  536.  
  537. Module["getValue"] = getValue;
  538. var ALLOC_NORMAL = 0;
  539. var ALLOC_STACK = 1;
  540. var ALLOC_STATIC = 2;
  541. var ALLOC_DYNAMIC = 3;
  542. var ALLOC_NONE = 4;
  543. Module["ALLOC_NORMAL"] = ALLOC_NORMAL;
  544. Module["ALLOC_STACK"] = ALLOC_STACK;
  545. Module["ALLOC_STATIC"] = ALLOC_STATIC;
  546. Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC;
  547. Module["ALLOC_NONE"] = ALLOC_NONE;
  548.  
  549. function allocate(slab, types, allocator, ptr) {
  550.     var zeroinit, size;
  551.     if (typeof slab === "number") {
  552.         zeroinit = true;
  553.         size = slab
  554.     } else {
  555.         zeroinit = false;
  556.         size = slab.length
  557.     }
  558.     var singleType = typeof types === "string" ? types : null;
  559.     var ret;
  560.     if (allocator == ALLOC_NONE) {
  561.         ret = ptr
  562.     } else {
  563.         ret = [typeof _malloc === "function" ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length))
  564.     }
  565.     if (zeroinit) {
  566.         var ptr = ret, stop;
  567.         assert((ret & 3) == 0);
  568.         stop = ret + (size & ~3);
  569.         for (; ptr < stop; ptr += 4) {
  570.             HEAP32[ptr >> 2] = 0
  571.         }
  572.         stop = ret + size;
  573.         while (ptr < stop) {
  574.             HEAP8[ptr++ >> 0] = 0
  575.         }
  576.         return ret
  577.     }
  578.     if (singleType === "i8") {
  579.         if (slab.subarray || slab.slice) {
  580.             HEAPU8.set(slab, ret)
  581.         } else {
  582.             HEAPU8.set(new Uint8Array(slab), ret)
  583.         }
  584.         return ret
  585.     }
  586.     var i = 0, type, typeSize, previousType;
  587.     while (i < size) {
  588.         var curr = slab[i];
  589.         if (typeof curr === "function") {
  590.             curr = Runtime.getFunctionIndex(curr)
  591.         }
  592.         type = singleType || types[i];
  593.         if (type === 0) {
  594.             i++;
  595.             continue
  596.         }
  597.         if (type == "i64") type = "i32";
  598.         setValue(ret + i, curr, type);
  599.         if (previousType !== type) {
  600.             typeSize = Runtime.getNativeTypeSize(type);
  601.             previousType = type
  602.         }
  603.         i += typeSize
  604.     }
  605.     return ret
  606. }
  607.  
  608. Module["allocate"] = allocate;
  609.  
  610. function getMemory(size) {
  611.     if (!staticSealed) return Runtime.staticAlloc(size);
  612.     if (!runtimeInitialized) return Runtime.dynamicAlloc(size);
  613.     return _malloc(size)
  614. }
  615.  
  616. Module["getMemory"] = getMemory;
  617.  
  618. function Pointer_stringify(ptr, length) {
  619.     if (length === 0 || !ptr) return "";
  620.     var hasUtf = 0;
  621.     var t;
  622.     var i = 0;
  623.     while (1) {
  624.         t = HEAPU8[ptr + i >> 0];
  625.         hasUtf |= t;
  626.         if (t == 0 && !length) break;
  627.         i++;
  628.         if (length && i == length) break
  629.     }
  630.     if (!length) length = i;
  631.     var ret = "";
  632.     if (hasUtf < 128) {
  633.         var MAX_CHUNK = 1024;
  634.         var curr;
  635.         while (length > 0) {
  636.             curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
  637.             ret = ret ? ret + curr : curr;
  638.             ptr += MAX_CHUNK;
  639.             length -= MAX_CHUNK
  640.         }
  641.         return ret
  642.     }
  643.     return Module["UTF8ToString"](ptr)
  644. }
  645.  
  646. Module["Pointer_stringify"] = Pointer_stringify;
  647.  
  648. function AsciiToString(ptr) {
  649.     var str = "";
  650.     while (1) {
  651.         var ch = HEAP8[ptr++ >> 0];
  652.         if (!ch) return str;
  653.         str += String.fromCharCode(ch)
  654.     }
  655. }
  656.  
  657. Module["AsciiToString"] = AsciiToString;
  658.  
  659. function stringToAscii(str, outPtr) {
  660.     return writeAsciiToMemory(str, outPtr, false)
  661. }
  662.  
  663. Module["stringToAscii"] = stringToAscii;
  664. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  665.  
  666. function UTF8ArrayToString(u8Array, idx) {
  667.     var endPtr = idx;
  668.     while (u8Array[endPtr]) ++endPtr;
  669.     if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  670.         return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
  671.     } else {
  672.         var u0, u1, u2, u3, u4, u5;
  673.         var str = "";
  674.         while (1) {
  675.             u0 = u8Array[idx++];
  676.             if (!u0) return str;
  677.             if (!(u0 & 128)) {
  678.                 str += String.fromCharCode(u0);
  679.                 continue
  680.             }
  681.             u1 = u8Array[idx++] & 63;
  682.             if ((u0 & 224) == 192) {
  683.                 str += String.fromCharCode((u0 & 31) << 6 | u1);
  684.                 continue
  685.             }
  686.             u2 = u8Array[idx++] & 63;
  687.             if ((u0 & 240) == 224) {
  688.                 u0 = (u0 & 15) << 12 | u1 << 6 | u2
  689.             } else {
  690.                 u3 = u8Array[idx++] & 63;
  691.                 if ((u0 & 248) == 240) {
  692.                     u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3
  693.                 } else {
  694.                     u4 = u8Array[idx++] & 63;
  695.                     if ((u0 & 252) == 248) {
  696.                         u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4
  697.                     } else {
  698.                         u5 = u8Array[idx++] & 63;
  699.                         u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5
  700.                     }
  701.                 }
  702.             }
  703.             if (u0 < 65536) {
  704.                 str += String.fromCharCode(u0)
  705.             } else {
  706.                 var ch = u0 - 65536;
  707.                 str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
  708.             }
  709.         }
  710.     }
  711. }
  712.  
  713. Module["UTF8ArrayToString"] = UTF8ArrayToString;
  714.  
  715. function UTF8ToString(ptr) {
  716.     return UTF8ArrayToString(HEAPU8, ptr)
  717. }
  718.  
  719. Module["UTF8ToString"] = UTF8ToString;
  720.  
  721. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  722.     if (!(maxBytesToWrite > 0)) return 0;
  723.     var startIdx = outIdx;
  724.     var endIdx = outIdx + maxBytesToWrite - 1;
  725.     for (var i = 0; i < str.length; ++i) {
  726.         var u = str.charCodeAt(i);
  727.         if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  728.         if (u <= 127) {
  729.             if (outIdx >= endIdx) break;
  730.             outU8Array[outIdx++] = u
  731.         } else if (u <= 2047) {
  732.             if (outIdx + 1 >= endIdx) break;
  733.             outU8Array[outIdx++] = 192 | u >> 6;
  734.             outU8Array[outIdx++] = 128 | u & 63
  735.         } else if (u <= 65535) {
  736.             if (outIdx + 2 >= endIdx) break;
  737.             outU8Array[outIdx++] = 224 | u >> 12;
  738.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  739.             outU8Array[outIdx++] = 128 | u & 63
  740.         } else if (u <= 2097151) {
  741.             if (outIdx + 3 >= endIdx) break;
  742.             outU8Array[outIdx++] = 240 | u >> 18;
  743.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  744.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  745.             outU8Array[outIdx++] = 128 | u & 63
  746.         } else if (u <= 67108863) {
  747.             if (outIdx + 4 >= endIdx) break;
  748.             outU8Array[outIdx++] = 248 | u >> 24;
  749.             outU8Array[outIdx++] = 128 | u >> 18 & 63;
  750.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  751.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  752.             outU8Array[outIdx++] = 128 | u & 63
  753.         } else {
  754.             if (outIdx + 5 >= endIdx) break;
  755.             outU8Array[outIdx++] = 252 | u >> 30;
  756.             outU8Array[outIdx++] = 128 | u >> 24 & 63;
  757.             outU8Array[outIdx++] = 128 | u >> 18 & 63;
  758.             outU8Array[outIdx++] = 128 | u >> 12 & 63;
  759.             outU8Array[outIdx++] = 128 | u >> 6 & 63;
  760.             outU8Array[outIdx++] = 128 | u & 63
  761.         }
  762.     }
  763.     outU8Array[outIdx] = 0;
  764.     return outIdx - startIdx
  765. }
  766.  
  767. Module["stringToUTF8Array"] = stringToUTF8Array;
  768.  
  769. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  770.     return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
  771. }
  772.  
  773. Module["stringToUTF8"] = stringToUTF8;
  774.  
  775. function lengthBytesUTF8(str) {
  776.     var len = 0;
  777.     for (var i = 0; i < str.length; ++i) {
  778.         var u = str.charCodeAt(i);
  779.         if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  780.         if (u <= 127) {
  781.             ++len
  782.         } else if (u <= 2047) {
  783.             len += 2
  784.         } else if (u <= 65535) {
  785.             len += 3
  786.         } else if (u <= 2097151) {
  787.             len += 4
  788.         } else if (u <= 67108863) {
  789.             len += 5
  790.         } else {
  791.             len += 6
  792.         }
  793.     }
  794.     return len
  795. }
  796.  
  797. Module["lengthBytesUTF8"] = lengthBytesUTF8;
  798. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
  799.  
  800. function demangle(func) {
  801.     var __cxa_demangle_func = Module["___cxa_demangle"] || Module["__cxa_demangle"];
  802.     if (__cxa_demangle_func) {
  803.         try {
  804.             var s = func.substr(1);
  805.             var len = lengthBytesUTF8(s) + 1;
  806.             var buf = _malloc(len);
  807.             stringToUTF8(s, buf, len);
  808.             var status = _malloc(4);
  809.             var ret = __cxa_demangle_func(buf, 0, 0, status);
  810.             if (getValue(status, "i32") === 0 && ret) {
  811.                 return Pointer_stringify(ret)
  812.             }
  813.         } catch (e) {
  814.         } finally {
  815.             if (buf) _free(buf);
  816.             if (status) _free(status);
  817.             if (ret) _free(ret)
  818.         }
  819.         return func
  820.     }
  821.     Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");
  822.     return func
  823. }
  824.  
  825. function demangleAll(text) {
  826.     var regex = /__Z[\w\d_]+/g;
  827.     return text.replace(regex, (function (x) {
  828.         var y = demangle(x);
  829.         return x === y ? x : x + " [" + y + "]"
  830.     }))
  831. }
  832.  
  833. function jsStackTrace() {
  834.     var err = new Error;
  835.     if (!err.stack) {
  836.         try {
  837.             throw new Error(0)
  838.         } catch (e) {
  839.             err = e
  840.         }
  841.         if (!err.stack) {
  842.             return "(no stack trace available)"
  843.         }
  844.     }
  845.     return err.stack.toString()
  846. }
  847.  
  848. function stackTrace() {
  849.     var js = jsStackTrace();
  850.     if (Module["extraStackTrace"]) js += "\n" + Module["extraStackTrace"]();
  851.     return demangleAll(js)
  852. }
  853.  
  854. Module["stackTrace"] = stackTrace;
  855. var WASM_PAGE_SIZE = 65536;
  856. var ASMJS_PAGE_SIZE = 16777216;
  857.  
  858. function alignUp(x, multiple) {
  859.     if (x % multiple > 0) {
  860.         x += multiple - x % multiple
  861.     }
  862.     return x
  863. }
  864.  
  865. var HEAP, buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  866.  
  867. function updateGlobalBuffer(buf) {
  868.     Module["buffer"] = buffer = buf
  869. }
  870.  
  871. function updateGlobalBufferViews() {
  872.     Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
  873.     Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
  874.     Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
  875.     Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
  876.     Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
  877.     Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
  878.     Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
  879.     Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer)
  880. }
  881.  
  882. var STATIC_BASE, STATICTOP, staticSealed;
  883. var STACK_BASE, STACKTOP, STACK_MAX;
  884. var DYNAMIC_BASE, DYNAMICTOP_PTR;
  885. STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
  886. staticSealed = false;
  887.  
  888. function abortOnCannotGrowMemory() {
  889.     abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")
  890. }
  891.  
  892. function enlargeMemory() {
  893.     abortOnCannotGrowMemory()
  894. }
  895.  
  896. var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880;
  897. var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 16777216;
  898. if (TOTAL_MEMORY < TOTAL_STACK) Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
  899. if (Module["buffer"]) {
  900.     buffer = Module["buffer"]
  901. } else {
  902.     if (typeof WebAssembly === "object" && typeof WebAssembly.Memory === "function") {
  903.         Module["wasmMemory"] = new WebAssembly.Memory({
  904.             "initial": TOTAL_MEMORY / WASM_PAGE_SIZE,
  905.             "maximum": TOTAL_MEMORY / WASM_PAGE_SIZE
  906.         });
  907.         buffer = Module["wasmMemory"].buffer
  908.     } else {
  909.         buffer = new ArrayBuffer(TOTAL_MEMORY)
  910.     }
  911. }
  912. updateGlobalBufferViews();
  913.  
  914. function getTotalMemory() {
  915.     return TOTAL_MEMORY
  916. }
  917.  
  918. HEAP32[0] = 1668509029;
  919. HEAP16[1] = 25459;
  920. if (HEAPU8[2] !== 115 || HEAPU8[3] !== 99) throw"Runtime error: expected the system to be little-endian!";
  921. Module["HEAP"] = HEAP;
  922. Module["buffer"] = buffer;
  923. Module["HEAP8"] = HEAP8;
  924. Module["HEAP16"] = HEAP16;
  925. Module["HEAP32"] = HEAP32;
  926. Module["HEAPU8"] = HEAPU8;
  927. Module["HEAPU16"] = HEAPU16;
  928. Module["HEAPU32"] = HEAPU32;
  929. Module["HEAPF32"] = HEAPF32;
  930. Module["HEAPF64"] = HEAPF64;
  931.  
  932. function callRuntimeCallbacks(callbacks) {
  933.     while (callbacks.length > 0) {
  934.         var callback = callbacks.shift();
  935.         if (typeof callback == "function") {
  936.             callback();
  937.             continue
  938.         }
  939.         var func = callback.func;
  940.         if (typeof func === "number") {
  941.             if (callback.arg === undefined) {
  942.                 Module["dynCall_v"](func)
  943.             } else {
  944.                 Module["dynCall_vi"](func, callback.arg)
  945.             }
  946.         } else {
  947.             func(callback.arg === undefined ? null : callback.arg)
  948.         }
  949.     }
  950. }
  951.  
  952. var __ATPRERUN__ = [];
  953. var __ATINIT__ = [];
  954. var __ATMAIN__ = [];
  955. var __ATEXIT__ = [];
  956. var __ATPOSTRUN__ = [];
  957. var runtimeInitialized = false;
  958. var runtimeExited = false;
  959.  
  960. function preRun() {
  961.     if (Module["preRun"]) {
  962.         if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
  963.         while (Module["preRun"].length) {
  964.             addOnPreRun(Module["preRun"].shift())
  965.         }
  966.     }
  967.     callRuntimeCallbacks(__ATPRERUN__)
  968. }
  969.  
  970. function ensureInitRuntime() {
  971.     if (runtimeInitialized) return;
  972.     runtimeInitialized = true;
  973.     callRuntimeCallbacks(__ATINIT__)
  974. }
  975.  
  976. function preMain() {
  977.     callRuntimeCallbacks(__ATMAIN__)
  978. }
  979.  
  980. function exitRuntime() {
  981.     callRuntimeCallbacks(__ATEXIT__);
  982.     runtimeExited = true
  983. }
  984.  
  985. function postRun() {
  986.     if (Module["postRun"]) {
  987.         if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
  988.         while (Module["postRun"].length) {
  989.             addOnPostRun(Module["postRun"].shift())
  990.         }
  991.     }
  992.     callRuntimeCallbacks(__ATPOSTRUN__)
  993. }
  994.  
  995. function addOnPreRun(cb) {
  996.     __ATPRERUN__.unshift(cb)
  997. }
  998.  
  999. Module["addOnPreRun"] = addOnPreRun;
  1000.  
  1001. function addOnInit(cb) {
  1002.     __ATINIT__.unshift(cb)
  1003. }
  1004.  
  1005. Module["addOnInit"] = addOnInit;
  1006.  
  1007. function addOnPreMain(cb) {
  1008.     __ATMAIN__.unshift(cb)
  1009. }
  1010.  
  1011. Module["addOnPreMain"] = addOnPreMain;
  1012.  
  1013. function addOnExit(cb) {
  1014.     __ATEXIT__.unshift(cb)
  1015. }
  1016.  
  1017. Module["addOnExit"] = addOnExit;
  1018.  
  1019. function addOnPostRun(cb) {
  1020.     __ATPOSTRUN__.unshift(cb)
  1021. }
  1022.  
  1023. Module["addOnPostRun"] = addOnPostRun;
  1024.  
  1025. function intArrayFromString(stringy, dontAddNull, length) {
  1026.     var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  1027.     var u8array = new Array(len);
  1028.     var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  1029.     if (dontAddNull) u8array.length = numBytesWritten;
  1030.     return u8array
  1031. }
  1032.  
  1033. Module["intArrayFromString"] = intArrayFromString;
  1034.  
  1035. function intArrayToString(array) {
  1036.     var ret = [];
  1037.     for (var i = 0; i < array.length; i++) {
  1038.         var chr = array[i];
  1039.         if (chr > 255) {
  1040.             chr &= 255
  1041.         }
  1042.         ret.push(String.fromCharCode(chr))
  1043.     }
  1044.     return ret.join("")
  1045. }
  1046.  
  1047. Module["intArrayToString"] = intArrayToString;
  1048.  
  1049. function writeStringToMemory(string, buffer, dontAddNull) {
  1050.     Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");
  1051.     var lastChar, end;
  1052.     if (dontAddNull) {
  1053.         end = buffer + lengthBytesUTF8(string);
  1054.         lastChar = HEAP8[end]
  1055.     }
  1056.     stringToUTF8(string, buffer, Infinity);
  1057.     if (dontAddNull) HEAP8[end] = lastChar
  1058. }
  1059.  
  1060. Module["writeStringToMemory"] = writeStringToMemory;
  1061.  
  1062. function writeArrayToMemory(array, buffer) {
  1063.     HEAP8.set(array, buffer)
  1064. }
  1065.  
  1066. Module["writeArrayToMemory"] = writeArrayToMemory;
  1067.  
  1068. function writeAsciiToMemory(str, buffer, dontAddNull) {
  1069.     for (var i = 0; i < str.length; ++i) {
  1070.         HEAP8[buffer++ >> 0] = str.charCodeAt(i)
  1071.     }
  1072.     if (!dontAddNull) HEAP8[buffer >> 0] = 0
  1073. }
  1074.  
  1075. Module["writeAsciiToMemory"] = writeAsciiToMemory;
  1076. if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5) Math["imul"] = function imul(a, b) {
  1077.     var ah = a >>> 16;
  1078.     var al = a & 65535;
  1079.     var bh = b >>> 16;
  1080.     var bl = b & 65535;
  1081.     return al * bl + (ah * bl + al * bh << 16) | 0
  1082. };
  1083. Math.imul = Math["imul"];
  1084. if (!Math["fround"]) {
  1085.     var froundBuffer = new Float32Array(1);
  1086.     Math["fround"] = (function (x) {
  1087.         froundBuffer[0] = x;
  1088.         return froundBuffer[0]
  1089.     })
  1090. }
  1091. Math.fround = Math["fround"];
  1092. if (!Math["clz32"]) Math["clz32"] = (function (x) {
  1093.     x = x >>> 0;
  1094.     for (var i = 0; i < 32; i++) {
  1095.         if (x & 1 << 31 - i) return i
  1096.     }
  1097.     return 32
  1098. });
  1099. Math.clz32 = Math["clz32"];
  1100. if (!Math["trunc"]) Math["trunc"] = (function (x) {
  1101.     return x < 0 ? Math.ceil(x) : Math.floor(x)
  1102. });
  1103. Math.trunc = Math["trunc"];
  1104. var Math_abs = Math.abs;
  1105. var Math_cos = Math.cos;
  1106. var Math_sin = Math.sin;
  1107. var Math_tan = Math.tan;
  1108. var Math_acos = Math.acos;
  1109. var Math_asin = Math.asin;
  1110. var Math_atan = Math.atan;
  1111. var Math_atan2 = Math.atan2;
  1112. var Math_exp = Math.exp;
  1113. var Math_log = Math.log;
  1114. var Math_sqrt = Math.sqrt;
  1115. var Math_ceil = Math.ceil;
  1116. var Math_floor = Math.floor;
  1117. var Math_pow = Math.pow;
  1118. var Math_imul = Math.imul;
  1119. var Math_fround = Math.fround;
  1120. var Math_round = Math.round;
  1121. var Math_min = Math.min;
  1122. var Math_clz32 = Math.clz32;
  1123. var Math_trunc = Math.trunc;
  1124. var runDependencies = 0;
  1125. var runDependencyWatcher = null;
  1126. var dependenciesFulfilled = null;
  1127.  
  1128. function getUniqueRunDependency(id) {
  1129.     return id
  1130. }
  1131.  
  1132. function addRunDependency(id) {
  1133.     runDependencies++;
  1134.     if (Module["monitorRunDependencies"]) {
  1135.         Module["monitorRunDependencies"](runDependencies)
  1136.     }
  1137. }
  1138.  
  1139. Module["addRunDependency"] = addRunDependency;
  1140.  
  1141. function removeRunDependency(id) {
  1142.     runDependencies--;
  1143.     if (Module["monitorRunDependencies"]) {
  1144.         Module["monitorRunDependencies"](runDependencies)
  1145.     }
  1146.     if (runDependencies == 0) {
  1147.         if (runDependencyWatcher !== null) {
  1148.             clearInterval(runDependencyWatcher);
  1149.             runDependencyWatcher = null
  1150.         }
  1151.         if (dependenciesFulfilled) {
  1152.             var callback = dependenciesFulfilled;
  1153.             dependenciesFulfilled = null;
  1154.             callback()
  1155.         }
  1156.     }
  1157. }
  1158.  
  1159. Module["removeRunDependency"] = removeRunDependency;
  1160. Module["preloadedImages"] = {};
  1161. Module["preloadedAudios"] = {};
  1162. var memoryInitializer = null;
  1163.  
  1164. function integrateWasmJS(Module) {
  1165.     var method = Module["wasmJSMethod"] || "native-wasm";
  1166.     Module["wasmJSMethod"] = method;
  1167.     var wasmTextFile = Module["wasmTextFile"] || "cn.wast";
  1168.     var wasmBinaryFile = Module["wasmBinaryFile"] || "cn.wasm";
  1169.     var asmjsCodeFile = Module["asmjsCodeFile"] || "cn.temp.asm.js";
  1170.     if (typeof Module["locateFile"] === "function") {
  1171.         wasmTextFile = Module["locateFile"](wasmTextFile);
  1172.         wasmBinaryFile = Module["locateFile"](wasmBinaryFile);
  1173.         asmjsCodeFile = Module["locateFile"](asmjsCodeFile)
  1174.     }
  1175.     var wasmPageSize = 64 * 1024;
  1176.     var asm2wasmImports = {
  1177.         "f64-rem": (function (x, y) {
  1178.             return x % y
  1179.         }), "f64-to-int": (function (x) {
  1180.             return x | 0
  1181.         }), "i32s-div": (function (x, y) {
  1182.             return (x | 0) / (y | 0) | 0
  1183.         }), "i32u-div": (function (x, y) {
  1184.             return (x >>> 0) / (y >>> 0) >>> 0
  1185.         }), "i32s-rem": (function (x, y) {
  1186.             return (x | 0) % (y | 0) | 0
  1187.         }), "i32u-rem": (function (x, y) {
  1188.             return (x >>> 0) % (y >>> 0) >>> 0
  1189.         }), "debugger": (function () {
  1190.             debugger
  1191.         })
  1192.     };
  1193.     var info = {"global": null, "env": null, "asm2wasm": asm2wasmImports, "parent": Module};
  1194.     var exports = null;
  1195.  
  1196.     function lookupImport(mod, base) {
  1197.         var lookup = info;
  1198.         if (mod.indexOf(".") < 0) {
  1199.             lookup = (lookup || {})[mod]
  1200.         } else {
  1201.             var parts = mod.split(".");
  1202.             lookup = (lookup || {})[parts[0]];
  1203.             lookup = (lookup || {})[parts[1]]
  1204.         }
  1205.         if (base) {
  1206.             lookup = (lookup || {})[base]
  1207.         }
  1208.         if (lookup === undefined) {
  1209.             abort("bad lookupImport to (" + mod + ")." + base)
  1210.         }
  1211.         return lookup
  1212.     }
  1213.  
  1214.     function mergeMemory(newBuffer) {
  1215.         var oldBuffer = Module["buffer"];
  1216.         if (newBuffer.byteLength < oldBuffer.byteLength) {
  1217.             Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")
  1218.         }
  1219.         var oldView = new Int8Array(oldBuffer);
  1220.         var newView = new Int8Array(newBuffer);
  1221.         if (!memoryInitializer) {
  1222.             oldView.set(newView.subarray(Module["STATIC_BASE"], Module["STATIC_BASE"] + Module["STATIC_BUMP"]), Module["STATIC_BASE"])
  1223.         }
  1224.         newView.set(oldView);
  1225.         updateGlobalBuffer(newBuffer);
  1226.         updateGlobalBufferViews()
  1227.     }
  1228.  
  1229.     var WasmTypes = {none: 0, i32: 1, i64: 2, f32: 3, f64: 4};
  1230.  
  1231.     function fixImports(imports) {
  1232.         if (!0) return imports;
  1233.         var ret = {};
  1234.         for (var i in imports) {
  1235.             var fixed = i;
  1236.             if (fixed[0] == "_") fixed = fixed.substr(1);
  1237.             ret[fixed] = imports[i]
  1238.         }
  1239.         return ret
  1240.     }
  1241.  
  1242.     function getBinary() {
  1243.         try {
  1244.             var binary;
  1245.             if (Module["wasmBinary"]) {
  1246.                 binary = Module["wasmBinary"];
  1247.                 binary = new Uint8Array(binary)
  1248.             } else if (Module["readBinary"]) {
  1249.                 binary = Module["readBinary"](wasmBinaryFile)
  1250.             } else {
  1251.                 throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"
  1252.             }
  1253.             return binary
  1254.         } catch (err) {
  1255.             abort(err)
  1256.         }
  1257.     }
  1258.  
  1259.     function getBinaryPromise() {
  1260.         if (!Module["wasmBinary"] && typeof fetch === "function") {
  1261.             return fetch(wasmBinaryFile, {credentials: "same-origin"}).then((function (response) {
  1262.                 if (!response["ok"]) {
  1263.                     throw"failed to load wasm binary file at '" + wasmBinaryFile + "'"
  1264.                 }
  1265.                 return response["arrayBuffer"]()
  1266.             }))
  1267.         }
  1268.         return new Promise((function (resolve, reject) {
  1269.             resolve(getBinary())
  1270.         }))
  1271.     }
  1272.  
  1273.     function doNativeWasm(global, env, providedBuffer) {
  1274.         if (typeof WebAssembly !== "object") {
  1275.             Module["printErr"]("no native wasm support detected");
  1276.             return false
  1277.         }
  1278.         if (!(Module["wasmMemory"] instanceof WebAssembly.Memory)) {
  1279.             Module["printErr"]("no native wasm Memory in use");
  1280.             return false
  1281.         }
  1282.         env["memory"] = Module["wasmMemory"];
  1283.         info["global"] = {"NaN": NaN, "Infinity": Infinity};
  1284.         info["global.Math"] = global.Math;
  1285.         info["env"] = env;
  1286.  
  1287.         function receiveInstance(instance) {
  1288.             exports = instance.exports;
  1289.             if (exports.memory) mergeMemory(exports.memory);
  1290.             Module["asm"] = exports;
  1291.             Module["usingWasm"] = true;
  1292.             removeRunDependency("wasm-instantiate")
  1293.         }
  1294.  
  1295.         addRunDependency("wasm-instantiate");
  1296.         if (Module["instantiateWasm"]) {
  1297.             try {
  1298.                 return Module["instantiateWasm"](info, receiveInstance)
  1299.             } catch (e) {
  1300.                 Module["printErr"]("Module.instantiateWasm callback failed with error: " + e);
  1301.                 return false
  1302.             }
  1303.         }
  1304.         getBinaryPromise().then((function (binary) {
  1305.             return WebAssembly.instantiate(binary, info)
  1306.         })).then((function (output) {
  1307.             receiveInstance(output["instance"])
  1308.         })).catch((function (reason) {
  1309.             Module["printErr"]("failed to asynchronously prepare wasm: " + reason);
  1310.             abort(reason)
  1311.         }));
  1312.         return {}
  1313.     }
  1314.  
  1315.     Module["asmPreload"] = Module["asm"];
  1316.     var asmjsReallocBuffer = Module["reallocBuffer"];
  1317.     var wasmReallocBuffer = (function (size) {
  1318.         var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE;
  1319.         size = alignUp(size, PAGE_MULTIPLE);
  1320.         var old = Module["buffer"];
  1321.         var oldSize = old.byteLength;
  1322.         if (Module["usingWasm"]) {
  1323.             try {
  1324.                 var result = Module["wasmMemory"].grow((size - oldSize) / wasmPageSize);
  1325.                 if (result !== (-1 | 0)) {
  1326.                     return Module["buffer"] = Module["wasmMemory"].buffer
  1327.                 } else {
  1328.                     return null
  1329.                 }
  1330.             } catch (e) {
  1331.                 return null
  1332.             }
  1333.         } else {
  1334.             exports["__growWasmMemory"]((size - oldSize) / wasmPageSize);
  1335.             return Module["buffer"] !== old ? Module["buffer"] : null
  1336.         }
  1337.     });
  1338.     Module["reallocBuffer"] = (function (size) {
  1339.         if (finalMethod === "asmjs") {
  1340.             return asmjsReallocBuffer(size)
  1341.         } else {
  1342.             return wasmReallocBuffer(size)
  1343.         }
  1344.     });
  1345.     var finalMethod = "";
  1346.     Module["asm"] = (function (global, env, providedBuffer) {
  1347.         global = fixImports(global);
  1348.         env = fixImports(env);
  1349.         if (!env["table"]) {
  1350.             var TABLE_SIZE = Module["wasmTableSize"];
  1351.             if (TABLE_SIZE === undefined) TABLE_SIZE = 1024;
  1352.             var MAX_TABLE_SIZE = Module["wasmMaxTableSize"];
  1353.             if (typeof WebAssembly === "object" && typeof WebAssembly.Table === "function") {
  1354.                 if (MAX_TABLE_SIZE !== undefined) {
  1355.                     env["table"] = new WebAssembly.Table({
  1356.                         "initial": TABLE_SIZE,
  1357.                         "maximum": MAX_TABLE_SIZE,
  1358.                         "element": "anyfunc"
  1359.                     })
  1360.                 } else {
  1361.                     env["table"] = new WebAssembly.Table({"initial": TABLE_SIZE, element: "anyfunc"})
  1362.                 }
  1363.             } else {
  1364.                 env["table"] = new Array(TABLE_SIZE)
  1365.             }
  1366.             Module["wasmTable"] = env["table"]
  1367.         }
  1368.         if (!env["memoryBase"]) {
  1369.             env["memoryBase"] = Module["STATIC_BASE"]
  1370.         }
  1371.         if (!env["tableBase"]) {
  1372.             env["tableBase"] = 0
  1373.         }
  1374.         var exports;
  1375.         exports = doNativeWasm(global, env, providedBuffer);
  1376.         return exports
  1377.     });
  1378.     var methodHandler = Module["asm"]
  1379. }
  1380.  
  1381. integrateWasmJS(Module);
  1382. var ASM_CONSTS = [];
  1383. STATIC_BASE = Runtime.GLOBAL_BASE;
  1384. STATICTOP = STATIC_BASE + 12512;
  1385. __ATINIT__.push();
  1386. memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "cn.js.mem" : null;
  1387. var STATIC_BUMP = 12512;
  1388. Module["STATIC_BASE"] = STATIC_BASE;
  1389. Module["STATIC_BUMP"] = STATIC_BUMP;
  1390. var tempDoublePtr = STATICTOP;
  1391. STATICTOP += 16;
  1392.  
  1393. function ___assert_fail(condition, filename, line, func) {
  1394.     ABORT = true;
  1395.     throw"Assertion failed: " + Pointer_stringify(condition) + ", at: " + [filename ? Pointer_stringify(filename) : "unknown filename", line, func ? Pointer_stringify(func) : "unknown function"] + " at " + stackTrace()
  1396. }
  1397.  
  1398. var PROCINFO = {ppid: 1, pid: 42, sid: 42, pgid: 42};
  1399. var ERRNO_CODES = {
  1400.     EPERM: 1,
  1401.     ENOENT: 2,
  1402.     ESRCH: 3,
  1403.     EINTR: 4,
  1404.     EIO: 5,
  1405.     ENXIO: 6,
  1406.     E2BIG: 7,
  1407.     ENOEXEC: 8,
  1408.     EBADF: 9,
  1409.     ECHILD: 10,
  1410.     EAGAIN: 11,
  1411.     EWOULDBLOCK: 11,
  1412.     ENOMEM: 12,
  1413.     EACCES: 13,
  1414.     EFAULT: 14,
  1415.     ENOTBLK: 15,
  1416.     EBUSY: 16,
  1417.     EEXIST: 17,
  1418.     EXDEV: 18,
  1419.     ENODEV: 19,
  1420.     ENOTDIR: 20,
  1421.     EISDIR: 21,
  1422.     EINVAL: 22,
  1423.     ENFILE: 23,
  1424.     EMFILE: 24,
  1425.     ENOTTY: 25,
  1426.     ETXTBSY: 26,
  1427.     EFBIG: 27,
  1428.     ENOSPC: 28,
  1429.     ESPIPE: 29,
  1430.     EROFS: 30,
  1431.     EMLINK: 31,
  1432.     EPIPE: 32,
  1433.     EDOM: 33,
  1434.     ERANGE: 34,
  1435.     ENOMSG: 42,
  1436.     EIDRM: 43,
  1437.     ECHRNG: 44,
  1438.     EL2NSYNC: 45,
  1439.     EL3HLT: 46,
  1440.     EL3RST: 47,
  1441.     ELNRNG: 48,
  1442.     EUNATCH: 49,
  1443.     ENOCSI: 50,
  1444.     EL2HLT: 51,
  1445.     EDEADLK: 35,
  1446.     ENOLCK: 37,
  1447.     EBADE: 52,
  1448.     EBADR: 53,
  1449.     EXFULL: 54,
  1450.     ENOANO: 55,
  1451.     EBADRQC: 56,
  1452.     EBADSLT: 57,
  1453.     EDEADLOCK: 35,
  1454.     EBFONT: 59,
  1455.     ENOSTR: 60,
  1456.     ENODATA: 61,
  1457.     ETIME: 62,
  1458.     ENOSR: 63,
  1459.     ENONET: 64,
  1460.     ENOPKG: 65,
  1461.     EREMOTE: 66,
  1462.     ENOLINK: 67,
  1463.     EADV: 68,
  1464.     ESRMNT: 69,
  1465.     ECOMM: 70,
  1466.     EPROTO: 71,
  1467.     EMULTIHOP: 72,
  1468.     EDOTDOT: 73,
  1469.     EBADMSG: 74,
  1470.     ENOTUNIQ: 76,
  1471.     EBADFD: 77,
  1472.     EREMCHG: 78,
  1473.     ELIBACC: 79,
  1474.     ELIBBAD: 80,
  1475.     ELIBSCN: 81,
  1476.     ELIBMAX: 82,
  1477.     ELIBEXEC: 83,
  1478.     ENOSYS: 38,
  1479.     ENOTEMPTY: 39,
  1480.     ENAMETOOLONG: 36,
  1481.     ELOOP: 40,
  1482.     EOPNOTSUPP: 95,
  1483.     EPFNOSUPPORT: 96,
  1484.     ECONNRESET: 104,
  1485.     ENOBUFS: 105,
  1486.     EAFNOSUPPORT: 97,
  1487.     EPROTOTYPE: 91,
  1488.     ENOTSOCK: 88,
  1489.     ENOPROTOOPT: 92,
  1490.     ESHUTDOWN: 108,
  1491.     ECONNREFUSED: 111,
  1492.     EADDRINUSE: 98,
  1493.     ECONNABORTED: 103,
  1494.     ENETUNREACH: 101,
  1495.     ENETDOWN: 100,
  1496.     ETIMEDOUT: 110,
  1497.     EHOSTDOWN: 112,
  1498.     EHOSTUNREACH: 113,
  1499.     EINPROGRESS: 115,
  1500.     EALREADY: 114,
  1501.     EDESTADDRREQ: 89,
  1502.     EMSGSIZE: 90,
  1503.     EPROTONOSUPPORT: 93,
  1504.     ESOCKTNOSUPPORT: 94,
  1505.     EADDRNOTAVAIL: 99,
  1506.     ENETRESET: 102,
  1507.     EISCONN: 106,
  1508.     ENOTCONN: 107,
  1509.     ETOOMANYREFS: 109,
  1510.     EUSERS: 87,
  1511.     EDQUOT: 122,
  1512.     ESTALE: 116,
  1513.     ENOTSUP: 95,
  1514.     ENOMEDIUM: 123,
  1515.     EILSEQ: 84,
  1516.     EOVERFLOW: 75,
  1517.     ECANCELED: 125,
  1518.     ENOTRECOVERABLE: 131,
  1519.     EOWNERDEAD: 130,
  1520.     ESTRPIPE: 86
  1521. };
  1522. var ERRNO_MESSAGES = {
  1523.     0: "Success",
  1524.     1: "Not super-user",
  1525.     2: "No such file or directory",
  1526.     3: "No such process",
  1527.     4: "Interrupted system call",
  1528.     5: "I/O error",
  1529.     6: "No such device or address",
  1530.     7: "Arg list too long",
  1531.     8: "Exec format error",
  1532.     9: "Bad file number",
  1533.     10: "No children",
  1534.     11: "No more processes",
  1535.     12: "Not enough core",
  1536.     13: "Permission denied",
  1537.     14: "Bad address",
  1538.     15: "Block device required",
  1539.     16: "Mount device busy",
  1540.     17: "File exists",
  1541.     18: "Cross-device link",
  1542.     19: "No such device",
  1543.     20: "Not a directory",
  1544.     21: "Is a directory",
  1545.     22: "Invalid argument",
  1546.     23: "Too many open files in system",
  1547.     24: "Too many open files",
  1548.     25: "Not a typewriter",
  1549.     26: "Text file busy",
  1550.     27: "File too large",
  1551.     28: "No space left on device",
  1552.     29: "Illegal seek",
  1553.     30: "Read only file system",
  1554.     31: "Too many links",
  1555.     32: "Broken pipe",
  1556.     33: "Math arg out of domain of func",
  1557.     34: "Math result not representable",
  1558.     35: "File locking deadlock error",
  1559.     36: "File or path name too long",
  1560.     37: "No record locks available",
  1561.     38: "Function not implemented",
  1562.     39: "Directory not empty",
  1563.     40: "Too many symbolic links",
  1564.     42: "No message of desired type",
  1565.     43: "Identifier removed",
  1566.     44: "Channel number out of range",
  1567.     45: "Level 2 not synchronized",
  1568.     46: "Level 3 halted",
  1569.     47: "Level 3 reset",
  1570.     48: "Link number out of range",
  1571.     49: "Protocol driver not attached",
  1572.     50: "No CSI structure available",
  1573.     51: "Level 2 halted",
  1574.     52: "Invalid exchange",
  1575.     53: "Invalid request descriptor",
  1576.     54: "Exchange full",
  1577.     55: "No anode",
  1578.     56: "Invalid request code",
  1579.     57: "Invalid slot",
  1580.     59: "Bad font file fmt",
  1581.     60: "Device not a stream",
  1582.     61: "No data (for no delay io)",
  1583.     62: "Timer expired",
  1584.     63: "Out of streams resources",
  1585.     64: "Machine is not on the network",
  1586.     65: "Package not installed",
  1587.     66: "The object is remote",
  1588.     67: "The link has been severed",
  1589.     68: "Advertise error",
  1590.     69: "Srmount error",
  1591.     70: "Communication error on send",
  1592.     71: "Protocol error",
  1593.     72: "Multihop attempted",
  1594.     73: "Cross mount point (not really error)",
  1595.     74: "Trying to read unreadable message",
  1596.     75: "Value too large for defined data type",
  1597.     76: "Given log. name not unique",
  1598.     77: "f.d. invalid for this operation",
  1599.     78: "Remote address changed",
  1600.     79: "Can access a needed shared lib",
  1601.     80: "Accessing a corrupted shared lib",
  1602.     81: ".lib section in a.out corrupted",
  1603.     82: "Attempting to link in too many libs",
  1604.     83: "Attempting to exec a shared library",
  1605.     84: "Illegal byte sequence",
  1606.     86: "Streams pipe error",
  1607.     87: "Too many users",
  1608.     88: "Socket operation on non-socket",
  1609.     89: "Destination address required",
  1610.     90: "Message too long",
  1611.     91: "Protocol wrong type for socket",
  1612.     92: "Protocol not available",
  1613.     93: "Unknown protocol",
  1614.     94: "Socket type not supported",
  1615.     95: "Not supported",
  1616.     96: "Protocol family not supported",
  1617.     97: "Address family not supported by protocol family",
  1618.     98: "Address already in use",
  1619.     99: "Address not available",
  1620.     100: "Network interface is not configured",
  1621.     101: "Network is unreachable",
  1622.     102: "Connection reset by network",
  1623.     103: "Connection aborted",
  1624.     104: "Connection reset by peer",
  1625.     105: "No buffer space available",
  1626.     106: "Socket is already connected",
  1627.     107: "Socket is not connected",
  1628.     108: "Can't send after socket shutdown",
  1629.     109: "Too many references",
  1630.     110: "Connection timed out",
  1631.     111: "Connection refused",
  1632.     112: "Host is down",
  1633.     113: "Host is unreachable",
  1634.     114: "Socket already connected",
  1635.     115: "Connection already in progress",
  1636.     116: "Stale file handle",
  1637.     122: "Quota exceeded",
  1638.     123: "No medium (in tape drive)",
  1639.     125: "Operation canceled",
  1640.     130: "Previous owner died",
  1641.     131: "State not recoverable"
  1642. };
  1643.  
  1644. function ___setErrNo(value) {
  1645.     if (Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value;
  1646.     return value
  1647. }
  1648.  
  1649. var PATH = {
  1650.     splitPath: (function (filename) {
  1651.         var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1652.         return splitPathRe.exec(filename).slice(1)
  1653.     }), normalizeArray: (function (parts, allowAboveRoot) {
  1654.         var up = 0;
  1655.         for (var i = parts.length - 1; i >= 0; i--) {
  1656.             var last = parts[i];
  1657.             if (last === ".") {
  1658.                 parts.splice(i, 1)
  1659.             } else if (last === "..") {
  1660.                 parts.splice(i, 1);
  1661.                 up++
  1662.             } else if (up) {
  1663.                 parts.splice(i, 1);
  1664.                 up--
  1665.             }
  1666.         }
  1667.         if (allowAboveRoot) {
  1668.             for (; up; up--) {
  1669.                 parts.unshift("..")
  1670.             }
  1671.         }
  1672.         return parts
  1673.     }), normalize: (function (path) {
  1674.         var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/";
  1675.         path = PATH.normalizeArray(path.split("/").filter((function (p) {
  1676.             return !!p
  1677.         })), !isAbsolute).join("/");
  1678.         if (!path && !isAbsolute) {
  1679.             path = "."
  1680.         }
  1681.         if (path && trailingSlash) {
  1682.             path += "/"
  1683.         }
  1684.         return (isAbsolute ? "/" : "") + path
  1685.     }), dirname: (function (path) {
  1686.         var result = PATH.splitPath(path), root = result[0], dir = result[1];
  1687.         if (!root && !dir) {
  1688.             return "."
  1689.         }
  1690.         if (dir) {
  1691.             dir = dir.substr(0, dir.length - 1)
  1692.         }
  1693.         return root + dir
  1694.     }), basename: (function (path) {
  1695.         if (path === "/") return "/";
  1696.         var lastSlash = path.lastIndexOf("/");
  1697.         if (lastSlash === -1) return path;
  1698.         return path.substr(lastSlash + 1)
  1699.     }), extname: (function (path) {
  1700.         return PATH.splitPath(path)[3]
  1701.     }), join: (function () {
  1702.         var paths = Array.prototype.slice.call(arguments, 0);
  1703.         return PATH.normalize(paths.join("/"))
  1704.     }), join2: (function (l, r) {
  1705.         return PATH.normalize(l + "/" + r)
  1706.     }), resolve: (function () {
  1707.         var resolvedPath = "", resolvedAbsolute = false;
  1708.         for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1709.             var path = i >= 0 ? arguments[i] : FS.cwd();
  1710.             if (typeof path !== "string") {
  1711.                 throw new TypeError("Arguments to path.resolve must be strings")
  1712.             } else if (!path) {
  1713.                 return ""
  1714.             }
  1715.             resolvedPath = path + "/" + resolvedPath;
  1716.             resolvedAbsolute = path.charAt(0) === "/"
  1717.         }
  1718.         resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter((function (p) {
  1719.             return !!p
  1720.         })), !resolvedAbsolute).join("/");
  1721.         return (resolvedAbsolute ? "/" : "") + resolvedPath || "."
  1722.     }), relative: (function (from, to) {
  1723.         from = PATH.resolve(from).substr(1);
  1724.         to = PATH.resolve(to).substr(1);
  1725.  
  1726.         function trim(arr) {
  1727.             var start = 0;
  1728.             for (; start < arr.length; start++) {
  1729.                 if (arr[start] !== "") break
  1730.             }
  1731.             var end = arr.length - 1;
  1732.             for (; end >= 0; end--) {
  1733.                 if (arr[end] !== "") break
  1734.             }
  1735.             if (start > end) return [];
  1736.             return arr.slice(start, end - start + 1)
  1737.         }
  1738.  
  1739.         var fromParts = trim(from.split("/"));
  1740.         var toParts = trim(to.split("/"));
  1741.         var length = Math.min(fromParts.length, toParts.length);
  1742.         var samePartsLength = length;
  1743.         for (var i = 0; i < length; i++) {
  1744.             if (fromParts[i] !== toParts[i]) {
  1745.                 samePartsLength = i;
  1746.                 break
  1747.             }
  1748.         }
  1749.         var outputParts = [];
  1750.         for (var i = samePartsLength; i < fromParts.length; i++) {
  1751.             outputParts.push("..")
  1752.         }
  1753.         outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1754.         return outputParts.join("/")
  1755.     })
  1756. };
  1757. var TTY = {
  1758.     ttys: [], init: (function () {
  1759.     }), shutdown: (function () {
  1760.     }), register: (function (dev, ops) {
  1761.         TTY.ttys[dev] = {input: [], output: [], ops: ops};
  1762.         FS.registerDevice(dev, TTY.stream_ops)
  1763.     }), stream_ops: {
  1764.         open: (function (stream) {
  1765.             var tty = TTY.ttys[stream.node.rdev];
  1766.             if (!tty) {
  1767.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  1768.             }
  1769.             stream.tty = tty;
  1770.             stream.seekable = false
  1771.         }), close: (function (stream) {
  1772.             stream.tty.ops.flush(stream.tty)
  1773.         }), flush: (function (stream) {
  1774.             stream.tty.ops.flush(stream.tty)
  1775.         }), read: (function (stream, buffer, offset, length, pos) {
  1776.             if (!stream.tty || !stream.tty.ops.get_char) {
  1777.                 throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1778.             }
  1779.             var bytesRead = 0;
  1780.             for (var i = 0; i < length; i++) {
  1781.                 var result;
  1782.                 try {
  1783.                     result = stream.tty.ops.get_char(stream.tty)
  1784.                 } catch (e) {
  1785.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1786.                 }
  1787.                 if (result === undefined && bytesRead === 0) {
  1788.                     throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  1789.                 }
  1790.                 if (result === null || result === undefined) break;
  1791.                 bytesRead++;
  1792.                 buffer[offset + i] = result
  1793.             }
  1794.             if (bytesRead) {
  1795.                 stream.node.timestamp = Date.now()
  1796.             }
  1797.             return bytesRead
  1798.         }), write: (function (stream, buffer, offset, length, pos) {
  1799.             if (!stream.tty || !stream.tty.ops.put_char) {
  1800.                 throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1801.             }
  1802.             for (var i = 0; i < length; i++) {
  1803.                 try {
  1804.                     stream.tty.ops.put_char(stream.tty, buffer[offset + i])
  1805.                 } catch (e) {
  1806.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1807.                 }
  1808.             }
  1809.             if (length) {
  1810.                 stream.node.timestamp = Date.now()
  1811.             }
  1812.             return i
  1813.         })
  1814.     }, default_tty_ops: {
  1815.         get_char: (function (tty) {
  1816.             if (!tty.input.length) {
  1817.                 var result = null;
  1818.                 if (ENVIRONMENT_IS_NODE) {
  1819.                     var BUFSIZE = 256;
  1820.                     var buf = new Buffer(BUFSIZE);
  1821.                     var bytesRead = 0;
  1822.                     var isPosixPlatform = process.platform != "win32";
  1823.                     var fd = process.stdin.fd;
  1824.                     if (isPosixPlatform) {
  1825.                         var usingDevice = false;
  1826.                         try {
  1827.                             fd = fs.openSync("/dev/stdin", "r");
  1828.                             usingDevice = true
  1829.                         } catch (e) {
  1830.                         }
  1831.                     }
  1832.                     try {
  1833.                         bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null)
  1834.                     } catch (e) {
  1835.                         if (e.toString().indexOf("EOF") != -1) bytesRead = 0; else throw e
  1836.                     }
  1837.                     if (usingDevice) {
  1838.                         fs.closeSync(fd)
  1839.                     }
  1840.                     if (bytesRead > 0) {
  1841.                         result = buf.slice(0, bytesRead).toString("utf-8")
  1842.                     } else {
  1843.                         result = null
  1844.                     }
  1845.                 } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  1846.                     result = window.prompt("Input: ");
  1847.                     if (result !== null) {
  1848.                         result += "\n"
  1849.                     }
  1850.                 } else if (typeof readline == "function") {
  1851.                     result = readline();
  1852.                     if (result !== null) {
  1853.                         result += "\n"
  1854.                     }
  1855.                 }
  1856.                 if (!result) {
  1857.                     return null
  1858.                 }
  1859.                 tty.input = intArrayFromString(result, true)
  1860.             }
  1861.             return tty.input.shift()
  1862.         }), put_char: (function (tty, val) {
  1863.             if (val === null || val === 10) {
  1864.                 Module["print"](UTF8ArrayToString(tty.output, 0));
  1865.                 tty.output = []
  1866.             } else {
  1867.                 if (val != 0) tty.output.push(val)
  1868.             }
  1869.         }), flush: (function (tty) {
  1870.             if (tty.output && tty.output.length > 0) {
  1871.                 Module["print"](UTF8ArrayToString(tty.output, 0));
  1872.                 tty.output = []
  1873.             }
  1874.         })
  1875.     }, default_tty1_ops: {
  1876.         put_char: (function (tty, val) {
  1877.             if (val === null || val === 10) {
  1878.                 Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1879.                 tty.output = []
  1880.             } else {
  1881.                 if (val != 0) tty.output.push(val)
  1882.             }
  1883.         }), flush: (function (tty) {
  1884.             if (tty.output && tty.output.length > 0) {
  1885.                 Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1886.                 tty.output = []
  1887.             }
  1888.         })
  1889.     }
  1890. };
  1891. var MEMFS = {
  1892.     ops_table: null, mount: (function (mount) {
  1893.         return MEMFS.createNode(null, "/", 16384 | 511, 0)
  1894.     }), createNode: (function (parent, name, mode, dev) {
  1895.         if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1896.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  1897.         }
  1898.         if (!MEMFS.ops_table) {
  1899.             MEMFS.ops_table = {
  1900.                 dir: {
  1901.                     node: {
  1902.                         getattr: MEMFS.node_ops.getattr,
  1903.                         setattr: MEMFS.node_ops.setattr,
  1904.                         lookup: MEMFS.node_ops.lookup,
  1905.                         mknod: MEMFS.node_ops.mknod,
  1906.                         rename: MEMFS.node_ops.rename,
  1907.                         unlink: MEMFS.node_ops.unlink,
  1908.                         rmdir: MEMFS.node_ops.rmdir,
  1909.                         readdir: MEMFS.node_ops.readdir,
  1910.                         symlink: MEMFS.node_ops.symlink
  1911.                     }, stream: {llseek: MEMFS.stream_ops.llseek}
  1912.                 },
  1913.                 file: {
  1914.                     node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},
  1915.                     stream: {
  1916.                         llseek: MEMFS.stream_ops.llseek,
  1917.                         read: MEMFS.stream_ops.read,
  1918.                         write: MEMFS.stream_ops.write,
  1919.                         allocate: MEMFS.stream_ops.allocate,
  1920.                         mmap: MEMFS.stream_ops.mmap,
  1921.                         msync: MEMFS.stream_ops.msync
  1922.                     }
  1923.                 },
  1924.                 link: {
  1925.                     node: {
  1926.                         getattr: MEMFS.node_ops.getattr,
  1927.                         setattr: MEMFS.node_ops.setattr,
  1928.                         readlink: MEMFS.node_ops.readlink
  1929.                     }, stream: {}
  1930.                 },
  1931.                 chrdev: {
  1932.                     node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr},
  1933.                     stream: FS.chrdev_stream_ops
  1934.                 }
  1935.             }
  1936.         }
  1937.         var node = FS.createNode(parent, name, mode, dev);
  1938.         if (FS.isDir(node.mode)) {
  1939.             node.node_ops = MEMFS.ops_table.dir.node;
  1940.             node.stream_ops = MEMFS.ops_table.dir.stream;
  1941.             node.contents = {}
  1942.         } else if (FS.isFile(node.mode)) {
  1943.             node.node_ops = MEMFS.ops_table.file.node;
  1944.             node.stream_ops = MEMFS.ops_table.file.stream;
  1945.             node.usedBytes = 0;
  1946.             node.contents = null
  1947.         } else if (FS.isLink(node.mode)) {
  1948.             node.node_ops = MEMFS.ops_table.link.node;
  1949.             node.stream_ops = MEMFS.ops_table.link.stream
  1950.         } else if (FS.isChrdev(node.mode)) {
  1951.             node.node_ops = MEMFS.ops_table.chrdev.node;
  1952.             node.stream_ops = MEMFS.ops_table.chrdev.stream
  1953.         }
  1954.         node.timestamp = Date.now();
  1955.         if (parent) {
  1956.             parent.contents[name] = node
  1957.         }
  1958.         return node
  1959.     }), getFileDataAsRegularArray: (function (node) {
  1960.         if (node.contents && node.contents.subarray) {
  1961.             var arr = [];
  1962.             for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);
  1963.             return arr
  1964.         }
  1965.         return node.contents
  1966.     }), getFileDataAsTypedArray: (function (node) {
  1967.         if (!node.contents) return new Uint8Array;
  1968.         if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);
  1969.         return new Uint8Array(node.contents)
  1970.     }), expandFileStorage: (function (node, newCapacity) {
  1971.         if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {
  1972.             node.contents = MEMFS.getFileDataAsRegularArray(node);
  1973.             node.usedBytes = node.contents.length
  1974.         }
  1975.         if (!node.contents || node.contents.subarray) {
  1976.             var prevCapacity = node.contents ? node.contents.length : 0;
  1977.             if (prevCapacity >= newCapacity) return;
  1978.             var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  1979.             newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);
  1980.             if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
  1981.             var oldContents = node.contents;
  1982.             node.contents = new Uint8Array(newCapacity);
  1983.             if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  1984.             return
  1985.         }
  1986.         if (!node.contents && newCapacity > 0) node.contents = [];
  1987.         while (node.contents.length < newCapacity) node.contents.push(0)
  1988.     }), resizeFileStorage: (function (node, newSize) {
  1989.         if (node.usedBytes == newSize) return;
  1990.         if (newSize == 0) {
  1991.             node.contents = null;
  1992.             node.usedBytes = 0;
  1993.             return
  1994.         }
  1995.         if (!node.contents || node.contents.subarray) {
  1996.             var oldContents = node.contents;
  1997.             node.contents = new Uint8Array(new ArrayBuffer(newSize));
  1998.             if (oldContents) {
  1999.                 node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))
  2000.             }
  2001.             node.usedBytes = newSize;
  2002.             return
  2003.         }
  2004.         if (!node.contents) node.contents = [];
  2005.         if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0);
  2006.         node.usedBytes = newSize
  2007.     }), node_ops: {
  2008.         getattr: (function (node) {
  2009.             var attr = {};
  2010.             attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  2011.             attr.ino = node.id;
  2012.             attr.mode = node.mode;
  2013.             attr.nlink = 1;
  2014.             attr.uid = 0;
  2015.             attr.gid = 0;
  2016.             attr.rdev = node.rdev;
  2017.             if (FS.isDir(node.mode)) {
  2018.                 attr.size = 4096
  2019.             } else if (FS.isFile(node.mode)) {
  2020.                 attr.size = node.usedBytes
  2021.             } else if (FS.isLink(node.mode)) {
  2022.                 attr.size = node.link.length
  2023.             } else {
  2024.                 attr.size = 0
  2025.             }
  2026.             attr.atime = new Date(node.timestamp);
  2027.             attr.mtime = new Date(node.timestamp);
  2028.             attr.ctime = new Date(node.timestamp);
  2029.             attr.blksize = 4096;
  2030.             attr.blocks = Math.ceil(attr.size / attr.blksize);
  2031.             return attr
  2032.         }), setattr: (function (node, attr) {
  2033.             if (attr.mode !== undefined) {
  2034.                 node.mode = attr.mode
  2035.             }
  2036.             if (attr.timestamp !== undefined) {
  2037.                 node.timestamp = attr.timestamp
  2038.             }
  2039.             if (attr.size !== undefined) {
  2040.                 MEMFS.resizeFileStorage(node, attr.size)
  2041.             }
  2042.         }), lookup: (function (parent, name) {
  2043.             throw FS.genericErrors[ERRNO_CODES.ENOENT]
  2044.         }), mknod: (function (parent, name, mode, dev) {
  2045.             return MEMFS.createNode(parent, name, mode, dev)
  2046.         }), rename: (function (old_node, new_dir, new_name) {
  2047.             if (FS.isDir(old_node.mode)) {
  2048.                 var new_node;
  2049.                 try {
  2050.                     new_node = FS.lookupNode(new_dir, new_name)
  2051.                 } catch (e) {
  2052.                 }
  2053.                 if (new_node) {
  2054.                     for (var i in new_node.contents) {
  2055.                         throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2056.                     }
  2057.                 }
  2058.             }
  2059.             delete old_node.parent.contents[old_node.name];
  2060.             old_node.name = new_name;
  2061.             new_dir.contents[new_name] = old_node;
  2062.             old_node.parent = new_dir
  2063.         }), unlink: (function (parent, name) {
  2064.             delete parent.contents[name]
  2065.         }), rmdir: (function (parent, name) {
  2066.             var node = FS.lookupNode(parent, name);
  2067.             for (var i in node.contents) {
  2068.                 throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2069.             }
  2070.             delete parent.contents[name]
  2071.         }), readdir: (function (node) {
  2072.             var entries = [".", ".."];
  2073.             for (var key in node.contents) {
  2074.                 if (!node.contents.hasOwnProperty(key)) {
  2075.                     continue
  2076.                 }
  2077.                 entries.push(key)
  2078.             }
  2079.             return entries
  2080.         }), symlink: (function (parent, newname, oldpath) {
  2081.             var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  2082.             node.link = oldpath;
  2083.             return node
  2084.         }), readlink: (function (node) {
  2085.             if (!FS.isLink(node.mode)) {
  2086.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2087.             }
  2088.             return node.link
  2089.         })
  2090.     }, stream_ops: {
  2091.         read: (function (stream, buffer, offset, length, position) {
  2092.             var contents = stream.node.contents;
  2093.             if (position >= stream.node.usedBytes) return 0;
  2094.             var size = Math.min(stream.node.usedBytes - position, length);
  2095.             assert(size >= 0);
  2096.             if (size > 8 && contents.subarray) {
  2097.                 buffer.set(contents.subarray(position, position + size), offset)
  2098.             } else {
  2099.                 for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]
  2100.             }
  2101.             return size
  2102.         }), write: (function (stream, buffer, offset, length, position, canOwn) {
  2103.             if (!length) return 0;
  2104.             var node = stream.node;
  2105.             node.timestamp = Date.now();
  2106.             if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  2107.                 if (canOwn) {
  2108.                     node.contents = buffer.subarray(offset, offset + length);
  2109.                     node.usedBytes = length;
  2110.                     return length
  2111.                 } else if (node.usedBytes === 0 && position === 0) {
  2112.                     node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
  2113.                     node.usedBytes = length;
  2114.                     return length
  2115.                 } else if (position + length <= node.usedBytes) {
  2116.                     node.contents.set(buffer.subarray(offset, offset + length), position);
  2117.                     return length
  2118.                 }
  2119.             }
  2120.             MEMFS.expandFileStorage(node, position + length);
  2121.             if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); else {
  2122.                 for (var i = 0; i < length; i++) {
  2123.                     node.contents[position + i] = buffer[offset + i]
  2124.                 }
  2125.             }
  2126.             node.usedBytes = Math.max(node.usedBytes, position + length);
  2127.             return length
  2128.         }), llseek: (function (stream, offset, whence) {
  2129.             var position = offset;
  2130.             if (whence === 1) {
  2131.                 position += stream.position
  2132.             } else if (whence === 2) {
  2133.                 if (FS.isFile(stream.node.mode)) {
  2134.                     position += stream.node.usedBytes
  2135.                 }
  2136.             }
  2137.             if (position < 0) {
  2138.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2139.             }
  2140.             return position
  2141.         }), allocate: (function (stream, offset, length) {
  2142.             MEMFS.expandFileStorage(stream.node, offset + length);
  2143.             stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
  2144.         }), mmap: (function (stream, buffer, offset, length, position, prot, flags) {
  2145.             if (!FS.isFile(stream.node.mode)) {
  2146.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2147.             }
  2148.             var ptr;
  2149.             var allocated;
  2150.             var contents = stream.node.contents;
  2151.             if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {
  2152.                 allocated = false;
  2153.                 ptr = contents.byteOffset
  2154.             } else {
  2155.                 if (position > 0 || position + length < stream.node.usedBytes) {
  2156.                     if (contents.subarray) {
  2157.                         contents = contents.subarray(position, position + length)
  2158.                     } else {
  2159.                         contents = Array.prototype.slice.call(contents, position, position + length)
  2160.                     }
  2161.                 }
  2162.                 allocated = true;
  2163.                 ptr = _malloc(length);
  2164.                 if (!ptr) {
  2165.                     throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)
  2166.                 }
  2167.                 buffer.set(contents, ptr)
  2168.             }
  2169.             return {ptr: ptr, allocated: allocated}
  2170.         }), msync: (function (stream, buffer, offset, length, mmapFlags) {
  2171.             if (!FS.isFile(stream.node.mode)) {
  2172.                 throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2173.             }
  2174.             if (mmapFlags & 2) {
  2175.                 return 0
  2176.             }
  2177.             var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
  2178.             return 0
  2179.         })
  2180.     }
  2181. };
  2182. var IDBFS = {
  2183.     dbs: {}, indexedDB: (function () {
  2184.         if (typeof indexedDB !== "undefined") return indexedDB;
  2185.         var ret = null;
  2186.         if (typeof window === "object") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2187.         assert(ret, "IDBFS used, but indexedDB not supported");
  2188.         return ret
  2189.     }), DB_VERSION: 21, DB_STORE_NAME: "FILE_DATA", mount: (function (mount) {
  2190.         return MEMFS.mount.apply(null, arguments)
  2191.     }), syncfs: (function (mount, populate, callback) {
  2192.         IDBFS.getLocalSet(mount, (function (err, local) {
  2193.             if (err) return callback(err);
  2194.             IDBFS.getRemoteSet(mount, (function (err, remote) {
  2195.                 if (err) return callback(err);
  2196.                 var src = populate ? remote : local;
  2197.                 var dst = populate ? local : remote;
  2198.                 IDBFS.reconcile(src, dst, callback)
  2199.             }))
  2200.         }))
  2201.     }), getDB: (function (name, callback) {
  2202.         var db = IDBFS.dbs[name];
  2203.         if (db) {
  2204.             return callback(null, db)
  2205.         }
  2206.         var req;
  2207.         try {
  2208.             req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
  2209.         } catch (e) {
  2210.             return callback(e)
  2211.         }
  2212.         if (!req) {
  2213.             return callback("Unable to connect to IndexedDB")
  2214.         }
  2215.         req.onupgradeneeded = (function (e) {
  2216.             var db = e.target.result;
  2217.             var transaction = e.target.transaction;
  2218.             var fileStore;
  2219.             if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  2220.                 fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
  2221.             } else {
  2222.                 fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
  2223.             }
  2224.             if (!fileStore.indexNames.contains("timestamp")) {
  2225.                 fileStore.createIndex("timestamp", "timestamp", {unique: false})
  2226.             }
  2227.         });
  2228.         req.onsuccess = (function () {
  2229.             db = req.result;
  2230.             IDBFS.dbs[name] = db;
  2231.             callback(null, db)
  2232.         });
  2233.         req.onerror = (function (e) {
  2234.             callback(this.error);
  2235.             e.preventDefault()
  2236.         })
  2237.     }), getLocalSet: (function (mount, callback) {
  2238.         var entries = {};
  2239.  
  2240.         function isRealDir(p) {
  2241.             return p !== "." && p !== ".."
  2242.         }
  2243.  
  2244.         function toAbsolute(root) {
  2245.             return (function (p) {
  2246.                 return PATH.join2(root, p)
  2247.             })
  2248.         }
  2249.  
  2250.         var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
  2251.         while (check.length) {
  2252.             var path = check.pop();
  2253.             var stat;
  2254.             try {
  2255.                 stat = FS.stat(path)
  2256.             } catch (e) {
  2257.                 return callback(e)
  2258.             }
  2259.             if (FS.isDir(stat.mode)) {
  2260.                 check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))
  2261.             }
  2262.             entries[path] = {timestamp: stat.mtime}
  2263.         }
  2264.         return callback(null, {type: "local", entries: entries})
  2265.     }), getRemoteSet: (function (mount, callback) {
  2266.         var entries = {};
  2267.         IDBFS.getDB(mount.mountpoint, (function (err, db) {
  2268.             if (err) return callback(err);
  2269.             var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readonly");
  2270.             transaction.onerror = (function (e) {
  2271.                 callback(this.error);
  2272.                 e.preventDefault()
  2273.             });
  2274.             var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2275.             var index = store.index("timestamp");
  2276.             index.openKeyCursor().onsuccess = (function (event) {
  2277.                 var cursor = event.target.result;
  2278.                 if (!cursor) {
  2279.                     return callback(null, {type: "remote", db: db, entries: entries})
  2280.                 }
  2281.                 entries[cursor.primaryKey] = {timestamp: cursor.key};
  2282.                 cursor.continue()
  2283.             })
  2284.         }))
  2285.     }), loadLocalEntry: (function (path, callback) {
  2286.         var stat, node;
  2287.         try {
  2288.             var lookup = FS.lookupPath(path);
  2289.             node = lookup.node;
  2290.             stat = FS.stat(path)
  2291.         } catch (e) {
  2292.             return callback(e)
  2293.         }
  2294.         if (FS.isDir(stat.mode)) {
  2295.             return callback(null, {timestamp: stat.mtime, mode: stat.mode})
  2296.         } else if (FS.isFile(stat.mode)) {
  2297.             node.contents = MEMFS.getFileDataAsTypedArray(node);
  2298.             return callback(null, {timestamp: stat.mtime, mode: stat.mode, contents: node.contents})
  2299.         } else {
  2300.             return callback(new Error("node type not supported"))
  2301.         }
  2302.     }), storeLocalEntry: (function (path, entry, callback) {
  2303.         try {
  2304.             if (FS.isDir(entry.mode)) {
  2305.                 FS.mkdir(path, entry.mode)
  2306.             } else if (FS.isFile(entry.mode)) {
  2307.                 FS.writeFile(path, entry.contents, {encoding: "binary", canOwn: true})
  2308.             } else {
  2309.                 return callback(new Error("node type not supported"))
  2310.             }
  2311.             FS.chmod(path, entry.mode);
  2312.             FS.utime(path, entry.timestamp, entry.timestamp)
  2313.         } catch (e) {
  2314.             return callback(e)
  2315.         }
  2316.         callback(null)
  2317.     }), removeLocalEntry: (function (path, callback) {
  2318.         try {
  2319.             var lookup = FS.lookupPath(path);
  2320.             var stat = FS.stat(path);
  2321.             if (FS.isDir(stat.mode)) {
  2322.                 FS.rmdir(path)
  2323.             } else if (FS.isFile(stat.mode)) {
  2324.                 FS.unlink(path)
  2325.             }
  2326.         } catch (e) {
  2327.             return callback(e)
  2328.         }
  2329.         callback(null)
  2330.     }), loadRemoteEntry: (function (store, path, callback) {
  2331.         var req = store.get(path);
  2332.         req.onsuccess = (function (event) {
  2333.             callback(null, event.target.result)
  2334.         });
  2335.         req.onerror = (function (e) {
  2336.             callback(this.error);
  2337.             e.preventDefault()
  2338.         })
  2339.     }), storeRemoteEntry: (function (store, path, entry, callback) {
  2340.         var req = store.put(entry, path);
  2341.         req.onsuccess = (function () {
  2342.             callback(null)
  2343.         });
  2344.         req.onerror = (function (e) {
  2345.             callback(this.error);
  2346.             e.preventDefault()
  2347.         })
  2348.     }), removeRemoteEntry: (function (store, path, callback) {
  2349.         var req = store.delete(path);
  2350.         req.onsuccess = (function () {
  2351.             callback(null)
  2352.         });
  2353.         req.onerror = (function (e) {
  2354.             callback(this.error);
  2355.             e.preventDefault()
  2356.         })
  2357.     }), reconcile: (function (src, dst, callback) {
  2358.         var total = 0;
  2359.         var create = [];
  2360.         Object.keys(src.entries).forEach((function (key) {
  2361.             var e = src.entries[key];
  2362.             var e2 = dst.entries[key];
  2363.             if (!e2 || e.timestamp > e2.timestamp) {
  2364.                 create.push(key);
  2365.                 total++
  2366.             }
  2367.         }));
  2368.         var remove = [];
  2369.         Object.keys(dst.entries).forEach((function (key) {
  2370.             var e = dst.entries[key];
  2371.             var e2 = src.entries[key];
  2372.             if (!e2) {
  2373.                 remove.push(key);
  2374.                 total++
  2375.             }
  2376.         }));
  2377.         if (!total) {
  2378.             return callback(null)
  2379.         }
  2380.         var completed = 0;
  2381.         var db = src.type === "remote" ? src.db : dst.db;
  2382.         var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readwrite");
  2383.         var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2384.  
  2385.         function done(err) {
  2386.             if (err) {
  2387.                 if (!done.errored) {
  2388.                     done.errored = true;
  2389.                     return callback(err)
  2390.                 }
  2391.                 return
  2392.             }
  2393.             if (++completed >= total) {
  2394.                 return callback(null)
  2395.             }
  2396.         }
  2397.  
  2398.         transaction.onerror = (function (e) {
  2399.             done(this.error);
  2400.             e.preventDefault()
  2401.         });
  2402.         create.sort().forEach((function (path) {
  2403.             if (dst.type === "local") {
  2404.                 IDBFS.loadRemoteEntry(store, path, (function (err, entry) {
  2405.                     if (err) return done(err);
  2406.                     IDBFS.storeLocalEntry(path, entry, done)
  2407.                 }))
  2408.             } else {
  2409.                 IDBFS.loadLocalEntry(path, (function (err, entry) {
  2410.                     if (err) return done(err);
  2411.                     IDBFS.storeRemoteEntry(store, path, entry, done)
  2412.                 }))
  2413.             }
  2414.         }));
  2415.         remove.sort().reverse().forEach((function (path) {
  2416.             if (dst.type === "local") {
  2417.                 IDBFS.removeLocalEntry(path, done)
  2418.             } else {
  2419.                 IDBFS.removeRemoteEntry(store, path, done)
  2420.             }
  2421.         }))
  2422.     })
  2423. };
  2424. var NODEFS = {
  2425.     isWindows: false,
  2426.     staticInit: (function () {
  2427.         NODEFS.isWindows = !!process.platform.match(/^win/)
  2428.     }),
  2429.     mount: (function (mount) {
  2430.         assert(ENVIRONMENT_IS_NODE);
  2431.         return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0)
  2432.     }),
  2433.     createNode: (function (parent, name, mode, dev) {
  2434.         if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  2435.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2436.         }
  2437.         var node = FS.createNode(parent, name, mode);
  2438.         node.node_ops = NODEFS.node_ops;
  2439.         node.stream_ops = NODEFS.stream_ops;
  2440.         return node
  2441.     }),
  2442.     getMode: (function (path) {
  2443.         var stat;
  2444.         try {
  2445.             stat = fs.lstatSync(path);
  2446.             if (NODEFS.isWindows) {
  2447.                 stat.mode = stat.mode | (stat.mode & 146) >> 1
  2448.             }
  2449.         } catch (e) {
  2450.             if (!e.code) throw e;
  2451.             throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2452.         }
  2453.         return stat.mode
  2454.     }),
  2455.     realPath: (function (node) {
  2456.         var parts = [];
  2457.         while (node.parent !== node) {
  2458.             parts.push(node.name);
  2459.             node = node.parent
  2460.         }
  2461.         parts.push(node.mount.opts.root);
  2462.         parts.reverse();
  2463.         return PATH.join.apply(null, parts)
  2464.     }),
  2465.     flagsToPermissionStringMap: {
  2466.         0: "r",
  2467.         1: "r+",
  2468.         2: "r+",
  2469.         64: "r",
  2470.         65: "r+",
  2471.         66: "r+",
  2472.         129: "rx+",
  2473.         193: "rx+",
  2474.         514: "w+",
  2475.         577: "w",
  2476.         578: "w+",
  2477.         705: "wx",
  2478.         706: "wx+",
  2479.         1024: "a",
  2480.         1025: "a",
  2481.         1026: "a+",
  2482.         1089: "a",
  2483.         1090: "a+",
  2484.         1153: "ax",
  2485.         1154: "ax+",
  2486.         1217: "ax",
  2487.         1218: "ax+",
  2488.         4096: "rs",
  2489.         4098: "rs+"
  2490.     },
  2491.     flagsToPermissionString: (function (flags) {
  2492.         flags &= ~2097152;
  2493.         flags &= ~2048;
  2494.         flags &= ~32768;
  2495.         flags &= ~524288;
  2496.         if (flags in NODEFS.flagsToPermissionStringMap) {
  2497.             return NODEFS.flagsToPermissionStringMap[flags]
  2498.         } else {
  2499.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2500.         }
  2501.     }),
  2502.     node_ops: {
  2503.         getattr: (function (node) {
  2504.             var path = NODEFS.realPath(node);
  2505.             var stat;
  2506.             try {
  2507.                 stat = fs.lstatSync(path)
  2508.             } catch (e) {
  2509.                 if (!e.code) throw e;
  2510.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2511.             }
  2512.             if (NODEFS.isWindows && !stat.blksize) {
  2513.                 stat.blksize = 4096
  2514.             }
  2515.             if (NODEFS.isWindows && !stat.blocks) {
  2516.                 stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0
  2517.             }
  2518.             return {
  2519.                 dev: stat.dev,
  2520.                 ino: stat.ino,
  2521.                 mode: stat.mode,
  2522.                 nlink: stat.nlink,
  2523.                 uid: stat.uid,
  2524.                 gid: stat.gid,
  2525.                 rdev: stat.rdev,
  2526.                 size: stat.size,
  2527.                 atime: stat.atime,
  2528.                 mtime: stat.mtime,
  2529.                 ctime: stat.ctime,
  2530.                 blksize: stat.blksize,
  2531.                 blocks: stat.blocks
  2532.             }
  2533.         }), setattr: (function (node, attr) {
  2534.             var path = NODEFS.realPath(node);
  2535.             try {
  2536.                 if (attr.mode !== undefined) {
  2537.                     fs.chmodSync(path, attr.mode);
  2538.                     node.mode = attr.mode
  2539.                 }
  2540.                 if (attr.timestamp !== undefined) {
  2541.                     var date = new Date(attr.timestamp);
  2542.                     fs.utimesSync(path, date, date)
  2543.                 }
  2544.                 if (attr.size !== undefined) {
  2545.                     fs.truncateSync(path, attr.size)
  2546.                 }
  2547.             } catch (e) {
  2548.                 if (!e.code) throw e;
  2549.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2550.             }
  2551.         }), lookup: (function (parent, name) {
  2552.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2553.             var mode = NODEFS.getMode(path);
  2554.             return NODEFS.createNode(parent, name, mode)
  2555.         }), mknod: (function (parent, name, mode, dev) {
  2556.             var node = NODEFS.createNode(parent, name, mode, dev);
  2557.             var path = NODEFS.realPath(node);
  2558.             try {
  2559.                 if (FS.isDir(node.mode)) {
  2560.                     fs.mkdirSync(path, node.mode)
  2561.                 } else {
  2562.                     fs.writeFileSync(path, "", {mode: node.mode})
  2563.                 }
  2564.             } catch (e) {
  2565.                 if (!e.code) throw e;
  2566.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2567.             }
  2568.             return node
  2569.         }), rename: (function (oldNode, newDir, newName) {
  2570.             var oldPath = NODEFS.realPath(oldNode);
  2571.             var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
  2572.             try {
  2573.                 fs.renameSync(oldPath, newPath)
  2574.             } catch (e) {
  2575.                 if (!e.code) throw e;
  2576.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2577.             }
  2578.         }), unlink: (function (parent, name) {
  2579.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2580.             try {
  2581.                 fs.unlinkSync(path)
  2582.             } catch (e) {
  2583.                 if (!e.code) throw e;
  2584.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2585.             }
  2586.         }), rmdir: (function (parent, name) {
  2587.             var path = PATH.join2(NODEFS.realPath(parent), name);
  2588.             try {
  2589.                 fs.rmdirSync(path)
  2590.             } catch (e) {
  2591.                 if (!e.code) throw e;
  2592.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2593.             }
  2594.         }), readdir: (function (node) {
  2595.             var path = NODEFS.realPath(node);
  2596.             try {
  2597.                 return fs.readdirSync(path)
  2598.             } catch (e) {
  2599.                 if (!e.code) throw e;
  2600.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2601.             }
  2602.         }), symlink: (function (parent, newName, oldPath) {
  2603.             var newPath = PATH.join2(NODEFS.realPath(parent), newName);
  2604.             try {
  2605.                 fs.symlinkSync(oldPath, newPath)
  2606.             } catch (e) {
  2607.                 if (!e.code) throw e;
  2608.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2609.             }
  2610.         }), readlink: (function (node) {
  2611.             var path = NODEFS.realPath(node);
  2612.             try {
  2613.                 path = fs.readlinkSync(path);
  2614.                 path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
  2615.                 return path
  2616.             } catch (e) {
  2617.                 if (!e.code) throw e;
  2618.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2619.             }
  2620.         })
  2621.     },
  2622.     stream_ops: {
  2623.         open: (function (stream) {
  2624.             var path = NODEFS.realPath(stream.node);
  2625.             try {
  2626.                 if (FS.isFile(stream.node.mode)) {
  2627.                     stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags))
  2628.                 }
  2629.             } catch (e) {
  2630.                 if (!e.code) throw e;
  2631.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2632.             }
  2633.         }), close: (function (stream) {
  2634.             try {
  2635.                 if (FS.isFile(stream.node.mode) && stream.nfd) {
  2636.                     fs.closeSync(stream.nfd)
  2637.                 }
  2638.             } catch (e) {
  2639.                 if (!e.code) throw e;
  2640.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2641.             }
  2642.         }), read: (function (stream, buffer, offset, length, position) {
  2643.             if (length === 0) return 0;
  2644.             var nbuffer = new Buffer(length);
  2645.             var res;
  2646.             try {
  2647.                 res = fs.readSync(stream.nfd, nbuffer, 0, length, position)
  2648.             } catch (e) {
  2649.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2650.             }
  2651.             if (res > 0) {
  2652.                 for (var i = 0; i < res; i++) {
  2653.                     buffer[offset + i] = nbuffer[i]
  2654.                 }
  2655.             }
  2656.             return res
  2657.         }), write: (function (stream, buffer, offset, length, position) {
  2658.             var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
  2659.             var res;
  2660.             try {
  2661.                 res = fs.writeSync(stream.nfd, nbuffer, 0, length, position)
  2662.             } catch (e) {
  2663.                 throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2664.             }
  2665.             return res
  2666.         }), llseek: (function (stream, offset, whence) {
  2667.             var position = offset;
  2668.             if (whence === 1) {
  2669.                 position += stream.position
  2670.             } else if (whence === 2) {
  2671.                 if (FS.isFile(stream.node.mode)) {
  2672.                     try {
  2673.                         var stat = fs.fstatSync(stream.nfd);
  2674.                         position += stat.size
  2675.                     } catch (e) {
  2676.                         throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2677.                     }
  2678.                 }
  2679.             }
  2680.             if (position < 0) {
  2681.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2682.             }
  2683.             return position
  2684.         })
  2685.     }
  2686. };
  2687. var WORKERFS = {
  2688.     DIR_MODE: 16895, FILE_MODE: 33279, reader: null, mount: (function (mount) {
  2689.         assert(ENVIRONMENT_IS_WORKER);
  2690.         if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync;
  2691.         var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0);
  2692.         var createdParents = {};
  2693.  
  2694.         function ensureParent(path) {
  2695.             var parts = path.split("/");
  2696.             var parent = root;
  2697.             for (var i = 0; i < parts.length - 1; i++) {
  2698.                 var curr = parts.slice(0, i + 1).join("/");
  2699.                 if (!createdParents[curr]) {
  2700.                     createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0)
  2701.                 }
  2702.                 parent = createdParents[curr]
  2703.             }
  2704.             return parent
  2705.         }
  2706.  
  2707.         function base(path) {
  2708.             var parts = path.split("/");
  2709.             return parts[parts.length - 1]
  2710.         }
  2711.  
  2712.         Array.prototype.forEach.call(mount.opts["files"] || [], (function (file) {
  2713.             WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate)
  2714.         }));
  2715.         (mount.opts["blobs"] || []).forEach((function (obj) {
  2716.             WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"])
  2717.         }));
  2718.         (mount.opts["packages"] || []).forEach((function (pack) {
  2719.             pack["metadata"].files.forEach((function (file) {
  2720.                 var name = file.filename.substr(1);
  2721.                 WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end))
  2722.             }))
  2723.         }));
  2724.         return root
  2725.     }), createNode: (function (parent, name, mode, dev, contents, mtime) {
  2726.         var node = FS.createNode(parent, name, mode);
  2727.         node.mode = mode;
  2728.         node.node_ops = WORKERFS.node_ops;
  2729.         node.stream_ops = WORKERFS.stream_ops;
  2730.         node.timestamp = (mtime || new Date).getTime();
  2731.         assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
  2732.         if (mode === WORKERFS.FILE_MODE) {
  2733.             node.size = contents.size;
  2734.             node.contents = contents
  2735.         } else {
  2736.             node.size = 4096;
  2737.             node.contents = {}
  2738.         }
  2739.         if (parent) {
  2740.             parent.contents[name] = node
  2741.         }
  2742.         return node
  2743.     }), node_ops: {
  2744.         getattr: (function (node) {
  2745.             return {
  2746.                 dev: 1,
  2747.                 ino: undefined,
  2748.                 mode: node.mode,
  2749.                 nlink: 1,
  2750.                 uid: 0,
  2751.                 gid: 0,
  2752.                 rdev: undefined,
  2753.                 size: node.size,
  2754.                 atime: new Date(node.timestamp),
  2755.                 mtime: new Date(node.timestamp),
  2756.                 ctime: new Date(node.timestamp),
  2757.                 blksize: 4096,
  2758.                 blocks: Math.ceil(node.size / 4096)
  2759.             }
  2760.         }), setattr: (function (node, attr) {
  2761.             if (attr.mode !== undefined) {
  2762.                 node.mode = attr.mode
  2763.             }
  2764.             if (attr.timestamp !== undefined) {
  2765.                 node.timestamp = attr.timestamp
  2766.             }
  2767.         }), lookup: (function (parent, name) {
  2768.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  2769.         }), mknod: (function (parent, name, mode, dev) {
  2770.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2771.         }), rename: (function (oldNode, newDir, newName) {
  2772.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2773.         }), unlink: (function (parent, name) {
  2774.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2775.         }), rmdir: (function (parent, name) {
  2776.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2777.         }), readdir: (function (node) {
  2778.             var entries = [".", ".."];
  2779.             for (var key in node.contents) {
  2780.                 if (!node.contents.hasOwnProperty(key)) {
  2781.                     continue
  2782.                 }
  2783.                 entries.push(key)
  2784.             }
  2785.             return entries
  2786.         }), symlink: (function (parent, newName, oldPath) {
  2787.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2788.         }), readlink: (function (node) {
  2789.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2790.         })
  2791.     }, stream_ops: {
  2792.         read: (function (stream, buffer, offset, length, position) {
  2793.             if (position >= stream.node.size) return 0;
  2794.             var chunk = stream.node.contents.slice(position, position + length);
  2795.             var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
  2796.             buffer.set(new Uint8Array(ab), offset);
  2797.             return chunk.size
  2798.         }), write: (function (stream, buffer, offset, length, position) {
  2799.             throw new FS.ErrnoError(ERRNO_CODES.EIO)
  2800.         }), llseek: (function (stream, offset, whence) {
  2801.             var position = offset;
  2802.             if (whence === 1) {
  2803.                 position += stream.position
  2804.             } else if (whence === 2) {
  2805.                 if (FS.isFile(stream.node.mode)) {
  2806.                     position += stream.node.size
  2807.                 }
  2808.             }
  2809.             if (position < 0) {
  2810.                 throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2811.             }
  2812.             return position
  2813.         })
  2814.     }
  2815. };
  2816. STATICTOP += 16;
  2817. STATICTOP += 16;
  2818. STATICTOP += 16;
  2819. var FS = {
  2820.     root: null,
  2821.     mounts: [],
  2822.     devices: [null],
  2823.     streams: [],
  2824.     nextInode: 1,
  2825.     nameTable: null,
  2826.     currentPath: "/",
  2827.     initialized: false,
  2828.     ignorePermissions: true,
  2829.     trackingDelegate: {},
  2830.     tracking: {openFlags: {READ: 1, WRITE: 2}},
  2831.     ErrnoError: null,
  2832.     genericErrors: {},
  2833.     filesystems: null,
  2834.     syncFSRequests: 0,
  2835.     handleFSError: (function (e) {
  2836.         if (!(e instanceof FS.ErrnoError)) throw e + " : " + stackTrace();
  2837.         return ___setErrNo(e.errno)
  2838.     }),
  2839.     lookupPath: (function (path, opts) {
  2840.         path = PATH.resolve(FS.cwd(), path);
  2841.         opts = opts || {};
  2842.         if (!path) return {path: "", node: null};
  2843.         var defaults = {follow_mount: true, recurse_count: 0};
  2844.         for (var key in defaults) {
  2845.             if (opts[key] === undefined) {
  2846.                 opts[key] = defaults[key]
  2847.             }
  2848.         }
  2849.         if (opts.recurse_count > 8) {
  2850.             throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  2851.         }
  2852.         var parts = PATH.normalizeArray(path.split("/").filter((function (p) {
  2853.             return !!p
  2854.         })), false);
  2855.         var current = FS.root;
  2856.         var current_path = "/";
  2857.         for (var i = 0; i < parts.length; i++) {
  2858.             var islast = i === parts.length - 1;
  2859.             if (islast && opts.parent) {
  2860.                 break
  2861.             }
  2862.             current = FS.lookupNode(current, parts[i]);
  2863.             current_path = PATH.join2(current_path, parts[i]);
  2864.             if (FS.isMountpoint(current)) {
  2865.                 if (!islast || islast && opts.follow_mount) {
  2866.                     current = current.mounted.root
  2867.                 }
  2868.             }
  2869.             if (!islast || opts.follow) {
  2870.                 var count = 0;
  2871.                 while (FS.isLink(current.mode)) {
  2872.                     var link = FS.readlink(current_path);
  2873.                     current_path = PATH.resolve(PATH.dirname(current_path), link);
  2874.                     var lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count});
  2875.                     current = lookup.node;
  2876.                     if (count++ > 40) {
  2877.                         throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  2878.                     }
  2879.                 }
  2880.             }
  2881.         }
  2882.         return {path: current_path, node: current}
  2883.     }),
  2884.     getPath: (function (node) {
  2885.         var path;
  2886.         while (true) {
  2887.             if (FS.isRoot(node)) {
  2888.                 var mount = node.mount.mountpoint;
  2889.                 if (!path) return mount;
  2890.                 return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path
  2891.             }
  2892.             path = path ? node.name + "/" + path : node.name;
  2893.             node = node.parent
  2894.         }
  2895.     }),
  2896.     hashName: (function (parentid, name) {
  2897.         var hash = 0;
  2898.         for (var i = 0; i < name.length; i++) {
  2899.             hash = (hash << 5) - hash + name.charCodeAt(i) | 0
  2900.         }
  2901.         return (parentid + hash >>> 0) % FS.nameTable.length
  2902.     }),
  2903.     hashAddNode: (function (node) {
  2904.         var hash = FS.hashName(node.parent.id, node.name);
  2905.         node.name_next = FS.nameTable[hash];
  2906.         FS.nameTable[hash] = node
  2907.     }),
  2908.     hashRemoveNode: (function (node) {
  2909.         var hash = FS.hashName(node.parent.id, node.name);
  2910.         if (FS.nameTable[hash] === node) {
  2911.             FS.nameTable[hash] = node.name_next
  2912.         } else {
  2913.             var current = FS.nameTable[hash];
  2914.             while (current) {
  2915.                 if (current.name_next === node) {
  2916.                     current.name_next = node.name_next;
  2917.                     break
  2918.                 }
  2919.                 current = current.name_next
  2920.             }
  2921.         }
  2922.     }),
  2923.     lookupNode: (function (parent, name) {
  2924.         var err = FS.mayLookup(parent);
  2925.         if (err) {
  2926.             throw new FS.ErrnoError(err, parent)
  2927.         }
  2928.         var hash = FS.hashName(parent.id, name);
  2929.         for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  2930.             var nodeName = node.name;
  2931.             if (node.parent.id === parent.id && nodeName === name) {
  2932.                 return node
  2933.             }
  2934.         }
  2935.         return FS.lookup(parent, name)
  2936.     }),
  2937.     createNode: (function (parent, name, mode, rdev) {
  2938.         if (!FS.FSNode) {
  2939.             FS.FSNode = (function (parent, name, mode, rdev) {
  2940.                 if (!parent) {
  2941.                     parent = this
  2942.                 }
  2943.                 this.parent = parent;
  2944.                 this.mount = parent.mount;
  2945.                 this.mounted = null;
  2946.                 this.id = FS.nextInode++;
  2947.                 this.name = name;
  2948.                 this.mode = mode;
  2949.                 this.node_ops = {};
  2950.                 this.stream_ops = {};
  2951.                 this.rdev = rdev
  2952.             });
  2953.             FS.FSNode.prototype = {};
  2954.             var readMode = 292 | 73;
  2955.             var writeMode = 146;
  2956.             Object.defineProperties(FS.FSNode.prototype, {
  2957.                 read: {
  2958.                     get: (function () {
  2959.                         return (this.mode & readMode) === readMode
  2960.                     }), set: (function (val) {
  2961.                         val ? this.mode |= readMode : this.mode &= ~readMode
  2962.                     })
  2963.                 }, write: {
  2964.                     get: (function () {
  2965.                         return (this.mode & writeMode) === writeMode
  2966.                     }), set: (function (val) {
  2967.                         val ? this.mode |= writeMode : this.mode &= ~writeMode
  2968.                     })
  2969.                 }, isFolder: {
  2970.                     get: (function () {
  2971.                         return FS.isDir(this.mode)
  2972.                     })
  2973.                 }, isDevice: {
  2974.                     get: (function () {
  2975.                         return FS.isChrdev(this.mode)
  2976.                     })
  2977.                 }
  2978.             })
  2979.         }
  2980.         var node = new FS.FSNode(parent, name, mode, rdev);
  2981.         FS.hashAddNode(node);
  2982.         return node
  2983.     }),
  2984.     destroyNode: (function (node) {
  2985.         FS.hashRemoveNode(node)
  2986.     }),
  2987.     isRoot: (function (node) {
  2988.         return node === node.parent
  2989.     }),
  2990.     isMountpoint: (function (node) {
  2991.         return !!node.mounted
  2992.     }),
  2993.     isFile: (function (mode) {
  2994.         return (mode & 61440) === 32768
  2995.     }),
  2996.     isDir: (function (mode) {
  2997.         return (mode & 61440) === 16384
  2998.     }),
  2999.     isLink: (function (mode) {
  3000.         return (mode & 61440) === 40960
  3001.     }),
  3002.     isChrdev: (function (mode) {
  3003.         return (mode & 61440) === 8192
  3004.     }),
  3005.     isBlkdev: (function (mode) {
  3006.         return (mode & 61440) === 24576
  3007.     }),
  3008.     isFIFO: (function (mode) {
  3009.         return (mode & 61440) === 4096
  3010.     }),
  3011.     isSocket: (function (mode) {
  3012.         return (mode & 49152) === 49152
  3013.     }),
  3014.     flagModes: {
  3015.         "r": 0,
  3016.         "rs": 1052672,
  3017.         "r+": 2,
  3018.         "w": 577,
  3019.         "wx": 705,
  3020.         "xw": 705,
  3021.         "w+": 578,
  3022.         "wx+": 706,
  3023.         "xw+": 706,
  3024.         "a": 1089,
  3025.         "ax": 1217,
  3026.         "xa": 1217,
  3027.         "a+": 1090,
  3028.         "ax+": 1218,
  3029.         "xa+": 1218
  3030.     },
  3031.     modeStringToFlags: (function (str) {
  3032.         var flags = FS.flagModes[str];
  3033.         if (typeof flags === "undefined") {
  3034.             throw new Error("Unknown file open mode: " + str)
  3035.         }
  3036.         return flags
  3037.     }),
  3038.     flagsToPermissionString: (function (flag) {
  3039.         var perms = ["r", "w", "rw"][flag & 3];
  3040.         if (flag & 512) {
  3041.             perms += "w"
  3042.         }
  3043.         return perms
  3044.     }),
  3045.     nodePermissions: (function (node, perms) {
  3046.         if (FS.ignorePermissions) {
  3047.             return 0
  3048.         }
  3049.         if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  3050.             return ERRNO_CODES.EACCES
  3051.         } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  3052.             return ERRNO_CODES.EACCES
  3053.         } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  3054.             return ERRNO_CODES.EACCES
  3055.         }
  3056.         return 0
  3057.     }),
  3058.     mayLookup: (function (dir) {
  3059.         var err = FS.nodePermissions(dir, "x");
  3060.         if (err) return err;
  3061.         if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES;
  3062.         return 0
  3063.     }),
  3064.     mayCreate: (function (dir, name) {
  3065.         try {
  3066.             var node = FS.lookupNode(dir, name);
  3067.             return ERRNO_CODES.EEXIST
  3068.         } catch (e) {
  3069.         }
  3070.         return FS.nodePermissions(dir, "wx")
  3071.     }),
  3072.     mayDelete: (function (dir, name, isdir) {
  3073.         var node;
  3074.         try {
  3075.             node = FS.lookupNode(dir, name)
  3076.         } catch (e) {
  3077.             return e.errno
  3078.         }
  3079.         var err = FS.nodePermissions(dir, "wx");
  3080.         if (err) {
  3081.             return err
  3082.         }
  3083.         if (isdir) {
  3084.             if (!FS.isDir(node.mode)) {
  3085.                 return ERRNO_CODES.ENOTDIR
  3086.             }
  3087.             if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  3088.                 return ERRNO_CODES.EBUSY
  3089.             }
  3090.         } else {
  3091.             if (FS.isDir(node.mode)) {
  3092.                 return ERRNO_CODES.EISDIR
  3093.             }
  3094.         }
  3095.         return 0
  3096.     }),
  3097.     mayOpen: (function (node, flags) {
  3098.         if (!node) {
  3099.             return ERRNO_CODES.ENOENT
  3100.         }
  3101.         if (FS.isLink(node.mode)) {
  3102.             return ERRNO_CODES.ELOOP
  3103.         } else if (FS.isDir(node.mode)) {
  3104.             if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  3105.                 return ERRNO_CODES.EISDIR
  3106.             }
  3107.         }
  3108.         return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
  3109.     }),
  3110.     MAX_OPEN_FDS: 4096,
  3111.     nextfd: (function (fd_start, fd_end) {
  3112.         fd_start = fd_start || 0;
  3113.         fd_end = fd_end || FS.MAX_OPEN_FDS;
  3114.         for (var fd = fd_start; fd <= fd_end; fd++) {
  3115.             if (!FS.streams[fd]) {
  3116.                 return fd
  3117.             }
  3118.         }
  3119.         throw new FS.ErrnoError(ERRNO_CODES.EMFILE)
  3120.     }),
  3121.     getStream: (function (fd) {
  3122.         return FS.streams[fd]
  3123.     }),
  3124.     createStream: (function (stream, fd_start, fd_end) {
  3125.         if (!FS.FSStream) {
  3126.             FS.FSStream = (function () {
  3127.             });
  3128.             FS.FSStream.prototype = {};
  3129.             Object.defineProperties(FS.FSStream.prototype, {
  3130.                 object: {
  3131.                     get: (function () {
  3132.                         return this.node
  3133.                     }), set: (function (val) {
  3134.                         this.node = val
  3135.                     })
  3136.                 }, isRead: {
  3137.                     get: (function () {
  3138.                         return (this.flags & 2097155) !== 1
  3139.                     })
  3140.                 }, isWrite: {
  3141.                     get: (function () {
  3142.                         return (this.flags & 2097155) !== 0
  3143.                     })
  3144.                 }, isAppend: {
  3145.                     get: (function () {
  3146.                         return this.flags & 1024
  3147.                     })
  3148.                 }
  3149.             })
  3150.         }
  3151.         var newStream = new FS.FSStream;
  3152.         for (var p in stream) {
  3153.             newStream[p] = stream[p]
  3154.         }
  3155.         stream = newStream;
  3156.         var fd = FS.nextfd(fd_start, fd_end);
  3157.         stream.fd = fd;
  3158.         FS.streams[fd] = stream;
  3159.         return stream
  3160.     }),
  3161.     closeStream: (function (fd) {
  3162.         FS.streams[fd] = null
  3163.     }),
  3164.     chrdev_stream_ops: {
  3165.         open: (function (stream) {
  3166.             var device = FS.getDevice(stream.node.rdev);
  3167.             stream.stream_ops = device.stream_ops;
  3168.             if (stream.stream_ops.open) {
  3169.                 stream.stream_ops.open(stream)
  3170.             }
  3171.         }), llseek: (function () {
  3172.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3173.         })
  3174.     },
  3175.     major: (function (dev) {
  3176.         return dev >> 8
  3177.     }),
  3178.     minor: (function (dev) {
  3179.         return dev & 255
  3180.     }),
  3181.     makedev: (function (ma, mi) {
  3182.         return ma << 8 | mi
  3183.     }),
  3184.     registerDevice: (function (dev, ops) {
  3185.         FS.devices[dev] = {stream_ops: ops}
  3186.     }),
  3187.     getDevice: (function (dev) {
  3188.         return FS.devices[dev]
  3189.     }),
  3190.     getMounts: (function (mount) {
  3191.         var mounts = [];
  3192.         var check = [mount];
  3193.         while (check.length) {
  3194.             var m = check.pop();
  3195.             mounts.push(m);
  3196.             check.push.apply(check, m.mounts)
  3197.         }
  3198.         return mounts
  3199.     }),
  3200.     syncfs: (function (populate, callback) {
  3201.         if (typeof populate === "function") {
  3202.             callback = populate;
  3203.             populate = false
  3204.         }
  3205.         FS.syncFSRequests++;
  3206.         if (FS.syncFSRequests > 1) {
  3207.             console.log("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work")
  3208.         }
  3209.         var mounts = FS.getMounts(FS.root.mount);
  3210.         var completed = 0;
  3211.  
  3212.         function doCallback(err) {
  3213.             assert(FS.syncFSRequests > 0);
  3214.             FS.syncFSRequests--;
  3215.             return callback(err)
  3216.         }
  3217.  
  3218.         function done(err) {
  3219.             if (err) {
  3220.                 if (!done.errored) {
  3221.                     done.errored = true;
  3222.                     return doCallback(err)
  3223.                 }
  3224.                 return
  3225.             }
  3226.             if (++completed >= mounts.length) {
  3227.                 doCallback(null)
  3228.             }
  3229.         }
  3230.  
  3231.         mounts.forEach((function (mount) {
  3232.             if (!mount.type.syncfs) {
  3233.                 return done(null)
  3234.             }
  3235.             mount.type.syncfs(mount, populate, done)
  3236.         }))
  3237.     }),
  3238.     mount: (function (type, opts, mountpoint) {
  3239.         var root = mountpoint === "/";
  3240.         var pseudo = !mountpoint;
  3241.         var node;
  3242.         if (root && FS.root) {
  3243.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3244.         } else if (!root && !pseudo) {
  3245.             var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  3246.             mountpoint = lookup.path;
  3247.             node = lookup.node;
  3248.             if (FS.isMountpoint(node)) {
  3249.                 throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3250.             }
  3251.             if (!FS.isDir(node.mode)) {
  3252.                 throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3253.             }
  3254.         }
  3255.         var mount = {type: type, opts: opts, mountpoint: mountpoint, mounts: []};
  3256.         var mountRoot = type.mount(mount);
  3257.         mountRoot.mount = mount;
  3258.         mount.root = mountRoot;
  3259.         if (root) {
  3260.             FS.root = mountRoot
  3261.         } else if (node) {
  3262.             node.mounted = mount;
  3263.             if (node.mount) {
  3264.                 node.mount.mounts.push(mount)
  3265.             }
  3266.         }
  3267.         return mountRoot
  3268.     }),
  3269.     unmount: (function (mountpoint) {
  3270.         var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  3271.         if (!FS.isMountpoint(lookup.node)) {
  3272.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3273.         }
  3274.         var node = lookup.node;
  3275.         var mount = node.mounted;
  3276.         var mounts = FS.getMounts(mount);
  3277.         Object.keys(FS.nameTable).forEach((function (hash) {
  3278.             var current = FS.nameTable[hash];
  3279.             while (current) {
  3280.                 var next = current.name_next;
  3281.                 if (mounts.indexOf(current.mount) !== -1) {
  3282.                     FS.destroyNode(current)
  3283.                 }
  3284.                 current = next
  3285.             }
  3286.         }));
  3287.         node.mounted = null;
  3288.         var idx = node.mount.mounts.indexOf(mount);
  3289.         assert(idx !== -1);
  3290.         node.mount.mounts.splice(idx, 1)
  3291.     }),
  3292.     lookup: (function (parent, name) {
  3293.         return parent.node_ops.lookup(parent, name)
  3294.     }),
  3295.     mknod: (function (path, mode, dev) {
  3296.         var lookup = FS.lookupPath(path, {parent: true});
  3297.         var parent = lookup.node;
  3298.         var name = PATH.basename(path);
  3299.         if (!name || name === "." || name === "..") {
  3300.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3301.         }
  3302.         var err = FS.mayCreate(parent, name);
  3303.         if (err) {
  3304.             throw new FS.ErrnoError(err)
  3305.         }
  3306.         if (!parent.node_ops.mknod) {
  3307.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3308.         }
  3309.         return parent.node_ops.mknod(parent, name, mode, dev)
  3310.     }),
  3311.     create: (function (path, mode) {
  3312.         mode = mode !== undefined ? mode : 438;
  3313.         mode &= 4095;
  3314.         mode |= 32768;
  3315.         return FS.mknod(path, mode, 0)
  3316.     }),
  3317.     mkdir: (function (path, mode) {
  3318.         mode = mode !== undefined ? mode : 511;
  3319.         mode &= 511 | 512;
  3320.         mode |= 16384;
  3321.         return FS.mknod(path, mode, 0)
  3322.     }),
  3323.     mkdirTree: (function (path, mode) {
  3324.         var dirs = path.split("/");
  3325.         var d = "";
  3326.         for (var i = 0; i < dirs.length; ++i) {
  3327.             if (!dirs[i]) continue;
  3328.             d += "/" + dirs[i];
  3329.             try {
  3330.                 FS.mkdir(d, mode)
  3331.             } catch (e) {
  3332.                 if (e.errno != ERRNO_CODES.EEXIST) throw e
  3333.             }
  3334.         }
  3335.     }),
  3336.     mkdev: (function (path, mode, dev) {
  3337.         if (typeof dev === "undefined") {
  3338.             dev = mode;
  3339.             mode = 438
  3340.         }
  3341.         mode |= 8192;
  3342.         return FS.mknod(path, mode, dev)
  3343.     }),
  3344.     symlink: (function (oldpath, newpath) {
  3345.         if (!PATH.resolve(oldpath)) {
  3346.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3347.         }
  3348.         var lookup = FS.lookupPath(newpath, {parent: true});
  3349.         var parent = lookup.node;
  3350.         if (!parent) {
  3351.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3352.         }
  3353.         var newname = PATH.basename(newpath);
  3354.         var err = FS.mayCreate(parent, newname);
  3355.         if (err) {
  3356.             throw new FS.ErrnoError(err)
  3357.         }
  3358.         if (!parent.node_ops.symlink) {
  3359.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3360.         }
  3361.         return parent.node_ops.symlink(parent, newname, oldpath)
  3362.     }),
  3363.     rename: (function (old_path, new_path) {
  3364.         var old_dirname = PATH.dirname(old_path);
  3365.         var new_dirname = PATH.dirname(new_path);
  3366.         var old_name = PATH.basename(old_path);
  3367.         var new_name = PATH.basename(new_path);
  3368.         var lookup, old_dir, new_dir;
  3369.         try {
  3370.             lookup = FS.lookupPath(old_path, {parent: true});
  3371.             old_dir = lookup.node;
  3372.             lookup = FS.lookupPath(new_path, {parent: true});
  3373.             new_dir = lookup.node
  3374.         } catch (e) {
  3375.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3376.         }
  3377.         if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
  3378.         if (old_dir.mount !== new_dir.mount) {
  3379.             throw new FS.ErrnoError(ERRNO_CODES.EXDEV)
  3380.         }
  3381.         var old_node = FS.lookupNode(old_dir, old_name);
  3382.         var relative = PATH.relative(old_path, new_dirname);
  3383.         if (relative.charAt(0) !== ".") {
  3384.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3385.         }
  3386.         relative = PATH.relative(new_path, old_dirname);
  3387.         if (relative.charAt(0) !== ".") {
  3388.             throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  3389.         }
  3390.         var new_node;
  3391.         try {
  3392.             new_node = FS.lookupNode(new_dir, new_name)
  3393.         } catch (e) {
  3394.         }
  3395.         if (old_node === new_node) {
  3396.             return
  3397.         }
  3398.         var isdir = FS.isDir(old_node.mode);
  3399.         var err = FS.mayDelete(old_dir, old_name, isdir);
  3400.         if (err) {
  3401.             throw new FS.ErrnoError(err)
  3402.         }
  3403.         err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  3404.         if (err) {
  3405.             throw new FS.ErrnoError(err)
  3406.         }
  3407.         if (!old_dir.node_ops.rename) {
  3408.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3409.         }
  3410.         if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  3411.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3412.         }
  3413.         if (new_dir !== old_dir) {
  3414.             err = FS.nodePermissions(old_dir, "w");
  3415.             if (err) {
  3416.                 throw new FS.ErrnoError(err)
  3417.             }
  3418.         }
  3419.         try {
  3420.             if (FS.trackingDelegate["willMovePath"]) {
  3421.                 FS.trackingDelegate["willMovePath"](old_path, new_path)
  3422.             }
  3423.         } catch (e) {
  3424.             console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3425.         }
  3426.         FS.hashRemoveNode(old_node);
  3427.         try {
  3428.             old_dir.node_ops.rename(old_node, new_dir, new_name)
  3429.         } catch (e) {
  3430.             throw e
  3431.         } finally {
  3432.             FS.hashAddNode(old_node)
  3433.         }
  3434.         try {
  3435.             if (FS.trackingDelegate["onMovePath"]) FS.trackingDelegate["onMovePath"](old_path, new_path)
  3436.         } catch (e) {
  3437.             console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3438.         }
  3439.     }),
  3440.     rmdir: (function (path) {
  3441.         var lookup = FS.lookupPath(path, {parent: true});
  3442.         var parent = lookup.node;
  3443.         var name = PATH.basename(path);
  3444.         var node = FS.lookupNode(parent, name);
  3445.         var err = FS.mayDelete(parent, name, true);
  3446.         if (err) {
  3447.             throw new FS.ErrnoError(err)
  3448.         }
  3449.         if (!parent.node_ops.rmdir) {
  3450.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3451.         }
  3452.         if (FS.isMountpoint(node)) {
  3453.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3454.         }
  3455.         try {
  3456.             if (FS.trackingDelegate["willDeletePath"]) {
  3457.                 FS.trackingDelegate["willDeletePath"](path)
  3458.             }
  3459.         } catch (e) {
  3460.             console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3461.         }
  3462.         parent.node_ops.rmdir(parent, name);
  3463.         FS.destroyNode(node);
  3464.         try {
  3465.             if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3466.         } catch (e) {
  3467.             console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3468.         }
  3469.     }),
  3470.     readdir: (function (path) {
  3471.         var lookup = FS.lookupPath(path, {follow: true});
  3472.         var node = lookup.node;
  3473.         if (!node.node_ops.readdir) {
  3474.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3475.         }
  3476.         return node.node_ops.readdir(node)
  3477.     }),
  3478.     unlink: (function (path) {
  3479.         var lookup = FS.lookupPath(path, {parent: true});
  3480.         var parent = lookup.node;
  3481.         var name = PATH.basename(path);
  3482.         var node = FS.lookupNode(parent, name);
  3483.         var err = FS.mayDelete(parent, name, false);
  3484.         if (err) {
  3485.             throw new FS.ErrnoError(err)
  3486.         }
  3487.         if (!parent.node_ops.unlink) {
  3488.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3489.         }
  3490.         if (FS.isMountpoint(node)) {
  3491.             throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3492.         }
  3493.         try {
  3494.             if (FS.trackingDelegate["willDeletePath"]) {
  3495.                 FS.trackingDelegate["willDeletePath"](path)
  3496.             }
  3497.         } catch (e) {
  3498.             console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3499.         }
  3500.         parent.node_ops.unlink(parent, name);
  3501.         FS.destroyNode(node);
  3502.         try {
  3503.             if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3504.         } catch (e) {
  3505.             console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3506.         }
  3507.     }),
  3508.     readlink: (function (path) {
  3509.         var lookup = FS.lookupPath(path);
  3510.         var link = lookup.node;
  3511.         if (!link) {
  3512.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3513.         }
  3514.         if (!link.node_ops.readlink) {
  3515.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3516.         }
  3517.         return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link))
  3518.     }),
  3519.     stat: (function (path, dontFollow) {
  3520.         var lookup = FS.lookupPath(path, {follow: !dontFollow});
  3521.         var node = lookup.node;
  3522.         if (!node) {
  3523.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3524.         }
  3525.         if (!node.node_ops.getattr) {
  3526.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3527.         }
  3528.         return node.node_ops.getattr(node)
  3529.     }),
  3530.     lstat: (function (path) {
  3531.         return FS.stat(path, true)
  3532.     }),
  3533.     chmod: (function (path, mode, dontFollow) {
  3534.         var node;
  3535.         if (typeof path === "string") {
  3536.             var lookup = FS.lookupPath(path, {follow: !dontFollow});
  3537.             node = lookup.node
  3538.         } else {
  3539.             node = path
  3540.         }
  3541.         if (!node.node_ops.setattr) {
  3542.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3543.         }
  3544.         node.node_ops.setattr(node, {mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now()})
  3545.     }),
  3546.     lchmod: (function (path, mode) {
  3547.         FS.chmod(path, mode, true)
  3548.     }),
  3549.     fchmod: (function (fd, mode) {
  3550.         var stream = FS.getStream(fd);
  3551.         if (!stream) {
  3552.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3553.         }
  3554.         FS.chmod(stream.node, mode)
  3555.     }),
  3556.     chown: (function (path, uid, gid, dontFollow) {
  3557.         var node;
  3558.         if (typeof path === "string") {
  3559.             var lookup = FS.lookupPath(path, {follow: !dontFollow});
  3560.             node = lookup.node
  3561.         } else {
  3562.             node = path
  3563.         }
  3564.         if (!node.node_ops.setattr) {
  3565.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3566.         }
  3567.         node.node_ops.setattr(node, {timestamp: Date.now()})
  3568.     }),
  3569.     lchown: (function (path, uid, gid) {
  3570.         FS.chown(path, uid, gid, true)
  3571.     }),
  3572.     fchown: (function (fd, uid, gid) {
  3573.         var stream = FS.getStream(fd);
  3574.         if (!stream) {
  3575.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3576.         }
  3577.         FS.chown(stream.node, uid, gid)
  3578.     }),
  3579.     truncate: (function (path, len) {
  3580.         if (len < 0) {
  3581.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3582.         }
  3583.         var node;
  3584.         if (typeof path === "string") {
  3585.             var lookup = FS.lookupPath(path, {follow: true});
  3586.             node = lookup.node
  3587.         } else {
  3588.             node = path
  3589.         }
  3590.         if (!node.node_ops.setattr) {
  3591.             throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3592.         }
  3593.         if (FS.isDir(node.mode)) {
  3594.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3595.         }
  3596.         if (!FS.isFile(node.mode)) {
  3597.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3598.         }
  3599.         var err = FS.nodePermissions(node, "w");
  3600.         if (err) {
  3601.             throw new FS.ErrnoError(err)
  3602.         }
  3603.         node.node_ops.setattr(node, {size: len, timestamp: Date.now()})
  3604.     }),
  3605.     ftruncate: (function (fd, len) {
  3606.         var stream = FS.getStream(fd);
  3607.         if (!stream) {
  3608.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3609.         }
  3610.         if ((stream.flags & 2097155) === 0) {
  3611.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3612.         }
  3613.         FS.truncate(stream.node, len)
  3614.     }),
  3615.     utime: (function (path, atime, mtime) {
  3616.         var lookup = FS.lookupPath(path, {follow: true});
  3617.         var node = lookup.node;
  3618.         node.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)})
  3619.     }),
  3620.     open: (function (path, flags, mode, fd_start, fd_end) {
  3621.         if (path === "") {
  3622.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3623.         }
  3624.         flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  3625.         mode = typeof mode === "undefined" ? 438 : mode;
  3626.         if (flags & 64) {
  3627.             mode = mode & 4095 | 32768
  3628.         } else {
  3629.             mode = 0
  3630.         }
  3631.         var node;
  3632.         if (typeof path === "object") {
  3633.             node = path
  3634.         } else {
  3635.             path = PATH.normalize(path);
  3636.             try {
  3637.                 var lookup = FS.lookupPath(path, {follow: !(flags & 131072)});
  3638.                 node = lookup.node
  3639.             } catch (e) {
  3640.             }
  3641.         }
  3642.         var created = false;
  3643.         if (flags & 64) {
  3644.             if (node) {
  3645.                 if (flags & 128) {
  3646.                     throw new FS.ErrnoError(ERRNO_CODES.EEXIST)
  3647.                 }
  3648.             } else {
  3649.                 node = FS.mknod(path, mode, 0);
  3650.                 created = true
  3651.             }
  3652.         }
  3653.         if (!node) {
  3654.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3655.         }
  3656.         if (FS.isChrdev(node.mode)) {
  3657.             flags &= ~512
  3658.         }
  3659.         if (flags & 65536 && !FS.isDir(node.mode)) {
  3660.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3661.         }
  3662.         if (!created) {
  3663.             var err = FS.mayOpen(node, flags);
  3664.             if (err) {
  3665.                 throw new FS.ErrnoError(err)
  3666.             }
  3667.         }
  3668.         if (flags & 512) {
  3669.             FS.truncate(node, 0)
  3670.         }
  3671.         flags &= ~(128 | 512);
  3672.         var stream = FS.createStream({
  3673.             node: node,
  3674.             path: FS.getPath(node),
  3675.             flags: flags,
  3676.             seekable: true,
  3677.             position: 0,
  3678.             stream_ops: node.stream_ops,
  3679.             ungotten: [],
  3680.             error: false
  3681.         }, fd_start, fd_end);
  3682.         if (stream.stream_ops.open) {
  3683.             stream.stream_ops.open(stream)
  3684.         }
  3685.         if (Module["logReadFiles"] && !(flags & 1)) {
  3686.             if (!FS.readFiles) FS.readFiles = {};
  3687.             if (!(path in FS.readFiles)) {
  3688.                 FS.readFiles[path] = 1;
  3689.                 Module["printErr"]("read file: " + path)
  3690.             }
  3691.         }
  3692.         try {
  3693.             if (FS.trackingDelegate["onOpenFile"]) {
  3694.                 var trackingFlags = 0;
  3695.                 if ((flags & 2097155) !== 1) {
  3696.                     trackingFlags |= FS.tracking.openFlags.READ
  3697.                 }
  3698.                 if ((flags & 2097155) !== 0) {
  3699.                     trackingFlags |= FS.tracking.openFlags.WRITE
  3700.                 }
  3701.                 FS.trackingDelegate["onOpenFile"](path, trackingFlags)
  3702.             }
  3703.         } catch (e) {
  3704.             console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message)
  3705.         }
  3706.         return stream
  3707.     }),
  3708.     close: (function (stream) {
  3709.         if (stream.getdents) stream.getdents = null;
  3710.         try {
  3711.             if (stream.stream_ops.close) {
  3712.                 stream.stream_ops.close(stream)
  3713.             }
  3714.         } catch (e) {
  3715.             throw e
  3716.         } finally {
  3717.             FS.closeStream(stream.fd)
  3718.         }
  3719.     }),
  3720.     llseek: (function (stream, offset, whence) {
  3721.         if (!stream.seekable || !stream.stream_ops.llseek) {
  3722.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3723.         }
  3724.         stream.position = stream.stream_ops.llseek(stream, offset, whence);
  3725.         stream.ungotten = [];
  3726.         return stream.position
  3727.     }),
  3728.     read: (function (stream, buffer, offset, length, position) {
  3729.         if (length < 0 || position < 0) {
  3730.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3731.         }
  3732.         if ((stream.flags & 2097155) === 1) {
  3733.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3734.         }
  3735.         if (FS.isDir(stream.node.mode)) {
  3736.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3737.         }
  3738.         if (!stream.stream_ops.read) {
  3739.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3740.         }
  3741.         var seeking = true;
  3742.         if (typeof position === "undefined") {
  3743.             position = stream.position;
  3744.             seeking = false
  3745.         } else if (!stream.seekable) {
  3746.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3747.         }
  3748.         var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
  3749.         if (!seeking) stream.position += bytesRead;
  3750.         return bytesRead
  3751.     }),
  3752.     write: (function (stream, buffer, offset, length, position, canOwn) {
  3753.         if (length < 0 || position < 0) {
  3754.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3755.         }
  3756.         if ((stream.flags & 2097155) === 0) {
  3757.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3758.         }
  3759.         if (FS.isDir(stream.node.mode)) {
  3760.             throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3761.         }
  3762.         if (!stream.stream_ops.write) {
  3763.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3764.         }
  3765.         if (stream.flags & 1024) {
  3766.             FS.llseek(stream, 0, 2)
  3767.         }
  3768.         var seeking = true;
  3769.         if (typeof position === "undefined") {
  3770.             position = stream.position;
  3771.             seeking = false
  3772.         } else if (!stream.seekable) {
  3773.             throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3774.         }
  3775.         var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
  3776.         if (!seeking) stream.position += bytesWritten;
  3777.         try {
  3778.             if (stream.path && FS.trackingDelegate["onWriteToFile"]) FS.trackingDelegate["onWriteToFile"](stream.path)
  3779.         } catch (e) {
  3780.             console.log("FS.trackingDelegate['onWriteToFile']('" + path + "') threw an exception: " + e.message)
  3781.         }
  3782.         return bytesWritten
  3783.     }),
  3784.     allocate: (function (stream, offset, length) {
  3785.         if (offset < 0 || length <= 0) {
  3786.             throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3787.         }
  3788.         if ((stream.flags & 2097155) === 0) {
  3789.             throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3790.         }
  3791.         if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  3792.             throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  3793.         }
  3794.         if (!stream.stream_ops.allocate) {
  3795.             throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)
  3796.         }
  3797.         stream.stream_ops.allocate(stream, offset, length)
  3798.     }),
  3799.     mmap: (function (stream, buffer, offset, length, position, prot, flags) {
  3800.         if ((stream.flags & 2097155) === 1) {
  3801.             throw new FS.ErrnoError(ERRNO_CODES.EACCES)
  3802.         }
  3803.         if (!stream.stream_ops.mmap) {
  3804.             throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  3805.         }
  3806.         return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags)
  3807.     }),
  3808.     msync: (function (stream, buffer, offset, length, mmapFlags) {
  3809.         if (!stream || !stream.stream_ops.msync) {
  3810.             return 0
  3811.         }
  3812.         return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
  3813.     }),
  3814.     munmap: (function (stream) {
  3815.         return 0
  3816.     }),
  3817.     ioctl: (function (stream, cmd, arg) {
  3818.         if (!stream.stream_ops.ioctl) {
  3819.             throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)
  3820.         }
  3821.         return stream.stream_ops.ioctl(stream, cmd, arg)
  3822.     }),
  3823.     readFile: (function (path, opts) {
  3824.         opts = opts || {};
  3825.         opts.flags = opts.flags || "r";
  3826.         opts.encoding = opts.encoding || "binary";
  3827.         if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  3828.             throw new Error('Invalid encoding type "' + opts.encoding + '"')
  3829.         }
  3830.         var ret;
  3831.         var stream = FS.open(path, opts.flags);
  3832.         var stat = FS.stat(path);
  3833.         var length = stat.size;
  3834.         var buf = new Uint8Array(length);
  3835.         FS.read(stream, buf, 0, length, 0);
  3836.         if (opts.encoding === "utf8") {
  3837.             ret = UTF8ArrayToString(buf, 0)
  3838.         } else if (opts.encoding === "binary") {
  3839.             ret = buf
  3840.         }
  3841.         FS.close(stream);
  3842.         return ret
  3843.     }),
  3844.     writeFile: (function (path, data, opts) {
  3845.         opts = opts || {};
  3846.         opts.flags = opts.flags || "w";
  3847.         opts.encoding = opts.encoding || "utf8";
  3848.         if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  3849.             throw new Error('Invalid encoding type "' + opts.encoding + '"')
  3850.         }
  3851.         var stream = FS.open(path, opts.flags, opts.mode);
  3852.         if (opts.encoding === "utf8") {
  3853.             var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  3854.             var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  3855.             FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn)
  3856.         } else if (opts.encoding === "binary") {
  3857.             FS.write(stream, data, 0, data.length, 0, opts.canOwn)
  3858.         }
  3859.         FS.close(stream)
  3860.     }),
  3861.     cwd: (function () {
  3862.         return FS.currentPath
  3863.     }),
  3864.     chdir: (function (path) {
  3865.         var lookup = FS.lookupPath(path, {follow: true});
  3866.         if (lookup.node === null) {
  3867.             throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3868.         }
  3869.         if (!FS.isDir(lookup.node.mode)) {
  3870.             throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3871.         }
  3872.         var err = FS.nodePermissions(lookup.node, "x");
  3873.         if (err) {
  3874.             throw new FS.ErrnoError(err)
  3875.         }
  3876.         FS.currentPath = lookup.path
  3877.     }),
  3878.     createDefaultDirectories: (function () {
  3879.         FS.mkdir("/tmp");
  3880.         FS.mkdir("/home");
  3881.         FS.mkdir("/home/web_user")
  3882.     }),
  3883.     createDefaultDevices: (function () {
  3884.         FS.mkdir("/dev");
  3885.         FS.registerDevice(FS.makedev(1, 3), {
  3886.             read: (function () {
  3887.                 return 0
  3888.             }), write: (function (stream, buffer, offset, length, pos) {
  3889.                 return length
  3890.             })
  3891.         });
  3892.         FS.mkdev("/dev/null", FS.makedev(1, 3));
  3893.         TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  3894.         TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  3895.         FS.mkdev("/dev/tty", FS.makedev(5, 0));
  3896.         FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  3897.         var random_device;
  3898.         if (typeof crypto !== "undefined") {
  3899.             var randomBuffer = new Uint8Array(1);
  3900.             random_device = (function () {
  3901.                 crypto.getRandomValues(randomBuffer);
  3902.                 return randomBuffer[0]
  3903.             })
  3904.         } else if (ENVIRONMENT_IS_NODE) {
  3905.             random_device = (function () {
  3906.                 return require("crypto").randomBytes(1)[0]
  3907.             })
  3908.         } else {
  3909.             random_device = (function () {
  3910.                 return Math.random() * 256 | 0
  3911.             })
  3912.         }
  3913.         FS.createDevice("/dev", "random", random_device);
  3914.         FS.createDevice("/dev", "urandom", random_device);
  3915.         FS.mkdir("/dev/shm");
  3916.         FS.mkdir("/dev/shm/tmp")
  3917.     }),
  3918.     createSpecialDirectories: (function () {
  3919.         FS.mkdir("/proc");
  3920.         FS.mkdir("/proc/self");
  3921.         FS.mkdir("/proc/self/fd");
  3922.         FS.mount({
  3923.             mount: (function () {
  3924.                 var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  3925.                 node.node_ops = {
  3926.                     lookup: (function (parent, name) {
  3927.                         var fd = +name;
  3928.                         var stream = FS.getStream(fd);
  3929.                         if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  3930.                         var ret = {
  3931.                             parent: null, mount: {mountpoint: "fake"}, node_ops: {
  3932.                                 readlink: (function () {
  3933.                                     return stream.path
  3934.                                 })
  3935.                             }
  3936.                         };
  3937.                         ret.parent = ret;
  3938.                         return ret
  3939.                     })
  3940.                 };
  3941.                 return node
  3942.             })
  3943.         }, {}, "/proc/self/fd")
  3944.     }),
  3945.     createStandardStreams: (function () {
  3946.         if (Module["stdin"]) {
  3947.             FS.createDevice("/dev", "stdin", Module["stdin"])
  3948.         } else {
  3949.             FS.symlink("/dev/tty", "/dev/stdin")
  3950.         }
  3951.         if (Module["stdout"]) {
  3952.             FS.createDevice("/dev", "stdout", null, Module["stdout"])
  3953.         } else {
  3954.             FS.symlink("/dev/tty", "/dev/stdout")
  3955.         }
  3956.         if (Module["stderr"]) {
  3957.             FS.createDevice("/dev", "stderr", null, Module["stderr"])
  3958.         } else {
  3959.             FS.symlink("/dev/tty1", "/dev/stderr")
  3960.         }
  3961.         var stdin = FS.open("/dev/stdin", "r");
  3962.         assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")");
  3963.         var stdout = FS.open("/dev/stdout", "w");
  3964.         assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")");
  3965.         var stderr = FS.open("/dev/stderr", "w");
  3966.         assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")")
  3967.     }),
  3968.     ensureErrnoError: (function () {
  3969.         if (FS.ErrnoError) return;
  3970.         FS.ErrnoError = function ErrnoError(errno, node) {
  3971.             this.node = node;
  3972.             this.setErrno = (function (errno) {
  3973.                 this.errno = errno;
  3974.                 for (var key in ERRNO_CODES) {
  3975.                     if (ERRNO_CODES[key] === errno) {
  3976.                         this.code = key;
  3977.                         break
  3978.                     }
  3979.                 }
  3980.             });
  3981.             this.setErrno(errno);
  3982.             this.message = ERRNO_MESSAGES[errno]
  3983.         };
  3984.         FS.ErrnoError.prototype = new Error;
  3985.         FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  3986.         [ERRNO_CODES.ENOENT].forEach((function (code) {
  3987.             FS.genericErrors[code] = new FS.ErrnoError(code);
  3988.             FS.genericErrors[code].stack = "<generic error, no stack>"
  3989.         }))
  3990.     }),
  3991.     staticInit: (function () {
  3992.         FS.ensureErrnoError();
  3993.         FS.nameTable = new Array(4096);
  3994.         FS.mount(MEMFS, {}, "/");
  3995.         FS.createDefaultDirectories();
  3996.         FS.createDefaultDevices();
  3997.         FS.createSpecialDirectories();
  3998.         FS.filesystems = {"MEMFS": MEMFS, "IDBFS": IDBFS, "NODEFS": NODEFS, "WORKERFS": WORKERFS}
  3999.     }),
  4000.     init: (function (input, output, error) {
  4001.         assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
  4002.         FS.init.initialized = true;
  4003.         FS.ensureErrnoError();
  4004.         Module["stdin"] = input || Module["stdin"];
  4005.         Module["stdout"] = output || Module["stdout"];
  4006.         Module["stderr"] = error || Module["stderr"];
  4007.         FS.createStandardStreams()
  4008.     }),
  4009.     quit: (function () {
  4010.         FS.init.initialized = false;
  4011.         var fflush = Module["_fflush"];
  4012.         if (fflush) fflush(0);
  4013.         for (var i = 0; i < FS.streams.length; i++) {
  4014.             var stream = FS.streams[i];
  4015.             if (!stream) {
  4016.                 continue
  4017.             }
  4018.             FS.close(stream)
  4019.         }
  4020.     }),
  4021.     getMode: (function (canRead, canWrite) {
  4022.         var mode = 0;
  4023.         if (canRead) mode |= 292 | 73;
  4024.         if (canWrite) mode |= 146;
  4025.         return mode
  4026.     }),
  4027.     joinPath: (function (parts, forceRelative) {
  4028.         var path = PATH.join.apply(null, parts);
  4029.         if (forceRelative && path[0] == "/") path = path.substr(1);
  4030.         return path
  4031.     }),
  4032.     absolutePath: (function (relative, base) {
  4033.         return PATH.resolve(base, relative)
  4034.     }),
  4035.     standardizePath: (function (path) {
  4036.         return PATH.normalize(path)
  4037.     }),
  4038.     findObject: (function (path, dontResolveLastLink) {
  4039.         var ret = FS.analyzePath(path, dontResolveLastLink);
  4040.         if (ret.exists) {
  4041.             return ret.object
  4042.         } else {
  4043.             ___setErrNo(ret.error);
  4044.             return null
  4045.         }
  4046.     }),
  4047.     analyzePath: (function (path, dontResolveLastLink) {
  4048.         try {
  4049.             var lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  4050.             path = lookup.path
  4051.         } catch (e) {
  4052.         }
  4053.         var ret = {
  4054.             isRoot: false,
  4055.             exists: false,
  4056.             error: 0,
  4057.             name: null,
  4058.             path: null,
  4059.             object: null,
  4060.             parentExists: false,
  4061.             parentPath: null,
  4062.             parentObject: null
  4063.         };
  4064.         try {
  4065.             var lookup = FS.lookupPath(path, {parent: true});
  4066.             ret.parentExists = true;
  4067.             ret.parentPath = lookup.path;
  4068.             ret.parentObject = lookup.node;
  4069.             ret.name = PATH.basename(path);
  4070.             lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  4071.             ret.exists = true;
  4072.             ret.path = lookup.path;
  4073.             ret.object = lookup.node;
  4074.             ret.name = lookup.node.name;
  4075.             ret.isRoot = lookup.path === "/"
  4076.         } catch (e) {
  4077.             ret.error = e.errno
  4078.         }
  4079.         return ret
  4080.     }),
  4081.     createFolder: (function (parent, name, canRead, canWrite) {
  4082.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4083.         var mode = FS.getMode(canRead, canWrite);
  4084.         return FS.mkdir(path, mode)
  4085.     }),
  4086.     createPath: (function (parent, path, canRead, canWrite) {
  4087.         parent = typeof parent === "string" ? parent : FS.getPath(parent);
  4088.         var parts = path.split("/").reverse();
  4089.         while (parts.length) {
  4090.             var part = parts.pop();
  4091.             if (!part) continue;
  4092.             var current = PATH.join2(parent, part);
  4093.             try {
  4094.                 FS.mkdir(current)
  4095.             } catch (e) {
  4096.             }
  4097.             parent = current
  4098.         }
  4099.         return current
  4100.     }),
  4101.     createFile: (function (parent, name, properties, canRead, canWrite) {
  4102.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4103.         var mode = FS.getMode(canRead, canWrite);
  4104.         return FS.create(path, mode)
  4105.     }),
  4106.     createDataFile: (function (parent, name, data, canRead, canWrite, canOwn) {
  4107.         var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  4108.         var mode = FS.getMode(canRead, canWrite);
  4109.         var node = FS.create(path, mode);
  4110.         if (data) {
  4111.             if (typeof data === "string") {
  4112.                 var arr = new Array(data.length);
  4113.                 for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
  4114.                 data = arr
  4115.             }
  4116.             FS.chmod(node, mode | 146);
  4117.             var stream = FS.open(node, "w");
  4118.             FS.write(stream, data, 0, data.length, 0, canOwn);
  4119.             FS.close(stream);
  4120.             FS.chmod(node, mode)
  4121.         }
  4122.         return node
  4123.     }),
  4124.     createDevice: (function (parent, name, input, output) {
  4125.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4126.         var mode = FS.getMode(!!input, !!output);
  4127.         if (!FS.createDevice.major) FS.createDevice.major = 64;
  4128.         var dev = FS.makedev(FS.createDevice.major++, 0);
  4129.         FS.registerDevice(dev, {
  4130.             open: (function (stream) {
  4131.                 stream.seekable = false
  4132.             }), close: (function (stream) {
  4133.                 if (output && output.buffer && output.buffer.length) {
  4134.                     output(10)
  4135.                 }
  4136.             }), read: (function (stream, buffer, offset, length, pos) {
  4137.                 var bytesRead = 0;
  4138.                 for (var i = 0; i < length; i++) {
  4139.                     var result;
  4140.                     try {
  4141.                         result = input()
  4142.                     } catch (e) {
  4143.                         throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4144.                     }
  4145.                     if (result === undefined && bytesRead === 0) {
  4146.                         throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  4147.                     }
  4148.                     if (result === null || result === undefined) break;
  4149.                     bytesRead++;
  4150.                     buffer[offset + i] = result
  4151.                 }
  4152.                 if (bytesRead) {
  4153.                     stream.node.timestamp = Date.now()
  4154.                 }
  4155.                 return bytesRead
  4156.             }), write: (function (stream, buffer, offset, length, pos) {
  4157.                 for (var i = 0; i < length; i++) {
  4158.                     try {
  4159.                         output(buffer[offset + i])
  4160.                     } catch (e) {
  4161.                         throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4162.                     }
  4163.                 }
  4164.                 if (length) {
  4165.                     stream.node.timestamp = Date.now()
  4166.                 }
  4167.                 return i
  4168.             })
  4169.         });
  4170.         return FS.mkdev(path, mode, dev)
  4171.     }),
  4172.     createLink: (function (parent, name, target, canRead, canWrite) {
  4173.         var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4174.         return FS.symlink(target, path)
  4175.     }),
  4176.     forceLoadFile: (function (obj) {
  4177.         if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
  4178.         var success = true;
  4179.         if (typeof XMLHttpRequest !== "undefined") {
  4180.             throw new Error("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.")
  4181.         } else if (Module["read"]) {
  4182.             try {
  4183.                 obj.contents = intArrayFromString(Module["read"](obj.url), true);
  4184.                 obj.usedBytes = obj.contents.length
  4185.             } catch (e) {
  4186.                 success = false
  4187.             }
  4188.         } else {
  4189.             throw new Error("Cannot load without read() or XMLHttpRequest.")
  4190.         }
  4191.         if (!success) ___setErrNo(ERRNO_CODES.EIO);
  4192.         return success
  4193.     }),
  4194.     createLazyFile: (function (parent, name, url, canRead, canWrite) {
  4195.         function LazyUint8Array() {
  4196.             this.lengthKnown = false;
  4197.             this.chunks = []
  4198.         }
  4199.  
  4200.         LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  4201.             if (idx > this.length - 1 || idx < 0) {
  4202.                 return undefined
  4203.             }
  4204.             var chunkOffset = idx % this.chunkSize;
  4205.             var chunkNum = idx / this.chunkSize | 0;
  4206.             return this.getter(chunkNum)[chunkOffset]
  4207.         };
  4208.         LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  4209.             this.getter = getter
  4210.         };
  4211.         LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  4212.             var xhr = new XMLHttpRequest;
  4213.             xhr.open("HEAD", url, false);
  4214.             xhr.send(null);
  4215.             if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4216.             var datalength = Number(xhr.getResponseHeader("Content-length"));
  4217.             var header;
  4218.             var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  4219.             var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  4220.             var chunkSize = 1024 * 1024;
  4221.             if (!hasByteServing) chunkSize = datalength;
  4222.             var doXHR = (function (from, to) {
  4223.                 if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  4224.                 if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
  4225.                 var xhr = new XMLHttpRequest;
  4226.                 xhr.open("GET", url, false);
  4227.                 if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  4228.                 if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer";
  4229.                 if (xhr.overrideMimeType) {
  4230.                     xhr.overrideMimeType("text/plain; charset=x-user-defined")
  4231.                 }
  4232.                 xhr.send(null);
  4233.                 if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4234.                 if (xhr.response !== undefined) {
  4235.                     return new Uint8Array(xhr.response || [])
  4236.                 } else {
  4237.                     return intArrayFromString(xhr.responseText || "", true)
  4238.                 }
  4239.             });
  4240.             var lazyArray = this;
  4241.             lazyArray.setDataGetter((function (chunkNum) {
  4242.                 var start = chunkNum * chunkSize;
  4243.                 var end = (chunkNum + 1) * chunkSize - 1;
  4244.                 end = Math.min(end, datalength - 1);
  4245.                 if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  4246.                     lazyArray.chunks[chunkNum] = doXHR(start, end)
  4247.                 }
  4248.                 if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!");
  4249.                 return lazyArray.chunks[chunkNum]
  4250.             }));
  4251.             if (usesGzip || !datalength) {
  4252.                 chunkSize = datalength = 1;
  4253.                 datalength = this.getter(0).length;
  4254.                 chunkSize = datalength;
  4255.                 console.log("LazyFiles on gzip forces download of the whole file when length is accessed")
  4256.             }
  4257.             this._length = datalength;
  4258.             this._chunkSize = chunkSize;
  4259.             this.lengthKnown = true
  4260.         };
  4261.         if (typeof XMLHttpRequest !== "undefined") {
  4262.             if (!ENVIRONMENT_IS_WORKER) throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  4263.             var lazyArray = new LazyUint8Array;
  4264.             Object.defineProperties(lazyArray, {
  4265.                 length: {
  4266.                     get: (function () {
  4267.                         if (!this.lengthKnown) {
  4268.                             this.cacheLength()
  4269.                         }
  4270.                         return this._length
  4271.                     })
  4272.                 }, chunkSize: {
  4273.                     get: (function () {
  4274.                         if (!this.lengthKnown) {
  4275.                             this.cacheLength()
  4276.                         }
  4277.                         return this._chunkSize
  4278.                     })
  4279.                 }
  4280.             });
  4281.             var properties = {isDevice: false, contents: lazyArray}
  4282.         } else {
  4283.             var properties = {isDevice: false, url: url}
  4284.         }
  4285.         var node = FS.createFile(parent, name, properties, canRead, canWrite);
  4286.         if (properties.contents) {
  4287.             node.contents = properties.contents
  4288.         } else if (properties.url) {
  4289.             node.contents = null;
  4290.             node.url = properties.url
  4291.         }
  4292.         Object.defineProperties(node, {
  4293.             usedBytes: {
  4294.                 get: (function () {
  4295.                     return this.contents.length
  4296.                 })
  4297.             }
  4298.         });
  4299.         var stream_ops = {};
  4300.         var keys = Object.keys(node.stream_ops);
  4301.         keys.forEach((function (key) {
  4302.             var fn = node.stream_ops[key];
  4303.             stream_ops[key] = function forceLoadLazyFile() {
  4304.                 if (!FS.forceLoadFile(node)) {
  4305.                     throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4306.                 }
  4307.                 return fn.apply(null, arguments)
  4308.             }
  4309.         }));
  4310.         stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
  4311.             if (!FS.forceLoadFile(node)) {
  4312.                 throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4313.             }
  4314.             var contents = stream.node.contents;
  4315.             if (position >= contents.length) return 0;
  4316.             var size = Math.min(contents.length - position, length);
  4317.             assert(size >= 0);
  4318.             if (contents.slice) {
  4319.                 for (var i = 0; i < size; i++) {
  4320.                     buffer[offset + i] = contents[position + i]
  4321.                 }
  4322.             } else {
  4323.                 for (var i = 0; i < size; i++) {
  4324.                     buffer[offset + i] = contents.get(position + i)
  4325.                 }
  4326.             }
  4327.             return size
  4328.         };
  4329.         node.stream_ops = stream_ops;
  4330.         return node
  4331.     }),
  4332.     createPreloadedFile: (function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  4333.         Browser.init();
  4334.         var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
  4335.         var dep = getUniqueRunDependency("cp " + fullname);
  4336.  
  4337.         function processData(byteArray) {
  4338.             function finish(byteArray) {
  4339.                 if (preFinish) preFinish();
  4340.                 if (!dontCreateFile) {
  4341.                     FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
  4342.                 }
  4343.                 if (onload) onload();
  4344.                 removeRunDependency(dep)
  4345.             }
  4346.  
  4347.             var handled = false;
  4348.             Module["preloadPlugins"].forEach((function (plugin) {
  4349.                 if (handled) return;
  4350.                 if (plugin["canHandle"](fullname)) {
  4351.                     plugin["handle"](byteArray, fullname, finish, (function () {
  4352.                         if (onerror) onerror();
  4353.                         removeRunDependency(dep)
  4354.                     }));
  4355.                     handled = true
  4356.                 }
  4357.             }));
  4358.             if (!handled) finish(byteArray)
  4359.         }
  4360.  
  4361.         addRunDependency(dep);
  4362.         if (typeof url == "string") {
  4363.             Browser.asyncLoad(url, (function (byteArray) {
  4364.                 processData(byteArray)
  4365.             }), onerror)
  4366.         } else {
  4367.             processData(url)
  4368.         }
  4369.     }),
  4370.     indexedDB: (function () {
  4371.         return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
  4372.     }),
  4373.     DB_NAME: (function () {
  4374.         return "EM_FS_" + window.location.pathname
  4375.     }),
  4376.     DB_VERSION: 20,
  4377.     DB_STORE_NAME: "FILE_DATA",
  4378.     saveFilesToDB: (function (paths, onload, onerror) {
  4379.         onload = onload || (function () {
  4380.         });
  4381.         onerror = onerror || (function () {
  4382.         });
  4383.         var indexedDB = FS.indexedDB();
  4384.         try {
  4385.             var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4386.         } catch (e) {
  4387.             return onerror(e)
  4388.         }
  4389.         openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  4390.             console.log("creating db");
  4391.             var db = openRequest.result;
  4392.             db.createObjectStore(FS.DB_STORE_NAME)
  4393.         };
  4394.         openRequest.onsuccess = function openRequest_onsuccess() {
  4395.             var db = openRequest.result;
  4396.             var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  4397.             var files = transaction.objectStore(FS.DB_STORE_NAME);
  4398.             var ok = 0, fail = 0, total = paths.length;
  4399.  
  4400.             function finish() {
  4401.                 if (fail == 0) onload(); else onerror()
  4402.             }
  4403.  
  4404.             paths.forEach((function (path) {
  4405.                 var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  4406.                 putRequest.onsuccess = function putRequest_onsuccess() {
  4407.                     ok++;
  4408.                     if (ok + fail == total) finish()
  4409.                 };
  4410.                 putRequest.onerror = function putRequest_onerror() {
  4411.                     fail++;
  4412.                     if (ok + fail == total) finish()
  4413.                 }
  4414.             }));
  4415.             transaction.onerror = onerror
  4416.         };
  4417.         openRequest.onerror = onerror
  4418.     }),
  4419.     loadFilesFromDB: (function (paths, onload, onerror) {
  4420.         onload = onload || (function () {
  4421.         });
  4422.         onerror = onerror || (function () {
  4423.         });
  4424.         var indexedDB = FS.indexedDB();
  4425.         try {
  4426.             var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4427.         } catch (e) {
  4428.             return onerror(e)
  4429.         }
  4430.         openRequest.onupgradeneeded = onerror;
  4431.         openRequest.onsuccess = function openRequest_onsuccess() {
  4432.             var db = openRequest.result;
  4433.             try {
  4434.                 var transaction = db.transaction([FS.DB_STORE_NAME], "readonly")
  4435.             } catch (e) {
  4436.                 onerror(e);
  4437.                 return
  4438.             }
  4439.             var files = transaction.objectStore(FS.DB_STORE_NAME);
  4440.             var ok = 0, fail = 0, total = paths.length;
  4441.  
  4442.             function finish() {
  4443.                 if (fail == 0) onload(); else onerror()
  4444.             }
  4445.  
  4446.             paths.forEach((function (path) {
  4447.                 var getRequest = files.get(path);
  4448.                 getRequest.onsuccess = function getRequest_onsuccess() {
  4449.                     if (FS.analyzePath(path).exists) {
  4450.                         FS.unlink(path)
  4451.                     }
  4452.                     FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  4453.                     ok++;
  4454.                     if (ok + fail == total) finish()
  4455.                 };
  4456.                 getRequest.onerror = function getRequest_onerror() {
  4457.                     fail++;
  4458.                     if (ok + fail == total) finish()
  4459.                 }
  4460.             }));
  4461.             transaction.onerror = onerror
  4462.         };
  4463.         openRequest.onerror = onerror
  4464.     })
  4465. };
  4466. var SYSCALLS = {
  4467.     DEFAULT_POLLMASK: 5, mappings: {}, umask: 511, calculateAt: (function (dirfd, path) {
  4468.         if (path[0] !== "/") {
  4469.             var dir;
  4470.             if (dirfd === -100) {
  4471.                 dir = FS.cwd()
  4472.             } else {
  4473.                 var dirstream = FS.getStream(dirfd);
  4474.                 if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4475.                 dir = dirstream.path
  4476.             }
  4477.             path = PATH.join2(dir, path)
  4478.         }
  4479.         return path
  4480.     }), doStat: (function (func, path, buf) {
  4481.         try {
  4482.             var stat = func(path)
  4483.         } catch (e) {
  4484.             if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  4485.                 return -ERRNO_CODES.ENOTDIR
  4486.             }
  4487.             throw e
  4488.         }
  4489.         HEAP32[buf >> 2] = stat.dev;
  4490.         HEAP32[buf + 4 >> 2] = 0;
  4491.         HEAP32[buf + 8 >> 2] = stat.ino;
  4492.         HEAP32[buf + 12 >> 2] = stat.mode;
  4493.         HEAP32[buf + 16 >> 2] = stat.nlink;
  4494.         HEAP32[buf + 20 >> 2] = stat.uid;
  4495.         HEAP32[buf + 24 >> 2] = stat.gid;
  4496.         HEAP32[buf + 28 >> 2] = stat.rdev;
  4497.         HEAP32[buf + 32 >> 2] = 0;
  4498.         HEAP32[buf + 36 >> 2] = stat.size;
  4499.         HEAP32[buf + 40 >> 2] = 4096;
  4500.         HEAP32[buf + 44 >> 2] = stat.blocks;
  4501.         HEAP32[buf + 48 >> 2] = stat.atime.getTime() / 1e3 | 0;
  4502.         HEAP32[buf + 52 >> 2] = 0;
  4503.         HEAP32[buf + 56 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  4504.         HEAP32[buf + 60 >> 2] = 0;
  4505.         HEAP32[buf + 64 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  4506.         HEAP32[buf + 68 >> 2] = 0;
  4507.         HEAP32[buf + 72 >> 2] = stat.ino;
  4508.         return 0
  4509.     }), doMsync: (function (addr, stream, len, flags) {
  4510.         var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
  4511.         FS.msync(stream, buffer, 0, len, flags)
  4512.     }), doMkdir: (function (path, mode) {
  4513.         path = PATH.normalize(path);
  4514.         if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1);
  4515.         FS.mkdir(path, mode, 0);
  4516.         return 0
  4517.     }), doMknod: (function (path, mode, dev) {
  4518.         switch (mode & 61440) {
  4519.             case 32768:
  4520.             case 8192:
  4521.             case 24576:
  4522.             case 4096:
  4523.             case 49152:
  4524.                 break;
  4525.             default:
  4526.                 return -ERRNO_CODES.EINVAL
  4527.         }
  4528.         FS.mknod(path, mode, dev);
  4529.         return 0
  4530.     }), doReadlink: (function (path, buf, bufsize) {
  4531.         if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
  4532.         var ret = FS.readlink(path);
  4533.         var len = Math.min(bufsize, lengthBytesUTF8(ret));
  4534.         var endChar = HEAP8[buf + len];
  4535.         stringToUTF8(ret, buf, bufsize + 1);
  4536.         HEAP8[buf + len] = endChar;
  4537.         return len
  4538.     }), doAccess: (function (path, amode) {
  4539.         if (amode & ~7) {
  4540.             return -ERRNO_CODES.EINVAL
  4541.         }
  4542.         var node;
  4543.         var lookup = FS.lookupPath(path, {follow: true});
  4544.         node = lookup.node;
  4545.         var perms = "";
  4546.         if (amode & 4) perms += "r";
  4547.         if (amode & 2) perms += "w";
  4548.         if (amode & 1) perms += "x";
  4549.         if (perms && FS.nodePermissions(node, perms)) {
  4550.             return -ERRNO_CODES.EACCES
  4551.         }
  4552.         return 0
  4553.     }), doDup: (function (path, flags, suggestFD) {
  4554.         var suggest = FS.getStream(suggestFD);
  4555.         if (suggest) FS.close(suggest);
  4556.         return FS.open(path, flags, 0, suggestFD, suggestFD).fd
  4557.     }), doReadv: (function (stream, iov, iovcnt, offset) {
  4558.         var ret = 0;
  4559.         for (var i = 0; i < iovcnt; i++) {
  4560.             var ptr = HEAP32[iov + i * 8 >> 2];
  4561.             var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4562.             var curr = FS.read(stream, HEAP8, ptr, len, offset);
  4563.             if (curr < 0) return -1;
  4564.             ret += curr;
  4565.             if (curr < len) break
  4566.         }
  4567.         return ret
  4568.     }), doWritev: (function (stream, iov, iovcnt, offset) {
  4569.         var ret = 0;
  4570.         for (var i = 0; i < iovcnt; i++) {
  4571.             var ptr = HEAP32[iov + i * 8 >> 2];
  4572.             var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4573.             var curr = FS.write(stream, HEAP8, ptr, len, offset);
  4574.             if (curr < 0) return -1;
  4575.             ret += curr
  4576.         }
  4577.         return ret
  4578.     }), varargs: 0, get: (function (varargs) {
  4579.         SYSCALLS.varargs += 4;
  4580.         var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  4581.         return ret
  4582.     }), getStr: (function () {
  4583.         var ret = Pointer_stringify(SYSCALLS.get());
  4584.         return ret
  4585.     }), getStreamFromFD: (function () {
  4586.         var stream = FS.getStream(SYSCALLS.get());
  4587.         if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4588.         return stream
  4589.     }), getSocketFromFD: (function () {
  4590.         var socket = SOCKFS.getSocket(SYSCALLS.get());
  4591.         if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4592.         return socket
  4593.     }), getSocketAddress: (function (allowNull) {
  4594.         var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get();
  4595.         if (allowNull && addrp === 0) return null;
  4596.         var info = __read_sockaddr(addrp, addrlen);
  4597.         if (info.errno) throw new FS.ErrnoError(info.errno);
  4598.         info.addr = DNS.lookup_addr(info.addr) || info.addr;
  4599.         return info
  4600.     }), get64: (function () {
  4601.         var low = SYSCALLS.get(), high = SYSCALLS.get();
  4602.         if (low >= 0) assert(high === 0); else assert(high === -1);
  4603.         return low
  4604.     }), getZero: (function () {
  4605.         assert(SYSCALLS.get() === 0)
  4606.     })
  4607. };
  4608.  
  4609. function ___syscall20(which, varargs) {
  4610.     SYSCALLS.varargs = varargs;
  4611.     try {
  4612.         return PROCINFO.pid
  4613.     } catch (e) {
  4614.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4615.         return -e.errno
  4616.     }
  4617. }
  4618.  
  4619. var ___tm_current = STATICTOP;
  4620. STATICTOP += 48;
  4621. var ___tm_timezone = allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);
  4622.  
  4623. function _gmtime_r(time, tmPtr) {
  4624.     var date = new Date(HEAP32[time >> 2] * 1e3);
  4625.     HEAP32[tmPtr >> 2] = date.getUTCSeconds();
  4626.     HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes();
  4627.     HEAP32[tmPtr + 8 >> 2] = date.getUTCHours();
  4628.     HEAP32[tmPtr + 12 >> 2] = date.getUTCDate();
  4629.     HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth();
  4630.     HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900;
  4631.     HEAP32[tmPtr + 24 >> 2] = date.getUTCDay();
  4632.     HEAP32[tmPtr + 36 >> 2] = 0;
  4633.     HEAP32[tmPtr + 32 >> 2] = 0;
  4634.     var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
  4635.     var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0;
  4636.     HEAP32[tmPtr + 28 >> 2] = yday;
  4637.     HEAP32[tmPtr + 40 >> 2] = ___tm_timezone;
  4638.     return tmPtr
  4639. }
  4640.  
  4641. function _gmtime(time) {
  4642.     return _gmtime_r(time, ___tm_current)
  4643. }
  4644.  
  4645. function ___lock() {
  4646. }
  4647.  
  4648. function ___unlock() {
  4649. }
  4650.  
  4651. function ___syscall6(which, varargs) {
  4652.     SYSCALLS.varargs = varargs;
  4653.     try {
  4654.         var stream = SYSCALLS.getStreamFromFD();
  4655.         FS.close(stream);
  4656.         return 0
  4657.     } catch (e) {
  4658.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4659.         return -e.errno
  4660.     }
  4661. }
  4662.  
  4663. function _emscripten_memcpy_big(dest, src, num) {
  4664.     HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
  4665.     return dest
  4666. }
  4667.  
  4668. function _ftime(p) {
  4669.     var millis = Date.now();
  4670.     HEAP32[p >> 2] = millis / 1e3 | 0;
  4671.     HEAP16[p + 4 >> 1] = millis % 1e3;
  4672.     HEAP16[p + 6 >> 1] = 0;
  4673.     HEAP16[p + 8 >> 1] = 0;
  4674.     return 0
  4675. }
  4676.  
  4677. function ___syscall140(which, varargs) {
  4678.     SYSCALLS.varargs = varargs;
  4679.     try {
  4680.         var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(),
  4681.             result = SYSCALLS.get(), whence = SYSCALLS.get();
  4682.         var offset = offset_low;
  4683.         FS.llseek(stream, offset, whence);
  4684.         HEAP32[result >> 2] = stream.position;
  4685.         if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
  4686.         return 0
  4687.     } catch (e) {
  4688.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4689.         return -e.errno
  4690.     }
  4691. }
  4692.  
  4693. function ___syscall146(which, varargs) {
  4694.     SYSCALLS.varargs = varargs;
  4695.     try {
  4696.         var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
  4697.         return SYSCALLS.doWritev(stream, iov, iovcnt)
  4698.     } catch (e) {
  4699.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4700.         return -e.errno
  4701.     }
  4702. }
  4703.  
  4704. function ___syscall54(which, varargs) {
  4705.     SYSCALLS.varargs = varargs;
  4706.     try {
  4707.         var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get();
  4708.         switch (op) {
  4709.             case 21505: {
  4710.                 if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4711.                 return 0
  4712.             }
  4713.                 ;
  4714.             case 21506: {
  4715.                 if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4716.                 return 0
  4717.             }
  4718.                 ;
  4719.             case 21519: {
  4720.                 if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4721.                 var argp = SYSCALLS.get();
  4722.                 HEAP32[argp >> 2] = 0;
  4723.                 return 0
  4724.             }
  4725.                 ;
  4726.             case 21520: {
  4727.                 if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4728.                 return -ERRNO_CODES.EINVAL
  4729.             }
  4730.                 ;
  4731.             case 21531: {
  4732.                 var argp = SYSCALLS.get();
  4733.                 return FS.ioctl(stream, op, argp)
  4734.             }
  4735.                 ;
  4736.             case 21523: {
  4737.                 if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4738.                 return 0
  4739.             }
  4740.                 ;
  4741.             default:
  4742.                 abort("bad ioctl syscall " + op)
  4743.         }
  4744.     } catch (e) {
  4745.         if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4746.         return -e.errno
  4747.     }
  4748. }
  4749.  
  4750. FS.staticInit();
  4751. __ATINIT__.unshift((function () {
  4752.     if (!Module["noFSInit"] && !FS.init.initialized) FS.init()
  4753. }));
  4754. __ATMAIN__.push((function () {
  4755.     FS.ignorePermissions = false
  4756. }));
  4757. __ATEXIT__.push((function () {
  4758.     FS.quit()
  4759. }));
  4760. Module["FS_createFolder"] = FS.createFolder;
  4761. Module["FS_createPath"] = FS.createPath;
  4762. Module["FS_createDataFile"] = FS.createDataFile;
  4763. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  4764. Module["FS_createLazyFile"] = FS.createLazyFile;
  4765. Module["FS_createLink"] = FS.createLink;
  4766. Module["FS_createDevice"] = FS.createDevice;
  4767. Module["FS_unlink"] = FS.unlink;
  4768. __ATINIT__.unshift((function () {
  4769.     TTY.init()
  4770. }));
  4771. __ATEXIT__.push((function () {
  4772.     TTY.shutdown()
  4773. }));
  4774. if (ENVIRONMENT_IS_NODE) {
  4775.     var fs = require("fs");
  4776.     var NODEJS_PATH = require("path");
  4777.     NODEFS.staticInit()
  4778. }
  4779. DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC);
  4780. STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
  4781. STACK_MAX = STACK_BASE + TOTAL_STACK;
  4782. DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX);
  4783. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
  4784. staticSealed = true;
  4785. Module["wasmTableSize"] = 14;
  4786. Module["wasmMaxTableSize"] = 14;
  4787.  
  4788. function invoke_ii(index, a1) {
  4789.     try {
  4790.         return Module["dynCall_ii"](index, a1)
  4791.     } catch (e) {
  4792.         if (typeof e !== "number" && e !== "longjmp") throw e;
  4793.         Module["setThrew"](1, 0)
  4794.     }
  4795. }
  4796.  
  4797. function invoke_iiii(index, a1, a2, a3) {
  4798.     try {
  4799.         return Module["dynCall_iiii"](index, a1, a2, a3)
  4800.     } catch (e) {
  4801.         if (typeof e !== "number" && e !== "longjmp") throw e;
  4802.         Module["setThrew"](1, 0)
  4803.     }
  4804. }
  4805.  
  4806. function invoke_viii(index, a1, a2, a3) {
  4807.     try {
  4808.         Module["dynCall_viii"](index, a1, a2, a3)
  4809.     } catch (e) {
  4810.         if (typeof e !== "number" && e !== "longjmp") throw e;
  4811.         Module["setThrew"](1, 0)
  4812.     }
  4813. }
  4814.  
  4815. Module.asmGlobalArg = {
  4816.     "Math": Math,
  4817.     "Int8Array": Int8Array,
  4818.     "Int16Array": Int16Array,
  4819.     "Int32Array": Int32Array,
  4820.     "Uint8Array": Uint8Array,
  4821.     "Uint16Array": Uint16Array,
  4822.     "Uint32Array": Uint32Array,
  4823.     "Float32Array": Float32Array,
  4824.     "Float64Array": Float64Array,
  4825.     "NaN": NaN,
  4826.     "Infinity": Infinity
  4827. };
  4828. Module.asmLibraryArg = {
  4829.     "abort": abort,
  4830.     "assert": assert,
  4831.     "enlargeMemory": enlargeMemory,
  4832.     "getTotalMemory": getTotalMemory,
  4833.     "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
  4834.     "invoke_ii": invoke_ii,
  4835.     "invoke_iiii": invoke_iiii,
  4836.     "invoke_viii": invoke_viii,
  4837.     "_gmtime_r": _gmtime_r,
  4838.     "_gmtime": _gmtime,
  4839.     "___lock": ___lock,
  4840.     "___syscall6": ___syscall6,
  4841.     "___setErrNo": ___setErrNo,
  4842.     "___unlock": ___unlock,
  4843.     "_ftime": _ftime,
  4844.     "_emscripten_memcpy_big": _emscripten_memcpy_big,
  4845.     "___syscall54": ___syscall54,
  4846.     "___syscall140": ___syscall140,
  4847.     "___syscall20": ___syscall20,
  4848.     "___assert_fail": ___assert_fail,
  4849.     "___syscall146": ___syscall146,
  4850.     "DYNAMICTOP_PTR": DYNAMICTOP_PTR,
  4851.     "tempDoublePtr": tempDoublePtr,
  4852.     "ABORT": ABORT,
  4853.     "STACKTOP": STACKTOP,
  4854.     "STACK_MAX": STACK_MAX
  4855. };
  4856. var asm = Module["asm"](Module.asmGlobalArg, Module.asmLibraryArg, buffer);
  4857. Module["asm"] = asm;
  4858. var _cryptonight_hash = Module["_cryptonight_hash"] = (function () {
  4859.     return Module["asm"]["_cryptonight_hash"].apply(null, arguments)
  4860. });
  4861. var getTempRet0 = Module["getTempRet0"] = (function () {
  4862.     return Module["asm"]["getTempRet0"].apply(null, arguments)
  4863. });
  4864. var _free = Module["_free"] = (function () {
  4865.     return Module["asm"]["_free"].apply(null, arguments)
  4866. });
  4867. var runPostSets = Module["runPostSets"] = (function () {
  4868.     return Module["asm"]["runPostSets"].apply(null, arguments)
  4869. });
  4870. var setTempRet0 = Module["setTempRet0"] = (function () {
  4871.     return Module["asm"]["setTempRet0"].apply(null, arguments)
  4872. });
  4873. var establishStackSpace = Module["establishStackSpace"] = (function () {
  4874.     return Module["asm"]["establishStackSpace"].apply(null, arguments)
  4875. });
  4876. var _memmove = Module["_memmove"] = (function () {
  4877.     return Module["asm"]["_memmove"].apply(null, arguments)
  4878. });
  4879. var stackSave = Module["stackSave"] = (function () {
  4880.     return Module["asm"]["stackSave"].apply(null, arguments)
  4881. });
  4882. var _memset = Module["_memset"] = (function () {
  4883.     return Module["asm"]["_memset"].apply(null, arguments)
  4884. });
  4885. var _malloc = Module["_malloc"] = (function () {
  4886.     return Module["asm"]["_malloc"].apply(null, arguments)
  4887. });
  4888. var _cryptonight_create = Module["_cryptonight_create"] = (function () {
  4889.     return Module["asm"]["_cryptonight_create"].apply(null, arguments)
  4890. });
  4891. var _memcpy = Module["_memcpy"] = (function () {
  4892.     return Module["asm"]["_memcpy"].apply(null, arguments)
  4893. });
  4894. var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = (function () {
  4895.     return Module["asm"]["_emscripten_get_global_libc"].apply(null, arguments)
  4896. });
  4897. var stackAlloc = Module["stackAlloc"] = (function () {
  4898.     return Module["asm"]["stackAlloc"].apply(null, arguments)
  4899. });
  4900. var setThrew = Module["setThrew"] = (function () {
  4901.     return Module["asm"]["setThrew"].apply(null, arguments)
  4902. });
  4903. var _sbrk = Module["_sbrk"] = (function () {
  4904.     return Module["asm"]["_sbrk"].apply(null, arguments)
  4905. });
  4906. var _fflush = Module["_fflush"] = (function () {
  4907.     return Module["asm"]["_fflush"].apply(null, arguments)
  4908. });
  4909. var stackRestore = Module["stackRestore"] = (function () {
  4910.     return Module["asm"]["stackRestore"].apply(null, arguments)
  4911. });
  4912. var _cryptonight_destroy = Module["_cryptonight_destroy"] = (function () {
  4913.     return Module["asm"]["_cryptonight_destroy"].apply(null, arguments)
  4914. });
  4915. var ___errno_location = Module["___errno_location"] = (function () {
  4916.     return Module["asm"]["___errno_location"].apply(null, arguments)
  4917. });
  4918. var dynCall_ii = Module["dynCall_ii"] = (function () {
  4919.     return Module["asm"]["dynCall_ii"].apply(null, arguments)
  4920. });
  4921. var dynCall_iiii = Module["dynCall_iiii"] = (function () {
  4922.     return Module["asm"]["dynCall_iiii"].apply(null, arguments)
  4923. });
  4924. var dynCall_viii = Module["dynCall_viii"] = (function () {
  4925.     return Module["asm"]["dynCall_viii"].apply(null, arguments)
  4926. });
  4927. Runtime.stackAlloc = Module["stackAlloc"];
  4928. Runtime.stackSave = Module["stackSave"];
  4929. Runtime.stackRestore = Module["stackRestore"];
  4930. Runtime.establishStackSpace = Module["establishStackSpace"];
  4931. Runtime.setTempRet0 = Module["setTempRet0"];
  4932. Runtime.getTempRet0 = Module["getTempRet0"];
  4933. Module["asm"] = asm;
  4934. if (memoryInitializer) {
  4935.     if (typeof Module["locateFile"] === "function") {
  4936.         memoryInitializer = Module["locateFile"](memoryInitializer)
  4937.     } else if (Module["memoryInitializerPrefixURL"]) {
  4938.         memoryInitializer = Module["memoryInitializerPrefixURL"] + memoryInitializer
  4939.     }
  4940.     if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
  4941.         var data = Module["readBinary"](memoryInitializer);
  4942.         HEAPU8.set(data, Runtime.GLOBAL_BASE)
  4943.     } else {
  4944.         addRunDependency("memory initializer");
  4945.         var applyMemoryInitializer = (function (data) {
  4946.             if (data.byteLength) data = new Uint8Array(data);
  4947.             HEAPU8.set(data, Runtime.GLOBAL_BASE);
  4948.             if (Module["memoryInitializerRequest"]) delete Module["memoryInitializerRequest"].response;
  4949.             removeRunDependency("memory initializer")
  4950.         });
  4951.  
  4952.         function doBrowserLoad() {
  4953.             Module["readAsync"](memoryInitializer, applyMemoryInitializer, (function () {
  4954.                 throw"could not load memory initializer " + memoryInitializer
  4955.             }))
  4956.         }
  4957.  
  4958.         if (Module["memoryInitializerRequest"]) {
  4959.             function useRequest() {
  4960.                 var request = Module["memoryInitializerRequest"];
  4961.                 if (request.status !== 200 && request.status !== 0) {
  4962.                     console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: " + request.status + ", retrying " + memoryInitializer);
  4963.                     doBrowserLoad();
  4964.                     return
  4965.                 }
  4966.                 applyMemoryInitializer(request.response)
  4967.             }
  4968.  
  4969.             if (Module["memoryInitializerRequest"].response) {
  4970.                 setTimeout(useRequest, 0)
  4971.             } else {
  4972.                 Module["memoryInitializerRequest"].addEventListener("load", useRequest)
  4973.             }
  4974.         } else {
  4975.             doBrowserLoad()
  4976.         }
  4977.     }
  4978. }
  4979.  
  4980. function ExitStatus(status) {
  4981.     this.name = "ExitStatus";
  4982.     this.message = "Program terminated with exit(" + status + ")";
  4983.     this.status = status
  4984. }
  4985.  
  4986. ExitStatus.prototype = new Error;
  4987. ExitStatus.prototype.constructor = ExitStatus;
  4988. var initialStackTop;
  4989. var preloadStartTime = null;
  4990. var calledMain = false;
  4991. dependenciesFulfilled = function runCaller() {
  4992.     if (!Module["calledRun"]) run();
  4993.     if (!Module["calledRun"]) dependenciesFulfilled = runCaller
  4994. };
  4995. Module["callMain"] = Module.callMain = function callMain(args) {
  4996.     args = args || [];
  4997.     ensureInitRuntime();
  4998.     var argc = args.length + 1;
  4999.  
  5000.     function pad() {
  5001.         for (var i = 0; i < 4 - 1; i++) {
  5002.             argv.push(0)
  5003.         }
  5004.     }
  5005.  
  5006.     var argv = [allocate(intArrayFromString(Module["thisProgram"]), "i8", ALLOC_NORMAL)];
  5007.     pad();
  5008.     for (var i = 0; i < argc - 1; i = i + 1) {
  5009.         argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_NORMAL));
  5010.         pad()
  5011.     }
  5012.     argv.push(0);
  5013.     argv = allocate(argv, "i32", ALLOC_NORMAL);
  5014.     try {
  5015.         var ret = Module["_main"](argc, argv, 0);
  5016.         exit(ret, true)
  5017.     } catch (e) {
  5018.         if (e instanceof ExitStatus) {
  5019.             return
  5020.         } else if (e == "SimulateInfiniteLoop") {
  5021.             Module["noExitRuntime"] = true;
  5022.             return
  5023.         } else {
  5024.             var toLog = e;
  5025.             if (e && typeof e === "object" && e.stack) {
  5026.                 toLog = [e, e.stack]
  5027.             }
  5028.             Module.printErr("exception thrown: " + toLog);
  5029.             Module["quit"](1, e)
  5030.         }
  5031.     } finally {
  5032.         calledMain = true
  5033.     }
  5034. };
  5035.  
  5036. function run(args) {
  5037.     args = args || Module["arguments"];
  5038.     if (preloadStartTime === null) preloadStartTime = Date.now();
  5039.     if (runDependencies > 0) {
  5040.         return
  5041.     }
  5042.     preRun();
  5043.     if (runDependencies > 0) return;
  5044.     if (Module["calledRun"]) return;
  5045.  
  5046.     function doRun() {
  5047.         if (Module["calledRun"]) return;
  5048.         Module["calledRun"] = true;
  5049.         if (ABORT) return;
  5050.         ensureInitRuntime();
  5051.         preMain();
  5052.         if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
  5053.         if (Module["_main"] && shouldRunNow) Module["callMain"](args);
  5054.         postRun()
  5055.     }
  5056.  
  5057.     if (Module["setStatus"]) {
  5058.         Module["setStatus"]("Running...");
  5059.         setTimeout((function () {
  5060.             setTimeout((function () {
  5061.                 Module["setStatus"]("")
  5062.             }), 1);
  5063.             doRun()
  5064.         }), 1)
  5065.     } else {
  5066.         doRun()
  5067.     }
  5068. }
  5069.  
  5070. Module["run"] = Module.run = run;
  5071.  
  5072. function exit(status, implicit) {
  5073.     if (implicit && Module["noExitRuntime"]) {
  5074.         return
  5075.     }
  5076.     if (Module["noExitRuntime"]) {
  5077.     } else {
  5078.         ABORT = true;
  5079.         EXITSTATUS = status;
  5080.         STACKTOP = initialStackTop;
  5081.         exitRuntime();
  5082.         if (Module["onExit"]) Module["onExit"](status)
  5083.     }
  5084.     if (ENVIRONMENT_IS_NODE) {
  5085.         process["exit"](status)
  5086.     }
  5087.     Module["quit"](status, new ExitStatus(status))
  5088. }
  5089.  
  5090. Module["exit"] = Module.exit = exit;
  5091. var abortDecorators = [];
  5092.  
  5093. function abort(what) {
  5094.     if (Module["onAbort"]) {
  5095.         Module["onAbort"](what)
  5096.     }
  5097.     if (what !== undefined) {
  5098.         Module.print(what);
  5099.         Module.printErr(what);
  5100.         what = JSON.stringify(what)
  5101.     } else {
  5102.         what = ""
  5103.     }
  5104.     ABORT = true;
  5105.     EXITSTATUS = 1;
  5106.     var extra = "\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";
  5107.     var output = "abort(" + what + ") at " + stackTrace() + extra;
  5108.     if (abortDecorators) {
  5109.         abortDecorators.forEach((function (decorator) {
  5110.             output = decorator(output, what)
  5111.         }))
  5112.     }
  5113.     throw output
  5114. }
  5115.  
  5116. Module["abort"] = Module.abort = abort;
  5117. if (Module["preInit"]) {
  5118.     if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
  5119.     while (Module["preInit"].length > 0) {
  5120.         Module["preInit"].pop()()
  5121.     }
  5122. }
  5123. var shouldRunNow = true;
  5124. if (Module["noInitialRun"]) {
  5125.     shouldRunNow = false
  5126. }
  5127. run();
  5128. var CryptonightWASMWrapper = (function () {
  5129.     this.ctx = _cryptonight_create();
  5130.     this.throttleWait = 0;
  5131.     this.throttledStart = 0;
  5132.     this.throttledHashes = 0;
  5133.     this.workThrottledBound = this.workThrottled.bind(this);
  5134.     this.currentJob = null;
  5135.     this.target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
  5136.     var heap = Module.HEAPU8.buffer;
  5137.     this.input = new Uint8Array(heap, Module._malloc(84), 84);
  5138.     this.output = new Uint8Array(heap, Module._malloc(32), 32);
  5139.     self.postMessage("ready");
  5140.     self.onmessage = this.onMessage.bind(this)
  5141. });
  5142. CryptonightWASMWrapper.prototype.onMessage = (function (msg) {
  5143.     var job = msg.data;
  5144.     if (job.verify_id) {
  5145.         this.verify(job);
  5146.         return
  5147.     }
  5148.     if (!this.currentJob || this.currentJob.job_id !== job.job_id) {
  5149.         this.setJob(job)
  5150.     }
  5151.     if (job.throttle) {
  5152.         this.throttleWait = 1 / (1 - job.throttle) - 1;
  5153.         this.throttledStart = this.now();
  5154.         this.throttledHashes = 0;
  5155.         this.workThrottled()
  5156.     } else {
  5157.         this.work()
  5158.     }
  5159. });
  5160. CryptonightWASMWrapper.prototype.destroy = (function () {
  5161.     _cryptonight_destroy(this.ctx)
  5162. });
  5163. CryptonightWASMWrapper.prototype.hexToBytes = (function (hex, bytes) {
  5164.     var bytes = new Uint8Array(hex.length / 2);
  5165.     for (var i = 0, c = 0; c < hex.length; c += 2, i++) {
  5166.         bytes[i] = parseInt(hex.substr(c, 2), 16)
  5167.     }
  5168.     return bytes
  5169. });
  5170. CryptonightWASMWrapper.prototype.bytesToHex = (function (bytes) {
  5171.     for (var hex = "", i = 0; i < bytes.length; i++) {
  5172.         hex += (bytes[i] >>> 4).toString(16);
  5173.         hex += (bytes[i] & 15).toString(16)
  5174.     }
  5175.     return hex
  5176. });
  5177. CryptonightWASMWrapper.prototype.meetsTarget = (function (hash, target) {
  5178.     for (var i = 0; i < target.length; i++) {
  5179.         var hi = hash.length - i - 1, ti = target.length - i - 1;
  5180.         if (hash[hi] > target[ti]) {
  5181.             return false
  5182.         } else if (hash[hi] < target[ti]) {
  5183.             return true
  5184.         }
  5185.     }
  5186.     return false
  5187. });
  5188. CryptonightWASMWrapper.prototype.setJob = (function (job) {
  5189.     this.currentJob = job;
  5190.     this.blob = this.hexToBytes(job.blob);
  5191.     this.input.set(this.blob);
  5192.     var target = this.hexToBytes(job.target);
  5193.     if (target.length <= 8) {
  5194.         for (var i = 0; i < target.length; i++) {
  5195.             this.target[this.target.length - i - 1] = target[target.length - i - 1]
  5196.         }
  5197.         for (var i = 0; i < this.target.length - target.length; i++) {
  5198.             this.target[i] = 255
  5199.         }
  5200.     } else {
  5201.         this.target = target
  5202.     }
  5203. });
  5204. CryptonightWASMWrapper.prototype.now = (function () {
  5205.     return self.performance ? self.performance.now() : Date.now()
  5206. });
  5207. CryptonightWASMWrapper.prototype.hash = (function (input, output, length) {
  5208.     var nonce = Math.random() * 4294967295 + 1 >>> 0;
  5209.     this.input[39] = (nonce & 4278190080) >> 24;
  5210.     this.input[40] = (nonce & 16711680) >> 16;
  5211.     this.input[41] = (nonce & 65280) >> 8;
  5212.     this.input[42] = (nonce & 255) >> 0;
  5213.     _cryptonight_hash(this.ctx, input.byteOffset, output.byteOffset, length)
  5214. });
  5215. CryptonightWASMWrapper.prototype.verify = (function (job) {
  5216.     this.blob = this.hexToBytes(job.blob);
  5217.     this.input.set(this.blob);
  5218.     for (var i = 0, c = 0; c < job.nonce.length; c += 2, i++) {
  5219.         this.input[39 + i] = parseInt(job.nonce.substr(c, 2), 16)
  5220.     }
  5221.     _cryptonight_hash(this.ctx, this.input.byteOffset, this.output.byteOffset, this.blob.length);
  5222.     var result = this.bytesToHex(this.output);
  5223.     self.postMessage({verify_id: job.verify_id, verified: result === job.result})
  5224. });
  5225. CryptonightWASMWrapper.prototype.work = (function () {
  5226.     var hashes = 0;
  5227.     var meetsTarget = false;
  5228.     var start = this.now();
  5229.     var elapsed = 0;
  5230.     do {
  5231.         this.hash(this.input, this.output, this.blob.length);
  5232.         hashes++;
  5233.         meetsTarget = this.meetsTarget(this.output, this.target);
  5234.         elapsed = this.now() - start
  5235.     } while (!meetsTarget && elapsed < 1e3);
  5236.     var hashesPerSecond = hashes / (elapsed / 1e3);
  5237.     if (meetsTarget) {
  5238.         var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5239.         var resultHex = this.bytesToHex(this.output);
  5240.         self.postMessage({
  5241.             hashesPerSecond: hashesPerSecond,
  5242.             hashes: hashes,
  5243.             job_id: this.currentJob.job_id,
  5244.             nonce: nonceHex,
  5245.             result: resultHex
  5246.         })
  5247.     } else {
  5248.         self.postMessage({hashesPerSecond: hashesPerSecond, hashes: hashes})
  5249.     }
  5250. });
  5251. CryptonightWASMWrapper.prototype.workThrottled = (function () {
  5252.     var start = this.now();
  5253.     this.hash(this.input, this.output, this.blob.length);
  5254.     var end = this.now();
  5255.     var timePerHash = end - start;
  5256.     this.throttledHashes++;
  5257.     var elapsed = end - this.throttledStart;
  5258.     var hashesPerSecond = this.throttledHashes / (elapsed / 1e3);
  5259.     if (this.meetsTarget(this.output, this.target)) {
  5260.         var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5261.         var resultHex = this.bytesToHex(this.output);
  5262.         self.postMessage({
  5263.             hashesPerSecond: hashesPerSecond,
  5264.             hashes: this.throttledHashes,
  5265.             job_id: this.currentJob.job_id,
  5266.             nonce: nonceHex,
  5267.             result: resultHex
  5268.         });
  5269.         this.throttledHashes = 0
  5270.     } else if (elapsed > 1e3) {
  5271.         self.postMessage({hashesPerSecond: hashesPerSecond, hashes: this.throttledHashes});
  5272.         this.throttledHashes = 0
  5273.     } else {
  5274.         var wait = Math.min(2e3, timePerHash * this.throttleWait);
  5275.         setTimeout(this.workThrottledBound, wait)
  5276.     }
  5277. });
  5278. Module["onRuntimeInitialized"] = (function () {
  5279.     var cryptonight = new CryptonightWASMWrapper
  5280. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement