// Modified embenchen to direct to asm-wasm.
// Flags: --validate-asm --allow-natives-syntax

var EXPECTED_OUTPUT =
  /frame averages: .+ \+- .+, range: .+ to .+ \n/;
var Module = {
  arguments: [1],
  print: function(x) {Module.printBuffer += x + '\n';},
  preRun: [function() {Module.printBuffer = ''}],
  postRun: [function() {
    assertTrue(EXPECTED_OUTPUT.test(Module.printBuffer));
  }],
};
// The Module object: Our interface to the outside world. We import
// and export values on it, and do the work to get that through
// closure compiler if necessary. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to do an eval in order to handle the closure compiler
// case, where this code here is minified but Module was defined
// elsewhere (e.g. case 4 above). We also need to check if Module
// already exists (e.g. case 3 above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define   var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module;
if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};

// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
for (var key in Module) {
  if (Module.hasOwnProperty(key)) {
    moduleOverrides[key] = Module[key];
  }
}

// The environment setup code below is customized to use Module.
// *** Environment setup code ***
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;

if (ENVIRONMENT_IS_NODE) {
  // Expose functionality in the same simple way that the shells work
  // Note that we pollute the global namespace here, otherwise we break in node
  if (!Module['print']) Module['print'] = function print(x) {
    process['stdout'].write(x + '\n');
  };
  if (!Module['printErr']) Module['printErr'] = function printErr(x) {
    process['stderr'].write(x + '\n');
  };

  var nodeFS = require('fs');
  var nodePath = require('path');

  Module['read'] = function read(filename, binary) {
    filename = nodePath['normalize'](filename);
    var ret = nodeFS['readFileSync'](filename);
    // The path is absolute if the normalized version is the same as the resolved.
    if (!ret && filename != nodePath['resolve'](filename)) {
      filename = path.join(__dirname, '..', 'src', filename);
      ret = nodeFS['readFileSync'](filename);
    }
    if (ret && !binary) ret = ret.toString();
    return ret;
  };

  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };

  Module['load'] = function load(f) {
    globalEval(read(f));
  };

  Module['arguments'] = process['argv'].slice(2);

  module['exports'] = Module;
}
else if (ENVIRONMENT_IS_SHELL) {
  if (!Module['print']) Module['print'] = print;
  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm

  if (typeof read != 'undefined') {
    Module['read'] = read;
  } else {
    Module['read'] = function read() { throw 'no read() available (jsc?)' };
  }

  Module['readBinary'] = function readBinary(f) {
    return read(f, 'binary');
  };

  if (typeof scriptArgs != 'undefined') {
    Module['arguments'] = scriptArgs;
  } else if (typeof arguments != 'undefined') {
    Module['arguments'] = arguments;
  }

  this['Module'] = Module;

  eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)
}
else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  Module['read'] = function read(url) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, false);
    xhr.send(null);
    return xhr.responseText;
  };

  if (typeof arguments != 'undefined') {
    Module['arguments'] = arguments;
  }

  if (typeof console !== 'undefined') {
    if (!Module['print']) Module['print'] = function print(x) {
      console.log(x);
    };
    if (!Module['printErr']) Module['printErr'] = function printErr(x) {
      console.log(x);
    };
  } else {
    // Probably a worker, and without console.log. We can do very little here...
    var TRY_USE_DUMP = false;
    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
      dump(x);
    }) : (function(x) {
      // self.postMessage(x); // enable this if you want stdout to be sent as messages
    }));
  }

  if (ENVIRONMENT_IS_WEB) {
    window['Module'] = Module;
  } else {
    Module['load'] = importScripts;
  }
}
else {
  // Unreachable because SHELL is dependant on the others
  throw 'Unknown runtime environment. Where are we?';
}

function globalEval(x) {
  eval.call(null, x);
}
if (!Module['load'] == 'undefined' && Module['read']) {
  Module['load'] = function load(f) {
    globalEval(Module['read'](f));
  };
}
if (!Module['print']) {
  Module['print'] = function(){};
}
if (!Module['printErr']) {
  Module['printErr'] = Module['print'];
}
if (!Module['arguments']) {
  Module['arguments'] = [];
}
// *** Environment setup code ***

// Closure helpers
Module.print = Module['print'];
Module.printErr = Module['printErr'];

// Callbacks
Module['preRun'] = [];
Module['postRun'] = [];

// Merge back in the overrides
for (var key in moduleOverrides) {
  if (moduleOverrides.hasOwnProperty(key)) {
    Module[key] = moduleOverrides[key];
  }
}



// === Auto-generated preamble library stuff ===

//========================================
// Runtime code shared with compiler
//========================================

var Runtime = {
  stackSave: function () {
    return STACKTOP;
  },
  stackRestore: function (stackTop) {
    STACKTOP = stackTop;
  },
  forceAlign: function (target, quantum) {
    quantum = quantum || 4;
    if (quantum == 1) return target;
    if (isNumber(target) && isNumber(quantum)) {
      return Math.ceil(target/quantum)*quantum;
    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
    }
    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
  },
  isNumberType: function (type) {
    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
  },
  isPointerType: function isPointerType(type) {
  return type[type.length-1] == '*';
},
  isStructType: function isStructType(type) {
  if (isPointerType(type)) return false;
  if (isArrayType(type)) return true;
  if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
  // See comment in isStructPointerType()
  return type[0] == '%';
},
  INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
  FLOAT_TYPES: {"float":0,"double":0},
  or64: function (x, y) {
    var l = (x | 0) | (y | 0);
    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  and64: function (x, y) {
    var l = (x | 0) & (y | 0);
    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  xor64: function (x, y) {
    var l = (x | 0) ^ (y | 0);
    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
    return l + h;
  },
  getNativeTypeSize: function (type) {
    switch (type) {
      case 'i1': case 'i8': return 1;
      case 'i16': return 2;
      case 'i32': return 4;
      case 'i64': return 8;
      case 'float': return 4;
      case 'double': return 8;
      default: {
        if (type[type.length-1] === '*') {
          return Runtime.QUANTUM_SIZE; // A pointer
        } else if (type[0] === 'i') {
          var bits = parseInt(type.substr(1));
          assert(bits % 8 === 0);
          return bits/8;
        } else {
          return 0;
        }
      }
    }
  },
  getNativeFieldSize: function (type) {
    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
  },
  dedup: function dedup(items, ident) {
  var seen = {};
  if (ident) {
    return items.filter(function(item) {
      if (seen[item[ident]]) return false;
      seen[item[ident]] = true;
      return true;
    });
  } else {
    return items.filter(function(item) {
      if (seen[item]) return false;
      seen[item] = true;
      return true;
    });
  }
},
  set: function set() {
  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
  var ret = {};
  for (var i = 0; i < args.length; i++) {
    ret[args[i]] = 0;
  }
  return ret;
},
  STACK_ALIGN: 8,
  getAlignSize: function (type, size, vararg) {
    // we align i64s and doubles on 64-bit boundaries, unlike x86
    if (!vararg && (type == 'i64' || type == 'double')) return 8;
    if (!type) return Math.min(size, 8); // align structures internally to 64 bits
    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
  },
  calculateStructAlignment: function calculateStructAlignment(type) {
    type.flatSize = 0;
    type.alignSize = 0;
    var diffs = [];
    var prev = -1;
    var index = 0;
    type.flatIndexes = type.fields.map(function(field) {
      index++;
      var size, alignSize;
      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
        alignSize = Runtime.getAlignSize(field, size);
      } else if (Runtime.isStructType(field)) {
        if (field[1] === '0') {
          // this is [0 x something]. When inside another structure like here, it must be at the end,
          // and it adds no size
          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
          size = 0;
          if (Types.types[field]) {
            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
          } else {
            alignSize = type.alignSize || QUANTUM_SIZE;
          }
        } else {
          size = Types.types[field].flatSize;
          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
        }
      } else if (field[0] == 'b') {
        // bN, large number field, like a [N x i8]
        size = field.substr(1)|0;
        alignSize = 1;
      } else if (field[0] === '<') {
        // vector type
        size = alignSize = Types.types[field].flatSize; // fully aligned
      } else if (field[0] === 'i') {
        // illegal integer field, that could not be legalized because it is an internal structure field
        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex
        size = alignSize = parseInt(field.substr(1))/8;
        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
      } else {
        assert(false, 'invalid type for calculateStructAlignment');
      }
      if (type.packed) alignSize = 1;
      type.alignSize = Math.max(type.alignSize, alignSize);
      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
      type.flatSize = curr + size;
      if (prev >= 0) {
        diffs.push(curr-prev);
      }
      prev = curr;
      return curr;
    });
    if (type.name_ && type.name_[0] === '[') {
      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
      // allocating a potentially huge array for [999999 x i8] etc.
      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
    }
    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
    if (diffs.length == 0) {
      type.flatFactor = type.flatSize;
    } else if (Runtime.dedup(diffs).length == 1) {
      type.flatFactor = diffs[0];
    }
    type.needsFlattening = (type.flatFactor != 1);
    return type.flatIndexes;
  },
  generateStructInfo: function (struct, typeName, offset) {
    var type, alignment;
    if (typeName) {
      offset = offset || 0;
      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
      if (!type) return null;
      if (type.fields.length != struct.length) {
        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
        return null;
      }
      alignment = type.flatIndexes;
    } else {
      var type = { fields: struct.map(function(item) { return item[0] }) };
      alignment = Runtime.calculateStructAlignment(type);
    }
    var ret = {
      __size__: type.flatSize
    };
    if (typeName) {
      struct.forEach(function(item, i) {
        if (typeof item === 'string') {
          ret[item] = alignment[i] + offset;
        } else {
          // embedded struct
          var key;
          for (var k in item) key = k;
          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
        }
      });
    } else {
      struct.forEach(function(item, i) {
        ret[item[1]] = alignment[i];
      });
    }
    return ret;
  },
  dynCall: function (sig, ptr, args) {
    if (args && args.length) {
      if (!args.splice) args = Array.prototype.slice.call(args);
      args.splice(0, 0, ptr);
      return Module['dynCall_' + sig].apply(null, args);
    } else {
      return Module['dynCall_' + sig].call(null, ptr);
    }
  },
  functionPointers: [],
  addFunction: function (func) {
    for (var i = 0; i < Runtime.functionPointers.length; i++) {
      if (!Runtime.functionPointers[i]) {
        Runtime.functionPointers[i] = func;
        return 2*(1 + i);
      }
    }
    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
  },
  removeFunction: function (index) {
    Runtime.functionPointers[(index-2)/2] = null;
  },
  getAsmConst: function (code, numArgs) {
    // code is a constant string on the heap, so we can cache these
    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
    var func = Runtime.asmConstCache[code];
    if (func) return func;
    var args = [];
    for (var i = 0; i < numArgs; i++) {
      args.push(String.fromCharCode(36) + i); // $0, $1 etc
    }
    var source = Pointer_stringify(code);
    if (source[0] === '"') {
      // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
      if (source.indexOf('"', 1) === source.length-1) {
        source = source.substr(1, source.length-2);
      } else {
        // something invalid happened, e.g. EM_ASM("..code($0)..", input)
        abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
      }
    }
    try {
      var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })'); // new Function does not allow upvars in node
    } catch(e) {
      Module.printErr('error in executing inline EM_ASM code: ' + e + ' on: \n\n' + source + '\n\nwith args |' + args + '| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)');
      throw e;
    }
    return Runtime.asmConstCache[code] = evalled;
  },
  warnOnce: function (text) {
    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
    if (!Runtime.warnOnce.shown[text]) {
      Runtime.warnOnce.shown[text] = 1;
      Module.printErr(text);
    }
  },
  funcWrappers: {},
  getFuncWrapper: function (func, sig) {
    assert(sig);
    if (!Runtime.funcWrappers[func]) {
      Runtime.funcWrappers[func] = function dynCall_wrapper() {
        return Runtime.dynCall(sig, func, arguments);
      };
    }
    return Runtime.funcWrappers[func];
  },
  UTF8Processor: function () {
    var buffer = [];
    var needed = 0;
    this.processCChar = function (code) {
      code = code & 0xFF;

      if (buffer.length == 0) {
        if ((code & 0x80) == 0x00) {        // 0xxxxxxx
          return String.fromCharCode(code);
        }
        buffer.push(code);
        if ((code & 0xE0) == 0xC0) {        // 110xxxxx
          needed = 1;
        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx
          needed = 2;
        } else {                            // 11110xxx
          needed = 3;
        }
        return '';
      }

      if (needed) {
        buffer.push(code);
        needed--;
        if (needed > 0) return '';
      }

      var c1 = buffer[0];
      var c2 = buffer[1];
      var c3 = buffer[2];
      var c4 = buffer[3];
      var ret;
      if (buffer.length == 2) {
        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));
      } else if (buffer.length == 3) {
        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));
      } else {
        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);
        ret = String.fromCharCode(
          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
          (codePoint - 0x10000) % 0x400 + 0xDC00);
      }
      buffer.length = 0;
      return ret;
    }
    this.processJSString = function processJSString(string) {
      /* TODO: use TextEncoder when present,
        var encoder = new TextEncoder();
        encoder['encoding'] = "utf-8";
        var utf8Array = encoder['encode'](aMsg.data);
      */
      string = unescape(encodeURIComponent(string));
      var ret = [];
      for (var i = 0; i < string.length; i++) {
        ret.push(string.charCodeAt(i));
      }
      return ret;
    }
  },
  getCompilerSetting: function (name) {
    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';
  },
  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },
  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },
  GLOBAL_BASE: 8,
  QUANTUM_SIZE: 4,
  __dummy__: 0
}


Module['Runtime'] = Runtime;









//========================================
// Runtime essentials
//========================================

var __THREW__ = 0; // Used in checking for thrown exceptions.

var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
var EXITSTATUS = 0;

var undef = 0;
// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
var tempI64, tempI64b;
var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;

function assert(condition, text) {
  if (!condition) {
    abort('Assertion failed: ' + text);
  }
}

var globalScope = this;

// C calling interface. A convenient way to call C functions (in C files, or
// defined with extern "C").
//
// Note: LLVM optimizations can inline and remove functions, after which you will not be
//       able to call them. Closure can also do so. To avoid that, add your function to
//       the exports using something like
//
//         -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
//
// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern "C")
// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,
//                   except that 'array' is not possible (there is no way for us to know the length of the array)
// @param args       An array of the arguments to the function, as native JS values (as in returnType)
//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
// @return           The return value, as a native JS value (as in returnType)
function ccall(ident, returnType, argTypes, args) {
  return ccallFunc(getCFunc(ident), returnType, argTypes, args);
}
Module["ccall"] = ccall;

// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
  try {
    var func = Module['_' + ident]; // closure exported function
    if (!func) func = eval('_' + ident); // explicit lookup
  } catch(e) {
  }
  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
  return func;
}

// Internal function that does a C call using a function, not an identifier
function ccallFunc(func, returnType, argTypes, args) {
  var stack = 0;
  function toC(value, type) {
    if (type == 'string') {
      if (value === null || value === undefined || value === 0) return 0; // null string
      value = intArrayFromString(value);
      type = 'array';
    }
    if (type == 'array') {
      if (!stack) stack = Runtime.stackSave();
      var ret = Runtime.stackAlloc(value.length);
      writeArrayToMemory(value, ret);
      return ret;
    }
    return value;
  }
  function fromC(value, type) {
    if (type == 'string') {
      return Pointer_stringify(value);
    }
    assert(type != 'array');
    return value;
  }
  var i = 0;
  var cArgs = args ? args.map(function(arg) {
    return toC(arg, argTypes[i++]);
  }) : [];
  var ret = fromC(func.apply(null, cArgs), returnType);
  if (stack) Runtime.stackRestore(stack);
  return ret;
}

// Returns a native JS wrapper for a C function. This is similar to ccall, but
// returns a function you can call repeatedly in a normal way. For example:
//
//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
//   alert(my_function(5, 22));
//   alert(my_function(99, 12));
//
function cwrap(ident, returnType, argTypes) {
  var func = getCFunc(ident);
  return function() {
    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
  }
}
Module["cwrap"] = cwrap;

// Sets a value in memory in a dynamic way at run-time. Uses the
// type data. This is the same as makeSetValue, except that
// makeSetValue is done at compile-time and generates the needed
// code then, whereas this function picks the right code at
// run-time.
// Note that setValue and getValue only do *aligned* writes and reads!
// Note that ccall uses JS types as for defining types, while setValue and
// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
function setValue(ptr, value, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
    switch(type) {
      case 'i1': HEAP8[(ptr)]=value; break;
      case 'i8': HEAP8[(ptr)]=value; break;
      case 'i16': HEAP16[((ptr)>>1)]=value; break;
      case 'i32': HEAP32[((ptr)>>2)]=value; break;
      case 'i64': (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]); break;
      case 'float': HEAPF32[((ptr)>>2)]=value; break;
      case 'double': HEAPF64[((ptr)>>3)]=value; break;
      default: abort('invalid type for setValue: ' + type);
    }
}
Module['setValue'] = setValue;

// Parallel to setValue.
function getValue(ptr, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
    switch(type) {
      case 'i1': return HEAP8[(ptr)];
      case 'i8': return HEAP8[(ptr)];
      case 'i16': return HEAP16[((ptr)>>1)];
      case 'i32': return HEAP32[((ptr)>>2)];
      case 'i64': return HEAP32[((ptr)>>2)];
      case 'float': return HEAPF32[((ptr)>>2)];
      case 'double': return HEAPF64[((ptr)>>3)];
      default: abort('invalid type for setValue: ' + type);
    }
  return null;
}
Module['getValue'] = getValue;

var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
var ALLOC_STATIC = 2; // Cannot be freed
var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
var ALLOC_NONE = 4; // Do not allocate
Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
Module['ALLOC_STACK'] = ALLOC_STACK;
Module['ALLOC_STATIC'] = ALLOC_STATIC;
Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
Module['ALLOC_NONE'] = ALLOC_NONE;

// allocate(): This is for internal use. You can use it yourself as well, but the interface
//             is a little tricky (see docs right below). The reason is that it is optimized
//             for multiple syntaxes to save space in generated code. So you should
//             normally not use allocate(), and instead allocate memory using _malloc(),
//             initialize it with setValue(), and so forth.
// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
//        in *bytes* (note that this is sometimes confusing: the next parameter does not
//        affect this!)
// @types: Either an array of types, one for each byte (or 0 if no type at that position),
//         or a single type which is used for the entire block. This only matters if there
//         is initial data - if @slab is a number, then this does not matter at all and is
//         ignored.
// @allocator: How to allocate memory, see ALLOC_*
function allocate(slab, types, allocator, ptr) {
  var zeroinit, size;
  if (typeof slab === 'number') {
    zeroinit = true;
    size = slab;
  } else {
    zeroinit = false;
    size = slab.length;
  }

  var singleType = typeof types === 'string' ? types : null;

  var ret;
  if (allocator == ALLOC_NONE) {
    ret = ptr;
  } else {
    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
  }

  if (zeroinit) {
    var ptr = ret, stop;
    assert((ret & 3) == 0);
    stop = ret + (size & ~3);
    for (; ptr < stop; ptr += 4) {
      HEAP32[((ptr)>>2)]=0;
    }
    stop = ret + size;
    while (ptr < stop) {
      HEAP8[((ptr++)|0)]=0;
    }
    return ret;
  }

  if (singleType === 'i8') {
    if (slab.subarray || slab.slice) {
      HEAPU8.set(slab, ret);
    } else {
      HEAPU8.set(new Uint8Array(slab), ret);
    }
    return ret;
  }

  var i = 0, type, typeSize, previousType;
  while (i < size) {
    var curr = slab[i];

    if (typeof curr === 'function') {
      curr = Runtime.getFunctionIndex(curr);
    }

    type = singleType || types[i];
    if (type === 0) {
      i++;
      continue;
    }

    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later

    setValue(ret+i, curr, type);

    // no need to look up size unless type changes, so cache it
    if (previousType !== type) {
      typeSize = Runtime.getNativeTypeSize(type);
      previousType = type;
    }
    i += typeSize;
  }

  return ret;
}
Module['allocate'] = allocate;

function Pointer_stringify(ptr, /* optional */ length) {
  // TODO: use TextDecoder
  // Find the length, and check for UTF while doing so
  var hasUtf = false;
  var t;
  var i = 0;
  while (1) {
    t = HEAPU8[(((ptr)+(i))|0)];
    if (t >= 128) hasUtf = true;
    else if (t == 0 && !length) break;
    i++;
    if (length && i == length) break;
  }
  if (!length) length = i;

  var ret = '';

  if (!hasUtf) {
    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
    var curr;
    while (length > 0) {
      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
      ret = ret ? ret + curr : curr;
      ptr += MAX_CHUNK;
      length -= MAX_CHUNK;
    }
    return ret;
  }

  var utf8 = new Runtime.UTF8Processor();
  for (i = 0; i < length; i++) {
    t = HEAPU8[(((ptr)+(i))|0)];
    ret += utf8.processCChar(t);
  }
  return ret;
}
Module['Pointer_stringify'] = Pointer_stringify;

// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF16ToString(ptr) {
  var i = 0;

  var str = '';
  while (1) {
    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
    if (codeUnit == 0)
      return str;
    ++i;
    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
    str += String.fromCharCode(codeUnit);
  }
}
Module['UTF16ToString'] = UTF16ToString;

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
function stringToUTF16(str, outPtr) {
  for(var i = 0; i < str.length; ++i) {
    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
}
Module['stringToUTF16'] = stringToUTF16;

// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF32ToString(ptr) {
  var i = 0;

  var str = '';
  while (1) {
    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
    if (utf32 == 0)
      return str;
    ++i;
    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
    if (utf32 >= 0x10000) {
      var ch = utf32 - 0x10000;
      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
    } else {
      str += String.fromCharCode(utf32);
    }
  }
}
Module['UTF32ToString'] = UTF32ToString;

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.
function stringToUTF32(str, outPtr) {
  var iChar = 0;
  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
      var trailSurrogate = str.charCodeAt(++iCodeUnit);
      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
    }
    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
    ++iChar;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
}
Module['stringToUTF32'] = stringToUTF32;

function demangle(func) {
  var i = 3;
  // params, etc.
  var basicTypes = {
    'v': 'void',
    'b': 'bool',
    'c': 'char',
    's': 'short',
    'i': 'int',
    'l': 'long',
    'f': 'float',
    'd': 'double',
    'w': 'wchar_t',
    'a': 'signed char',
    'h': 'unsigned char',
    't': 'unsigned short',
    'j': 'unsigned int',
    'm': 'unsigned long',
    'x': 'long long',
    'y': 'unsigned long long',
    'z': '...'
  };
  var subs = [];
  var first = true;
  function dump(x) {
    //return;
    if (x) Module.print(x);
    Module.print(func);
    var pre = '';
    for (var a = 0; a < i; a++) pre += ' ';
    Module.print (pre + '^');
  }
  function parseNested() {
    i++;
    if (func[i] === 'K') i++; // ignore const
    var parts = [];
    while (func[i] !== 'E') {
      if (func[i] === 'S') { // substitution
        i++;
        var next = func.indexOf('_', i);
        var num = func.substring(i, next) || 0;
        parts.push(subs[num] || '?');
        i = next+1;
        continue;
      }
      if (func[i] === 'C') { // constructor
        parts.push(parts[parts.length-1]);
        i += 2;
        continue;
      }
      var size = parseInt(func.substr(i));
      var pre = size.toString().length;
      if (!size || !pre) { i--; break; } // counter i++ below us
      var curr = func.substr(i + pre, size);
      parts.push(curr);
      subs.push(curr);
      i += pre + size;
    }
    i++; // skip E
    return parts;
  }
  function parse(rawList, limit, allowVoid) { // main parser
    limit = limit || Infinity;
    var ret = '', list = [];
    function flushList() {
      return '(' + list.join(', ') + ')';
    }
    var name;
    if (func[i] === 'N') {
      // namespaced N-E
      name = parseNested().join('::');
      limit--;
      if (limit === 0) return rawList ? [name] : name;
    } else {
      // not namespaced
      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
      var size = parseInt(func.substr(i));
      if (size) {
        var pre = size.toString().length;
        name = func.substr(i + pre, size);
        i += pre + size;
      }
    }
    first = false;
    if (func[i] === 'I') {
      i++;
      var iList = parse(true);
      var iRet = parse(true, 1, true);
      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
    } else {
      ret = name;
    }
    paramLoop: while (i < func.length && limit-- > 0) {
      //dump('paramLoop');
      var c = func[i++];
      if (c in basicTypes) {
        list.push(basicTypes[c]);
      } else {
        switch (c) {
          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
          case 'L': { // literal
            i++; // skip basic type
            var end = func.indexOf('E', i);
            var size = end - i;
            list.push(func.substr(i, size));
            i += size + 2; // size + 'EE'
            break;
          }
          case 'A': { // array
            var size = parseInt(func.substr(i));
            i += size.toString().length;
            if (func[i] !== '_') throw '?';
            i++; // skip _
            list.push(parse(true, 1, true)[0] + ' [' + size + ']');
            break;
          }
          case 'E': break paramLoop;
          default: ret += '?' + c; break paramLoop;
        }
      }
    }
    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
    if (rawList) {
      if (ret) {
        list.push(ret + '?');
      }
      return list;
    } else {
      return ret + flushList();
    }
  }
  try {
    // Special-case the entry point, since its name differs from other name mangling.
    if (func == 'Object._main' || func == '_main') {
      return 'main()';
    }
    if (typeof func === 'number') func = Pointer_stringify(func);
    if (func[0] !== '_') return func;
    if (func[1] !== '_') return func; // C function
    if (func[2] !== 'Z') return func;
    switch (func[3]) {
      case 'n': return 'operator new()';
      case 'd': return 'operator delete()';
    }
    return parse();
  } catch(e) {
    return func;
  }
}

function demangleAll(text) {
  return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
}

function stackTrace() {
  var stack = new Error().stack;
  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
}

// Memory management

var PAGE_SIZE = 4096;
function alignMemoryPage(x) {
  return (x+4095)&-4096;
}

var HEAP;
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;

var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk

function enlargeMemory() {
  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');
}

var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728;
var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;

var totalMemory = 4096;
while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
  if (totalMemory < 16*1024*1024) {
    totalMemory *= 2;
  } else {
    totalMemory += 16*1024*1024
  }
}
if (totalMemory !== TOTAL_MEMORY) {
  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');
  TOTAL_MEMORY = totalMemory;
}

// Initialize the runtime's memory
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
       'JS engine does not provide full typed array support');

var buffer = new ArrayBuffer(TOTAL_MEMORY);
HEAP8 = new Int8Array(buffer);
HEAP16 = new Int16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPU8 = new Uint8Array(buffer);
HEAPU16 = new Uint16Array(buffer);
HEAPU32 = new Uint32Array(buffer);
HEAPF32 = new Float32Array(buffer);
HEAPF64 = new Float64Array(buffer);

// Endianness check (note: assumes compiler arch was little-endian)
HEAP32[0] = 255;
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');

Module['HEAP'] = HEAP;
Module['HEAP8'] = HEAP8;
Module['HEAP16'] = HEAP16;
Module['HEAP32'] = HEAP32;
Module['HEAPU8'] = HEAPU8;
Module['HEAPU16'] = HEAPU16;
Module['HEAPU32'] = HEAPU32;
Module['HEAPF32'] = HEAPF32;
Module['HEAPF64'] = HEAPF64;

function callRuntimeCallbacks(callbacks) {
  while(callbacks.length > 0) {
    var callback = callbacks.shift();
    if (typeof callback == 'function') {
      callback();
      continue;
    }
    var func = callback.func;
    if (typeof func === 'number') {
      if (callback.arg === undefined) {
        Runtime.dynCall('v', func);
      } else {
        Runtime.dynCall('vi', func, [callback.arg]);
      }
    } else {
      func(callback.arg === undefined ? null : callback.arg);
    }
  }
}

var __ATPRERUN__  = []; // functions called before the runtime is initialized
var __ATINIT__    = []; // functions called during startup
var __ATMAIN__    = []; // functions called when main() is to be run
var __ATEXIT__    = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the runtime has exited

var runtimeInitialized = false;

function preRun() {
  // compatibility - merge in anything from Module['preRun'] at this time
  if (Module['preRun']) {
    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
    while (Module['preRun'].length) {
      addOnPreRun(Module['preRun'].shift());
    }
  }
  callRuntimeCallbacks(__ATPRERUN__);
}

function ensureInitRuntime() {
  if (runtimeInitialized) return;
  runtimeInitialized = true;
  callRuntimeCallbacks(__ATINIT__);
}

function preMain() {
  callRuntimeCallbacks(__ATMAIN__);
}

function exitRuntime() {
  callRuntimeCallbacks(__ATEXIT__);
}

function postRun() {
  // compatibility - merge in anything from Module['postRun'] at this time
  if (Module['postRun']) {
    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
    while (Module['postRun'].length) {
      addOnPostRun(Module['postRun'].shift());
    }
  }
  callRuntimeCallbacks(__ATPOSTRUN__);
}

function addOnPreRun(cb) {
  __ATPRERUN__.unshift(cb);
}
Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;

function addOnInit(cb) {
  __ATINIT__.unshift(cb);
}
Module['addOnInit'] = Module.addOnInit = addOnInit;

function addOnPreMain(cb) {
  __ATMAIN__.unshift(cb);
}
Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;

function addOnExit(cb) {
  __ATEXIT__.unshift(cb);
}
Module['addOnExit'] = Module.addOnExit = addOnExit;

function addOnPostRun(cb) {
  __ATPOSTRUN__.unshift(cb);
}
Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;

// Tools

// This processes a JS string into a C-line array of numbers, 0-terminated.
// For LLVM-originating strings, see parser.js:parseLLVMString function
function intArrayFromString(stringy, dontAddNull, length /* optional */) {
  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
  if (length) {
    ret.length = length;
  }
  if (!dontAddNull) {
    ret.push(0);
  }
  return ret;
}
Module['intArrayFromString'] = intArrayFromString;

function intArrayToString(array) {
  var ret = [];
  for (var i = 0; i < array.length; i++) {
    var chr = array[i];
    if (chr > 0xFF) {
      chr &= 0xFF;
    }
    ret.push(String.fromCharCode(chr));
  }
  return ret.join('');
}
Module['intArrayToString'] = intArrayToString;

// Write a Javascript array to somewhere in the heap
function writeStringToMemory(string, buffer, dontAddNull) {
  var array = intArrayFromString(string, dontAddNull);
  var i = 0;
  while (i < array.length) {
    var chr = array[i];
    HEAP8[(((buffer)+(i))|0)]=chr;
    i = i + 1;
  }
}
Module['writeStringToMemory'] = writeStringToMemory;

function writeArrayToMemory(array, buffer) {
  for (var i = 0; i < array.length; i++) {
    HEAP8[(((buffer)+(i))|0)]=array[i];
  }
}
Module['writeArrayToMemory'] = writeArrayToMemory;

function writeAsciiToMemory(str, buffer, dontAddNull) {
  for (var i = 0; i < str.length; i++) {
    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
  }
  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
}
Module['writeAsciiToMemory'] = writeAsciiToMemory;

function unSign(value, bits, ignore) {
  if (value >= 0) {
    return value;
  }
  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
                    : Math.pow(2, bits)         + value;
}
function reSign(value, bits, ignore) {
  if (value <= 0) {
    return value;
  }
  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
                        : Math.pow(2, bits-1);
  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
                                                       // TODO: In i64 mode 1, resign the two parts separately and safely
    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
  }
  return value;
}

// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
  var ah  = a >>> 16;
  var al = a & 0xffff;
  var bh  = b >>> 16;
  var bl = b & 0xffff;
  return (al*bl + ((ah*bl + al*bh) << 16))|0;
};
Math.imul = Math['imul'];


var Math_abs = Math.abs;
var Math_cos = Math.cos;
var Math_sin = Math.sin;
var Math_tan = Math.tan;
var Math_acos = Math.acos;
var Math_asin = Math.asin;
var Math_atan = Math.atan;
var Math_atan2 = Math.atan2;
var Math_exp = Math.exp;
var Math_log = Math.log;
var Math_sqrt = Math.sqrt;
var Math_ceil = Math.ceil;
var Math_floor = Math.floor;
var Math_pow = Math.pow;
var Math_imul = Math.imul;
var Math_fround = Math.fround;
var Math_min = Math.min;

// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled

function addRunDependency(id) {
  runDependencies++;
  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }
}
Module['addRunDependency'] = addRunDependency;
function removeRunDependency(id) {
  runDependencies--;
  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }
  if (runDependencies == 0) {
    if (runDependencyWatcher !== null) {
      clearInterval(runDependencyWatcher);
      runDependencyWatcher = null;
    }
    if (dependenciesFulfilled) {
      var callback = dependenciesFulfilled;
      dependenciesFulfilled = null;
      callback(); // can add another dependenciesFulfilled
    }
  }
}
Module['removeRunDependency'] = removeRunDependency;

Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data


var memoryInitializer = null;

// === Body ===
var __ZTVN10__cxxabiv117__class_type_infoE = 7024;
var __ZTVN10__cxxabiv120__si_class_type_infoE = 7064;




STATIC_BASE = 8;

STATICTOP = STATIC_BASE + Runtime.alignMemory(7731);
/* global initializers */ __ATINIT__.push();


/* memory initializer */ allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,118,72,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,114,114,111,114,58,32,37,100,92,110,0,0,0,0,0,102,114,97,109,101,32,97,118,101,114,97,103,101,115,58,32,37,46,51,102,32,43,45,32,37,46,51,102,44,32,114,97,110,103,101,58,32,37,46,51,102,32,116,111,32,37,46,51,102,32,10,0,0,0,0,0,105,102,32,40,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,41,32,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,40,41,0,0,114,101,115,112,111,110,115,105,118,101,32,109,97,105,110,32,108,111,111,112,0,0,0,0,0,0,0,0,56,1,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,49,49,98,50,69,100,103,101,83,104,97,112,101,0,0,0,55,98,50,83,104,97,112,101,0,0,0,0,0,0,0,0,120,27,0,0,32,1,0,0,160,27,0,0,16,1,0,0,48,1,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,80,111,108,121,103,111,110,83,104,97,112,101,46,99,112,112,0,0,0,0,0,0,0,48,46,48,102,32,60,61,32,108,111,119,101,114,32,38,38,32,108,111,119,101,114,32,60,61,32,105,110,112,117,116,46,109,97,120,70,114,97,99,116,105,111,110,0,0,0,0,0,82,97,121,67,97,115,116,0,109,95,118,101,114,116,101,120,67,111,117,110,116,32,62,61,32,51,0,0,0,0,0,0,67,111,109,112,117,116,101,77,97,115,115,0,0,0,0,0,97,114,101,97,32,62,32,49,46,49,57,50,48,57,50,57,48,101,45,48,55,70,0,0,0,0,0,0,48,2,0,0,3,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,49,52,98,50,80,111,108,121,103,111,110,83,104,97,112,101,0,0,0,0,0,0,0,0,160,27,0,0,24,2,0,0,48,1,0,0,0,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,1,0,0,64,1,0,0,128,1,0,0,192,1,0,0,0,2,0,0,128,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,0,48,32,60,32,115,105,122,101,0,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,98,108,111,99,107,67,111,117,110,116,32,42,32,98,108,111,99,107,83,105,122,101,32,60,61,32,98,50,95,99,104,117,110,107,83,105,122,101,0,0,70,114,101,101,0,0,0,0,98,100,45,62,112,111,115,105,116,105,111,110,46,73,115,86,97,108,105,100,40,41,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,66,111,100,121,46,99,112,112,0,0,0,0,0,0,0,98,50,66,111,100,121,0,0,98,100,45,62,108,105,110,101,97,114,86,101,108,111,99,105,116,121,46,73,115,86,97,108,105,100,40,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,108,101,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,86,101,108,111,99,105,116,121,41,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,0,0,109,95,119,111,114,108,100,45,62,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,67,114,101,97,116,101,70,105,120,116,117,114,101,0,0,0,109,95,116,121,112,101,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,0,0,82,101,115,101,116,77,97,115,115,68,97,116,97,0,0,0,109,95,73,32,62,32,48,46,48,102,0,0,0,0,0,0,0,10,0,0,0,0,0,0,240,7,0,0,0,0,0,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,104,0,0,0,0,0,0,0,71,101,116,85,115,101,114,68,97,116,97,0,0,0,0,0,71,101,116,70,97,116,65,65,66,66,0,0,0,0,0,0,0,0,0,0,32,8,0,0,5,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,49,55,98,50,67,111,110,116,97,99,116,76,105,115,116,101,110,101,114,0,0,0,0,0,120,27,0,0,8,8,0,0,109,95,112,114,111,120,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,70,105,120,116,117,114,101,46,99,112,112,0,0,0,0,67,114,101,97,116,101,80,114,111,120,105,101,115,0,0,0,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,87,111,114,108,100,46,99,112,112,0,0,0,0,0,0,67,114,101,97,116,101,66,111,100,121,0,0,0,0,0,0,98,45,62,73,115,65,99,116,105,118,101,40,41,32,61,61,32,116,114,117,101,0,0,0,83,111,108,118,101,0,0,0,115,116,97,99,107,67,111,117,110,116,32,60,32,115,116,97,99,107,83,105,122,101,0,0,116,121,112,101,65,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,32,124,124,32,116,121,112,101,66,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,97,108,112,104,97,48,32,60,32,49,46,48,102,0,0,0,46,47,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,77,97,116,104,46,104,0,65,100,118,97,110,99,101,0,109,95,106,111,105,110,116,67,111,117,110,116,32,60,32,109,95,106,111,105,110,116,67,97,112,97,99,105,116,121,0,0,46,47,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,104,0,0,0,0,0,65,100,100,0,0,0,0,0,109,95,99,111,110,116,97,99,116,67,111,117,110,116,32,60,32,109,95,99,111,110,116,97,99,116,67,97,112,97,99,105,116,121,0,0,0,0,0,0,109,95,98,111,100,121,67,111,117,110,116,32,60,32,109,95,98,111,100,121,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,40,10,0,0,7,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,49,53,98,50,67,111,110,116,97,99,116,70,105,108,116,101,114,0,0,0,0,0,0,0,120,27,0,0,16,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,99,104,97,105,110,45,62,109,95,99,111,117,110,116,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,99,112,112,0,0,83,101,116,0,0,0,0,0,102,97,108,115,101,0,0,0,98,50,68,105,115,116,97,110,99,101,0,0,0,0,0,0,71,101,116,77,101,116,114,105,99,0,0,0,0,0,0,0,71,101,116,87,105,116,110,101,115,115,80,111,105,110,116,115,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,71,101,116,67,108,111,115,101,115,116,80,111,105,110,116,0,99,97,99,104,101,45,62,99,111,117,110,116,32,60,61,32,51,0,0,0,0,0,0,0,82,101,97,100,67,97,99,104,101,0,0,0,0,0,0,0,109,95,110,111,100,101,67,111,117,110,116,32,61,61,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,99,112,112,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,78,111,100,101,0,0,0,0,48,32,60,61,32,110,111,100,101,73,100,32,38,38,32,110,111,100,101,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,70,114,101,101,78,111,100,101,0,0,0,0,0,0,0,0,48,32,60,32,109,95,110,111,100,101,67,111,117,110,116,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,109,95,110,111,100,101,115,91,112,114,111,120,121,73,100,93,46,73,115,76,101,97,102,40,41,0,0,0,0,0,0,0,77,111,118,101,80,114,111,120,121,0,0,0,0,0,0,0,99,104,105,108,100,49,32,33,61,32,40,45,49,41,0,0,73,110,115,101,114,116,76,101,97,102,0,0,0,0,0,0,99,104,105,108,100,50,32,33,61,32,40,45,49,41,0,0,105,65,32,33,61,32,40,45,49,41,0,0,0,0,0,0,66,97,108,97,110,99,101,0,48,32,60,61,32,105,66,32,38,38,32,105,66,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,67,32,38,38,32,105,67,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,70,32,38,38,32,105,70,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,71,32,38,38,32,105,71,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,67,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,48,32,60,61,32,105,68,32,38,38,32,105,68,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,69,32,38,38,32,105,69,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,66,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,97,114,103,101,116,32,62,32,116,111,108,101,114,97,110,99,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,84,105,109,101,79,102,73,109,112,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,84,105,109,101,79,102,73,109,112,97,99,116,0,0,102,97,108,115,101,0,0,0,69,118,97,108,117,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,70,105,110,100,77,105,110,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,48,32,60,32,99,111,117,110,116,32,38,38,32,99,111,117,110,116,32,60,32,51,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,95,105,110,100,101,120,32,61,61,32,48,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,126,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,60,32,98,50,95,109,97,120,83,116,97,99,107,69,110,116,114,105,101,115,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,70,114,101,101,0,0,0,0,112,32,61,61,32,101,110,116,114,121,45,62,100,97,116,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,116,121,112,101,49,32,38,38,32,116,121,112,101,49,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,46,99,112,112,0,0,0,48,32,60,61,32,116,121,112,101,50,32,38,38,32,116,121,112,101,50,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,67,114,101,97,116,101,0,0,115,95,105,110,105,116,105,97,108,105,122,101,100,32,61,61,32,116,114,117,101,0,0,0,68,101,115,116,114,111,121,0,48,32,60,61,32,116,121,112,101,65,32,38,38,32,116,121,112,101,66,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,0,0,0,0,120,17,0,0,1,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,57,98,50,67,111,110,116,97,99,116,0,0,0,0,0,0,120,27,0,0,104,17,0,0,0,0,0,0,104,18,0,0,3,0,0,0,11,0,0,0,12,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,50,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,160,27,0,0,72,18,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,19,0,0,4,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,51,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,19,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,20,0,0,5,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,53,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,160,27,0,0,64,20,0,0,120,17,0,0,0,0,0,0,0,0,0,0,72,21,0,0,6,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,49,54,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,48,21,0,0,120,17,0,0,0,0,0,0,116,111,105,73,110,100,101,120,65,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,99,112,112,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,116,111,105,73,110,100,101,120,66,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,100,101,110,32,62,32,48,46,48,102,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,69,100,103,101,46,99,112,112,0,0,0,0,0,0,0,98,50,67,111,108,108,105,100,101,69,100,103,101,65,110,100,67,105,114,99,108,101,0,0,48,32,60,61,32,101,100,103,101,49,32,38,38,32,101,100,103,101,49,32,60,32,112,111,108,121,49,45,62,109,95,118,101,114,116,101,120,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,80,111,108,121,103,111,110,46,99,112,112,0,0,0,0,98,50,70,105,110,100,73,110,99,105,100,101,110,116,69,100,103,101,0,0,0,0,0,0,98,50,69,100,103,101,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,120,23,0,0,7,0,0,0,19,0,0,0,20,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,51,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,88,23,0,0,120,17,0,0,0,0,0,0,0,0,0,0,120,24,0,0,8,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,52,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,88,24,0,0,120,17,0,0,0,0,0,0,0,0,0,0,88,25,0,0,9,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,49,53,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,25,0,0,120,17,0,0,0,0,0,0,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,46,99,112,112,0,0,0,0,0,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,0,109,97,110,105,102,111,108,100,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,112,111,105,110,116,67,111,117,110,116,32,61,61,32,49,32,124,124,32,112,111,105,110,116,67,111,117,110,116,32,61,61,32,50,0,0,0,0,0,0,83,111,108,118,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,46,120,32,62,61,32,48,46,48,102,32,38,38,32,97,46,121,32,62,61,32,48,46,48,102,0,0,0,0,0,0,112,99,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,67,104,97,105,110,83,104,97,112,101,46,99,112,112,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,32,45,32,49,0,0,0,0,0,0,0,71,101,116,67,104,105,108,100,69,100,103,101,0,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,120,27,0,0,232,26,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,160,27,0,0,0,27,0,0,248,26,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,160,27,0,0,56,27,0,0,40,27,0,0,0,0,0,0,0,0,0,0,96,27,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,232,27,0,0,25,0,0,0,29,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,11,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,160,27,0,0,192,27,0,0,96,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,30,0,0,30,0,0,0,31,0,0,0,3,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,160,27,0,0,24,30,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE);




var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8);

assert(tempDoublePtr % 8 == 0);

function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much

  HEAP8[tempDoublePtr] = HEAP8[ptr];

  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];

  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];

  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];

}

function copyTempDouble(ptr) {

  HEAP8[tempDoublePtr] = HEAP8[ptr];

  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];

  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];

  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];

  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];

  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];

  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];

  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];

}


  function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg) {
      Module['noExitRuntime'] = true;

      Browser.mainLoop.runner = function Browser_mainLoop_runner() {
        if (ABORT) return;
        if (Browser.mainLoop.queue.length > 0) {
          var start = Date.now();
          var blocker = Browser.mainLoop.queue.shift();
          blocker.func(blocker.arg);
          if (Browser.mainLoop.remainingBlockers) {
            var remaining = Browser.mainLoop.remainingBlockers;
            var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining);
            if (blocker.counted) {
              Browser.mainLoop.remainingBlockers = next;
            } else {
              // not counted, but move the progress along a tiny bit
              next = next + 0.5; // do not steal all the next one's progress
              Browser.mainLoop.remainingBlockers = (8*remaining + next)/9;
            }
          }
          console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); //, left: ' + Browser.mainLoop.remainingBlockers);
          Browser.mainLoop.updateStatus();
          setTimeout(Browser.mainLoop.runner, 0);
          return;
        }
        if (Browser.mainLoop.shouldPause) {
          // catch pauses from non-main loop sources
          Browser.mainLoop.paused = true;
          Browser.mainLoop.shouldPause = false;
          return;
        }

        // Signal GL rendering layer that processing of a new frame is about to start. This helps it optimize
        // VBO double-buffering and reduce GPU stalls.

        if (Browser.mainLoop.method === 'timeout' && Module.ctx) {
          Module.printErr('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!');
          Browser.mainLoop.method = ''; // just warn once per call to set main loop
        }

        if (Module['preMainLoop']) {
          Module['preMainLoop']();
        }

        try {
          if (typeof arg !== 'undefined') {
            Runtime.dynCall('vi', func, [arg]);
          } else {
            Runtime.dynCall('v', func);
          }
        } catch (e) {
          if (e instanceof ExitStatus) {
            return;
          } else {
            if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
            throw e;
          }
        }

        if (Module['postMainLoop']) {
          Module['postMainLoop']();
        }

        if (Browser.mainLoop.shouldPause) {
          // catch pauses from the main loop itself
          Browser.mainLoop.paused = true;
          Browser.mainLoop.shouldPause = false;
          return;
        }
        Browser.mainLoop.scheduler();
      }
      if (fps && fps > 0) {
        Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler() {
          setTimeout(Browser.mainLoop.runner, 1000/fps); // doing this each time means that on exception, we stop
        };
        Browser.mainLoop.method = 'timeout';
      } else {
        Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler() {
          Browser.requestAnimationFrame(Browser.mainLoop.runner);
        };
        Browser.mainLoop.method = 'rAF';
      }
      Browser.mainLoop.scheduler();

      if (simulateInfiniteLoop) {
        throw 'SimulateInfiniteLoop';
      }
    }

  var _cosf=Math_cos;

  function ___cxa_pure_virtual() {
      ABORT = true;
      throw 'Pure virtual function called!';
    }

  function _time(ptr) {
      var ret = Math.floor(Date.now()/1000);
      if (ptr) {
        HEAP32[((ptr)>>2)]=ret;
      }
      return ret;
    }

  function ___assert_fail(condition, filename, line, func) {
      ABORT = true;
      throw 'Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + stackTrace();
    }


  function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()
      return !!__ZSt18uncaught_exceptionv.uncaught_exception;
    }



  function ___cxa_is_number_type(type) {
      var isNumber = false;
      try { if (type == __ZTIi) isNumber = true } catch(e){}
      try { if (type == __ZTIj) isNumber = true } catch(e){}
      try { if (type == __ZTIl) isNumber = true } catch(e){}
      try { if (type == __ZTIm) isNumber = true } catch(e){}
      try { if (type == __ZTIx) isNumber = true } catch(e){}
      try { if (type == __ZTIy) isNumber = true } catch(e){}
      try { if (type == __ZTIf) isNumber = true } catch(e){}
      try { if (type == __ZTId) isNumber = true } catch(e){}
      try { if (type == __ZTIe) isNumber = true } catch(e){}
      try { if (type == __ZTIc) isNumber = true } catch(e){}
      try { if (type == __ZTIa) isNumber = true } catch(e){}
      try { if (type == __ZTIh) isNumber = true } catch(e){}
      try { if (type == __ZTIs) isNumber = true } catch(e){}
      try { if (type == __ZTIt) isNumber = true } catch(e){}
      return isNumber;
    }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {
      if (possibility == 0) return false;
      if (possibilityType == 0 || possibilityType == definiteType)
        return true;
      var possibility_type_info;
      if (___cxa_is_number_type(possibilityType)) {
        possibility_type_info = possibilityType;
      } else {
        var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;
        possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];
      }
      switch (possibility_type_info) {
      case 0: // possibility is a pointer
        // See if definite type is a pointer
        var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;
        var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];
        if (definite_type_info == 0) {
          // Also a pointer; compare base types of pointers
          var defPointerBaseAddr = definiteType+8;
          var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];
          var possPointerBaseAddr = possibilityType+8;
          var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];
          return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);
        } else
          return false; // one pointer and one non-pointer
      case 1: // class with no base class
        return false;
      case 2: // class with base class
        var parentTypeAddr = possibilityType + 8;
        var parentType = HEAP32[((parentTypeAddr)>>2)];
        return ___cxa_does_inherit(definiteType, parentType, possibility);
      default:
        return false; // some unencountered type
      }
    }



  var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {
      if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }
      throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
    }

  var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {
      if (thrown == -1) thrown = ___cxa_last_thrown_exception;
      header = thrown - ___cxa_exception_header_size;
      if (throwntype == -1) throwntype = HEAP32[((header)>>2)];
      var typeArray = Array.prototype.slice.call(arguments, 2);

      // If throwntype is a pointer, this means a pointer has been
      // thrown. When a pointer is thrown, actually what's thrown
      // is a pointer to the pointer. We'll dereference it.
      if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {
        var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;
        var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];
        if (throwntypeInfo == 0)
          thrown = HEAP32[((thrown)>>2)];
      }
      // The different catch blocks are denoted by different types.
      // Due to inheritance, those types may not precisely match the
      // type of the thrown object. Find one which matches, and
      // return the type of the catch block which should be called.
      for (var i = 0; i < typeArray.length; i++) {
        if (___cxa_does_inherit(typeArray[i], throwntype, thrown))
          return ((asm["setTempRet0"](typeArray[i]),thrown)|0);
      }
      // Shouldn't happen unless we have bogus data in typeArray
      // or encounter a type for which emscripten doesn't have suitable
      // typeinfo defined. Best-efforts match just in case.
      return ((asm["setTempRet0"](throwntype),thrown)|0);
    }function ___cxa_throw(ptr, type, destructor) {
      if (!___cxa_throw.initialized) {
        try {
          HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug
        } catch(e){}
        try {
          HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug
        } catch(e){}
        try {
          HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug
        } catch(e){}
        ___cxa_throw.initialized = true;
      }
      var header = ptr - ___cxa_exception_header_size;
      HEAP32[((header)>>2)]=type;
      HEAP32[(((header)+(4))>>2)]=destructor;
      ___cxa_last_thrown_exception = ptr;
      if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
        __ZSt18uncaught_exceptionv.uncaught_exception = 1;
      } else {
        __ZSt18uncaught_exceptionv.uncaught_exception++;
      }
      throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
    }


  Module["_memset"] = _memset;



  function __exit(status) {
      // void _exit(int status);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
      Module['exit'](status);
    }function _exit(status) {
      __exit(status);
    }function __ZSt9terminatev() {
      _exit(-1234);
    }

  function _abort() {
      Module['abort']();
    }





  var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};

  var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};


  var ___errno_state=0;function ___setErrNo(value) {
      // For convenient setting and returning of errno.
      HEAP32[((___errno_state)>>2)]=value;
      return value;
    }

  var PATH={splitPath:function (filename) {
        var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
        return splitPathRe.exec(filename).slice(1);
      },normalizeArray:function (parts, allowAboveRoot) {
        // if the path tries to go above the root, `up` ends up > 0
        var up = 0;
        for (var i = parts.length - 1; i >= 0; i--) {
          var last = parts[i];
          if (last === '.') {
            parts.splice(i, 1);
          } else if (last === '..') {
            parts.splice(i, 1);
            up++;
          } else if (up) {
            parts.splice(i, 1);
            up--;
          }
        }
        // if the path is allowed to go above the root, restore leading ..s
        if (allowAboveRoot) {
          for (; up--; up) {
            parts.unshift('..');
          }
        }
        return parts;
      },normalize:function (path) {
        var isAbsolute = path.charAt(0) === '/',
            trailingSlash = path.substr(-1) === '/';
        // Normalize the path
        path = PATH.normalizeArray(path.split('/').filter(function(p) {
          return !!p;
        }), !isAbsolute).join('/');
        if (!path && !isAbsolute) {
          path = '.';
        }
        if (path && trailingSlash) {
          path += '/';
        }
        return (isAbsolute ? '/' : '') + path;
      },dirname:function (path) {
        var result = PATH.splitPath(path),
            root = result[0],
            dir = result[1];
        if (!root && !dir) {
          // No dirname whatsoever
          return '.';
        }
        if (dir) {
          // It has a dirname, strip trailing slash
          dir = dir.substr(0, dir.length - 1);
        }
        return root + dir;
      },basename:function (path) {
        // EMSCRIPTEN return '/'' for '/', not an empty string
        if (path === '/') return '/';
        var lastSlash = path.lastIndexOf('/');
        if (lastSlash === -1) return path;
        return path.substr(lastSlash+1);
      },extname:function (path) {
        return PATH.splitPath(path)[3];
      },join:function () {
        var paths = Array.prototype.slice.call(arguments, 0);
        return PATH.normalize(paths.join('/'));
      },join2:function (l, r) {
        return PATH.normalize(l + '/' + r);
      },resolve:function () {
        var resolvedPath = '',
          resolvedAbsolute = false;
        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
          var path = (i >= 0) ? arguments[i] : FS.cwd();
          // Skip empty and invalid entries
          if (typeof path !== 'string') {
            throw new TypeError('Arguments to path.resolve must be strings');
          } else if (!path) {
            continue;
          }
          resolvedPath = path + '/' + resolvedPath;
          resolvedAbsolute = path.charAt(0) === '/';
        }
        // At this point the path should be resolved to a full absolute path, but
        // handle relative paths to be safe (might happen when process.cwd() fails)
        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
          return !!p;
        }), !resolvedAbsolute).join('/');
        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
      },relative:function (from, to) {
        from = PATH.resolve(from).substr(1);
        to = PATH.resolve(to).substr(1);
        function trim(arr) {
          var start = 0;
          for (; start < arr.length; start++) {
            if (arr[start] !== '') break;
          }
          var end = arr.length - 1;
          for (; end >= 0; end--) {
            if (arr[end] !== '') break;
          }
          if (start > end) return [];
          return arr.slice(start, end - start + 1);
        }
        var fromParts = trim(from.split('/'));
        var toParts = trim(to.split('/'));
        var length = Math.min(fromParts.length, toParts.length);
        var samePartsLength = length;
        for (var i = 0; i < length; i++) {
          if (fromParts[i] !== toParts[i]) {
            samePartsLength = i;
            break;
          }
        }
        var outputParts = [];
        for (var i = samePartsLength; i < fromParts.length; i++) {
          outputParts.push('..');
        }
        outputParts = outputParts.concat(toParts.slice(samePartsLength));
        return outputParts.join('/');
      }};

  var TTY={ttys:[],init:function () {
        // https://github.com/kripken/emscripten/pull/1555
        // if (ENVIRONMENT_IS_NODE) {
        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY
        //   // device, it always assumes it's a TTY device. because of this, we're forcing
        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible
        //   // with text files until FS.init can be refactored.
        //   process['stdin']['setEncoding']('utf8');
        // }
      },shutdown:function () {
        // https://github.com/kripken/emscripten/pull/1555
        // if (ENVIRONMENT_IS_NODE) {
        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
        //   process['stdin']['pause']();
        // }
      },register:function (dev, ops) {
        TTY.ttys[dev] = { input: [], output: [], ops: ops };
        FS.registerDevice(dev, TTY.stream_ops);
      },stream_ops:{open:function (stream) {
          var tty = TTY.ttys[stream.node.rdev];
          if (!tty) {
            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
          }
          stream.tty = tty;
          stream.seekable = false;
        },close:function (stream) {
          // flush any pending line data
          if (stream.tty.output.length) {
            stream.tty.ops.put_char(stream.tty, 10);
          }
        },read:function (stream, buffer, offset, length, pos /* ignored */) {
          if (!stream.tty || !stream.tty.ops.get_char) {
            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
          }
          var bytesRead = 0;
          for (var i = 0; i < length; i++) {
            var result;
            try {
              result = stream.tty.ops.get_char(stream.tty);
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
            if (result === undefined && bytesRead === 0) {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
            if (result === null || result === undefined) break;
            bytesRead++;
            buffer[offset+i] = result;
          }
          if (bytesRead) {
            stream.node.timestamp = Date.now();
          }
          return bytesRead;
        },write:function (stream, buffer, offset, length, pos) {
          if (!stream.tty || !stream.tty.ops.put_char) {
            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
          }
          for (var i = 0; i < length; i++) {
            try {
              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
          }
          if (length) {
            stream.node.timestamp = Date.now();
          }
          return i;
        }},default_tty_ops:{get_char:function (tty) {
          if (!tty.input.length) {
            var result = null;
            if (ENVIRONMENT_IS_NODE) {
              result = process['stdin']['read']();
              if (!result) {
                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {
                  return null;  // EOF
                }
                return undefined;  // no data available
              }
            } else if (typeof window != 'undefined' &&
              typeof window.prompt == 'function') {
              // Browser.
              result = window.prompt('Input: ');  // returns null on cancel
              if (result !== null) {
                result += '\n';
              }
            } else if (typeof readline == 'function') {
              // Command line.
              result = readline();
              if (result !== null) {
                result += '\n';
              }
            }
            if (!result) {
              return null;
            }
            tty.input = intArrayFromString(result, true);
          }
          return tty.input.shift();
        },put_char:function (tty, val) {
          if (val === null || val === 10) {
            Module['print'](tty.output.join(''));
            tty.output = [];
          } else {
            tty.output.push(TTY.utf8.processCChar(val));
          }
        }},default_tty1_ops:{put_char:function (tty, val) {
          if (val === null || val === 10) {
            Module['printErr'](tty.output.join(''));
            tty.output = [];
          } else {
            tty.output.push(TTY.utf8.processCChar(val));
          }
        }}};

  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {
        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
      },createNode:function (parent, name, mode, dev) {
        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
          // no supported
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (!MEMFS.ops_table) {
          MEMFS.ops_table = {
            dir: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr,
                lookup: MEMFS.node_ops.lookup,
                mknod: MEMFS.node_ops.mknod,
                rename: MEMFS.node_ops.rename,
                unlink: MEMFS.node_ops.unlink,
                rmdir: MEMFS.node_ops.rmdir,
                readdir: MEMFS.node_ops.readdir,
                symlink: MEMFS.node_ops.symlink
              },
              stream: {
                llseek: MEMFS.stream_ops.llseek
              }
            },
            file: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr
              },
              stream: {
                llseek: MEMFS.stream_ops.llseek,
                read: MEMFS.stream_ops.read,
                write: MEMFS.stream_ops.write,
                allocate: MEMFS.stream_ops.allocate,
                mmap: MEMFS.stream_ops.mmap
              }
            },
            link: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr,
                readlink: MEMFS.node_ops.readlink
              },
              stream: {}
            },
            chrdev: {
              node: {
                getattr: MEMFS.node_ops.getattr,
                setattr: MEMFS.node_ops.setattr
              },
              stream: FS.chrdev_stream_ops
            },
          };
        }
        var node = FS.createNode(parent, name, mode, dev);
        if (FS.isDir(node.mode)) {
          node.node_ops = MEMFS.ops_table.dir.node;
          node.stream_ops = MEMFS.ops_table.dir.stream;
          node.contents = {};
        } else if (FS.isFile(node.mode)) {
          node.node_ops = MEMFS.ops_table.file.node;
          node.stream_ops = MEMFS.ops_table.file.stream;
          node.contents = [];
          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
        } else if (FS.isLink(node.mode)) {
          node.node_ops = MEMFS.ops_table.link.node;
          node.stream_ops = MEMFS.ops_table.link.stream;
        } else if (FS.isChrdev(node.mode)) {
          node.node_ops = MEMFS.ops_table.chrdev.node;
          node.stream_ops = MEMFS.ops_table.chrdev.stream;
        }
        node.timestamp = Date.now();
        // add the new node to the parent
        if (parent) {
          parent.contents[name] = node;
        }
        return node;
      },ensureFlexible:function (node) {
        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {
          var contents = node.contents;
          node.contents = Array.prototype.slice.call(contents);
          node.contentMode = MEMFS.CONTENT_FLEXIBLE;
        }
      },node_ops:{getattr:function (node) {
          var attr = {};
          // device numbers reuse inode numbers.
          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
          attr.ino = node.id;
          attr.mode = node.mode;
          attr.nlink = 1;
          attr.uid = 0;
          attr.gid = 0;
          attr.rdev = node.rdev;
          if (FS.isDir(node.mode)) {
            attr.size = 4096;
          } else if (FS.isFile(node.mode)) {
            attr.size = node.contents.length;
          } else if (FS.isLink(node.mode)) {
            attr.size = node.link.length;
          } else {
            attr.size = 0;
          }
          attr.atime = new Date(node.timestamp);
          attr.mtime = new Date(node.timestamp);
          attr.ctime = new Date(node.timestamp);
          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
          //       but this is not required by the standard.
          attr.blksize = 4096;
          attr.blocks = Math.ceil(attr.size / attr.blksize);
          return attr;
        },setattr:function (node, attr) {
          if (attr.mode !== undefined) {
            node.mode = attr.mode;
          }
          if (attr.timestamp !== undefined) {
            node.timestamp = attr.timestamp;
          }
          if (attr.size !== undefined) {
            MEMFS.ensureFlexible(node);
            var contents = node.contents;
            if (attr.size < contents.length) contents.length = attr.size;
            else while (attr.size > contents.length) contents.push(0);
          }
        },lookup:function (parent, name) {
          throw FS.genericErrors[ERRNO_CODES.ENOENT];
        },mknod:function (parent, name, mode, dev) {
          return MEMFS.createNode(parent, name, mode, dev);
        },rename:function (old_node, new_dir, new_name) {
          // if we're overwriting a directory at new_name, make sure it's empty.
          if (FS.isDir(old_node.mode)) {
            var new_node;
            try {
              new_node = FS.lookupNode(new_dir, new_name);
            } catch (e) {
            }
            if (new_node) {
              for (var i in new_node.contents) {
                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
              }
            }
          }
          // do the internal rewiring
          delete old_node.parent.contents[old_node.name];
          old_node.name = new_name;
          new_dir.contents[new_name] = old_node;
          old_node.parent = new_dir;
        },unlink:function (parent, name) {
          delete parent.contents[name];
        },rmdir:function (parent, name) {
          var node = FS.lookupNode(parent, name);
          for (var i in node.contents) {
            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
          }
          delete parent.contents[name];
        },readdir:function (node) {
          var entries = ['.', '..']
          for (var key in node.contents) {
            if (!node.contents.hasOwnProperty(key)) {
              continue;
            }
            entries.push(key);
          }
          return entries;
        },symlink:function (parent, newname, oldpath) {
          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);
          node.link = oldpath;
          return node;
        },readlink:function (node) {
          if (!FS.isLink(node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          return node.link;
        }},stream_ops:{read:function (stream, buffer, offset, length, position) {
          var contents = stream.node.contents;
          if (position >= contents.length)
            return 0;
          var size = Math.min(contents.length - position, length);
          assert(size >= 0);
          if (size > 8 && contents.subarray) { // non-trivial, and typed array
            buffer.set(contents.subarray(position, position + size), offset);
          } else
          {
            for (var i = 0; i < size; i++) {
              buffer[offset + i] = contents[position + i];
            }
          }
          return size;
        },write:function (stream, buffer, offset, length, position, canOwn) {
          var node = stream.node;
          node.timestamp = Date.now();
          var contents = node.contents;
          if (length && contents.length === 0 && position === 0 && buffer.subarray) {
            // just replace it with the new data
            if (canOwn && offset === 0) {
              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
            } else {
              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
              node.contentMode = MEMFS.CONTENT_FIXED;
            }
            return length;
          }
          MEMFS.ensureFlexible(node);
          var contents = node.contents;
          while (contents.length < position) contents.push(0);
          for (var i = 0; i < length; i++) {
            contents[position + i] = buffer[offset + i];
          }
          return length;
        },llseek:function (stream, offset, whence) {
          var position = offset;
          if (whence === 1) {  // SEEK_CUR.
            position += stream.position;
          } else if (whence === 2) {  // SEEK_END.
            if (FS.isFile(stream.node.mode)) {
              position += stream.node.contents.length;
            }
          }
          if (position < 0) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          stream.ungotten = [];
          stream.position = position;
          return position;
        },allocate:function (stream, offset, length) {
          MEMFS.ensureFlexible(stream.node);
          var contents = stream.node.contents;
          var limit = offset + length;
          while (limit > contents.length) contents.push(0);
        },mmap:function (stream, buffer, offset, length, position, prot, flags) {
          if (!FS.isFile(stream.node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
          }
          var ptr;
          var allocated;
          var contents = stream.node.contents;
          // Only make a new copy when MAP_PRIVATE is specified.
          if ( !(flags & 2) &&
                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {
            // We can't emulate MAP_SHARED when the file is not backed by the buffer
            // we're mapping to (e.g. the HEAP buffer).
            allocated = false;
            ptr = contents.byteOffset;
          } else {
            // Try to avoid unnecessary slices.
            if (position > 0 || position + length < contents.length) {
              if (contents.subarray) {
                contents = contents.subarray(position, position + length);
              } else {
                contents = Array.prototype.slice.call(contents, position, position + length);
              }
            }
            allocated = true;
            ptr = _malloc(length);
            if (!ptr) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
            }
            buffer.set(contents, ptr);
          }
          return { ptr: ptr, allocated: allocated };
        }}};

  var IDBFS={dbs:{},indexedDB:function () {
        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
      },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) {
        // reuse all of the core MEMFS functionality
        return MEMFS.mount.apply(null, arguments);
      },syncfs:function (mount, populate, callback) {
        IDBFS.getLocalSet(mount, function(err, local) {
          if (err) return callback(err);

          IDBFS.getRemoteSet(mount, function(err, remote) {
            if (err) return callback(err);

            var src = populate ? remote : local;
            var dst = populate ? local : remote;

            IDBFS.reconcile(src, dst, callback);
          });
        });
      },getDB:function (name, callback) {
        // check the cache first
        var db = IDBFS.dbs[name];
        if (db) {
          return callback(null, db);
        }

        var req;
        try {
          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
        } catch (e) {
          return callback(e);
        }
        req.onupgradeneeded = function(e) {
          var db = e.target.result;
          var transaction = e.target.transaction;

          var fileStore;

          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);
          } else {
            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);
          }

          fileStore.createIndex('timestamp', 'timestamp', { unique: false });
        };
        req.onsuccess = function() {
          db = req.result;

          // add to the cache
          IDBFS.dbs[name] = db;
          callback(null, db);
        };
        req.onerror = function() {
          callback(this.error);
        };
      },getLocalSet:function (mount, callback) {
        var entries = {};

        function isRealDir(p) {
          return p !== '.' && p !== '..';
        };
        function toAbsolute(root) {
          return function(p) {
            return PATH.join2(root, p);
          }
        };

        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));

        while (check.length) {
          var path = check.pop();
          var stat;

          try {
            stat = FS.stat(path);
          } catch (e) {
            return callback(e);
          }

          if (FS.isDir(stat.mode)) {
            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));
          }

          entries[path] = { timestamp: stat.mtime };
        }

        return callback(null, { type: 'local', entries: entries });
      },getRemoteSet:function (mount, callback) {
        var entries = {};

        IDBFS.getDB(mount.mountpoint, function(err, db) {
          if (err) return callback(err);

          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
          transaction.onerror = function() { callback(this.error); };

          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
          var index = store.index('timestamp');

          index.openKeyCursor().onsuccess = function(event) {
            var cursor = event.target.result;

            if (!cursor) {
              return callback(null, { type: 'remote', db: db, entries: entries });
            }

            entries[cursor.primaryKey] = { timestamp: cursor.key };

            cursor.continue();
          };
        });
      },loadLocalEntry:function (path, callback) {
        var stat, node;

        try {
          var lookup = FS.lookupPath(path);
          node = lookup.node;
          stat = FS.stat(path);
        } catch (e) {
          return callback(e);
        }

        if (FS.isDir(stat.mode)) {
          return callback(null, { timestamp: stat.mtime, mode: stat.mode });
        } else if (FS.isFile(stat.mode)) {
          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });
        } else {
          return callback(new Error('node type not supported'));
        }
      },storeLocalEntry:function (path, entry, callback) {
        try {
          if (FS.isDir(entry.mode)) {
            FS.mkdir(path, entry.mode);
          } else if (FS.isFile(entry.mode)) {
            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });
          } else {
            return callback(new Error('node type not supported'));
          }

          FS.utime(path, entry.timestamp, entry.timestamp);
        } catch (e) {
          return callback(e);
        }

        callback(null);
      },removeLocalEntry:function (path, callback) {
        try {
          var lookup = FS.lookupPath(path);
          var stat = FS.stat(path);

          if (FS.isDir(stat.mode)) {
            FS.rmdir(path);
          } else if (FS.isFile(stat.mode)) {
            FS.unlink(path);
          }
        } catch (e) {
          return callback(e);
        }

        callback(null);
      },loadRemoteEntry:function (store, path, callback) {
        var req = store.get(path);
        req.onsuccess = function(event) { callback(null, event.target.result); };
        req.onerror = function() { callback(this.error); };
      },storeRemoteEntry:function (store, path, entry, callback) {
        var req = store.put(entry, path);
        req.onsuccess = function() { callback(null); };
        req.onerror = function() { callback(this.error); };
      },removeRemoteEntry:function (store, path, callback) {
        var req = store.delete(path);
        req.onsuccess = function() { callback(null); };
        req.onerror = function() { callback(this.error); };
      },reconcile:function (src, dst, callback) {
        var total = 0;

        var create = [];
        Object.keys(src.entries).forEach(function (key) {
          var e = src.entries[key];
          var e2 = dst.entries[key];
          if (!e2 || e.timestamp > e2.timestamp) {
            create.push(key);
            total++;
          }
        });

        var remove = [];
        Object.keys(dst.entries).forEach(function (key) {
          var e = dst.entries[key];
          var e2 = src.entries[key];
          if (!e2) {
            remove.push(key);
            total++;
          }
        });

        if (!total) {
          return callback(null);
        }

        var errored = false;
        var completed = 0;
        var db = src.type === 'remote' ? src.db : dst.db;
        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);

        function done(err) {
          if (err) {
            if (!done.errored) {
              done.errored = true;
              return callback(err);
            }
            return;
          }
          if (++completed >= total) {
            return callback(null);
          }
        };

        transaction.onerror = function() { done(this.error); };

        // sort paths in ascending order so directory entries are created
        // before the files inside them
        create.sort().forEach(function (path) {
          if (dst.type === 'local') {
            IDBFS.loadRemoteEntry(store, path, function (err, entry) {
              if (err) return done(err);
              IDBFS.storeLocalEntry(path, entry, done);
            });
          } else {
            IDBFS.loadLocalEntry(path, function (err, entry) {
              if (err) return done(err);
              IDBFS.storeRemoteEntry(store, path, entry, done);
            });
          }
        });

        // sort paths in descending order so files are deleted before their
        // parent directories
        remove.sort().reverse().forEach(function(path) {
          if (dst.type === 'local') {
            IDBFS.removeLocalEntry(path, done);
          } else {
            IDBFS.removeRemoteEntry(store, path, done);
          }
        });
      }};

  var NODEFS={isWindows:false,staticInit:function () {
        NODEFS.isWindows = !!process.platform.match(/^win/);
      },mount:function (mount) {
        assert(ENVIRONMENT_IS_NODE);
        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
      },createNode:function (parent, name, mode, dev) {
        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var node = FS.createNode(parent, name, mode);
        node.node_ops = NODEFS.node_ops;
        node.stream_ops = NODEFS.stream_ops;
        return node;
      },getMode:function (path) {
        var stat;
        try {
          stat = fs.lstatSync(path);
          if (NODEFS.isWindows) {
            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
            // propagate write bits to execute bits.
            stat.mode = stat.mode | ((stat.mode & 146) >> 1);
          }
        } catch (e) {
          if (!e.code) throw e;
          throw new FS.ErrnoError(ERRNO_CODES[e.code]);
        }
        return stat.mode;
      },realPath:function (node) {
        var parts = [];
        while (node.parent !== node) {
          parts.push(node.name);
          node = node.parent;
        }
        parts.push(node.mount.opts.root);
        parts.reverse();
        return PATH.join.apply(null, parts);
      },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) {
        if (flags in NODEFS.flagsToPermissionStringMap) {
          return NODEFS.flagsToPermissionStringMap[flags];
        } else {
          return flags;
        }
      },node_ops:{getattr:function (node) {
          var path = NODEFS.realPath(node);
          var stat;
          try {
            stat = fs.lstatSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
          // See http://support.microsoft.com/kb/140365
          if (NODEFS.isWindows && !stat.blksize) {
            stat.blksize = 4096;
          }
          if (NODEFS.isWindows && !stat.blocks) {
            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
          }
          return {
            dev: stat.dev,
            ino: stat.ino,
            mode: stat.mode,
            nlink: stat.nlink,
            uid: stat.uid,
            gid: stat.gid,
            rdev: stat.rdev,
            size: stat.size,
            atime: stat.atime,
            mtime: stat.mtime,
            ctime: stat.ctime,
            blksize: stat.blksize,
            blocks: stat.blocks
          };
        },setattr:function (node, attr) {
          var path = NODEFS.realPath(node);
          try {
            if (attr.mode !== undefined) {
              fs.chmodSync(path, attr.mode);
              // update the common node structure mode as well
              node.mode = attr.mode;
            }
            if (attr.timestamp !== undefined) {
              var date = new Date(attr.timestamp);
              fs.utimesSync(path, date, date);
            }
            if (attr.size !== undefined) {
              fs.truncateSync(path, attr.size);
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },lookup:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          var mode = NODEFS.getMode(path);
          return NODEFS.createNode(parent, name, mode);
        },mknod:function (parent, name, mode, dev) {
          var node = NODEFS.createNode(parent, name, mode, dev);
          // create the backing node for this in the fs root as well
          var path = NODEFS.realPath(node);
          try {
            if (FS.isDir(node.mode)) {
              fs.mkdirSync(path, node.mode);
            } else {
              fs.writeFileSync(path, '', { mode: node.mode });
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          return node;
        },rename:function (oldNode, newDir, newName) {
          var oldPath = NODEFS.realPath(oldNode);
          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
          try {
            fs.renameSync(oldPath, newPath);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },unlink:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          try {
            fs.unlinkSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },rmdir:function (parent, name) {
          var path = PATH.join2(NODEFS.realPath(parent), name);
          try {
            fs.rmdirSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },readdir:function (node) {
          var path = NODEFS.realPath(node);
          try {
            return fs.readdirSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },symlink:function (parent, newName, oldPath) {
          var newPath = PATH.join2(NODEFS.realPath(parent), newName);
          try {
            fs.symlinkSync(oldPath, newPath);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },readlink:function (node) {
          var path = NODEFS.realPath(node);
          try {
            return fs.readlinkSync(path);
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        }},stream_ops:{open:function (stream) {
          var path = NODEFS.realPath(stream.node);
          try {
            if (FS.isFile(stream.node.mode)) {
              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },close:function (stream) {
          try {
            if (FS.isFile(stream.node.mode) && stream.nfd) {
              fs.closeSync(stream.nfd);
            }
          } catch (e) {
            if (!e.code) throw e;
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
        },read:function (stream, buffer, offset, length, position) {
          // FIXME this is terrible.
          var nbuffer = new Buffer(length);
          var res;
          try {
            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          if (res > 0) {
            for (var i = 0; i < res; i++) {
              buffer[offset + i] = nbuffer[i];
            }
          }
          return res;
        },write:function (stream, buffer, offset, length, position) {
          // FIXME this is terrible.
          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
          var res;
          try {
            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES[e.code]);
          }
          return res;
        },llseek:function (stream, offset, whence) {
          var position = offset;
          if (whence === 1) {  // SEEK_CUR.
            position += stream.position;
          } else if (whence === 2) {  // SEEK_END.
            if (FS.isFile(stream.node.mode)) {
              try {
                var stat = fs.fstatSync(stream.nfd);
                position += stat.size;
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES[e.code]);
              }
            }
          }

          if (position < 0) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }

          stream.position = position;
          return position;
        }}};

  var _stdin=allocate(1, "i32*", ALLOC_STATIC);

  var _stdout=allocate(1, "i32*", ALLOC_STATIC);

  var _stderr=allocate(1, "i32*", ALLOC_STATIC);

  function _fflush(stream) {
      // int fflush(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
      // we don't currently perform any user-space buffering of data
    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {
        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
        return ___setErrNo(e.errno);
      },lookupPath:function (path, opts) {
        path = PATH.resolve(FS.cwd(), path);
        opts = opts || {};

        var defaults = {
          follow_mount: true,
          recurse_count: 0
        };
        for (var key in defaults) {
          if (opts[key] === undefined) {
            opts[key] = defaults[key];
          }
        }

        if (opts.recurse_count > 8) {  // max recursive lookup of 8
          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
        }

        // split the path
        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {
          return !!p;
        }), false);

        // start at the root
        var current = FS.root;
        var current_path = '/';

        for (var i = 0; i < parts.length; i++) {
          var islast = (i === parts.length-1);
          if (islast && opts.parent) {
            // stop resolving
            break;
          }

          current = FS.lookupNode(current, parts[i]);
          current_path = PATH.join2(current_path, parts[i]);

          // jump to the mount's root node if this is a mountpoint
          if (FS.isMountpoint(current)) {
            if (!islast || (islast && opts.follow_mount)) {
              current = current.mounted.root;
            }
          }

          // by default, lookupPath will not follow a symlink if it is the final path component.
          // setting opts.follow = true will override this behavior.
          if (!islast || opts.follow) {
            var count = 0;
            while (FS.isLink(current.mode)) {
              var link = FS.readlink(current_path);
              current_path = PATH.resolve(PATH.dirname(current_path), link);

              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });
              current = lookup.node;

              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);
              }
            }
          }
        }

        return { path: current_path, node: current };
      },getPath:function (node) {
        var path;
        while (true) {
          if (FS.isRoot(node)) {
            var mount = node.mount.mountpoint;
            if (!path) return mount;
            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
          }
          path = path ? node.name + '/' + path : node.name;
          node = node.parent;
        }
      },hashName:function (parentid, name) {
        var hash = 0;


        for (var i = 0; i < name.length; i++) {
          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
        }
        return ((parentid + hash) >>> 0) % FS.nameTable.length;
      },hashAddNode:function (node) {
        var hash = FS.hashName(node.parent.id, node.name);
        node.name_next = FS.nameTable[hash];
        FS.nameTable[hash] = node;
      },hashRemoveNode:function (node) {
        var hash = FS.hashName(node.parent.id, node.name);
        if (FS.nameTable[hash] === node) {
          FS.nameTable[hash] = node.name_next;
        } else {
          var current = FS.nameTable[hash];
          while (current) {
            if (current.name_next === node) {
              current.name_next = node.name_next;
              break;
            }
            current = current.name_next;
          }
        }
      },lookupNode:function (parent, name) {
        var err = FS.mayLookup(parent);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        var hash = FS.hashName(parent.id, name);
        for (var node = FS.nameTable[hash]; node; node = node.name_next) {
          var nodeName = node.name;
          if (node.parent.id === parent.id && nodeName === name) {
            return node;
          }
        }
        // if we failed to find it in the cache, call into the VFS
        return FS.lookup(parent, name);
      },createNode:function (parent, name, mode, rdev) {
        if (!FS.FSNode) {
          FS.FSNode = function(parent, name, mode, rdev) {
            if (!parent) {
              parent = this;  // root node sets parent to itself
            }
            this.parent = parent;
            this.mount = parent.mount;
            this.mounted = null;
            this.id = FS.nextInode++;
            this.name = name;
            this.mode = mode;
            this.node_ops = {};
            this.stream_ops = {};
            this.rdev = rdev;
          };

          FS.FSNode.prototype = {};

          // compatibility
          var readMode = 292 | 73;
          var writeMode = 146;

          // NOTE we must use Object.defineProperties instead of individual calls to
          // Object.defineProperty in order to make closure compiler happy
          Object.defineProperties(FS.FSNode.prototype, {
            read: {
              get: function() { return (this.mode & readMode) === readMode; },
              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
            },
            write: {
              get: function() { return (this.mode & writeMode) === writeMode; },
              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
            },
            isFolder: {
              get: function() { return FS.isDir(this.mode); },
            },
            isDevice: {
              get: function() { return FS.isChrdev(this.mode); },
            },
          });
        }

        var node = new FS.FSNode(parent, name, mode, rdev);

        FS.hashAddNode(node);

        return node;
      },destroyNode:function (node) {
        FS.hashRemoveNode(node);
      },isRoot:function (node) {
        return node === node.parent;
      },isMountpoint:function (node) {
        return !!node.mounted;
      },isFile:function (mode) {
        return (mode & 61440) === 32768;
      },isDir:function (mode) {
        return (mode & 61440) === 16384;
      },isLink:function (mode) {
        return (mode & 61440) === 40960;
      },isChrdev:function (mode) {
        return (mode & 61440) === 8192;
      },isBlkdev:function (mode) {
        return (mode & 61440) === 24576;
      },isFIFO:function (mode) {
        return (mode & 61440) === 4096;
      },isSocket:function (mode) {
        return (mode & 49152) === 49152;
      },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) {
        var flags = FS.flagModes[str];
        if (typeof flags === 'undefined') {
          throw new Error('Unknown file open mode: ' + str);
        }
        return flags;
      },flagsToPermissionString:function (flag) {
        var accmode = flag & 2097155;
        var perms = ['r', 'w', 'rw'][accmode];
        if ((flag & 512)) {
          perms += 'w';
        }
        return perms;
      },nodePermissions:function (node, perms) {
        if (FS.ignorePermissions) {
          return 0;
        }
        // return 0 if any user, group or owner bits are set.
        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
          return ERRNO_CODES.EACCES;
        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
          return ERRNO_CODES.EACCES;
        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
          return ERRNO_CODES.EACCES;
        }
        return 0;
      },mayLookup:function (dir) {
        return FS.nodePermissions(dir, 'x');
      },mayCreate:function (dir, name) {
        try {
          var node = FS.lookupNode(dir, name);
          return ERRNO_CODES.EEXIST;
        } catch (e) {
        }
        return FS.nodePermissions(dir, 'wx');
      },mayDelete:function (dir, name, isdir) {
        var node;
        try {
          node = FS.lookupNode(dir, name);
        } catch (e) {
          return e.errno;
        }
        var err = FS.nodePermissions(dir, 'wx');
        if (err) {
          return err;
        }
        if (isdir) {
          if (!FS.isDir(node.mode)) {
            return ERRNO_CODES.ENOTDIR;
          }
          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
            return ERRNO_CODES.EBUSY;
          }
        } else {
          if (FS.isDir(node.mode)) {
            return ERRNO_CODES.EISDIR;
          }
        }
        return 0;
      },mayOpen:function (node, flags) {
        if (!node) {
          return ERRNO_CODES.ENOENT;
        }
        if (FS.isLink(node.mode)) {
          return ERRNO_CODES.ELOOP;
        } else if (FS.isDir(node.mode)) {
          if ((flags & 2097155) !== 0 ||  // opening for write
              (flags & 512)) {
            return ERRNO_CODES.EISDIR;
          }
        }
        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {
        fd_start = fd_start || 0;
        fd_end = fd_end || FS.MAX_OPEN_FDS;
        for (var fd = fd_start; fd <= fd_end; fd++) {
          if (!FS.streams[fd]) {
            return fd;
          }
        }
        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);
      },getStream:function (fd) {
        return FS.streams[fd];
      },createStream:function (stream, fd_start, fd_end) {
        if (!FS.FSStream) {
          FS.FSStream = function(){};
          FS.FSStream.prototype = {};
          // compatibility
          Object.defineProperties(FS.FSStream.prototype, {
            object: {
              get: function() { return this.node; },
              set: function(val) { this.node = val; }
            },
            isRead: {
              get: function() { return (this.flags & 2097155) !== 1; }
            },
            isWrite: {
              get: function() { return (this.flags & 2097155) !== 0; }
            },
            isAppend: {
              get: function() { return (this.flags & 1024); }
            }
          });
        }
        if (0) {
          // reuse the object
          stream.__proto__ = FS.FSStream.prototype;
        } else {
          var newStream = new FS.FSStream();
          for (var p in stream) {
            newStream[p] = stream[p];
          }
          stream = newStream;
        }
        var fd = FS.nextfd(fd_start, fd_end);
        stream.fd = fd;
        FS.streams[fd] = stream;
        return stream;
      },closeStream:function (fd) {
        FS.streams[fd] = null;
      },getStreamFromPtr:function (ptr) {
        return FS.streams[ptr - 1];
      },getPtrForStream:function (stream) {
        return stream ? stream.fd + 1 : 0;
      },chrdev_stream_ops:{open:function (stream) {
          var device = FS.getDevice(stream.node.rdev);
          // override node's stream ops with the device's
          stream.stream_ops = device.stream_ops;
          // forward the open call
          if (stream.stream_ops.open) {
            stream.stream_ops.open(stream);
          }
        },llseek:function () {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }},major:function (dev) {
        return ((dev) >> 8);
      },minor:function (dev) {
        return ((dev) & 0xff);
      },makedev:function (ma, mi) {
        return ((ma) << 8 | (mi));
      },registerDevice:function (dev, ops) {
        FS.devices[dev] = { stream_ops: ops };
      },getDevice:function (dev) {
        return FS.devices[dev];
      },getMounts:function (mount) {
        var mounts = [];
        var check = [mount];

        while (check.length) {
          var m = check.pop();

          mounts.push(m);

          check.push.apply(check, m.mounts);
        }

        return mounts;
      },syncfs:function (populate, callback) {
        if (typeof(populate) === 'function') {
          callback = populate;
          populate = false;
        }

        var mounts = FS.getMounts(FS.root.mount);
        var completed = 0;

        function done(err) {
          if (err) {
            if (!done.errored) {
              done.errored = true;
              return callback(err);
            }
            return;
          }
          if (++completed >= mounts.length) {
            callback(null);
          }
        };

        // sync all mounts
        mounts.forEach(function (mount) {
          if (!mount.type.syncfs) {
            return done(null);
          }
          mount.type.syncfs(mount, populate, done);
        });
      },mount:function (type, opts, mountpoint) {
        var root = mountpoint === '/';
        var pseudo = !mountpoint;
        var node;

        if (root && FS.root) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        } else if (!root && !pseudo) {
          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });

          mountpoint = lookup.path;  // use the absolute path
          node = lookup.node;

          if (FS.isMountpoint(node)) {
            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
          }

          if (!FS.isDir(node.mode)) {
            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
          }
        }

        var mount = {
          type: type,
          opts: opts,
          mountpoint: mountpoint,
          mounts: []
        };

        // create a root node for the fs
        var mountRoot = type.mount(mount);
        mountRoot.mount = mount;
        mount.root = mountRoot;

        if (root) {
          FS.root = mountRoot;
        } else if (node) {
          // set as a mountpoint
          node.mounted = mount;

          // add the new mount to the current mount's children
          if (node.mount) {
            node.mount.mounts.push(mount);
          }
        }

        return mountRoot;
      },unmount:function (mountpoint) {
        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });

        if (!FS.isMountpoint(lookup.node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }

        // destroy the nodes for this mount, and all its child mounts
        var node = lookup.node;
        var mount = node.mounted;
        var mounts = FS.getMounts(mount);

        Object.keys(FS.nameTable).forEach(function (hash) {
          var current = FS.nameTable[hash];

          while (current) {
            var next = current.name_next;

            if (mounts.indexOf(current.mount) !== -1) {
              FS.destroyNode(current);
            }

            current = next;
          }
        });

        // no longer a mountpoint
        node.mounted = null;

        // remove this mount from the child mounts
        var idx = node.mount.mounts.indexOf(mount);
        assert(idx !== -1);
        node.mount.mounts.splice(idx, 1);
      },lookup:function (parent, name) {
        return parent.node_ops.lookup(parent, name);
      },mknod:function (path, mode, dev) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var err = FS.mayCreate(parent, name);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.mknod) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return parent.node_ops.mknod(parent, name, mode, dev);
      },create:function (path, mode) {
        mode = mode !== undefined ? mode : 438 /* 0666 */;
        mode &= 4095;
        mode |= 32768;
        return FS.mknod(path, mode, 0);
      },mkdir:function (path, mode) {
        mode = mode !== undefined ? mode : 511 /* 0777 */;
        mode &= 511 | 512;
        mode |= 16384;
        return FS.mknod(path, mode, 0);
      },mkdev:function (path, mode, dev) {
        if (typeof(dev) === 'undefined') {
          dev = mode;
          mode = 438 /* 0666 */;
        }
        mode |= 8192;
        return FS.mknod(path, mode, dev);
      },symlink:function (oldpath, newpath) {
        var lookup = FS.lookupPath(newpath, { parent: true });
        var parent = lookup.node;
        var newname = PATH.basename(newpath);
        var err = FS.mayCreate(parent, newname);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.symlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return parent.node_ops.symlink(parent, newname, oldpath);
      },rename:function (old_path, new_path) {
        var old_dirname = PATH.dirname(old_path);
        var new_dirname = PATH.dirname(new_path);
        var old_name = PATH.basename(old_path);
        var new_name = PATH.basename(new_path);
        // parents must exist
        var lookup, old_dir, new_dir;
        try {
          lookup = FS.lookupPath(old_path, { parent: true });
          old_dir = lookup.node;
          lookup = FS.lookupPath(new_path, { parent: true });
          new_dir = lookup.node;
        } catch (e) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        // need to be part of the same mount
        if (old_dir.mount !== new_dir.mount) {
          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);
        }
        // source must exist
        var old_node = FS.lookupNode(old_dir, old_name);
        // old path should not be an ancestor of the new path
        var relative = PATH.relative(old_path, new_dirname);
        if (relative.charAt(0) !== '.') {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        // new path should not be an ancestor of the old path
        relative = PATH.relative(new_path, old_dirname);
        if (relative.charAt(0) !== '.') {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
        }
        // see if the new path already exists
        var new_node;
        try {
          new_node = FS.lookupNode(new_dir, new_name);
        } catch (e) {
          // not fatal
        }
        // early out if nothing needs to change
        if (old_node === new_node) {
          return;
        }
        // we'll need to delete the old entry
        var isdir = FS.isDir(old_node.mode);
        var err = FS.mayDelete(old_dir, old_name, isdir);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        // need delete permissions if we'll be overwriting.
        // need create permissions if new doesn't already exist.
        err = new_node ?
          FS.mayDelete(new_dir, new_name, isdir) :
          FS.mayCreate(new_dir, new_name);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!old_dir.node_ops.rename) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        // if we are going to change the parent, check write permissions
        if (new_dir !== old_dir) {
          err = FS.nodePermissions(old_dir, 'w');
          if (err) {
            throw new FS.ErrnoError(err);
          }
        }
        // remove the node from the lookup hash
        FS.hashRemoveNode(old_node);
        // do the underlying fs rename
        try {
          old_dir.node_ops.rename(old_node, new_dir, new_name);
        } catch (e) {
          throw e;
        } finally {
          // add the node back to the hash (in case node_ops.rename
          // changed its name)
          FS.hashAddNode(old_node);
        }
      },rmdir:function (path) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var node = FS.lookupNode(parent, name);
        var err = FS.mayDelete(parent, name, true);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.rmdir) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        parent.node_ops.rmdir(parent, name);
        FS.destroyNode(node);
      },readdir:function (path) {
        var lookup = FS.lookupPath(path, { follow: true });
        var node = lookup.node;
        if (!node.node_ops.readdir) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
        }
        return node.node_ops.readdir(node);
      },unlink:function (path) {
        var lookup = FS.lookupPath(path, { parent: true });
        var parent = lookup.node;
        var name = PATH.basename(path);
        var node = FS.lookupNode(parent, name);
        var err = FS.mayDelete(parent, name, false);
        if (err) {
          // POSIX says unlink should set EPERM, not EISDIR
          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;
          throw new FS.ErrnoError(err);
        }
        if (!parent.node_ops.unlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isMountpoint(node)) {
          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);
        }
        parent.node_ops.unlink(parent, name);
        FS.destroyNode(node);
      },readlink:function (path) {
        var lookup = FS.lookupPath(path);
        var link = lookup.node;
        if (!link.node_ops.readlink) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        return link.node_ops.readlink(link);
      },stat:function (path, dontFollow) {
        var lookup = FS.lookupPath(path, { follow: !dontFollow });
        var node = lookup.node;
        if (!node.node_ops.getattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        return node.node_ops.getattr(node);
      },lstat:function (path) {
        return FS.stat(path, true);
      },chmod:function (path, mode, dontFollow) {
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: !dontFollow });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        node.node_ops.setattr(node, {
          mode: (mode & 4095) | (node.mode & ~4095),
          timestamp: Date.now()
        });
      },lchmod:function (path, mode) {
        FS.chmod(path, mode, true);
      },fchmod:function (fd, mode) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        FS.chmod(stream.node, mode);
      },chown:function (path, uid, gid, dontFollow) {
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: !dontFollow });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        node.node_ops.setattr(node, {
          timestamp: Date.now()
          // we ignore the uid / gid for now
        });
      },lchown:function (path, uid, gid) {
        FS.chown(path, uid, gid, true);
      },fchown:function (fd, uid, gid) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        FS.chown(stream.node, uid, gid);
      },truncate:function (path, len) {
        if (len < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var node;
        if (typeof path === 'string') {
          var lookup = FS.lookupPath(path, { follow: true });
          node = lookup.node;
        } else {
          node = path;
        }
        if (!node.node_ops.setattr) {
          throw new FS.ErrnoError(ERRNO_CODES.EPERM);
        }
        if (FS.isDir(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!FS.isFile(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var err = FS.nodePermissions(node, 'w');
        if (err) {
          throw new FS.ErrnoError(err);
        }
        node.node_ops.setattr(node, {
          size: len,
          timestamp: Date.now()
        });
      },ftruncate:function (fd, len) {
        var stream = FS.getStream(fd);
        if (!stream) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        FS.truncate(stream.node, len);
      },utime:function (path, atime, mtime) {
        var lookup = FS.lookupPath(path, { follow: true });
        var node = lookup.node;
        node.node_ops.setattr(node, {
          timestamp: Math.max(atime, mtime)
        });
      },open:function (path, flags, mode, fd_start, fd_end) {
        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;
        if ((flags & 64)) {
          mode = (mode & 4095) | 32768;
        } else {
          mode = 0;
        }
        var node;
        if (typeof path === 'object') {
          node = path;
        } else {
          path = PATH.normalize(path);
          try {
            var lookup = FS.lookupPath(path, {
              follow: !(flags & 131072)
            });
            node = lookup.node;
          } catch (e) {
            // ignore
          }
        }
        // perhaps we need to create the node
        if ((flags & 64)) {
          if (node) {
            // if O_CREAT and O_EXCL are set, error out if the node already exists
            if ((flags & 128)) {
              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);
            }
          } else {
            // node doesn't exist, try to create it
            node = FS.mknod(path, mode, 0);
          }
        }
        if (!node) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
        }
        // can't truncate a device
        if (FS.isChrdev(node.mode)) {
          flags &= ~512;
        }
        // check permissions
        var err = FS.mayOpen(node, flags);
        if (err) {
          throw new FS.ErrnoError(err);
        }
        // do truncation if necessary
        if ((flags & 512)) {
          FS.truncate(node, 0);
        }
        // we've already handled these, don't pass down to the underlying vfs
        flags &= ~(128 | 512);

        // register the stream with the filesystem
        var stream = FS.createStream({
          node: node,
          path: FS.getPath(node),  // we want the absolute path to the node
          flags: flags,
          seekable: true,
          position: 0,
          stream_ops: node.stream_ops,
          // used by the file family libc calls (fopen, fwrite, ferror, etc.)
          ungotten: [],
          error: false
        }, fd_start, fd_end);
        // call the new stream's open function
        if (stream.stream_ops.open) {
          stream.stream_ops.open(stream);
        }
        if (Module['logReadFiles'] && !(flags & 1)) {
          if (!FS.readFiles) FS.readFiles = {};
          if (!(path in FS.readFiles)) {
            FS.readFiles[path] = 1;
            Module['printErr']('read file: ' + path);
          }
        }
        return stream;
      },close:function (stream) {
        try {
          if (stream.stream_ops.close) {
            stream.stream_ops.close(stream);
          }
        } catch (e) {
          throw e;
        } finally {
          FS.closeStream(stream.fd);
        }
      },llseek:function (stream, offset, whence) {
        if (!stream.seekable || !stream.stream_ops.llseek) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        return stream.stream_ops.llseek(stream, offset, whence);
      },read:function (stream, buffer, offset, length, position) {
        if (length < 0 || position < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 1) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (FS.isDir(stream.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!stream.stream_ops.read) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var seeking = true;
        if (typeof position === 'undefined') {
          position = stream.position;
          seeking = false;
        } else if (!stream.seekable) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
        if (!seeking) stream.position += bytesRead;
        return bytesRead;
      },write:function (stream, buffer, offset, length, position, canOwn) {
        if (length < 0 || position < 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (FS.isDir(stream.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);
        }
        if (!stream.stream_ops.write) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        var seeking = true;
        if (typeof position === 'undefined') {
          position = stream.position;
          seeking = false;
        } else if (!stream.seekable) {
          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);
        }
        if (stream.flags & 1024) {
          // seek to the end before writing in append mode
          FS.llseek(stream, 0, 2);
        }
        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
        if (!seeking) stream.position += bytesWritten;
        return bytesWritten;
      },allocate:function (stream, offset, length) {
        if (offset < 0 || length <= 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
        }
        if ((stream.flags & 2097155) === 0) {
          throw new FS.ErrnoError(ERRNO_CODES.EBADF);
        }
        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
        }
        if (!stream.stream_ops.allocate) {
          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
        }
        stream.stream_ops.allocate(stream, offset, length);
      },mmap:function (stream, buffer, offset, length, position, prot, flags) {
        // TODO if PROT is PROT_WRITE, make sure we have write access
        if ((stream.flags & 2097155) === 1) {
          throw new FS.ErrnoError(ERRNO_CODES.EACCES);
        }
        if (!stream.stream_ops.mmap) {
          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
        }
        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
      },ioctl:function (stream, cmd, arg) {
        if (!stream.stream_ops.ioctl) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);
        }
        return stream.stream_ops.ioctl(stream, cmd, arg);
      },readFile:function (path, opts) {
        opts = opts || {};
        opts.flags = opts.flags || 'r';
        opts.encoding = opts.encoding || 'binary';
        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
          throw new Error('Invalid encoding type "' + opts.encoding + '"');
        }
        var ret;
        var stream = FS.open(path, opts.flags);
        var stat = FS.stat(path);
        var length = stat.size;
        var buf = new Uint8Array(length);
        FS.read(stream, buf, 0, length, 0);
        if (opts.encoding === 'utf8') {
          ret = '';
          var utf8 = new Runtime.UTF8Processor();
          for (var i = 0; i < length; i++) {
            ret += utf8.processCChar(buf[i]);
          }
        } else if (opts.encoding === 'binary') {
          ret = buf;
        }
        FS.close(stream);
        return ret;
      },writeFile:function (path, data, opts) {
        opts = opts || {};
        opts.flags = opts.flags || 'w';
        opts.encoding = opts.encoding || 'utf8';
        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
          throw new Error('Invalid encoding type "' + opts.encoding + '"');
        }
        var stream = FS.open(path, opts.flags, opts.mode);
        if (opts.encoding === 'utf8') {
          var utf8 = new Runtime.UTF8Processor();
          var buf = new Uint8Array(utf8.processJSString(data));
          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);
        } else if (opts.encoding === 'binary') {
          FS.write(stream, data, 0, data.length, 0, opts.canOwn);
        }
        FS.close(stream);
      },cwd:function () {
        return FS.currentPath;
      },chdir:function (path) {
        var lookup = FS.lookupPath(path, { follow: true });
        if (!FS.isDir(lookup.node.mode)) {
          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
        }
        var err = FS.nodePermissions(lookup.node, 'x');
        if (err) {
          throw new FS.ErrnoError(err);
        }
        FS.currentPath = lookup.path;
      },createDefaultDirectories:function () {
        FS.mkdir('/tmp');
      },createDefaultDevices:function () {
        // create /dev
        FS.mkdir('/dev');
        // setup /dev/null
        FS.registerDevice(FS.makedev(1, 3), {
          read: function() { return 0; },
          write: function() { return 0; }
        });
        FS.mkdev('/dev/null', FS.makedev(1, 3));
        // setup /dev/tty and /dev/tty1
        // stderr needs to print output using Module['printErr']
        // so we register a second tty just for it.
        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
        FS.mkdev('/dev/tty', FS.makedev(5, 0));
        FS.mkdev('/dev/tty1', FS.makedev(6, 0));
        // we're not going to emulate the actual shm device,
        // just create the tmp dirs that reside in it commonly
        FS.mkdir('/dev/shm');
        FS.mkdir('/dev/shm/tmp');
      },createStandardStreams:function () {
        // TODO deprecate the old functionality of a single
        // input / output callback and that utilizes FS.createDevice
        // and instead require a unique set of stream ops

        // by default, we symlink the standard streams to the
        // default tty devices. however, if the standard streams
        // have been overwritten we create a unique device for
        // them instead.
        if (Module['stdin']) {
          FS.createDevice('/dev', 'stdin', Module['stdin']);
        } else {
          FS.symlink('/dev/tty', '/dev/stdin');
        }
        if (Module['stdout']) {
          FS.createDevice('/dev', 'stdout', null, Module['stdout']);
        } else {
          FS.symlink('/dev/tty', '/dev/stdout');
        }
        if (Module['stderr']) {
          FS.createDevice('/dev', 'stderr', null, Module['stderr']);
        } else {
          FS.symlink('/dev/tty1', '/dev/stderr');
        }

        // open default streams for the stdin, stdout and stderr devices
        var stdin = FS.open('/dev/stdin', 'r');
        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);
        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');

        var stdout = FS.open('/dev/stdout', 'w');
        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);
        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');

        var stderr = FS.open('/dev/stderr', 'w');
        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);
        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');
      },ensureErrnoError:function () {
        if (FS.ErrnoError) return;
        FS.ErrnoError = function ErrnoError(errno) {
          this.errno = errno;
          for (var key in ERRNO_CODES) {
            if (ERRNO_CODES[key] === errno) {
              this.code = key;
              break;
            }
          }
          this.message = ERRNO_MESSAGES[errno];
        };
        FS.ErrnoError.prototype = new Error();
        FS.ErrnoError.prototype.constructor = FS.ErrnoError;
        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
        [ERRNO_CODES.ENOENT].forEach(function(code) {
          FS.genericErrors[code] = new FS.ErrnoError(code);
          FS.genericErrors[code].stack = '<generic error, no stack>';
        });
      },staticInit:function () {
        FS.ensureErrnoError();

        FS.nameTable = new Array(4096);

        FS.mount(MEMFS, {}, '/');

        FS.createDefaultDirectories();
        FS.createDefaultDevices();
      },init:function (input, output, error) {
        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
        FS.init.initialized = true;

        FS.ensureErrnoError();

        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
        Module['stdin'] = input || Module['stdin'];
        Module['stdout'] = output || Module['stdout'];
        Module['stderr'] = error || Module['stderr'];

        FS.createStandardStreams();
      },quit:function () {
        FS.init.initialized = false;
        for (var i = 0; i < FS.streams.length; i++) {
          var stream = FS.streams[i];
          if (!stream) {
            continue;
          }
          FS.close(stream);
        }
      },getMode:function (canRead, canWrite) {
        var mode = 0;
        if (canRead) mode |= 292 | 73;
        if (canWrite) mode |= 146;
        return mode;
      },joinPath:function (parts, forceRelative) {
        var path = PATH.join.apply(null, parts);
        if (forceRelative && path[0] == '/') path = path.substr(1);
        return path;
      },absolutePath:function (relative, base) {
        return PATH.resolve(base, relative);
      },standardizePath:function (path) {
        return PATH.normalize(path);
      },findObject:function (path, dontResolveLastLink) {
        var ret = FS.analyzePath(path, dontResolveLastLink);
        if (ret.exists) {
          return ret.object;
        } else {
          ___setErrNo(ret.error);
          return null;
        }
      },analyzePath:function (path, dontResolveLastLink) {
        // operate from within the context of the symlink's target
        try {
          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
          path = lookup.path;
        } catch (e) {
        }
        var ret = {
          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,
          parentExists: false, parentPath: null, parentObject: null
        };
        try {
          var lookup = FS.lookupPath(path, { parent: true });
          ret.parentExists = true;
          ret.parentPath = lookup.path;
          ret.parentObject = lookup.node;
          ret.name = PATH.basename(path);
          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
          ret.exists = true;
          ret.path = lookup.path;
          ret.object = lookup.node;
          ret.name = lookup.node.name;
          ret.isRoot = lookup.path === '/';
        } catch (e) {
          ret.error = e.errno;
        };
        return ret;
      },createFolder:function (parent, name, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(canRead, canWrite);
        return FS.mkdir(path, mode);
      },createPath:function (parent, path, canRead, canWrite) {
        parent = typeof parent === 'string' ? parent : FS.getPath(parent);
        var parts = path.split('/').reverse();
        while (parts.length) {
          var part = parts.pop();
          if (!part) continue;
          var current = PATH.join2(parent, part);
          try {
            FS.mkdir(current);
          } catch (e) {
            // ignore EEXIST
          }
          parent = current;
        }
        return current;
      },createFile:function (parent, name, properties, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(canRead, canWrite);
        return FS.create(path, mode);
      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {
        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
        var mode = FS.getMode(canRead, canWrite);
        var node = FS.create(path, mode);
        if (data) {
          if (typeof data === 'string') {
            var arr = new Array(data.length);
            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
            data = arr;
          }
          // make sure we can write to the file
          FS.chmod(node, mode | 146);
          var stream = FS.open(node, 'w');
          FS.write(stream, data, 0, data.length, 0, canOwn);
          FS.close(stream);
          FS.chmod(node, mode);
        }
        return node;
      },createDevice:function (parent, name, input, output) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        var mode = FS.getMode(!!input, !!output);
        if (!FS.createDevice.major) FS.createDevice.major = 64;
        var dev = FS.makedev(FS.createDevice.major++, 0);
        // Create a fake device that a set of stream ops to emulate
        // the old behavior.
        FS.registerDevice(dev, {
          open: function(stream) {
            stream.seekable = false;
          },
          close: function(stream) {
            // flush any pending line data
            if (output && output.buffer && output.buffer.length) {
              output(10);
            }
          },
          read: function(stream, buffer, offset, length, pos /* ignored */) {
            var bytesRead = 0;
            for (var i = 0; i < length; i++) {
              var result;
              try {
                result = input();
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES.EIO);
              }
              if (result === undefined && bytesRead === 0) {
                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
              }
              if (result === null || result === undefined) break;
              bytesRead++;
              buffer[offset+i] = result;
            }
            if (bytesRead) {
              stream.node.timestamp = Date.now();
            }
            return bytesRead;
          },
          write: function(stream, buffer, offset, length, pos) {
            for (var i = 0; i < length; i++) {
              try {
                output(buffer[offset+i]);
              } catch (e) {
                throw new FS.ErrnoError(ERRNO_CODES.EIO);
              }
            }
            if (length) {
              stream.node.timestamp = Date.now();
            }
            return i;
          }
        });
        return FS.mkdev(path, mode, dev);
      },createLink:function (parent, name, target, canRead, canWrite) {
        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
        return FS.symlink(target, path);
      },forceLoadFile:function (obj) {
        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
        var success = true;
        if (typeof XMLHttpRequest !== 'undefined') {
          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.");
        } else if (Module['read']) {
          // Command-line.
          try {
            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as
            //          read() will try to parse UTF8.
            obj.contents = intArrayFromString(Module['read'](obj.url), true);
          } catch (e) {
            success = false;
          }
        } else {
          throw new Error('Cannot load without read() or XMLHttpRequest.');
        }
        if (!success) ___setErrNo(ERRNO_CODES.EIO);
        return success;
      },createLazyFile:function (parent, name, url, canRead, canWrite) {
        // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
        function LazyUint8Array() {
          this.lengthKnown = false;
          this.chunks = []; // Loaded chunks. Index is the chunk number
        }
        LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
          if (idx > this.length-1 || idx < 0) {
            return undefined;
          }
          var chunkOffset = idx % this.chunkSize;
          var chunkNum = Math.floor(idx / this.chunkSize);
          return this.getter(chunkNum)[chunkOffset];
        }
        LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
          this.getter = getter;
        }
        LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
            // Find length
            var xhr = new XMLHttpRequest();
            xhr.open('HEAD', url, false);
            xhr.send(null);
            if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
            var datalength = Number(xhr.getResponseHeader("Content-length"));
            var header;
            var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
            var chunkSize = 1024*1024; // Chunk size in bytes

            if (!hasByteServing) chunkSize = datalength;

            // Function to get a range from the remote URL.
            var doXHR = (function(from, to) {
              if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
              if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!");

              // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
              var xhr = new XMLHttpRequest();
              xhr.open('GET', url, false);
              if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);

              // Some hints to the browser that we want binary data.
              if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';
              if (xhr.overrideMimeType) {
                xhr.overrideMimeType('text/plain; charset=x-user-defined');
              }

              xhr.send(null);
              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
              if (xhr.response !== undefined) {
                return new Uint8Array(xhr.response || []);
              } else {
                return intArrayFromString(xhr.responseText || '', true);
              }
            });
            var lazyArray = this;
            lazyArray.setDataGetter(function(chunkNum) {
              var start = chunkNum * chunkSize;
              var end = (chunkNum+1) * chunkSize - 1; // including this byte
              end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block
              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") {
                lazyArray.chunks[chunkNum] = doXHR(start, end);
              }
              if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!");
              return lazyArray.chunks[chunkNum];
            });

            this._length = datalength;
            this._chunkSize = chunkSize;
            this.lengthKnown = true;
        }
        if (typeof XMLHttpRequest !== 'undefined') {
          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
          var lazyArray = new LazyUint8Array();
          Object.defineProperty(lazyArray, "length", {
              get: function() {
                  if(!this.lengthKnown) {
                      this.cacheLength();
                  }
                  return this._length;
              }
          });
          Object.defineProperty(lazyArray, "chunkSize", {
              get: function() {
                  if(!this.lengthKnown) {
                      this.cacheLength();
                  }
                  return this._chunkSize;
              }
          });

          var properties = { isDevice: false, contents: lazyArray };
        } else {
          var properties = { isDevice: false, url: url };
        }

        var node = FS.createFile(parent, name, properties, canRead, canWrite);
        // This is a total hack, but I want to get this lazy file code out of the
        // core of MEMFS. If we want to keep this lazy file concept I feel it should
        // be its own thin LAZYFS proxying calls to MEMFS.
        if (properties.contents) {
          node.contents = properties.contents;
        } else if (properties.url) {
          node.contents = null;
          node.url = properties.url;
        }
        // override each stream op with one that tries to force load the lazy file first
        var stream_ops = {};
        var keys = Object.keys(node.stream_ops);
        keys.forEach(function(key) {
          var fn = node.stream_ops[key];
          stream_ops[key] = function forceLoadLazyFile() {
            if (!FS.forceLoadFile(node)) {
              throw new FS.ErrnoError(ERRNO_CODES.EIO);
            }
            return fn.apply(null, arguments);
          };
        });
        // use a custom read function
        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
          if (!FS.forceLoadFile(node)) {
            throw new FS.ErrnoError(ERRNO_CODES.EIO);
          }
          var contents = stream.node.contents;
          if (position >= contents.length)
            return 0;
          var size = Math.min(contents.length - position, length);
          assert(size >= 0);
          if (contents.slice) { // normal array
            for (var i = 0; i < size; i++) {
              buffer[offset + i] = contents[position + i];
            }
          } else {
            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
              buffer[offset + i] = contents.get(position + i);
            }
          }
          return size;
        };
        node.stream_ops = stream_ops;
        return node;
      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {
        Browser.init();
        // TODO we should allow people to just pass in a complete filename instead
        // of parent and name being that we just join them anyways
        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
        function processData(byteArray) {
          function finish(byteArray) {
            if (!dontCreateFile) {
              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
            }
            if (onload) onload();
            removeRunDependency('cp ' + fullname);
          }
          var handled = false;
          Module['preloadPlugins'].forEach(function(plugin) {
            if (handled) return;
            if (plugin['canHandle'](fullname)) {
              plugin['handle'](byteArray, fullname, finish, function() {
                if (onerror) onerror();
                removeRunDependency('cp ' + fullname);
              });
              handled = true;
            }
          });
          if (!handled) finish(byteArray);
        }
        addRunDependency('cp ' + fullname);
        if (typeof url == 'string') {
          Browser.asyncLoad(url, function(byteArray) {
            processData(byteArray);
          }, onerror);
        } else {
          processData(url);
        }
      },indexedDB:function () {
        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
      },DB_NAME:function () {
        return 'EM_FS_' + window.location.pathname;
      },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) {
        onload = onload || function(){};
        onerror = onerror || function(){};
        var indexedDB = FS.indexedDB();
        try {
          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
        } catch (e) {
          return onerror(e);
        }
        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
          console.log('creating db');
          var db = openRequest.result;
          db.createObjectStore(FS.DB_STORE_NAME);
        };
        openRequest.onsuccess = function openRequest_onsuccess() {
          var db = openRequest.result;
          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
          var files = transaction.objectStore(FS.DB_STORE_NAME);
          var ok = 0, fail = 0, total = paths.length;
          function finish() {
            if (fail == 0) onload(); else onerror();
          }
          paths.forEach(function(path) {
            var putRequest = files.put(FS.analyzePath(path).object.contents, path);
            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
          });
          transaction.onerror = onerror;
        };
        openRequest.onerror = onerror;
      },loadFilesFromDB:function (paths, onload, onerror) {
        onload = onload || function(){};
        onerror = onerror || function(){};
        var indexedDB = FS.indexedDB();
        try {
          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
        } catch (e) {
          return onerror(e);
        }
        openRequest.onupgradeneeded = onerror; // no database to load from
        openRequest.onsuccess = function openRequest_onsuccess() {
          var db = openRequest.result;
          try {
            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
          } catch(e) {
            onerror(e);
            return;
          }
          var files = transaction.objectStore(FS.DB_STORE_NAME);
          var ok = 0, fail = 0, total = paths.length;
          function finish() {
            if (fail == 0) onload(); else onerror();
          }
          paths.forEach(function(path) {
            var getRequest = files.get(path);
            getRequest.onsuccess = function getRequest_onsuccess() {
              if (FS.analyzePath(path).exists) {
                FS.unlink(path);
              }
              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
              ok++;
              if (ok + fail == total) finish();
            };
            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
          });
          transaction.onerror = onerror;
        };
        openRequest.onerror = onerror;
      }};




  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {
        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);
      },createSocket:function (family, type, protocol) {
        var streaming = type == 1;
        if (protocol) {
          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp
        }

        // create our internal socket structure
        var sock = {
          family: family,
          type: type,
          protocol: protocol,
          server: null,
          peers: {},
          pending: [],
          recv_queue: [],
          sock_ops: SOCKFS.websocket_sock_ops
        };

        // create the filesystem node to store the socket structure
        var name = SOCKFS.nextname();
        var node = FS.createNode(SOCKFS.root, name, 49152, 0);
        node.sock = sock;

        // and the wrapping stream that enables library functions such
        // as read and write to indirectly interact with the socket
        var stream = FS.createStream({
          path: name,
          node: node,
          flags: FS.modeStringToFlags('r+'),
          seekable: false,
          stream_ops: SOCKFS.stream_ops
        });

        // map the new stream to the socket structure (sockets have a 1:1
        // relationship with a stream)
        sock.stream = stream;

        return sock;
      },getSocket:function (fd) {
        var stream = FS.getStream(fd);
        if (!stream || !FS.isSocket(stream.node.mode)) {
          return null;
        }
        return stream.node.sock;
      },stream_ops:{poll:function (stream) {
          var sock = stream.node.sock;
          return sock.sock_ops.poll(sock);
        },ioctl:function (stream, request, varargs) {
          var sock = stream.node.sock;
          return sock.sock_ops.ioctl(sock, request, varargs);
        },read:function (stream, buffer, offset, length, position /* ignored */) {
          var sock = stream.node.sock;
          var msg = sock.sock_ops.recvmsg(sock, length);
          if (!msg) {
            // socket is closed
            return 0;
          }
          buffer.set(msg.buffer, offset);
          return msg.buffer.length;
        },write:function (stream, buffer, offset, length, position /* ignored */) {
          var sock = stream.node.sock;
          return sock.sock_ops.sendmsg(sock, buffer, offset, length);
        },close:function (stream) {
          var sock = stream.node.sock;
          sock.sock_ops.close(sock);
        }},nextname:function () {
        if (!SOCKFS.nextname.current) {
          SOCKFS.nextname.current = 0;
        }
        return 'socket[' + (SOCKFS.nextname.current++) + ']';
      },websocket_sock_ops:{createPeer:function (sock, addr, port) {
          var ws;

          if (typeof addr === 'object') {
            ws = addr;
            addr = null;
            port = null;
          }

          if (ws) {
            // for sockets that've already connected (e.g. we're the server)
            // we can inspect the _socket property for the address
            if (ws._socket) {
              addr = ws._socket.remoteAddress;
              port = ws._socket.remotePort;
            }
            // if we're just now initializing a connection to the remote,
            // inspect the url property
            else {
              var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
              if (!result) {
                throw new Error('WebSocket URL must be in the format ws(s)://address:port');
              }
              addr = result[1];
              port = parseInt(result[2], 10);
            }
          } else {
            // create the actual websocket object and connect
            try {
              // runtimeConfig gets set to true if WebSocket runtime configuration is available.
              var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket']));

              // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#'
              // comments without checking context, so we'd end up with ws:#, the replace swaps the "#" for "//" again.
              var url = 'ws:#'.replace('#', '//');

              if (runtimeConfig) {
                if ('string' === typeof Module['websocket']['url']) {
                  url = Module['websocket']['url']; // Fetch runtime WebSocket URL config.
                }
              }

              if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it.
                url = url + addr + ':' + port;
              }

              // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
              var subProtocols = 'binary'; // The default value is 'binary'

              if (runtimeConfig) {
                if ('string' === typeof Module['websocket']['subprotocol']) {
                  subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config.
                }
              }

              // The regex trims the string (removes spaces at the beginning and end, then splits the string by
              // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
              subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */);

              // The node ws library API for specifying optional subprotocol is slightly different than the browser's.
              var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols;

              // If node we use the ws library.
              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];
              ws = new WebSocket(url, opts);
              ws.binaryType = 'arraybuffer';
            } catch (e) {
              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);
            }
          }


          var peer = {
            addr: addr,
            port: port,
            socket: ws,
            dgram_send_queue: []
          };

          SOCKFS.websocket_sock_ops.addPeer(sock, peer);
          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);

          // if this is a bound dgram socket, send the port number first to allow
          // us to override the ephemeral port reported to us by remotePort on the
          // remote end.
          if (sock.type === 2 && typeof sock.sport !== 'undefined') {
            peer.dgram_send_queue.push(new Uint8Array([
                255, 255, 255, 255,
                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),
                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)
            ]));
          }

          return peer;
        },getPeer:function (sock, addr, port) {
          return sock.peers[addr + ':' + port];
        },addPeer:function (sock, peer) {
          sock.peers[peer.addr + ':' + peer.port] = peer;
        },removePeer:function (sock, peer) {
          delete sock.peers[peer.addr + ':' + peer.port];
        },handlePeerEvents:function (sock, peer) {
          var first = true;

          var handleOpen = function () {
            try {
              var queued = peer.dgram_send_queue.shift();
              while (queued) {
                peer.socket.send(queued);
                queued = peer.dgram_send_queue.shift();
              }
            } catch (e) {
              // not much we can do here in the way of proper error handling as we've already
              // lied and said this data was sent. shut it down.
              peer.socket.close();
            }
          };

          function handleMessage(data) {
            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer
            data = new Uint8Array(data);  // make a typed array view on the array buffer


            // if this is the port message, override the peer's port with it
            var wasfirst = first;
            first = false;
            if (wasfirst &&
                data.length === 10 &&
                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&
                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {
              // update the peer's port and it's key in the peer map
              var newport = ((data[8] << 8) | data[9]);
              SOCKFS.websocket_sock_ops.removePeer(sock, peer);
              peer.port = newport;
              SOCKFS.websocket_sock_ops.addPeer(sock, peer);
              return;
            }

            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });
          };

          if (ENVIRONMENT_IS_NODE) {
            peer.socket.on('open', handleOpen);
            peer.socket.on('message', function(data, flags) {
              if (!flags.binary) {
                return;
              }
              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer
            });
            peer.socket.on('error', function() {
              // don't throw
            });
          } else {
            peer.socket.onopen = handleOpen;
            peer.socket.onmessage = function peer_socket_onmessage(event) {
              handleMessage(event.data);
            };
          }
        },poll:function (sock) {
          if (sock.type === 1 && sock.server) {
            // listen sockets should only say they're available for reading
            // if there are pending clients.
            return sock.pending.length ? (64 | 1) : 0;
          }

          var mask = 0;
          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets
            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :
            null;

          if (sock.recv_queue.length ||
              !dest ||  // connection-less sockets are always ready to read
              (dest && dest.socket.readyState === dest.socket.CLOSING) ||
              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed
            mask |= (64 | 1);
          }

          if (!dest ||  // connection-less sockets are always ready to write
              (dest && dest.socket.readyState === dest.socket.OPEN)) {
            mask |= 4;
          }

          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||
              (dest && dest.socket.readyState === dest.socket.CLOSED)) {
            mask |= 16;
          }

          return mask;
        },ioctl:function (sock, request, arg) {
          switch (request) {
            case 21531:
              var bytes = 0;
              if (sock.recv_queue.length) {
                bytes = sock.recv_queue[0].data.length;
              }
              HEAP32[((arg)>>2)]=bytes;
              return 0;
            default:
              return ERRNO_CODES.EINVAL;
          }
        },close:function (sock) {
          // if we've spawned a listen server, close it
          if (sock.server) {
            try {
              sock.server.close();
            } catch (e) {
            }
            sock.server = null;
          }
          // close any peer connections
          var peers = Object.keys(sock.peers);
          for (var i = 0; i < peers.length; i++) {
            var peer = sock.peers[peers[i]];
            try {
              peer.socket.close();
            } catch (e) {
            }
            SOCKFS.websocket_sock_ops.removePeer(sock, peer);
          }
          return 0;
        },bind:function (sock, addr, port) {
          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound
          }
          sock.saddr = addr;
          sock.sport = port || _mkport();
          // in order to emulate dgram sockets, we need to launch a listen server when
          // binding on a connection-less socket
          // note: this is only required on the server side
          if (sock.type === 2) {
            // close the existing server if it exists
            if (sock.server) {
              sock.server.close();
              sock.server = null;
            }
            // swallow error operation not supported error that occurs when binding in the
            // browser where this isn't supported
            try {
              sock.sock_ops.listen(sock, 0);
            } catch (e) {
              if (!(e instanceof FS.ErrnoError)) throw e;
              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;
            }
          }
        },connect:function (sock, addr, port) {
          if (sock.server) {
            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);
          }

          // TODO autobind
          // if (!sock.addr && sock.type == 2) {
          // }

          // early out if we're already connected / in the middle of connecting
          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {
            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);
            if (dest) {
              if (dest.socket.readyState === dest.socket.CONNECTING) {
                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);
              } else {
                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);
              }
            }
          }

          // add the socket to our peer list and set our
          // destination address / port to match
          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
          sock.daddr = peer.addr;
          sock.dport = peer.port;

          // always "fail" in non-blocking mode
          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);
        },listen:function (sock, backlog) {
          if (!ENVIRONMENT_IS_NODE) {
            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);
          }
          if (sock.server) {
             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening
          }
          var WebSocketServer = require('ws').Server;
          var host = sock.saddr;
          sock.server = new WebSocketServer({
            host: host,
            port: sock.sport
            // TODO support backlog
          });

          sock.server.on('connection', function(ws) {
            if (sock.type === 1) {
              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);

              // create a peer on the new socket
              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);
              newsock.daddr = peer.addr;
              newsock.dport = peer.port;

              // push to queue for accept to pick up
              sock.pending.push(newsock);
            } else {
              // create a peer on the listen socket so calling sendto
              // with the listen socket and an address will resolve
              // to the correct client
              SOCKFS.websocket_sock_ops.createPeer(sock, ws);
            }
          });
          sock.server.on('closed', function() {
            sock.server = null;
          });
          sock.server.on('error', function() {
            // don't throw
          });
        },accept:function (listensock) {
          if (!listensock.server) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
          var newsock = listensock.pending.shift();
          newsock.stream.flags = listensock.stream.flags;
          return newsock;
        },getname:function (sock, peer) {
          var addr, port;
          if (peer) {
            if (sock.daddr === undefined || sock.dport === undefined) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
            }
            addr = sock.daddr;
            port = sock.dport;
          } else {
            // TODO saddr and sport will be set for bind()'d UDP sockets, but what
            // should we be returning for TCP sockets that've been connect()'d?
            addr = sock.saddr || 0;
            port = sock.sport || 0;
          }
          return { addr: addr, port: port };
        },sendmsg:function (sock, buffer, offset, length, addr, port) {
          if (sock.type === 2) {
            // connection-less sockets will honor the message address,
            // and otherwise fall back to the bound destination address
            if (addr === undefined || port === undefined) {
              addr = sock.daddr;
              port = sock.dport;
            }
            // if there was no address to fall back to, error out
            if (addr === undefined || port === undefined) {
              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);
            }
          } else {
            // connection-based sockets will only use the bound
            addr = sock.daddr;
            port = sock.dport;
          }

          // find the peer for the destination address
          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);

          // early out if not connected with a connection-based socket
          if (sock.type === 1) {
            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
            } else if (dest.socket.readyState === dest.socket.CONNECTING) {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
          }

          // create a copy of the incoming data to send, as the WebSocket API
          // doesn't work entirely with an ArrayBufferView, it'll just send
          // the entire underlying buffer
          var data;
          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {
            data = buffer.slice(offset, offset + length);
          } else {  // ArrayBufferView
            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);
          }

          // if we're emulating a connection-less dgram socket and don't have
          // a cached connection, queue the buffer to send upon connect and
          // lie, saying the data was sent now.
          if (sock.type === 2) {
            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
              // if we're not connected, open a new connection
              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
              }
              dest.dgram_send_queue.push(data);
              return length;
            }
          }

          try {
            // send the actual data
            dest.socket.send(data);
            return length;
          } catch (e) {
            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
          }
        },recvmsg:function (sock, length) {
          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
          if (sock.type === 1 && sock.server) {
            // tcp servers should not be recv()'ing on the listen socket
            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
          }

          var queued = sock.recv_queue.shift();
          if (!queued) {
            if (sock.type === 1) {
              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);

              if (!dest) {
                // if we have a destination address but are not connected, error out
                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);
              }
              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {
                // return null if the socket has closed
                return null;
              }
              else {
                // else, our socket is in a valid state but truly has nothing available
                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
              }
            } else {
              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
            }
          }

          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
          // requeued TCP data it'll be an ArrayBufferView
          var queuedLength = queued.data.byteLength || queued.data.length;
          var queuedOffset = queued.data.byteOffset || 0;
          var queuedBuffer = queued.data.buffer || queued.data;
          var bytesRead = Math.min(length, queuedLength);
          var res = {
            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
            addr: queued.addr,
            port: queued.port
          };


          // push back any unread data for TCP connections
          if (sock.type === 1 && bytesRead < queuedLength) {
            var bytesRemaining = queuedLength - bytesRead;
            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);
            sock.recv_queue.unshift(queued);
          }

          return res;
        }}};function _send(fd, buf, len, flags) {
      var sock = SOCKFS.getSocket(fd);
      if (!sock) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      // TODO honor flags
      return _write(fd, buf, len);
    }

  function _pwrite(fildes, buf, nbyte, offset) {
      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }
      try {
        var slab = HEAP8;
        return FS.write(stream, slab, buf, nbyte, offset);
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }function _write(fildes, buf, nbyte) {
      // ssize_t write(int fildes, const void *buf, size_t nbyte);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html
      var stream = FS.getStream(fildes);
      if (!stream) {
        ___setErrNo(ERRNO_CODES.EBADF);
        return -1;
      }


      try {
        var slab = HEAP8;
        return FS.write(stream, slab, buf, nbyte);
      } catch (e) {
        FS.handleFSError(e);
        return -1;
      }
    }

  function _fileno(stream) {
      // int fileno(FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
      stream = FS.getStreamFromPtr(stream);
      if (!stream) return -1;
      return stream.fd;
    }function _fwrite(ptr, size, nitems, stream) {
      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html
      var bytesToWrite = nitems * size;
      if (bytesToWrite == 0) return 0;
      var fd = _fileno(stream);
      var bytesWritten = _write(fd, ptr, bytesToWrite);
      if (bytesWritten == -1) {
        var streamObj = FS.getStreamFromPtr(stream);
        if (streamObj) streamObj.error = true;
        return 0;
      } else {
        return Math.floor(bytesWritten / size);
      }
    }



  Module["_strlen"] = _strlen;

  function __reallyNegative(x) {
      return x < 0 || (x === 0 && (1/x) === -Infinity);
    }function __formatString(format, varargs) {
      var textIndex = format;
      var argIndex = 0;
      function getNextArg(type) {
        // NOTE: Explicitly ignoring type safety. Otherwise this fails:
        //       int x = 4; printf("%c\n", (char)x);
        var ret;
        if (type === 'double') {
          ret = HEAPF64[(((varargs)+(argIndex))>>3)];
        } else if (type == 'i64') {
          ret = [HEAP32[(((varargs)+(argIndex))>>2)],
                 HEAP32[(((varargs)+(argIndex+4))>>2)]];

        } else {
          type = 'i32'; // varargs are always i32, i64, or double
          ret = HEAP32[(((varargs)+(argIndex))>>2)];
        }
        argIndex += Runtime.getNativeFieldSize(type);
        return ret;
      }

      var ret = [];
      var curr, next, currArg;
      while(1) {
        var startTextIndex = textIndex;
        curr = HEAP8[(textIndex)];
        if (curr === 0) break;
        next = HEAP8[((textIndex+1)|0)];
        if (curr == 37) {
          // Handle flags.
          var flagAlwaysSigned = false;
          var flagLeftAlign = false;
          var flagAlternative = false;
          var flagZeroPad = false;
          var flagPadSign = false;
          flagsLoop: while (1) {
            switch (next) {
              case 43:
                flagAlwaysSigned = true;
                break;
              case 45:
                flagLeftAlign = true;
                break;
              case 35:
                flagAlternative = true;
                break;
              case 48:
                if (flagZeroPad) {
                  break flagsLoop;
                } else {
                  flagZeroPad = true;
                  break;
                }
              case 32:
                flagPadSign = true;
                break;
              default:
                break flagsLoop;
            }
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
          }

          // Handle width.
          var width = 0;
          if (next == 42) {
            width = getNextArg('i32');
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
          } else {
            while (next >= 48 && next <= 57) {
              width = width * 10 + (next - 48);
              textIndex++;
              next = HEAP8[((textIndex+1)|0)];
            }
          }

          // Handle precision.
          var precisionSet = false, precision = -1;
          if (next == 46) {
            precision = 0;
            precisionSet = true;
            textIndex++;
            next = HEAP8[((textIndex+1)|0)];
            if (next == 42) {
              precision = getNextArg('i32');
              textIndex++;
            } else {
              while(1) {
                var precisionChr = HEAP8[((textIndex+1)|0)];
                if (precisionChr < 48 ||
                    precisionChr > 57) break;
                precision = precision * 10 + (precisionChr - 48);
                textIndex++;
              }
            }
            next = HEAP8[((textIndex+1)|0)];
          }
          if (precision < 0) {
            precision = 6; // Standard default.
            precisionSet = false;
          }

          // Handle integer sizes. WARNING: These assume a 32-bit architecture!
          var argSize;
          switch (String.fromCharCode(next)) {
            case 'h':
              var nextNext = HEAP8[((textIndex+2)|0)];
              if (nextNext == 104) {
                textIndex++;
                argSize = 1; // char (actually i32 in varargs)
              } else {
                argSize = 2; // short (actually i32 in varargs)
              }
              break;
            case 'l':
              var nextNext = HEAP8[((textIndex+2)|0)];
              if (nextNext == 108) {
                textIndex++;
                argSize = 8; // long long
              } else {
                argSize = 4; // long
              }
              break;
            case 'L': // long long
            case 'q': // int64_t
            case 'j': // intmax_t
              argSize = 8;
              break;
            case 'z': // size_t
            case 't': // ptrdiff_t
            case 'I': // signed ptrdiff_t or unsigned size_t
              argSize = 4;
              break;
            default:
              argSize = null;
          }
          if (argSize) textIndex++;
          next = HEAP8[((textIndex+1)|0)];

          // Handle type specifier.
          switch (String.fromCharCode(next)) {
            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {
              // Integer.
              var signed = next == 100 || next == 105;
              argSize = argSize || 4;
              var currArg = getNextArg('i' + (argSize * 8));
              var argText;
              // Flatten i64-1 [low, high] into a (slightly rounded) double
              if (argSize == 8) {
                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);
              }
              // Truncate to requested size.
              if (argSize <= 4) {
                var limit = Math.pow(256, argSize) - 1;
                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
              }
              // Format the number.
              var currAbsArg = Math.abs(currArg);
              var prefix = '';
              if (next == 100 || next == 105) {
                argText = reSign(currArg, 8 * argSize, 1).toString(10);
              } else if (next == 117) {
                argText = unSign(currArg, 8 * argSize, 1).toString(10);
                currArg = Math.abs(currArg);
              } else if (next == 111) {
                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
              } else if (next == 120 || next == 88) {
                prefix = (flagAlternative && currArg != 0) ? '0x' : '';
                if (currArg < 0) {
                  // Represent negative numbers in hex as 2's complement.
                  currArg = -currArg;
                  argText = (currAbsArg - 1).toString(16);
                  var buffer = [];
                  for (var i = 0; i < argText.length; i++) {
                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));
                  }
                  argText = buffer.join('');
                  while (argText.length < argSize * 2) argText = 'f' + argText;
                } else {
                  argText = currAbsArg.toString(16);
                }
                if (next == 88) {
                  prefix = prefix.toUpperCase();
                  argText = argText.toUpperCase();
                }
              } else if (next == 112) {
                if (currAbsArg === 0) {
                  argText = '(nil)';
                } else {
                  prefix = '0x';
                  argText = currAbsArg.toString(16);
                }
              }
              if (precisionSet) {
                while (argText.length < precision) {
                  argText = '0' + argText;
                }
              }

              // Add sign if needed
              if (currArg >= 0) {
                if (flagAlwaysSigned) {
                  prefix = '+' + prefix;
                } else if (flagPadSign) {
                  prefix = ' ' + prefix;
                }
              }

              // Move sign to prefix so we zero-pad after the sign
              if (argText.charAt(0) == '-') {
                prefix = '-' + prefix;
                argText = argText.substr(1);
              }

              // Add padding.
              while (prefix.length + argText.length < width) {
                if (flagLeftAlign) {
                  argText += ' ';
                } else {
                  if (flagZeroPad) {
                    argText = '0' + argText;
                  } else {
                    prefix = ' ' + prefix;
                  }
                }
              }

              // Insert the result into the buffer.
              argText = prefix + argText;
              argText.split('').forEach(function(chr) {
                ret.push(chr.charCodeAt(0));
              });
              break;
            }
            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {
              // Float.
              var currArg = getNextArg('double');
              var argText;
              if (isNaN(currArg)) {
                argText = 'nan';
                flagZeroPad = false;
              } else if (!isFinite(currArg)) {
                argText = (currArg < 0 ? '-' : '') + 'inf';
                flagZeroPad = false;
              } else {
                var isGeneral = false;
                var effectivePrecision = Math.min(precision, 20);

                // Convert g/G to f/F or e/E, as per:
                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html
                if (next == 103 || next == 71) {
                  isGeneral = true;
                  precision = precision || 1;
                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);
                  if (precision > exponent && exponent >= -4) {
                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);
                    precision -= exponent + 1;
                  } else {
                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);
                    precision--;
                  }
                  effectivePrecision = Math.min(precision, 20);
                }

                if (next == 101 || next == 69) {
                  argText = currArg.toExponential(effectivePrecision);
                  // Make sure the exponent has at least 2 digits.
                  if (/[eE][-+]\d$/.test(argText)) {
                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);
                  }
                } else if (next == 102 || next == 70) {
                  argText = currArg.toFixed(effectivePrecision);
                  if (currArg === 0 && __reallyNegative(currArg)) {
                    argText = '-' + argText;
                  }
                }

                var parts = argText.split('e');
                if (isGeneral && !flagAlternative) {
                  // Discard trailing zeros and periods.
                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&
                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {
                    parts[0] = parts[0].slice(0, -1);
                  }
                } else {
                  // Make sure we have a period in alternative mode.
                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
                  // Zero pad until required precision.
                  while (precision > effectivePrecision++) parts[0] += '0';
                }
                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');

                // Capitalize 'E' if needed.
                if (next == 69) argText = argText.toUpperCase();

                // Add sign.
                if (currArg >= 0) {
                  if (flagAlwaysSigned) {
                    argText = '+' + argText;
                  } else if (flagPadSign) {
                    argText = ' ' + argText;
                  }
                }
              }

              // Add padding.
              while (argText.length < width) {
                if (flagLeftAlign) {
                  argText += ' ';
                } else {
                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
                    argText = argText[0] + '0' + argText.slice(1);
                  } else {
                    argText = (flagZeroPad ? '0' : ' ') + argText;
                  }
                }
              }

              // Adjust case.
              if (next < 97) argText = argText.toUpperCase();

              // Insert the result into the buffer.
              argText.split('').forEach(function(chr) {
                ret.push(chr.charCodeAt(0));
              });
              break;
            }
            case 's': {
              // String.
              var arg = getNextArg('i8*');
              var argLength = arg ? _strlen(arg) : '(null)'.length;
              if (precisionSet) argLength = Math.min(argLength, precision);
              if (!flagLeftAlign) {
                while (argLength < width--) {
                  ret.push(32);
                }
              }
              if (arg) {
                for (var i = 0; i < argLength; i++) {
                  ret.push(HEAPU8[((arg++)|0)]);
                }
              } else {
                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));
              }
              if (flagLeftAlign) {
                while (argLength < width--) {
                  ret.push(32);
                }
              }
              break;
            }
            case 'c': {
              // Character.
              if (flagLeftAlign) ret.push(getNextArg('i8'));
              while (--width > 0) {
                ret.push(32);
              }
              if (!flagLeftAlign) ret.push(getNextArg('i8'));
              break;
            }
            case 'n': {
              // Write the length written so far to the next parameter.
              var ptr = getNextArg('i32*');
              HEAP32[((ptr)>>2)]=ret.length;
              break;
            }
            case '%': {
              // Literal percent sign.
              ret.push(curr);
              break;
            }
            default: {
              // Unknown specifiers remain untouched.
              for (var i = startTextIndex; i < textIndex + 2; i++) {
                ret.push(HEAP8[(i)]);
              }
            }
          }
          textIndex += 2;
          // TODO: Support a/A (hex float) and m (last error) specifiers.
          // TODO: Support %1${specifier} for arg selection.
        } else {
          ret.push(curr);
          textIndex += 1;
        }
      }
      return ret;
    }function _fprintf(stream, format, varargs) {
      // int fprintf(FILE *restrict stream, const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      var result = __formatString(format, varargs);
      var stack = Runtime.stackSave();
      var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);
      Runtime.stackRestore(stack);
      return ret;
    }function _printf(format, varargs) {
      // int printf(const char *restrict format, ...);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
      var stdout = HEAP32[((_stdout)>>2)];
      return _fprintf(stdout, format, varargs);
    }

  var _sinf=Math_sin;


  var _sqrtf=Math_sqrt;

  var _floorf=Math_floor;


  function _fputs(s, stream) {
      // int fputs(const char *restrict s, FILE *restrict stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
      var fd = _fileno(stream);
      return _write(fd, s, _strlen(s));
    }

  function _fputc(c, stream) {
      // int fputc(int c, FILE *stream);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html
      var chr = unSign(c & 0xFF);
      HEAP8[((_fputc.ret)|0)]=chr;
      var fd = _fileno(stream);
      var ret = _write(fd, _fputc.ret, 1);
      if (ret == -1) {
        var streamObj = FS.getStreamFromPtr(stream);
        if (streamObj) streamObj.error = true;
        return -1;
      } else {
        return chr;
      }
    }function _puts(s) {
      // int puts(const char *s);
      // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html
      // NOTE: puts() always writes an extra newline.
      var stdout = HEAP32[((_stdout)>>2)];
      var ret = _fputs(s, stdout);
      if (ret < 0) {
        return ret;
      } else {
        var newlineRet = _fputc(10, stdout);
        return (newlineRet < 0) ? -1 : ret + 1;
      }
    }

  function _clock() {
      if (_clock.start === undefined) _clock.start = Date.now();
      return Math.floor((Date.now() - _clock.start) * (1000000/1000));
    }


  var ___cxa_caught_exceptions=[];function ___cxa_begin_catch(ptr) {
      __ZSt18uncaught_exceptionv.uncaught_exception--;
      ___cxa_caught_exceptions.push(___cxa_last_thrown_exception);
      return ptr;
    }

  function ___errno_location() {
      return ___errno_state;
    }


  function _emscripten_memcpy_big(dest, src, num) {
      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
      return dest;
    }
  Module["_memcpy"] = _memcpy;

  function __ZNSt9exceptionD2Ev() {}

  var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false,queue:[],pause:function () {
          Browser.mainLoop.shouldPause = true;
        },resume:function () {
          if (Browser.mainLoop.paused) {
            Browser.mainLoop.paused = false;
            Browser.mainLoop.scheduler();
          }
          Browser.mainLoop.shouldPause = false;
        },updateStatus:function () {
          if (Module['setStatus']) {
            var message = Module['statusMessage'] || 'Please wait...';
            var remaining = Browser.mainLoop.remainingBlockers;
            var expected = Browser.mainLoop.expectedBlockers;
            if (remaining) {
              if (remaining < expected) {
                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');
              } else {
                Module['setStatus'](message);
              }
            } else {
              Module['setStatus']('');
            }
          }
        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {
        if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers

        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
        Browser.initted = true;

        try {
          new Blob();
          Browser.hasBlobConstructor = true;
        } catch(e) {
          Browser.hasBlobConstructor = false;
          console.log("warning: no blob constructor, cannot create blobs with mimetypes");
        }
        Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
        Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
          console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
          Module.noImageDecoding = true;
        }

        // Support for plugins that can process preloaded files. You can add more of these to
        // your app by creating and appending to Module.preloadPlugins.
        //
        // Each plugin is asked if it can handle a file based on the file's name. If it can,
        // it is given the file's raw data. When it is done, it calls a callback with the file's
        // (possibly modified) data. For example, a plugin might decompress a file, or it
        // might create some side data structure for use later (like an Image element, etc.).

        var imagePlugin = {};
        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
          return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
        };
        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
          var b = null;
          if (Browser.hasBlobConstructor) {
            try {
              b = new Blob([byteArray], { type: Browser.getMimetype(name) });
              if (b.size !== byteArray.length) { // Safari bug #118630
                // Safari's Blob can only take an ArrayBuffer
                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
              }
            } catch(e) {
              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
            }
          }
          if (!b) {
            var bb = new Browser.BlobBuilder();
            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
            b = bb.getBlob();
          }
          var url = Browser.URLObject.createObjectURL(b);
          var img = new Image();
          img.onload = function img_onload() {
            assert(img.complete, 'Image ' + name + ' could not be decoded');
            var canvas = document.createElement('canvas');
            canvas.width = img.width;
            canvas.height = img.height;
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0);
            Module["preloadedImages"][name] = canvas;
            Browser.URLObject.revokeObjectURL(url);
            if (onload) onload(byteArray);
          };
          img.onerror = function img_onerror(event) {
            console.log('Image ' + url + ' could not be decoded');
            if (onerror) onerror();
          };
          img.src = url;
        };
        Module['preloadPlugins'].push(imagePlugin);

        var audioPlugin = {};
        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
        };
        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {
          var done = false;
          function finish(audio) {
            if (done) return;
            done = true;
            Module["preloadedAudios"][name] = audio;
            if (onload) onload(byteArray);
          }
          function fail() {
            if (done) return;
            done = true;
            Module["preloadedAudios"][name] = new Audio(); // empty shim
            if (onerror) onerror();
          }
          if (Browser.hasBlobConstructor) {
            try {
              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
            } catch(e) {
              return fail();
            }
            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
            var audio = new Audio();
            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926
            audio.onerror = function audio_onerror(event) {
              if (done) return;
              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
              function encode64(data) {
                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
                var PAD = '=';
                var ret = '';
                var leftchar = 0;
                var leftbits = 0;
                for (var i = 0; i < data.length; i++) {
                  leftchar = (leftchar << 8) | data[i];
                  leftbits += 8;
                  while (leftbits >= 6) {
                    var curr = (leftchar >> (leftbits-6)) & 0x3f;
                    leftbits -= 6;
                    ret += BASE[curr];
                  }
                }
                if (leftbits == 2) {
                  ret += BASE[(leftchar&3) << 4];
                  ret += PAD + PAD;
                } else if (leftbits == 4) {
                  ret += BASE[(leftchar&0xf) << 2];
                  ret += PAD;
                }
                return ret;
              }
              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
              finish(audio); // we don't wait for confirmation this worked - but it's worth trying
            };
            audio.src = url;
            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
            Browser.safeSetTimeout(function() {
              finish(audio); // try to use it even though it is not necessarily ready to play
            }, 10000);
          } else {
            return fail();
          }
        };
        Module['preloadPlugins'].push(audioPlugin);

        // Canvas event setup

        var canvas = Module['canvas'];

        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module
        // Module['forcedAspectRatio'] = 4 / 3;

        canvas.requestPointerLock = canvas['requestPointerLock'] ||
                                    canvas['mozRequestPointerLock'] ||
                                    canvas['webkitRequestPointerLock'] ||
                                    canvas['msRequestPointerLock'] ||
                                    function(){};
        canvas.exitPointerLock = document['exitPointerLock'] ||
                                 document['mozExitPointerLock'] ||
                                 document['webkitExitPointerLock'] ||
                                 document['msExitPointerLock'] ||
                                 function(){}; // no-op if function does not exist
        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);

        function pointerLockChange() {
          Browser.pointerLock = document['pointerLockElement'] === canvas ||
                                document['mozPointerLockElement'] === canvas ||
                                document['webkitPointerLockElement'] === canvas ||
                                document['msPointerLockElement'] === canvas;
        }

        document.addEventListener('pointerlockchange', pointerLockChange, false);
        document.addEventListener('mozpointerlockchange', pointerLockChange, false);
        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);
        document.addEventListener('mspointerlockchange', pointerLockChange, false);

        if (Module['elementPointerLock']) {
          canvas.addEventListener("click", function(ev) {
            if (!Browser.pointerLock && canvas.requestPointerLock) {
              canvas.requestPointerLock();
              ev.preventDefault();
            }
          }, false);
        }
      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {
        var ctx;
        var errorInfo = '?';
        function onContextCreationError(event) {
          errorInfo = event.statusMessage || errorInfo;
        }
        try {
          if (useWebGL) {
            var contextAttributes = {
              antialias: false,
              alpha: false
            };

            if (webGLContextAttributes) {
              for (var attribute in webGLContextAttributes) {
                contextAttributes[attribute] = webGLContextAttributes[attribute];
              }
            }


            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
            try {
              ['experimental-webgl', 'webgl'].some(function(webglId) {
                return ctx = canvas.getContext(webglId, contextAttributes);
              });
            } finally {
              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
            }
          } else {
            ctx = canvas.getContext('2d');
          }
          if (!ctx) throw ':(';
        } catch (e) {
          Module.print('Could not create canvas: ' + [errorInfo, e]);
          return null;
        }
        if (useWebGL) {
          // Set the background of the WebGL canvas to black
          canvas.style.backgroundColor = "black";

          // Warn on context loss
          canvas.addEventListener('webglcontextlost', function(event) {
            alert('WebGL context lost. You will need to reload the page.');
          }, false);
        }
        if (setInModule) {
          GLctx = Module.ctx = ctx;
          Module.useWebGL = useWebGL;
          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });
          Browser.init();
        }
        return ctx;
      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {
        Browser.lockPointer = lockPointer;
        Browser.resizeCanvas = resizeCanvas;
        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;
        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;

        var canvas = Module['canvas'];
        function fullScreenChange() {
          Browser.isFullScreen = false;
          var canvasContainer = canvas.parentNode;
          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
               document['fullScreenElement'] || document['fullscreenElement'] ||
               document['msFullScreenElement'] || document['msFullscreenElement'] ||
               document['webkitCurrentFullScreenElement']) === canvasContainer) {
            canvas.cancelFullScreen = document['cancelFullScreen'] ||
                                      document['mozCancelFullScreen'] ||
                                      document['webkitCancelFullScreen'] ||
                                      document['msExitFullscreen'] ||
                                      document['exitFullscreen'] ||
                                      function() {};
            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
            if (Browser.lockPointer) canvas.requestPointerLock();
            Browser.isFullScreen = true;
            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
          } else {

            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen
            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
            canvasContainer.parentNode.removeChild(canvasContainer);

            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();
          }
          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
          Browser.updateCanvasDimensions(canvas);
        }

        if (!Browser.fullScreenHandlersInstalled) {
          Browser.fullScreenHandlersInstalled = true;
          document.addEventListener('fullscreenchange', fullScreenChange, false);
          document.addEventListener('mozfullscreenchange', fullScreenChange, false);
          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
          document.addEventListener('MSFullscreenChange', fullScreenChange, false);
        }

        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root
        var canvasContainer = document.createElement("div");
        canvas.parentNode.insertBefore(canvasContainer, canvas);
        canvasContainer.appendChild(canvas);

        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)
        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||
                                            canvasContainer['mozRequestFullScreen'] ||
                                            canvasContainer['msRequestFullscreen'] ||
                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
        canvasContainer.requestFullScreen();
      },requestAnimationFrame:function requestAnimationFrame(func) {
        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)
          setTimeout(func, 1000/60);
        } else {
          if (!window.requestAnimationFrame) {
            window.requestAnimationFrame = window['requestAnimationFrame'] ||
                                           window['mozRequestAnimationFrame'] ||
                                           window['webkitRequestAnimationFrame'] ||
                                           window['msRequestAnimationFrame'] ||
                                           window['oRequestAnimationFrame'] ||
                                           window['setTimeout'];
          }
          window.requestAnimationFrame(func);
        }
      },safeCallback:function (func) {
        return function() {
          if (!ABORT) return func.apply(null, arguments);
        };
      },safeRequestAnimationFrame:function (func) {
        return Browser.requestAnimationFrame(function() {
          if (!ABORT) func();
        });
      },safeSetTimeout:function (func, timeout) {
        return setTimeout(function() {
          if (!ABORT) func();
        }, timeout);
      },safeSetInterval:function (func, timeout) {
        return setInterval(function() {
          if (!ABORT) func();
        }, timeout);
      },getMimetype:function (name) {
        return {
          'jpg': 'image/jpeg',
          'jpeg': 'image/jpeg',
          'png': 'image/png',
          'bmp': 'image/bmp',
          'ogg': 'audio/ogg',
          'wav': 'audio/wav',
          'mp3': 'audio/mpeg'
        }[name.substr(name.lastIndexOf('.')+1)];
      },getUserMedia:function (func) {
        if(!window.getUserMedia) {
          window.getUserMedia = navigator['getUserMedia'] ||
                                navigator['mozGetUserMedia'];
        }
        window.getUserMedia(func);
      },getMovementX:function (event) {
        return event['movementX'] ||
               event['mozMovementX'] ||
               event['webkitMovementX'] ||
               0;
      },getMovementY:function (event) {
        return event['movementY'] ||
               event['mozMovementY'] ||
               event['webkitMovementY'] ||
               0;
      },getMouseWheelDelta:function (event) {
        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));
      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup
        if (Browser.pointerLock) {
          // When the pointer is locked, calculate the coordinates
          // based on the movement of the mouse.
          // Workaround for Firefox bug 764498
          if (event.type != 'mousemove' &&
              ('mozMovementX' in event)) {
            Browser.mouseMovementX = Browser.mouseMovementY = 0;
          } else {
            Browser.mouseMovementX = Browser.getMovementX(event);
            Browser.mouseMovementY = Browser.getMovementY(event);
          }

          // check if SDL is available
          if (typeof SDL != "undefined") {
    Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
    Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
          } else {
    // just add the mouse delta to the current absolut mouse position
    // FIXME: ideally this should be clamped against the canvas size and zero
    Browser.mouseX += Browser.mouseMovementX;
    Browser.mouseY += Browser.mouseMovementY;
          }
        } else {
          // Otherwise, calculate the movement based on the changes
          // in the coordinates.
          var rect = Module["canvas"].getBoundingClientRect();
          var x, y;

          // Neither .scrollX or .pageXOffset are defined in a spec, but
          // we prefer .scrollX because it is currently in a spec draft.
          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)
          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);
          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);
          if (event.type == 'touchstart' ||
              event.type == 'touchend' ||
              event.type == 'touchmove') {
            var t = event.touches.item(0);
            if (t) {
              x = t.pageX - (scrollX + rect.left);
              y = t.pageY - (scrollY + rect.top);
            } else {
              return;
            }
          } else {
            x = event.pageX - (scrollX + rect.left);
            y = event.pageY - (scrollY + rect.top);
          }

          // the canvas might be CSS-scaled compared to its backbuffer;
          // SDL-using content will want mouse coordinates in terms
          // of backbuffer units.
          var cw = Module["canvas"].width;
          var ch = Module["canvas"].height;
          x = x * (cw / rect.width);
          y = y * (ch / rect.height);

          Browser.mouseMovementX = x - Browser.mouseX;
          Browser.mouseMovementY = y - Browser.mouseY;
          Browser.mouseX = x;
          Browser.mouseY = y;
        }
      },xhrLoad:function (url, onload, onerror) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function xhr_onload() {
          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
            onload(xhr.response);
          } else {
            onerror();
          }
        };
        xhr.onerror = onerror;
        xhr.send(null);
      },asyncLoad:function (url, onload, onerror, noRunDep) {
        Browser.xhrLoad(url, function(arrayBuffer) {
          assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
          onload(new Uint8Array(arrayBuffer));
          if (!noRunDep) removeRunDependency('al ' + url);
        }, function(event) {
          if (onerror) {
            onerror();
          } else {
            throw 'Loading data file "' + url + '" failed.';
          }
        });
        if (!noRunDep) addRunDependency('al ' + url);
      },resizeListeners:[],updateResizeListeners:function () {
        var canvas = Module['canvas'];
        Browser.resizeListeners.forEach(function(listener) {
          listener(canvas.width, canvas.height);
        });
      },setCanvasSize:function (width, height, noUpdates) {
        var canvas = Module['canvas'];
        Browser.updateCanvasDimensions(canvas, width, height);
        if (!noUpdates) Browser.updateResizeListeners();
      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
        // check if SDL is available
        if (typeof SDL != "undefined") {
    var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
    flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
    HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
        }
        Browser.updateResizeListeners();
      },setWindowedCanvasSize:function () {
        // check if SDL is available
        if (typeof SDL != "undefined") {
    var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];
    flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
    HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags
        }
        Browser.updateResizeListeners();
      },updateCanvasDimensions:function (canvas, wNative, hNative) {
        if (wNative && hNative) {
          canvas.widthNative = wNative;
          canvas.heightNative = hNative;
        } else {
          wNative = canvas.widthNative;
          hNative = canvas.heightNative;
        }
        var w = wNative;
        var h = hNative;
        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {
          if (w/h < Module['forcedAspectRatio']) {
            w = Math.round(h * Module['forcedAspectRatio']);
          } else {
            h = Math.round(w / Module['forcedAspectRatio']);
          }
        }
        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
             document['fullScreenElement'] || document['fullscreenElement'] ||
             document['msFullScreenElement'] || document['msFullscreenElement'] ||
             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {
           var factor = Math.min(screen.width / w, screen.height / h);
           w = Math.round(w * factor);
           h = Math.round(h * factor);
        }
        if (Browser.resizeCanvas) {
          if (canvas.width  != w) canvas.width  = w;
          if (canvas.height != h) canvas.height = h;
          if (typeof canvas.style != 'undefined') {
            canvas.style.removeProperty( "width");
            canvas.style.removeProperty("height");
          }
        } else {
          if (canvas.width  != wNative) canvas.width  = wNative;
          if (canvas.height != hNative) canvas.height = hNative;
          if (typeof canvas.style != 'undefined') {
            if (w != wNative || h != hNative) {
              canvas.style.setProperty( "width", w + "px", "important");
              canvas.style.setProperty("height", h + "px", "important");
            } else {
              canvas.style.removeProperty( "width");
              canvas.style.removeProperty("height");
            }
          }
        }
      }};

  function _sbrk(bytes) {
      // Implement a Linux-like 'memory area' for our 'process'.
      // Changes the size of the memory area by |bytes|; returns the
      // address of the previous top ('break') of the memory area
      // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP
      var self = _sbrk;
      if (!self.called) {
        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned
        self.called = true;
        assert(Runtime.dynamicAlloc);
        self.alloc = Runtime.dynamicAlloc;
        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };
      }
      var ret = DYNAMICTOP;
      if (bytes != 0) self.alloc(bytes);
      return ret;  // Previous break location.
    }

  function _sysconf(name) {
      // long sysconf(int name);
      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
      switch(name) {
        case 30: return PAGE_SIZE;
        case 132:
        case 133:
        case 12:
        case 137:
        case 138:
        case 15:
        case 235:
        case 16:
        case 17:
        case 18:
        case 19:
        case 20:
        case 149:
        case 13:
        case 10:
        case 236:
        case 153:
        case 9:
        case 21:
        case 22:
        case 159:
        case 154:
        case 14:
        case 77:
        case 78:
        case 139:
        case 80:
        case 81:
        case 79:
        case 82:
        case 68:
        case 67:
        case 164:
        case 11:
        case 29:
        case 47:
        case 48:
        case 95:
        case 52:
        case 51:
        case 46:
          return 200809;
        case 27:
        case 246:
        case 127:
        case 128:
        case 23:
        case 24:
        case 160:
        case 161:
        case 181:
        case 182:
        case 242:
        case 183:
        case 184:
        case 243:
        case 244:
        case 245:
        case 165:
        case 178:
        case 179:
        case 49:
        case 50:
        case 168:
        case 169:
        case 175:
        case 170:
        case 171:
        case 172:
        case 97:
        case 76:
        case 32:
        case 173:
        case 35:
          return -1;
        case 176:
        case 177:
        case 7:
        case 155:
        case 8:
        case 157:
        case 125:
        case 126:
        case 92:
        case 93:
        case 129:
        case 130:
        case 131:
        case 94:
        case 91:
          return 1;
        case 74:
        case 60:
        case 69:
        case 70:
        case 4:
          return 1024;
        case 31:
        case 42:
        case 72:
          return 32;
        case 87:
        case 26:
        case 33:
          return 2147483647;
        case 34:
        case 1:
          return 47839;
        case 38:
        case 36:
          return 99;
        case 43:
        case 37:
          return 2048;
        case 0: return 2097152;
        case 3: return 65536;
        case 28: return 32768;
        case 44: return 32767;
        case 75: return 16384;
        case 39: return 1000;
        case 89: return 700;
        case 71: return 256;
        case 40: return 255;
        case 2: return 100;
        case 180: return 64;
        case 25: return 20;
        case 5: return 16;
        case 6: return 6;
        case 73: return 4;
        case 84: return 1;
      }
      ___setErrNo(ERRNO_CODES.EINVAL);
      return -1;
    }

  function _emscripten_run_script(ptr) {
      eval(Pointer_stringify(ptr));
    }


  function _malloc(bytes) {
      /* Over-allocate to make sure it is byte-aligned by 8.
       * This will leak memory, but this is only the dummy
       * implementation (replaced by dlmalloc normally) so
       * not an issue.
       */
      var ptr = Runtime.dynamicAlloc(bytes + 8);
      return (ptr+8) & 0xFFFFFFF8;
    }
  Module["_malloc"] = _malloc;function ___cxa_allocate_exception(size) {
      var ptr = _malloc(size + ___cxa_exception_header_size);
      return ptr + ___cxa_exception_header_size;
    }

  function _emscripten_cancel_main_loop() {
      Browser.mainLoop.scheduler = null;
      Browser.mainLoop.shouldPause = true;
    }

  var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], "i8", ALLOC_STATIC)+8, 0], "i32", ALLOC_STATIC);
FS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;
___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;
__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();
if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }
__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });
_fputc.ret = allocate([0], "i8", ALLOC_STATIC);
Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
  Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
  Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
  Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
  Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
  Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);

staticSealed = true; // seal the static portion of memory

STACK_MAX = STACK_BASE + 5242880;

DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);

assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack");


var Math_min = Math.min;
function invoke_iiii(index,a1,a2,a3) {
  try {
    return Module["dynCall_iiii"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiiii(index,a1,a2,a3,a4,a5) {
  try {
    Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_vi(index,a1) {
  try {
    Module["dynCall_vi"](index,a1);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_vii(index,a1,a2) {
  try {
    Module["dynCall_vii"](index,a1,a2);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_ii(index,a1) {
  try {
    return Module["dynCall_ii"](index,a1);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viii(index,a1,a2,a3) {
  try {
    Module["dynCall_viii"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_v(index) {
  try {
    Module["dynCall_v"](index);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viid(index,a1,a2,a3) {
  try {
    Module["dynCall_viid"](index,a1,a2,a3);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
  try {
    Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_iii(index,a1,a2) {
  try {
    return Module["dynCall_iii"](index,a1,a2);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_iiiiii(index,a1,a2,a3,a4,a5) {
  try {
    return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function invoke_viiii(index,a1,a2,a3,a4) {
  try {
    Module["dynCall_viiii"](index,a1,a2,a3,a4);
  } catch(e) {
    if (typeof e !== 'number' && e !== 'longjmp') throw e;
    asm["setThrew"](1, 0);
  }
}

function asmPrintInt(x, y) {
  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);
}
function asmPrintFloat(x, y) {
  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);
}
// EMSCRIPTEN_START_ASM
var ModuleFunc;
var asm = (ModuleFunc = function(global, env, buffer) {
  'use asm';
  var HEAP8 = new global.Int8Array(buffer);
  var HEAP16 = new global.Int16Array(buffer);
  var HEAP32 = new global.Int32Array(buffer);
  var HEAPU8 = new global.Uint8Array(buffer);
  var HEAPU16 = new global.Uint16Array(buffer);
  var HEAPU32 = new global.Uint32Array(buffer);
  var HEAPF32 = new global.Float32Array(buffer);
  var HEAPF64 = new global.Float64Array(buffer);

  var STACKTOP=env.STACKTOP|0;
  var STACK_MAX=env.STACK_MAX|0;
  var tempDoublePtr=env.tempDoublePtr|0;
  var ABORT=env.ABORT|0;
  var __ZTISt9exception=env.__ZTISt9exception|0;

  var __THREW__ = 0;
  var threwValue = 0;
  var setjmpId = 0;
  var undef = 0;
  var nan = +env.NaN, inf = +env.Infinity;
  var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0;

  var tempRet0 = 0;
  var tempRet1 = 0;
  var tempRet2 = 0;
  var tempRet3 = 0;
  var tempRet4 = 0;
  var tempRet5 = 0;
  var tempRet6 = 0;
  var tempRet7 = 0;
  var tempRet8 = 0;
  var tempRet9 = 0;
  var Math_floor=global.Math.floor;
  var Math_abs=global.Math.abs;
  var Math_sqrt=global.Math.sqrt;
  var Math_pow=global.Math.pow;
  var Math_cos=global.Math.cos;
  var Math_sin=global.Math.sin;
  var Math_tan=global.Math.tan;
  var Math_acos=global.Math.acos;
  var Math_asin=global.Math.asin;
  var Math_atan=global.Math.atan;
  var Math_atan2=global.Math.atan2;
  var Math_exp=global.Math.exp;
  var Math_log=global.Math.log;
  var Math_ceil=global.Math.ceil;
  var Math_imul=global.Math.imul;
  var abort=env.abort;
  var assert=env.assert;
  var asmPrintInt=env.asmPrintInt;
  var asmPrintFloat=env.asmPrintFloat;
  var Math_min=env.min;
  var invoke_iiii=env.invoke_iiii;
  var invoke_viiiii=env.invoke_viiiii;
  var invoke_vi=env.invoke_vi;
  var invoke_vii=env.invoke_vii;
  var invoke_ii=env.invoke_ii;
  var invoke_viii=env.invoke_viii;
  var invoke_v=env.invoke_v;
  var invoke_viid=env.invoke_viid;
  var invoke_viiiiii=env.invoke_viiiiii;
  var invoke_iii=env.invoke_iii;
  var invoke_iiiiii=env.invoke_iiiiii;
  var invoke_viiii=env.invoke_viiii;
  var ___cxa_throw=env.___cxa_throw;
  var _emscripten_run_script=env._emscripten_run_script;
  var _cosf=env._cosf;
  var _send=env._send;
  var __ZSt9terminatev=env.__ZSt9terminatev;
  var __reallyNegative=env.__reallyNegative;
  var ___cxa_is_number_type=env.___cxa_is_number_type;
  var ___assert_fail=env.___assert_fail;
  var ___cxa_allocate_exception=env.___cxa_allocate_exception;
  var ___cxa_find_matching_catch=env.___cxa_find_matching_catch;
  var _fflush=env._fflush;
  var _pwrite=env._pwrite;
  var ___setErrNo=env.___setErrNo;
  var _sbrk=env._sbrk;
  var ___cxa_begin_catch=env.___cxa_begin_catch;
  var _sinf=env._sinf;
  var _fileno=env._fileno;
  var ___resumeException=env.___resumeException;
  var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv;
  var _sysconf=env._sysconf;
  var _clock=env._clock;
  var _emscripten_memcpy_big=env._emscripten_memcpy_big;
  var _puts=env._puts;
  var _mkport=env._mkport;
  var _floorf=env._floorf;
  var _sqrtf=env._sqrtf;
  var _write=env._write;
  var _emscripten_set_main_loop=env._emscripten_set_main_loop;
  var ___errno_location=env.___errno_location;
  var __ZNSt9exceptionD2Ev=env.__ZNSt9exceptionD2Ev;
  var _printf=env._printf;
  var ___cxa_does_inherit=env.___cxa_does_inherit;
  var __exit=env.__exit;
  var _fputc=env._fputc;
  var _abort=env._abort;
  var _fwrite=env._fwrite;
  var _time=env._time;
  var _fprintf=env._fprintf;
  var _emscripten_cancel_main_loop=env._emscripten_cancel_main_loop;
  var __formatString=env.__formatString;
  var _fputs=env._fputs;
  var _exit=env._exit;
  var ___cxa_pure_virtual=env.___cxa_pure_virtual;
  var tempFloat = 0.0;

// EMSCRIPTEN_START_FUNCS
function _malloc(i12) {
 i12 = i12 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0;
 i1 = STACKTOP;
 do {
  if (i12 >>> 0 < 245) {
   if (i12 >>> 0 < 11) {
    i12 = 16;
   } else {
    i12 = i12 + 11 & -8;
   }
   i20 = i12 >>> 3;
   i18 = HEAP32[1790] | 0;
   i21 = i18 >>> i20;
   if ((i21 & 3 | 0) != 0) {
    i6 = (i21 & 1 ^ 1) + i20 | 0;
    i5 = i6 << 1;
    i3 = 7200 + (i5 << 2) | 0;
    i5 = 7200 + (i5 + 2 << 2) | 0;
    i7 = HEAP32[i5 >> 2] | 0;
    i2 = i7 + 8 | 0;
    i4 = HEAP32[i2 >> 2] | 0;
    do {
     if ((i3 | 0) != (i4 | 0)) {
      if (i4 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i8 = i4 + 12 | 0;
      if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) {
       HEAP32[i8 >> 2] = i3;
       HEAP32[i5 >> 2] = i4;
       break;
      } else {
       _abort();
      }
     } else {
      HEAP32[1790] = i18 & ~(1 << i6);
     }
    } while (0);
    i32 = i6 << 3;
    HEAP32[i7 + 4 >> 2] = i32 | 3;
    i32 = i7 + (i32 | 4) | 0;
    HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
    i32 = i2;
    STACKTOP = i1;
    return i32 | 0;
   }
   if (i12 >>> 0 > (HEAP32[7168 >> 2] | 0) >>> 0) {
    if ((i21 | 0) != 0) {
     i7 = 2 << i20;
     i7 = i21 << i20 & (i7 | 0 - i7);
     i7 = (i7 & 0 - i7) + -1 | 0;
     i2 = i7 >>> 12 & 16;
     i7 = i7 >>> i2;
     i6 = i7 >>> 5 & 8;
     i7 = i7 >>> i6;
     i5 = i7 >>> 2 & 4;
     i7 = i7 >>> i5;
     i4 = i7 >>> 1 & 2;
     i7 = i7 >>> i4;
     i3 = i7 >>> 1 & 1;
     i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0;
     i7 = i3 << 1;
     i4 = 7200 + (i7 << 2) | 0;
     i7 = 7200 + (i7 + 2 << 2) | 0;
     i5 = HEAP32[i7 >> 2] | 0;
     i2 = i5 + 8 | 0;
     i6 = HEAP32[i2 >> 2] | 0;
     do {
      if ((i4 | 0) != (i6 | 0)) {
       if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       }
       i8 = i6 + 12 | 0;
       if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) {
        HEAP32[i8 >> 2] = i4;
        HEAP32[i7 >> 2] = i6;
        break;
       } else {
        _abort();
       }
      } else {
       HEAP32[1790] = i18 & ~(1 << i3);
      }
     } while (0);
     i6 = i3 << 3;
     i4 = i6 - i12 | 0;
     HEAP32[i5 + 4 >> 2] = i12 | 3;
     i3 = i5 + i12 | 0;
     HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1;
     HEAP32[i5 + i6 >> 2] = i4;
     i6 = HEAP32[7168 >> 2] | 0;
     if ((i6 | 0) != 0) {
      i5 = HEAP32[7180 >> 2] | 0;
      i8 = i6 >>> 3;
      i9 = i8 << 1;
      i6 = 7200 + (i9 << 2) | 0;
      i7 = HEAP32[1790] | 0;
      i8 = 1 << i8;
      if ((i7 & i8 | 0) != 0) {
       i7 = 7200 + (i9 + 2 << 2) | 0;
       i8 = HEAP32[i7 >> 2] | 0;
       if (i8 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i28 = i7;
        i27 = i8;
       }
      } else {
       HEAP32[1790] = i7 | i8;
       i28 = 7200 + (i9 + 2 << 2) | 0;
       i27 = i6;
      }
      HEAP32[i28 >> 2] = i5;
      HEAP32[i27 + 12 >> 2] = i5;
      HEAP32[i5 + 8 >> 2] = i27;
      HEAP32[i5 + 12 >> 2] = i6;
     }
     HEAP32[7168 >> 2] = i4;
     HEAP32[7180 >> 2] = i3;
     i32 = i2;
     STACKTOP = i1;
     return i32 | 0;
    }
    i18 = HEAP32[7164 >> 2] | 0;
    if ((i18 | 0) != 0) {
     i2 = (i18 & 0 - i18) + -1 | 0;
     i31 = i2 >>> 12 & 16;
     i2 = i2 >>> i31;
     i30 = i2 >>> 5 & 8;
     i2 = i2 >>> i30;
     i32 = i2 >>> 2 & 4;
     i2 = i2 >>> i32;
     i6 = i2 >>> 1 & 2;
     i2 = i2 >>> i6;
     i3 = i2 >>> 1 & 1;
     i3 = HEAP32[7464 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0;
     i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0;
     i6 = i3;
     while (1) {
      i5 = HEAP32[i6 + 16 >> 2] | 0;
      if ((i5 | 0) == 0) {
       i5 = HEAP32[i6 + 20 >> 2] | 0;
       if ((i5 | 0) == 0) {
        break;
       }
      }
      i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0;
      i4 = i6 >>> 0 < i2 >>> 0;
      i2 = i4 ? i6 : i2;
      i6 = i5;
      i3 = i4 ? i5 : i3;
     }
     i6 = HEAP32[7176 >> 2] | 0;
     if (i3 >>> 0 < i6 >>> 0) {
      _abort();
     }
     i4 = i3 + i12 | 0;
     if (!(i3 >>> 0 < i4 >>> 0)) {
      _abort();
     }
     i5 = HEAP32[i3 + 24 >> 2] | 0;
     i7 = HEAP32[i3 + 12 >> 2] | 0;
     do {
      if ((i7 | 0) == (i3 | 0)) {
       i8 = i3 + 20 | 0;
       i7 = HEAP32[i8 >> 2] | 0;
       if ((i7 | 0) == 0) {
        i8 = i3 + 16 | 0;
        i7 = HEAP32[i8 >> 2] | 0;
        if ((i7 | 0) == 0) {
         i26 = 0;
         break;
        }
       }
       while (1) {
        i10 = i7 + 20 | 0;
        i9 = HEAP32[i10 >> 2] | 0;
        if ((i9 | 0) != 0) {
         i7 = i9;
         i8 = i10;
         continue;
        }
        i10 = i7 + 16 | 0;
        i9 = HEAP32[i10 >> 2] | 0;
        if ((i9 | 0) == 0) {
         break;
        } else {
         i7 = i9;
         i8 = i10;
        }
       }
       if (i8 >>> 0 < i6 >>> 0) {
        _abort();
       } else {
        HEAP32[i8 >> 2] = 0;
        i26 = i7;
        break;
       }
      } else {
       i8 = HEAP32[i3 + 8 >> 2] | 0;
       if (i8 >>> 0 < i6 >>> 0) {
        _abort();
       }
       i6 = i8 + 12 | 0;
       if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) {
        _abort();
       }
       i9 = i7 + 8 | 0;
       if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) {
        HEAP32[i6 >> 2] = i7;
        HEAP32[i9 >> 2] = i8;
        i26 = i7;
        break;
       } else {
        _abort();
       }
      }
     } while (0);
     do {
      if ((i5 | 0) != 0) {
       i7 = HEAP32[i3 + 28 >> 2] | 0;
       i6 = 7464 + (i7 << 2) | 0;
       if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) {
        HEAP32[i6 >> 2] = i26;
        if ((i26 | 0) == 0) {
         HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i7);
         break;
        }
       } else {
        if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        }
        i6 = i5 + 16 | 0;
        if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) {
         HEAP32[i6 >> 2] = i26;
        } else {
         HEAP32[i5 + 20 >> 2] = i26;
        }
        if ((i26 | 0) == 0) {
         break;
        }
       }
       if (i26 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       }
       HEAP32[i26 + 24 >> 2] = i5;
       i5 = HEAP32[i3 + 16 >> 2] | 0;
       do {
        if ((i5 | 0) != 0) {
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i26 + 16 >> 2] = i5;
          HEAP32[i5 + 24 >> 2] = i26;
          break;
         }
        }
       } while (0);
       i5 = HEAP32[i3 + 20 >> 2] | 0;
       if ((i5 | 0) != 0) {
        if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        } else {
         HEAP32[i26 + 20 >> 2] = i5;
         HEAP32[i5 + 24 >> 2] = i26;
         break;
        }
       }
      }
     } while (0);
     if (i2 >>> 0 < 16) {
      i32 = i2 + i12 | 0;
      HEAP32[i3 + 4 >> 2] = i32 | 3;
      i32 = i3 + (i32 + 4) | 0;
      HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
     } else {
      HEAP32[i3 + 4 >> 2] = i12 | 3;
      HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1;
      HEAP32[i3 + (i2 + i12) >> 2] = i2;
      i6 = HEAP32[7168 >> 2] | 0;
      if ((i6 | 0) != 0) {
       i5 = HEAP32[7180 >> 2] | 0;
       i8 = i6 >>> 3;
       i9 = i8 << 1;
       i6 = 7200 + (i9 << 2) | 0;
       i7 = HEAP32[1790] | 0;
       i8 = 1 << i8;
       if ((i7 & i8 | 0) != 0) {
        i7 = 7200 + (i9 + 2 << 2) | 0;
        i8 = HEAP32[i7 >> 2] | 0;
        if (i8 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        } else {
         i25 = i7;
         i24 = i8;
        }
       } else {
        HEAP32[1790] = i7 | i8;
        i25 = 7200 + (i9 + 2 << 2) | 0;
        i24 = i6;
       }
       HEAP32[i25 >> 2] = i5;
       HEAP32[i24 + 12 >> 2] = i5;
       HEAP32[i5 + 8 >> 2] = i24;
       HEAP32[i5 + 12 >> 2] = i6;
      }
      HEAP32[7168 >> 2] = i2;
      HEAP32[7180 >> 2] = i4;
     }
     i32 = i3 + 8 | 0;
     STACKTOP = i1;
     return i32 | 0;
    }
   }
  } else {
   if (!(i12 >>> 0 > 4294967231)) {
    i24 = i12 + 11 | 0;
    i12 = i24 & -8;
    i26 = HEAP32[7164 >> 2] | 0;
    if ((i26 | 0) != 0) {
     i25 = 0 - i12 | 0;
     i24 = i24 >>> 8;
     if ((i24 | 0) != 0) {
      if (i12 >>> 0 > 16777215) {
       i27 = 31;
      } else {
       i31 = (i24 + 1048320 | 0) >>> 16 & 8;
       i32 = i24 << i31;
       i30 = (i32 + 520192 | 0) >>> 16 & 4;
       i32 = i32 << i30;
       i27 = (i32 + 245760 | 0) >>> 16 & 2;
       i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0;
       i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1;
      }
     } else {
      i27 = 0;
     }
     i30 = HEAP32[7464 + (i27 << 2) >> 2] | 0;
     L126 : do {
      if ((i30 | 0) == 0) {
       i29 = 0;
       i24 = 0;
      } else {
       if ((i27 | 0) == 31) {
        i24 = 0;
       } else {
        i24 = 25 - (i27 >>> 1) | 0;
       }
       i29 = 0;
       i28 = i12 << i24;
       i24 = 0;
       while (1) {
        i32 = HEAP32[i30 + 4 >> 2] & -8;
        i31 = i32 - i12 | 0;
        if (i31 >>> 0 < i25 >>> 0) {
         if ((i32 | 0) == (i12 | 0)) {
          i25 = i31;
          i29 = i30;
          i24 = i30;
          break L126;
         } else {
          i25 = i31;
          i24 = i30;
         }
        }
        i31 = HEAP32[i30 + 20 >> 2] | 0;
        i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0;
        i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31;
        if ((i30 | 0) == 0) {
         break;
        } else {
         i28 = i28 << 1;
        }
       }
      }
     } while (0);
     if ((i29 | 0) == 0 & (i24 | 0) == 0) {
      i32 = 2 << i27;
      i26 = i26 & (i32 | 0 - i32);
      if ((i26 | 0) == 0) {
       break;
      }
      i32 = (i26 & 0 - i26) + -1 | 0;
      i28 = i32 >>> 12 & 16;
      i32 = i32 >>> i28;
      i27 = i32 >>> 5 & 8;
      i32 = i32 >>> i27;
      i30 = i32 >>> 2 & 4;
      i32 = i32 >>> i30;
      i31 = i32 >>> 1 & 2;
      i32 = i32 >>> i31;
      i29 = i32 >>> 1 & 1;
      i29 = HEAP32[7464 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0;
     }
     if ((i29 | 0) != 0) {
      while (1) {
       i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0;
       i26 = i27 >>> 0 < i25 >>> 0;
       i25 = i26 ? i27 : i25;
       i24 = i26 ? i29 : i24;
       i26 = HEAP32[i29 + 16 >> 2] | 0;
       if ((i26 | 0) != 0) {
        i29 = i26;
        continue;
       }
       i29 = HEAP32[i29 + 20 >> 2] | 0;
       if ((i29 | 0) == 0) {
        break;
       }
      }
     }
     if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[7168 >> 2] | 0) - i12 | 0) >>> 0 : 0) {
      i4 = HEAP32[7176 >> 2] | 0;
      if (i24 >>> 0 < i4 >>> 0) {
       _abort();
      }
      i2 = i24 + i12 | 0;
      if (!(i24 >>> 0 < i2 >>> 0)) {
       _abort();
      }
      i3 = HEAP32[i24 + 24 >> 2] | 0;
      i6 = HEAP32[i24 + 12 >> 2] | 0;
      do {
       if ((i6 | 0) == (i24 | 0)) {
        i6 = i24 + 20 | 0;
        i5 = HEAP32[i6 >> 2] | 0;
        if ((i5 | 0) == 0) {
         i6 = i24 + 16 | 0;
         i5 = HEAP32[i6 >> 2] | 0;
         if ((i5 | 0) == 0) {
          i22 = 0;
          break;
         }
        }
        while (1) {
         i8 = i5 + 20 | 0;
         i7 = HEAP32[i8 >> 2] | 0;
         if ((i7 | 0) != 0) {
          i5 = i7;
          i6 = i8;
          continue;
         }
         i7 = i5 + 16 | 0;
         i8 = HEAP32[i7 >> 2] | 0;
         if ((i8 | 0) == 0) {
          break;
         } else {
          i5 = i8;
          i6 = i7;
         }
        }
        if (i6 >>> 0 < i4 >>> 0) {
         _abort();
        } else {
         HEAP32[i6 >> 2] = 0;
         i22 = i5;
         break;
        }
       } else {
        i5 = HEAP32[i24 + 8 >> 2] | 0;
        if (i5 >>> 0 < i4 >>> 0) {
         _abort();
        }
        i7 = i5 + 12 | 0;
        if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) {
         _abort();
        }
        i4 = i6 + 8 | 0;
        if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
         HEAP32[i7 >> 2] = i6;
         HEAP32[i4 >> 2] = i5;
         i22 = i6;
         break;
        } else {
         _abort();
        }
       }
      } while (0);
      do {
       if ((i3 | 0) != 0) {
        i4 = HEAP32[i24 + 28 >> 2] | 0;
        i5 = 7464 + (i4 << 2) | 0;
        if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) {
         HEAP32[i5 >> 2] = i22;
         if ((i22 | 0) == 0) {
          HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i4);
          break;
         }
        } else {
         if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         }
         i4 = i3 + 16 | 0;
         if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) {
          HEAP32[i4 >> 2] = i22;
         } else {
          HEAP32[i3 + 20 >> 2] = i22;
         }
         if ((i22 | 0) == 0) {
          break;
         }
        }
        if (i22 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
         _abort();
        }
        HEAP32[i22 + 24 >> 2] = i3;
        i3 = HEAP32[i24 + 16 >> 2] | 0;
        do {
         if ((i3 | 0) != 0) {
          if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           HEAP32[i22 + 16 >> 2] = i3;
           HEAP32[i3 + 24 >> 2] = i22;
           break;
          }
         }
        } while (0);
        i3 = HEAP32[i24 + 20 >> 2] | 0;
        if ((i3 | 0) != 0) {
         if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i22 + 20 >> 2] = i3;
          HEAP32[i3 + 24 >> 2] = i22;
          break;
         }
        }
       }
      } while (0);
      L204 : do {
       if (!(i25 >>> 0 < 16)) {
        HEAP32[i24 + 4 >> 2] = i12 | 3;
        HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1;
        HEAP32[i24 + (i25 + i12) >> 2] = i25;
        i4 = i25 >>> 3;
        if (i25 >>> 0 < 256) {
         i6 = i4 << 1;
         i3 = 7200 + (i6 << 2) | 0;
         i5 = HEAP32[1790] | 0;
         i4 = 1 << i4;
         if ((i5 & i4 | 0) != 0) {
          i5 = 7200 + (i6 + 2 << 2) | 0;
          i4 = HEAP32[i5 >> 2] | 0;
          if (i4 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           i21 = i5;
           i20 = i4;
          }
         } else {
          HEAP32[1790] = i5 | i4;
          i21 = 7200 + (i6 + 2 << 2) | 0;
          i20 = i3;
         }
         HEAP32[i21 >> 2] = i2;
         HEAP32[i20 + 12 >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i20;
         HEAP32[i24 + (i12 + 12) >> 2] = i3;
         break;
        }
        i3 = i25 >>> 8;
        if ((i3 | 0) != 0) {
         if (i25 >>> 0 > 16777215) {
          i3 = 31;
         } else {
          i31 = (i3 + 1048320 | 0) >>> 16 & 8;
          i32 = i3 << i31;
          i30 = (i32 + 520192 | 0) >>> 16 & 4;
          i32 = i32 << i30;
          i3 = (i32 + 245760 | 0) >>> 16 & 2;
          i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
          i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1;
         }
        } else {
         i3 = 0;
        }
        i6 = 7464 + (i3 << 2) | 0;
        HEAP32[i24 + (i12 + 28) >> 2] = i3;
        HEAP32[i24 + (i12 + 20) >> 2] = 0;
        HEAP32[i24 + (i12 + 16) >> 2] = 0;
        i4 = HEAP32[7164 >> 2] | 0;
        i5 = 1 << i3;
        if ((i4 & i5 | 0) == 0) {
         HEAP32[7164 >> 2] = i4 | i5;
         HEAP32[i6 >> 2] = i2;
         HEAP32[i24 + (i12 + 24) >> 2] = i6;
         HEAP32[i24 + (i12 + 12) >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i2;
         break;
        }
        i4 = HEAP32[i6 >> 2] | 0;
        if ((i3 | 0) == 31) {
         i3 = 0;
        } else {
         i3 = 25 - (i3 >>> 1) | 0;
        }
        L225 : do {
         if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) {
          i3 = i25 << i3;
          while (1) {
           i6 = i4 + (i3 >>> 31 << 2) + 16 | 0;
           i5 = HEAP32[i6 >> 2] | 0;
           if ((i5 | 0) == 0) {
            break;
           }
           if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) {
            i18 = i5;
            break L225;
           } else {
            i3 = i3 << 1;
            i4 = i5;
           }
          }
          if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
           _abort();
          } else {
           HEAP32[i6 >> 2] = i2;
           HEAP32[i24 + (i12 + 24) >> 2] = i4;
           HEAP32[i24 + (i12 + 12) >> 2] = i2;
           HEAP32[i24 + (i12 + 8) >> 2] = i2;
           break L204;
          }
         } else {
          i18 = i4;
         }
        } while (0);
        i4 = i18 + 8 | 0;
        i3 = HEAP32[i4 >> 2] | 0;
        i5 = HEAP32[7176 >> 2] | 0;
        if (i18 >>> 0 < i5 >>> 0) {
         _abort();
        }
        if (i3 >>> 0 < i5 >>> 0) {
         _abort();
        } else {
         HEAP32[i3 + 12 >> 2] = i2;
         HEAP32[i4 >> 2] = i2;
         HEAP32[i24 + (i12 + 8) >> 2] = i3;
         HEAP32[i24 + (i12 + 12) >> 2] = i18;
         HEAP32[i24 + (i12 + 24) >> 2] = 0;
         break;
        }
       } else {
        i32 = i25 + i12 | 0;
        HEAP32[i24 + 4 >> 2] = i32 | 3;
        i32 = i24 + (i32 + 4) | 0;
        HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
       }
      } while (0);
      i32 = i24 + 8 | 0;
      STACKTOP = i1;
      return i32 | 0;
     }
    }
   } else {
    i12 = -1;
   }
  }
 } while (0);
 i18 = HEAP32[7168 >> 2] | 0;
 if (!(i12 >>> 0 > i18 >>> 0)) {
  i3 = i18 - i12 | 0;
  i2 = HEAP32[7180 >> 2] | 0;
  if (i3 >>> 0 > 15) {
   HEAP32[7180 >> 2] = i2 + i12;
   HEAP32[7168 >> 2] = i3;
   HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1;
   HEAP32[i2 + i18 >> 2] = i3;
   HEAP32[i2 + 4 >> 2] = i12 | 3;
  } else {
   HEAP32[7168 >> 2] = 0;
   HEAP32[7180 >> 2] = 0;
   HEAP32[i2 + 4 >> 2] = i18 | 3;
   i32 = i2 + (i18 + 4) | 0;
   HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1;
  }
  i32 = i2 + 8 | 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 i18 = HEAP32[7172 >> 2] | 0;
 if (i12 >>> 0 < i18 >>> 0) {
  i31 = i18 - i12 | 0;
  HEAP32[7172 >> 2] = i31;
  i32 = HEAP32[7184 >> 2] | 0;
  HEAP32[7184 >> 2] = i32 + i12;
  HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
  HEAP32[i32 + 4 >> 2] = i12 | 3;
  i32 = i32 + 8 | 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 do {
  if ((HEAP32[1908] | 0) == 0) {
   i18 = _sysconf(30) | 0;
   if ((i18 + -1 & i18 | 0) == 0) {
    HEAP32[7640 >> 2] = i18;
    HEAP32[7636 >> 2] = i18;
    HEAP32[7644 >> 2] = -1;
    HEAP32[7648 >> 2] = -1;
    HEAP32[7652 >> 2] = 0;
    HEAP32[7604 >> 2] = 0;
    HEAP32[1908] = (_time(0) | 0) & -16 ^ 1431655768;
    break;
   } else {
    _abort();
   }
  }
 } while (0);
 i20 = i12 + 48 | 0;
 i25 = HEAP32[7640 >> 2] | 0;
 i21 = i12 + 47 | 0;
 i22 = i25 + i21 | 0;
 i25 = 0 - i25 | 0;
 i18 = i22 & i25;
 if (!(i18 >>> 0 > i12 >>> 0)) {
  i32 = 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 i24 = HEAP32[7600 >> 2] | 0;
 if ((i24 | 0) != 0 ? (i31 = HEAP32[7592 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) {
  i32 = 0;
  STACKTOP = i1;
  return i32 | 0;
 }
 L269 : do {
  if ((HEAP32[7604 >> 2] & 4 | 0) == 0) {
   i26 = HEAP32[7184 >> 2] | 0;
   L271 : do {
    if ((i26 | 0) != 0) {
     i24 = 7608 | 0;
     while (1) {
      i27 = HEAP32[i24 >> 2] | 0;
      if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2] | 0) | 0) >>> 0 > i26 >>> 0) : 0) {
       break;
      }
      i24 = HEAP32[i24 + 8 >> 2] | 0;
      if ((i24 | 0) == 0) {
       i13 = 182;
       break L271;
      }
     }
     if ((i24 | 0) != 0) {
      i25 = i22 - (HEAP32[7172 >> 2] | 0) & i25;
      if (i25 >>> 0 < 2147483647) {
       i13 = _sbrk(i25 | 0) | 0;
       i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0);
       i22 = i13;
       i24 = i25;
       i23 = i26 ? i13 : -1;
       i25 = i26 ? i25 : 0;
       i13 = 191;
      } else {
       i25 = 0;
      }
     } else {
      i13 = 182;
     }
    } else {
     i13 = 182;
    }
   } while (0);
   do {
    if ((i13 | 0) == 182) {
     i23 = _sbrk(0) | 0;
     if ((i23 | 0) != (-1 | 0)) {
      i24 = i23;
      i22 = HEAP32[7636 >> 2] | 0;
      i25 = i22 + -1 | 0;
      if ((i25 & i24 | 0) == 0) {
       i25 = i18;
      } else {
       i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0;
      }
      i24 = HEAP32[7592 >> 2] | 0;
      i26 = i24 + i25 | 0;
      if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) {
       i22 = HEAP32[7600 >> 2] | 0;
       if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) {
        i25 = 0;
        break;
       }
       i22 = _sbrk(i25 | 0) | 0;
       i13 = (i22 | 0) == (i23 | 0);
       i24 = i25;
       i23 = i13 ? i23 : -1;
       i25 = i13 ? i25 : 0;
       i13 = 191;
      } else {
       i25 = 0;
      }
     } else {
      i25 = 0;
     }
    }
   } while (0);
   L291 : do {
    if ((i13 | 0) == 191) {
     i13 = 0 - i24 | 0;
     if ((i23 | 0) != (-1 | 0)) {
      i17 = i23;
      i14 = i25;
      i13 = 202;
      break L269;
     }
     do {
      if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[7640 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 2147483647) : 0) {
       if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) {
        _sbrk(i13 | 0) | 0;
        break L291;
       } else {
        i24 = i19 + i24 | 0;
        break;
       }
      }
     } while (0);
     if ((i22 | 0) != (-1 | 0)) {
      i17 = i22;
      i14 = i24;
      i13 = 202;
      break L269;
     }
    }
   } while (0);
   HEAP32[7604 >> 2] = HEAP32[7604 >> 2] | 4;
   i13 = 199;
  } else {
   i25 = 0;
   i13 = 199;
  }
 } while (0);
 if ((((i13 | 0) == 199 ? i18 >>> 0 < 2147483647 : 0) ? (i17 = _sbrk(i18 | 0) | 0, i16 = _sbrk(0) | 0, (i16 | 0) != (-1 | 0) & (i17 | 0) != (-1 | 0) & i17 >>> 0 < i16 >>> 0) : 0) ? (i15 = i16 - i17 | 0, i14 = i15 >>> 0 > (i12 + 40 | 0) >>> 0, i14) : 0) {
  i14 = i14 ? i15 : i25;
  i13 = 202;
 }
 if ((i13 | 0) == 202) {
  i15 = (HEAP32[7592 >> 2] | 0) + i14 | 0;
  HEAP32[7592 >> 2] = i15;
  if (i15 >>> 0 > (HEAP32[7596 >> 2] | 0) >>> 0) {
   HEAP32[7596 >> 2] = i15;
  }
  i15 = HEAP32[7184 >> 2] | 0;
  L311 : do {
   if ((i15 | 0) != 0) {
    i21 = 7608 | 0;
    while (1) {
     i16 = HEAP32[i21 >> 2] | 0;
     i19 = i21 + 4 | 0;
     i20 = HEAP32[i19 >> 2] | 0;
     if ((i17 | 0) == (i16 + i20 | 0)) {
      i13 = 214;
      break;
     }
     i18 = HEAP32[i21 + 8 >> 2] | 0;
     if ((i18 | 0) == 0) {
      break;
     } else {
      i21 = i18;
     }
    }
    if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) {
     HEAP32[i19 >> 2] = i20 + i14;
     i2 = (HEAP32[7172 >> 2] | 0) + i14 | 0;
     i3 = i15 + 8 | 0;
     if ((i3 & 7 | 0) == 0) {
      i3 = 0;
     } else {
      i3 = 0 - i3 & 7;
     }
     i32 = i2 - i3 | 0;
     HEAP32[7184 >> 2] = i15 + i3;
     HEAP32[7172 >> 2] = i32;
     HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1;
     HEAP32[i15 + (i2 + 4) >> 2] = 40;
     HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
     break;
    }
    if (i17 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
     HEAP32[7176 >> 2] = i17;
    }
    i19 = i17 + i14 | 0;
    i16 = 7608 | 0;
    while (1) {
     if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) {
      i13 = 224;
      break;
     }
     i18 = HEAP32[i16 + 8 >> 2] | 0;
     if ((i18 | 0) == 0) {
      break;
     } else {
      i16 = i18;
     }
    }
    if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) {
     HEAP32[i16 >> 2] = i17;
     i6 = i16 + 4 | 0;
     HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14;
     i6 = i17 + 8 | 0;
     if ((i6 & 7 | 0) == 0) {
      i6 = 0;
     } else {
      i6 = 0 - i6 & 7;
     }
     i7 = i17 + (i14 + 8) | 0;
     if ((i7 & 7 | 0) == 0) {
      i13 = 0;
     } else {
      i13 = 0 - i7 & 7;
     }
     i15 = i17 + (i13 + i14) | 0;
     i8 = i6 + i12 | 0;
     i7 = i17 + i8 | 0;
     i10 = i15 - (i17 + i6) - i12 | 0;
     HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3;
     L348 : do {
      if ((i15 | 0) != (HEAP32[7184 >> 2] | 0)) {
       if ((i15 | 0) == (HEAP32[7180 >> 2] | 0)) {
        i32 = (HEAP32[7168 >> 2] | 0) + i10 | 0;
        HEAP32[7168 >> 2] = i32;
        HEAP32[7180 >> 2] = i7;
        HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
        HEAP32[i17 + (i32 + i8) >> 2] = i32;
        break;
       }
       i12 = i14 + 4 | 0;
       i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0;
       if ((i18 & 3 | 0) == 1) {
        i11 = i18 & -8;
        i16 = i18 >>> 3;
        do {
         if (!(i18 >>> 0 < 256)) {
          i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0;
          i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
          do {
           if ((i19 | 0) == (i15 | 0)) {
            i19 = i13 | 16;
            i18 = i17 + (i12 + i19) | 0;
            i16 = HEAP32[i18 >> 2] | 0;
            if ((i16 | 0) == 0) {
             i18 = i17 + (i19 + i14) | 0;
             i16 = HEAP32[i18 >> 2] | 0;
             if ((i16 | 0) == 0) {
              i5 = 0;
              break;
             }
            }
            while (1) {
             i20 = i16 + 20 | 0;
             i19 = HEAP32[i20 >> 2] | 0;
             if ((i19 | 0) != 0) {
              i16 = i19;
              i18 = i20;
              continue;
             }
             i19 = i16 + 16 | 0;
             i20 = HEAP32[i19 >> 2] | 0;
             if ((i20 | 0) == 0) {
              break;
             } else {
              i16 = i20;
              i18 = i19;
             }
            }
            if (i18 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            } else {
             HEAP32[i18 >> 2] = 0;
             i5 = i16;
             break;
            }
           } else {
            i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
            if (i18 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            }
            i16 = i18 + 12 | 0;
            if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) {
             _abort();
            }
            i20 = i19 + 8 | 0;
            if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) {
             HEAP32[i16 >> 2] = i19;
             HEAP32[i20 >> 2] = i18;
             i5 = i19;
             break;
            } else {
             _abort();
            }
           }
          } while (0);
          if ((i9 | 0) != 0) {
           i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0;
           i18 = 7464 + (i16 << 2) | 0;
           if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) {
            HEAP32[i18 >> 2] = i5;
            if ((i5 | 0) == 0) {
             HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i16);
             break;
            }
           } else {
            if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            }
            i16 = i9 + 16 | 0;
            if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
             HEAP32[i16 >> 2] = i5;
            } else {
             HEAP32[i9 + 20 >> 2] = i5;
            }
            if ((i5 | 0) == 0) {
             break;
            }
           }
           if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           HEAP32[i5 + 24 >> 2] = i9;
           i15 = i13 | 16;
           i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0;
           do {
            if ((i9 | 0) != 0) {
             if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
              _abort();
             } else {
              HEAP32[i5 + 16 >> 2] = i9;
              HEAP32[i9 + 24 >> 2] = i5;
              break;
             }
            }
           } while (0);
           i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0;
           if ((i9 | 0) != 0) {
            if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
             _abort();
            } else {
             HEAP32[i5 + 20 >> 2] = i9;
             HEAP32[i9 + 24 >> 2] = i5;
             break;
            }
           }
          }
         } else {
          i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0;
          i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0;
          i18 = 7200 + (i16 << 1 << 2) | 0;
          if ((i5 | 0) != (i18 | 0)) {
           if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) {
            _abort();
           }
          }
          if ((i12 | 0) == (i5 | 0)) {
           HEAP32[1790] = HEAP32[1790] & ~(1 << i16);
           break;
          }
          if ((i12 | 0) != (i18 | 0)) {
           if (i12 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
            _abort();
           }
           i16 = i12 + 8 | 0;
           if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) {
            i9 = i16;
           } else {
            _abort();
           }
          } else {
           i9 = i12 + 8 | 0;
          }
          HEAP32[i5 + 12 >> 2] = i12;
          HEAP32[i9 >> 2] = i5;
         }
        } while (0);
        i15 = i17 + ((i11 | i13) + i14) | 0;
        i10 = i11 + i10 | 0;
       }
       i5 = i15 + 4 | 0;
       HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2;
       HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1;
       HEAP32[i17 + (i10 + i8) >> 2] = i10;
       i5 = i10 >>> 3;
       if (i10 >>> 0 < 256) {
        i10 = i5 << 1;
        i2 = 7200 + (i10 << 2) | 0;
        i9 = HEAP32[1790] | 0;
        i5 = 1 << i5;
        if ((i9 & i5 | 0) != 0) {
         i9 = 7200 + (i10 + 2 << 2) | 0;
         i5 = HEAP32[i9 >> 2] | 0;
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          i3 = i9;
          i4 = i5;
         }
        } else {
         HEAP32[1790] = i9 | i5;
         i3 = 7200 + (i10 + 2 << 2) | 0;
         i4 = i2;
        }
        HEAP32[i3 >> 2] = i7;
        HEAP32[i4 + 12 >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i4;
        HEAP32[i17 + (i8 + 12) >> 2] = i2;
        break;
       }
       i3 = i10 >>> 8;
       if ((i3 | 0) != 0) {
        if (i10 >>> 0 > 16777215) {
         i3 = 31;
        } else {
         i31 = (i3 + 1048320 | 0) >>> 16 & 8;
         i32 = i3 << i31;
         i30 = (i32 + 520192 | 0) >>> 16 & 4;
         i32 = i32 << i30;
         i3 = (i32 + 245760 | 0) >>> 16 & 2;
         i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
         i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1;
        }
       } else {
        i3 = 0;
       }
       i4 = 7464 + (i3 << 2) | 0;
       HEAP32[i17 + (i8 + 28) >> 2] = i3;
       HEAP32[i17 + (i8 + 20) >> 2] = 0;
       HEAP32[i17 + (i8 + 16) >> 2] = 0;
       i9 = HEAP32[7164 >> 2] | 0;
       i5 = 1 << i3;
       if ((i9 & i5 | 0) == 0) {
        HEAP32[7164 >> 2] = i9 | i5;
        HEAP32[i4 >> 2] = i7;
        HEAP32[i17 + (i8 + 24) >> 2] = i4;
        HEAP32[i17 + (i8 + 12) >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i7;
        break;
       }
       i4 = HEAP32[i4 >> 2] | 0;
       if ((i3 | 0) == 31) {
        i3 = 0;
       } else {
        i3 = 25 - (i3 >>> 1) | 0;
       }
       L444 : do {
        if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) {
         i3 = i10 << i3;
         while (1) {
          i5 = i4 + (i3 >>> 31 << 2) + 16 | 0;
          i9 = HEAP32[i5 >> 2] | 0;
          if ((i9 | 0) == 0) {
           break;
          }
          if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) {
           i2 = i9;
           break L444;
          } else {
           i3 = i3 << 1;
           i4 = i9;
          }
         }
         if (i5 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
          _abort();
         } else {
          HEAP32[i5 >> 2] = i7;
          HEAP32[i17 + (i8 + 24) >> 2] = i4;
          HEAP32[i17 + (i8 + 12) >> 2] = i7;
          HEAP32[i17 + (i8 + 8) >> 2] = i7;
          break L348;
         }
        } else {
         i2 = i4;
        }
       } while (0);
       i4 = i2 + 8 | 0;
       i3 = HEAP32[i4 >> 2] | 0;
       i5 = HEAP32[7176 >> 2] | 0;
       if (i2 >>> 0 < i5 >>> 0) {
        _abort();
       }
       if (i3 >>> 0 < i5 >>> 0) {
        _abort();
       } else {
        HEAP32[i3 + 12 >> 2] = i7;
        HEAP32[i4 >> 2] = i7;
        HEAP32[i17 + (i8 + 8) >> 2] = i3;
        HEAP32[i17 + (i8 + 12) >> 2] = i2;
        HEAP32[i17 + (i8 + 24) >> 2] = 0;
        break;
       }
      } else {
       i32 = (HEAP32[7172 >> 2] | 0) + i10 | 0;
       HEAP32[7172 >> 2] = i32;
       HEAP32[7184 >> 2] = i7;
       HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1;
      }
     } while (0);
     i32 = i17 + (i6 | 8) | 0;
     STACKTOP = i1;
     return i32 | 0;
    }
    i3 = 7608 | 0;
    while (1) {
     i2 = HEAP32[i3 >> 2] | 0;
     if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i11 | 0, i10 >>> 0 > i15 >>> 0) : 0) {
      break;
     }
     i3 = HEAP32[i3 + 8 >> 2] | 0;
    }
    i3 = i2 + (i11 + -39) | 0;
    if ((i3 & 7 | 0) == 0) {
     i3 = 0;
    } else {
     i3 = 0 - i3 & 7;
    }
    i2 = i2 + (i11 + -47 + i3) | 0;
    i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2;
    i3 = i2 + 8 | 0;
    i4 = i17 + 8 | 0;
    if ((i4 & 7 | 0) == 0) {
     i4 = 0;
    } else {
     i4 = 0 - i4 & 7;
    }
    i32 = i14 + -40 - i4 | 0;
    HEAP32[7184 >> 2] = i17 + i4;
    HEAP32[7172 >> 2] = i32;
    HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
    HEAP32[i2 + 4 >> 2] = 27;
    HEAP32[i3 + 0 >> 2] = HEAP32[7608 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[7612 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[7616 >> 2];
    HEAP32[i3 + 12 >> 2] = HEAP32[7620 >> 2];
    HEAP32[7608 >> 2] = i17;
    HEAP32[7612 >> 2] = i14;
    HEAP32[7620 >> 2] = 0;
    HEAP32[7616 >> 2] = i3;
    i4 = i2 + 28 | 0;
    HEAP32[i4 >> 2] = 7;
    if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) {
     while (1) {
      i3 = i4 + 4 | 0;
      HEAP32[i3 >> 2] = 7;
      if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) {
       i4 = i3;
      } else {
       break;
      }
     }
    }
    if ((i2 | 0) != (i15 | 0)) {
     i2 = i2 - i15 | 0;
     i3 = i15 + (i2 + 4) | 0;
     HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2;
     HEAP32[i15 + 4 >> 2] = i2 | 1;
     HEAP32[i15 + i2 >> 2] = i2;
     i3 = i2 >>> 3;
     if (i2 >>> 0 < 256) {
      i4 = i3 << 1;
      i2 = 7200 + (i4 << 2) | 0;
      i5 = HEAP32[1790] | 0;
      i3 = 1 << i3;
      if ((i5 & i3 | 0) != 0) {
       i4 = 7200 + (i4 + 2 << 2) | 0;
       i3 = HEAP32[i4 >> 2] | 0;
       if (i3 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        i7 = i4;
        i8 = i3;
       }
      } else {
       HEAP32[1790] = i5 | i3;
       i7 = 7200 + (i4 + 2 << 2) | 0;
       i8 = i2;
      }
      HEAP32[i7 >> 2] = i15;
      HEAP32[i8 + 12 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i8;
      HEAP32[i15 + 12 >> 2] = i2;
      break;
     }
     i3 = i2 >>> 8;
     if ((i3 | 0) != 0) {
      if (i2 >>> 0 > 16777215) {
       i3 = 31;
      } else {
       i31 = (i3 + 1048320 | 0) >>> 16 & 8;
       i32 = i3 << i31;
       i30 = (i32 + 520192 | 0) >>> 16 & 4;
       i32 = i32 << i30;
       i3 = (i32 + 245760 | 0) >>> 16 & 2;
       i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0;
       i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1;
      }
     } else {
      i3 = 0;
     }
     i7 = 7464 + (i3 << 2) | 0;
     HEAP32[i15 + 28 >> 2] = i3;
     HEAP32[i15 + 20 >> 2] = 0;
     HEAP32[i15 + 16 >> 2] = 0;
     i4 = HEAP32[7164 >> 2] | 0;
     i5 = 1 << i3;
     if ((i4 & i5 | 0) == 0) {
      HEAP32[7164 >> 2] = i4 | i5;
      HEAP32[i7 >> 2] = i15;
      HEAP32[i15 + 24 >> 2] = i7;
      HEAP32[i15 + 12 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i15;
      break;
     }
     i4 = HEAP32[i7 >> 2] | 0;
     if ((i3 | 0) == 31) {
      i3 = 0;
     } else {
      i3 = 25 - (i3 >>> 1) | 0;
     }
     L499 : do {
      if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) {
       i3 = i2 << i3;
       while (1) {
        i7 = i4 + (i3 >>> 31 << 2) + 16 | 0;
        i5 = HEAP32[i7 >> 2] | 0;
        if ((i5 | 0) == 0) {
         break;
        }
        if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) {
         i6 = i5;
         break L499;
        } else {
         i3 = i3 << 1;
         i4 = i5;
        }
       }
       if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[i7 >> 2] = i15;
        HEAP32[i15 + 24 >> 2] = i4;
        HEAP32[i15 + 12 >> 2] = i15;
        HEAP32[i15 + 8 >> 2] = i15;
        break L311;
       }
      } else {
       i6 = i4;
      }
     } while (0);
     i4 = i6 + 8 | 0;
     i3 = HEAP32[i4 >> 2] | 0;
     i2 = HEAP32[7176 >> 2] | 0;
     if (i6 >>> 0 < i2 >>> 0) {
      _abort();
     }
     if (i3 >>> 0 < i2 >>> 0) {
      _abort();
     } else {
      HEAP32[i3 + 12 >> 2] = i15;
      HEAP32[i4 >> 2] = i15;
      HEAP32[i15 + 8 >> 2] = i3;
      HEAP32[i15 + 12 >> 2] = i6;
      HEAP32[i15 + 24 >> 2] = 0;
      break;
     }
    }
   } else {
    i32 = HEAP32[7176 >> 2] | 0;
    if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) {
     HEAP32[7176 >> 2] = i17;
    }
    HEAP32[7608 >> 2] = i17;
    HEAP32[7612 >> 2] = i14;
    HEAP32[7620 >> 2] = 0;
    HEAP32[7196 >> 2] = HEAP32[1908];
    HEAP32[7192 >> 2] = -1;
    i2 = 0;
    do {
     i32 = i2 << 1;
     i31 = 7200 + (i32 << 2) | 0;
     HEAP32[7200 + (i32 + 3 << 2) >> 2] = i31;
     HEAP32[7200 + (i32 + 2 << 2) >> 2] = i31;
     i2 = i2 + 1 | 0;
    } while ((i2 | 0) != 32);
    i2 = i17 + 8 | 0;
    if ((i2 & 7 | 0) == 0) {
     i2 = 0;
    } else {
     i2 = 0 - i2 & 7;
    }
    i32 = i14 + -40 - i2 | 0;
    HEAP32[7184 >> 2] = i17 + i2;
    HEAP32[7172 >> 2] = i32;
    HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1;
    HEAP32[i17 + (i14 + -36) >> 2] = 40;
    HEAP32[7188 >> 2] = HEAP32[7648 >> 2];
   }
  } while (0);
  i2 = HEAP32[7172 >> 2] | 0;
  if (i2 >>> 0 > i12 >>> 0) {
   i31 = i2 - i12 | 0;
   HEAP32[7172 >> 2] = i31;
   i32 = HEAP32[7184 >> 2] | 0;
   HEAP32[7184 >> 2] = i32 + i12;
   HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1;
   HEAP32[i32 + 4 >> 2] = i12 | 3;
   i32 = i32 + 8 | 0;
   STACKTOP = i1;
   return i32 | 0;
  }
 }
 HEAP32[(___errno_location() | 0) >> 2] = 12;
 i32 = 0;
 STACKTOP = i1;
 return i32 | 0;
}
function __ZN12b2EPCollider7CollideEP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS7_(i12, i2, i16, i5, i8, i6) {
 i12 = i12 | 0;
 i2 = i2 | 0;
 i16 = i16 | 0;
 i5 = i5 | 0;
 i8 = i8 | 0;
 i6 = i6 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, i29 = 0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, i34 = 0, i35 = 0, d36 = 0.0, d37 = 0.0, i38 = 0, d39 = 0.0, i40 = 0, i41 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 144 | 0;
 i18 = i1 + 128 | 0;
 i11 = i1 + 24 | 0;
 i9 = i1 + 72 | 0;
 i10 = i1 + 48 | 0;
 i3 = i1;
 i4 = i12 + 132 | 0;
 d28 = +HEAPF32[i5 + 12 >> 2];
 d37 = +HEAPF32[i6 + 8 >> 2];
 d23 = +HEAPF32[i5 + 8 >> 2];
 d27 = +HEAPF32[i6 + 12 >> 2];
 d22 = d28 * d37 - d23 * d27;
 d27 = d37 * d23 + d28 * d27;
 d37 = +d22;
 d26 = +d27;
 d25 = +HEAPF32[i6 >> 2] - +HEAPF32[i5 >> 2];
 d36 = +HEAPF32[i6 + 4 >> 2] - +HEAPF32[i5 + 4 >> 2];
 d24 = d28 * d25 + d23 * d36;
 d25 = d28 * d36 - d23 * d25;
 d23 = +d24;
 d36 = +d25;
 i5 = i4;
 HEAPF32[i5 >> 2] = d23;
 HEAPF32[i5 + 4 >> 2] = d36;
 i5 = i12 + 140 | 0;
 HEAPF32[i5 >> 2] = d37;
 HEAPF32[i5 + 4 >> 2] = d26;
 i5 = i12 + 144 | 0;
 d26 = +HEAPF32[i8 + 12 >> 2];
 i7 = i12 + 140 | 0;
 d37 = +HEAPF32[i8 + 16 >> 2];
 d24 = d24 + (d27 * d26 - d22 * d37);
 i6 = i12 + 136 | 0;
 d25 = d26 * d22 + d27 * d37 + d25;
 d37 = +d24;
 d27 = +d25;
 i34 = i12 + 148 | 0;
 HEAPF32[i34 >> 2] = d37;
 HEAPF32[i34 + 4 >> 2] = d27;
 i34 = i16 + 28 | 0;
 i29 = HEAP32[i34 >> 2] | 0;
 i34 = HEAP32[i34 + 4 >> 2] | 0;
 i14 = i12 + 156 | 0;
 HEAP32[i14 >> 2] = i29;
 HEAP32[i14 + 4 >> 2] = i34;
 i14 = i12 + 164 | 0;
 i17 = i16 + 12 | 0;
 i40 = HEAP32[i17 >> 2] | 0;
 i17 = HEAP32[i17 + 4 >> 2] | 0;
 i13 = i14;
 HEAP32[i13 >> 2] = i40;
 HEAP32[i13 + 4 >> 2] = i17;
 i13 = i12 + 172 | 0;
 i20 = i16 + 20 | 0;
 i41 = HEAP32[i20 >> 2] | 0;
 i20 = HEAP32[i20 + 4 >> 2] | 0;
 i38 = i13;
 HEAP32[i38 >> 2] = i41;
 HEAP32[i38 + 4 >> 2] = i20;
 i38 = i16 + 36 | 0;
 i35 = HEAP32[i38 >> 2] | 0;
 i38 = HEAP32[i38 + 4 >> 2] | 0;
 i19 = i12 + 180 | 0;
 HEAP32[i19 >> 2] = i35;
 HEAP32[i19 + 4 >> 2] = i38;
 i19 = (HEAP8[i16 + 44 | 0] | 0) != 0;
 i21 = (HEAP8[i16 + 45 | 0] | 0) != 0;
 d27 = (HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
 d37 = (HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
 d22 = d27 - d37;
 d26 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]);
 i20 = i12 + 168 | 0;
 d36 = (HEAP32[tempDoublePtr >> 2] = i17, +HEAPF32[tempDoublePtr >> 2]);
 d23 = d26 - d36;
 d28 = +Math_sqrt(+(d22 * d22 + d23 * d23));
 d33 = (HEAP32[tempDoublePtr >> 2] = i29, +HEAPF32[tempDoublePtr >> 2]);
 d32 = (HEAP32[tempDoublePtr >> 2] = i34, +HEAPF32[tempDoublePtr >> 2]);
 d31 = (HEAP32[tempDoublePtr >> 2] = i35, +HEAPF32[tempDoublePtr >> 2]);
 d30 = (HEAP32[tempDoublePtr >> 2] = i38, +HEAPF32[tempDoublePtr >> 2]);
 if (!(d28 < 1.1920928955078125e-7)) {
  d39 = 1.0 / d28;
  d22 = d22 * d39;
  d23 = d23 * d39;
 }
 i16 = i12 + 196 | 0;
 d28 = -d22;
 HEAPF32[i16 >> 2] = d23;
 i17 = i12 + 200 | 0;
 HEAPF32[i17 >> 2] = d28;
 d28 = (d24 - d37) * d23 + (d25 - d36) * d28;
 if (i19) {
  d37 = d37 - d33;
  d36 = d36 - d32;
  d39 = +Math_sqrt(+(d37 * d37 + d36 * d36));
  if (!(d39 < 1.1920928955078125e-7)) {
   d39 = 1.0 / d39;
   d37 = d37 * d39;
   d36 = d36 * d39;
  }
  d39 = -d37;
  HEAPF32[i12 + 188 >> 2] = d36;
  HEAPF32[i12 + 192 >> 2] = d39;
  i29 = d23 * d37 - d22 * d36 >= 0.0;
  d32 = (d24 - d33) * d36 + (d25 - d32) * d39;
 } else {
  i29 = 0;
  d32 = 0.0;
 }
 L10 : do {
  if (!i21) {
   if (!i19) {
    i41 = d28 >= 0.0;
    HEAP8[i12 + 248 | 0] = i41 & 1;
    i19 = i12 + 212 | 0;
    if (i41) {
     i15 = 64;
     break;
    } else {
     i15 = 65;
     break;
    }
   }
   i19 = d32 >= 0.0;
   if (i29) {
    if (!i19) {
     i41 = d28 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (!i41) {
      d37 = +-d23;
      d39 = +d22;
      i38 = i19;
      HEAPF32[i38 >> 2] = d37;
      HEAPF32[i38 + 4 >> 2] = d39;
      i38 = i16;
      i40 = HEAP32[i38 >> 2] | 0;
      i38 = HEAP32[i38 + 4 >> 2] | 0;
      i41 = i12 + 228 | 0;
      HEAP32[i41 >> 2] = i40;
      HEAP32[i41 + 4 >> 2] = i38;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = -(HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
    i41 = i16;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i19;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i12 + 188 | 0;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 228 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    d37 = +-+HEAPF32[i16 >> 2];
    d39 = +-+HEAPF32[i17 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   } else {
    if (i19) {
     i41 = d28 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (i41) {
      i38 = i16;
      i41 = HEAP32[i38 >> 2] | 0;
      i38 = HEAP32[i38 + 4 >> 2] | 0;
      i40 = i19;
      HEAP32[i40 >> 2] = i41;
      HEAP32[i40 + 4 >> 2] = i38;
      i40 = i12 + 228 | 0;
      HEAP32[i40 >> 2] = i41;
      HEAP32[i40 + 4 >> 2] = i38;
      d37 = +-(HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
      d39 = +d22;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 0;
     i19 = i12 + 212 | 0;
    }
    d39 = +-d23;
    d37 = +d22;
    i38 = i19;
    HEAPF32[i38 >> 2] = d39;
    HEAPF32[i38 + 4 >> 2] = d37;
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 228 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    d37 = +-+HEAPF32[i12 + 188 >> 2];
    d39 = +-+HEAPF32[i12 + 192 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   }
  } else {
   d33 = d31 - d27;
   d31 = d30 - d26;
   d30 = +Math_sqrt(+(d33 * d33 + d31 * d31));
   if (d30 < 1.1920928955078125e-7) {
    d30 = d33;
   } else {
    d39 = 1.0 / d30;
    d30 = d33 * d39;
    d31 = d31 * d39;
   }
   d39 = -d30;
   i34 = i12 + 204 | 0;
   HEAPF32[i34 >> 2] = d31;
   i35 = i12 + 208 | 0;
   HEAPF32[i35 >> 2] = d39;
   i38 = d22 * d31 - d23 * d30 > 0.0;
   d24 = (d24 - d27) * d31 + (d25 - d26) * d39;
   if (!i19) {
    i19 = d28 >= 0.0;
    if (!i21) {
     HEAP8[i12 + 248 | 0] = i19 & 1;
     i15 = i12 + 212 | 0;
     if (i19) {
      i19 = i15;
      i15 = 64;
      break;
     } else {
      i19 = i15;
      i15 = 65;
      break;
     }
    }
    if (i38) {
     if (!i19) {
      i41 = d24 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (!i41) {
       d37 = +-d23;
       d39 = +d22;
       i38 = i19;
       HEAPF32[i38 >> 2] = d37;
       HEAPF32[i38 + 4 >> 2] = d39;
       i38 = i12 + 228 | 0;
       HEAPF32[i38 >> 2] = d37;
       HEAPF32[i38 + 4 >> 2] = d39;
       i38 = i16;
       i40 = HEAP32[i38 + 4 >> 2] | 0;
       i41 = i12 + 236 | 0;
       HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
       HEAP32[i41 + 4 >> 2] = i40;
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 1;
      i19 = i12 + 212 | 0;
     }
     i41 = i16;
     i40 = HEAP32[i41 + 4 >> 2] | 0;
     i38 = i19;
     HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
     HEAP32[i38 + 4 >> 2] = i40;
     d37 = +-+HEAPF32[i16 >> 2];
     d39 = +-+HEAPF32[i17 >> 2];
     i38 = i12 + 228 | 0;
     HEAPF32[i38 >> 2] = d37;
     HEAPF32[i38 + 4 >> 2] = d39;
     i38 = i12 + 204 | 0;
     i40 = HEAP32[i38 + 4 >> 2] | 0;
     i41 = i12 + 236 | 0;
     HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
     HEAP32[i41 + 4 >> 2] = i40;
     break;
    } else {
     if (i19) {
      i41 = d24 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (i41) {
       i40 = i16;
       i38 = HEAP32[i40 >> 2] | 0;
       i40 = HEAP32[i40 + 4 >> 2] | 0;
       i41 = i19;
       HEAP32[i41 >> 2] = i38;
       HEAP32[i41 + 4 >> 2] = i40;
       d37 = +-(HEAP32[tempDoublePtr >> 2] = i38, +HEAPF32[tempDoublePtr >> 2]);
       d39 = +d22;
       i41 = i12 + 228 | 0;
       HEAPF32[i41 >> 2] = d37;
       HEAPF32[i41 + 4 >> 2] = d39;
       i41 = i12 + 236 | 0;
       HEAP32[i41 >> 2] = i38;
       HEAP32[i41 + 4 >> 2] = i40;
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 0;
      i19 = i12 + 212 | 0;
     }
     d39 = +-d23;
     d37 = +d22;
     i38 = i19;
     HEAPF32[i38 >> 2] = d39;
     HEAPF32[i38 + 4 >> 2] = d37;
     d37 = +-+HEAPF32[i12 + 204 >> 2];
     d39 = +-+HEAPF32[i12 + 208 >> 2];
     i38 = i12 + 228 | 0;
     HEAPF32[i38 >> 2] = d37;
     HEAPF32[i38 + 4 >> 2] = d39;
     i38 = i16;
     i40 = HEAP32[i38 + 4 >> 2] | 0;
     i41 = i12 + 236 | 0;
     HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
     HEAP32[i41 + 4 >> 2] = i40;
     break;
    }
   }
   if (i29 & i38) {
    if (!(d32 >= 0.0) & !(d28 >= 0.0)) {
     i41 = d24 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (!i41) {
      d37 = +-d23;
      d39 = +d22;
      i41 = i19;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      i41 = i12 + 228 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i19;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    i41 = i12 + 188 | 0;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i12 + 228 | 0;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i12 + 204 | 0;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 236 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    break;
   }
   if (i29) {
    do {
     if (!(d32 >= 0.0)) {
      if (d28 >= 0.0) {
       i41 = d24 >= 0.0;
       HEAP8[i12 + 248 | 0] = i41 & 1;
       i19 = i12 + 212 | 0;
       if (i41) {
        break;
       }
      } else {
       HEAP8[i12 + 248 | 0] = 0;
       i19 = i12 + 212 | 0;
      }
      d37 = +-d23;
      d39 = +d22;
      i41 = i19;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      d39 = +-+HEAPF32[i34 >> 2];
      d37 = +-+HEAPF32[i35 >> 2];
      i41 = i12 + 228 | 0;
      HEAPF32[i41 >> 2] = d39;
      HEAPF32[i41 + 4 >> 2] = d37;
      d37 = +-+HEAPF32[i16 >> 2];
      d39 = +-+HEAPF32[i17 >> 2];
      i41 = i12 + 236 | 0;
      HEAPF32[i41 >> 2] = d37;
      HEAPF32[i41 + 4 >> 2] = d39;
      break L10;
     } else {
      HEAP8[i12 + 248 | 0] = 1;
      i19 = i12 + 212 | 0;
     }
    } while (0);
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i19;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    i41 = i12 + 188 | 0;
    i40 = HEAP32[i41 + 4 >> 2] | 0;
    i38 = i12 + 228 | 0;
    HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
    HEAP32[i38 + 4 >> 2] = i40;
    i38 = i16;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i41 = i12 + 236 | 0;
    HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i41 + 4 >> 2] = i40;
    break;
   }
   if (!i38) {
    if (!(!(d32 >= 0.0) | !(d28 >= 0.0))) {
     i41 = d24 >= 0.0;
     HEAP8[i12 + 248 | 0] = i41 & 1;
     i19 = i12 + 212 | 0;
     if (i41) {
      i40 = i16;
      i38 = HEAP32[i40 >> 2] | 0;
      i40 = HEAP32[i40 + 4 >> 2] | 0;
      i41 = i19;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      i41 = i12 + 228 | 0;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      i41 = i12 + 236 | 0;
      HEAP32[i41 >> 2] = i38;
      HEAP32[i41 + 4 >> 2] = i40;
      break;
     }
    } else {
     HEAP8[i12 + 248 | 0] = 0;
     i19 = i12 + 212 | 0;
    }
    d37 = +-d23;
    d39 = +d22;
    i41 = i19;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    d39 = +-+HEAPF32[i34 >> 2];
    d37 = +-+HEAPF32[i35 >> 2];
    i41 = i12 + 228 | 0;
    HEAPF32[i41 >> 2] = d39;
    HEAPF32[i41 + 4 >> 2] = d37;
    d37 = +-+HEAPF32[i12 + 188 >> 2];
    d39 = +-+HEAPF32[i12 + 192 >> 2];
    i41 = i12 + 236 | 0;
    HEAPF32[i41 >> 2] = d37;
    HEAPF32[i41 + 4 >> 2] = d39;
    break;
   }
   do {
    if (!(d24 >= 0.0)) {
     if (d32 >= 0.0) {
      i41 = d28 >= 0.0;
      HEAP8[i12 + 248 | 0] = i41 & 1;
      i19 = i12 + 212 | 0;
      if (i41) {
       break;
      }
     } else {
      HEAP8[i12 + 248 | 0] = 0;
      i19 = i12 + 212 | 0;
     }
     d37 = +-d23;
     d39 = +d22;
     i41 = i19;
     HEAPF32[i41 >> 2] = d37;
     HEAPF32[i41 + 4 >> 2] = d39;
     d39 = +-+HEAPF32[i16 >> 2];
     d37 = +-+HEAPF32[i17 >> 2];
     i41 = i12 + 228 | 0;
     HEAPF32[i41 >> 2] = d39;
     HEAPF32[i41 + 4 >> 2] = d37;
     d37 = +-+HEAPF32[i12 + 188 >> 2];
     d39 = +-+HEAPF32[i12 + 192 >> 2];
     i41 = i12 + 236 | 0;
     HEAPF32[i41 >> 2] = d37;
     HEAPF32[i41 + 4 >> 2] = d39;
     break L10;
    } else {
     HEAP8[i12 + 248 | 0] = 1;
     i19 = i12 + 212 | 0;
    }
   } while (0);
   i38 = i16;
   i40 = HEAP32[i38 + 4 >> 2] | 0;
   i41 = i19;
   HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i41 + 4 >> 2] = i40;
   i41 = i16;
   i40 = HEAP32[i41 + 4 >> 2] | 0;
   i38 = i12 + 228 | 0;
   HEAP32[i38 >> 2] = HEAP32[i41 >> 2];
   HEAP32[i38 + 4 >> 2] = i40;
   i38 = i12 + 204 | 0;
   i40 = HEAP32[i38 + 4 >> 2] | 0;
   i41 = i12 + 236 | 0;
   HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i41 + 4 >> 2] = i40;
  }
 } while (0);
 if ((i15 | 0) == 64) {
  i38 = i16;
  i41 = HEAP32[i38 >> 2] | 0;
  i38 = HEAP32[i38 + 4 >> 2] | 0;
  i40 = i19;
  HEAP32[i40 >> 2] = i41;
  HEAP32[i40 + 4 >> 2] = i38;
  d37 = +-(HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
  d39 = +d22;
  i41 = i12 + 228 | 0;
  HEAPF32[i41 >> 2] = d37;
  HEAPF32[i41 + 4 >> 2] = d39;
  i41 = i12 + 236 | 0;
  HEAPF32[i41 >> 2] = d37;
  HEAPF32[i41 + 4 >> 2] = d39;
 } else if ((i15 | 0) == 65) {
  d37 = +-d23;
  d39 = +d22;
  i40 = i19;
  HEAPF32[i40 >> 2] = d37;
  HEAPF32[i40 + 4 >> 2] = d39;
  i40 = i16;
  i38 = HEAP32[i40 >> 2] | 0;
  i40 = HEAP32[i40 + 4 >> 2] | 0;
  i41 = i12 + 228 | 0;
  HEAP32[i41 >> 2] = i38;
  HEAP32[i41 + 4 >> 2] = i40;
  i41 = i12 + 236 | 0;
  HEAP32[i41 >> 2] = i38;
  HEAP32[i41 + 4 >> 2] = i40;
 }
 i21 = i8 + 148 | 0;
 i34 = i12 + 128 | 0;
 HEAP32[i34 >> 2] = HEAP32[i21 >> 2];
 if ((HEAP32[i21 >> 2] | 0) > 0) {
  i19 = 0;
  do {
   d33 = +HEAPF32[i5 >> 2];
   d37 = +HEAPF32[i8 + (i19 << 3) + 20 >> 2];
   d39 = +HEAPF32[i7 >> 2];
   d36 = +HEAPF32[i8 + (i19 << 3) + 24 >> 2];
   d32 = +(+HEAPF32[i4 >> 2] + (d33 * d37 - d39 * d36));
   d36 = +(d37 * d39 + d33 * d36 + +HEAPF32[i6 >> 2]);
   i41 = i12 + (i19 << 3) | 0;
   HEAPF32[i41 >> 2] = d32;
   HEAPF32[i41 + 4 >> 2] = d36;
   d36 = +HEAPF32[i5 >> 2];
   d32 = +HEAPF32[i8 + (i19 << 3) + 84 >> 2];
   d33 = +HEAPF32[i7 >> 2];
   d39 = +HEAPF32[i8 + (i19 << 3) + 88 >> 2];
   d37 = +(d36 * d32 - d33 * d39);
   d39 = +(d32 * d33 + d36 * d39);
   i41 = i12 + (i19 << 3) + 64 | 0;
   HEAPF32[i41 >> 2] = d37;
   HEAPF32[i41 + 4 >> 2] = d39;
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i21 >> 2] | 0));
 }
 i21 = i12 + 244 | 0;
 HEAPF32[i21 >> 2] = .019999999552965164;
 i19 = i2 + 60 | 0;
 HEAP32[i19 >> 2] = 0;
 i29 = i12 + 248 | 0;
 i35 = HEAP32[i34 >> 2] | 0;
 if ((i35 | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 d23 = +HEAPF32[i12 + 164 >> 2];
 d26 = +HEAPF32[i20 >> 2];
 d24 = +HEAPF32[i12 + 212 >> 2];
 d27 = +HEAPF32[i12 + 216 >> 2];
 d22 = 3.4028234663852886e+38;
 i20 = 0;
 do {
  d25 = d24 * (+HEAPF32[i12 + (i20 << 3) >> 2] - d23) + d27 * (+HEAPF32[i12 + (i20 << 3) + 4 >> 2] - d26);
  d22 = d25 < d22 ? d25 : d22;
  i20 = i20 + 1 | 0;
 } while ((i20 | 0) != (i35 | 0));
 if (d22 > .019999999552965164) {
  STACKTOP = i1;
  return;
 }
 __ZN12b2EPCollider24ComputePolygonSeparationEv(i18, i12);
 i20 = HEAP32[i18 >> 2] | 0;
 if ((i20 | 0) != 0) {
  d23 = +HEAPF32[i18 + 8 >> 2];
  if (d23 > +HEAPF32[i21 >> 2]) {
   STACKTOP = i1;
   return;
  }
  if (d23 > d22 * .9800000190734863 + .0010000000474974513) {
   i18 = HEAP32[i18 + 4 >> 2] | 0;
   i35 = i2 + 56 | 0;
   if ((i20 | 0) == 1) {
    i18 = i11;
    i15 = 77;
   } else {
    HEAP32[i35 >> 2] = 2;
    i40 = i14;
    i41 = HEAP32[i40 + 4 >> 2] | 0;
    i38 = i11;
    HEAP32[i38 >> 2] = HEAP32[i40 >> 2];
    HEAP32[i38 + 4 >> 2] = i41;
    i38 = i11 + 8 | 0;
    HEAP8[i38] = 0;
    i41 = i18 & 255;
    HEAP8[i38 + 1 | 0] = i41;
    HEAP8[i38 + 2 | 0] = 0;
    HEAP8[i38 + 3 | 0] = 1;
    i38 = i13;
    i40 = HEAP32[i38 + 4 >> 2] | 0;
    i13 = i11 + 12 | 0;
    HEAP32[i13 >> 2] = HEAP32[i38 >> 2];
    HEAP32[i13 + 4 >> 2] = i40;
    i13 = i11 + 20 | 0;
    HEAP8[i13] = 0;
    HEAP8[i13 + 1 | 0] = i41;
    HEAP8[i13 + 2 | 0] = 0;
    HEAP8[i13 + 3 | 0] = 1;
    HEAP32[i9 >> 2] = i18;
    i13 = i18 + 1 | 0;
    i16 = (i13 | 0) < (HEAP32[i34 >> 2] | 0) ? i13 : 0;
    HEAP32[i9 + 4 >> 2] = i16;
    i17 = i12 + (i18 << 3) | 0;
    i13 = HEAP32[i17 >> 2] | 0;
    i17 = HEAP32[i17 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i13;
    HEAP32[i29 + 4 >> 2] = i17;
    i16 = i12 + (i16 << 3) | 0;
    i29 = HEAP32[i16 >> 2] | 0;
    i16 = HEAP32[i16 + 4 >> 2] | 0;
    i20 = i9 + 16 | 0;
    HEAP32[i20 >> 2] = i29;
    HEAP32[i20 + 4 >> 2] = i16;
    i20 = i12 + (i18 << 3) + 64 | 0;
    i12 = HEAP32[i20 >> 2] | 0;
    i20 = HEAP32[i20 + 4 >> 2] | 0;
    i14 = i9 + 24 | 0;
    HEAP32[i14 >> 2] = i12;
    HEAP32[i14 + 4 >> 2] = i20;
    i14 = 0;
   }
  } else {
   i15 = 75;
  }
 } else {
  i15 = 75;
 }
 if ((i15 | 0) == 75) {
  i18 = i11;
  i35 = i2 + 56 | 0;
  i15 = 77;
 }
 do {
  if ((i15 | 0) == 77) {
   HEAP32[i35 >> 2] = 1;
   i15 = HEAP32[i34 >> 2] | 0;
   if ((i15 | 0) > 1) {
    d23 = +HEAPF32[i12 + 216 >> 2];
    d22 = +HEAPF32[i12 + 212 >> 2];
    i34 = 0;
    d24 = d22 * +HEAPF32[i12 + 64 >> 2] + d23 * +HEAPF32[i12 + 68 >> 2];
    i35 = 1;
    while (1) {
     d25 = d22 * +HEAPF32[i12 + (i35 << 3) + 64 >> 2] + d23 * +HEAPF32[i12 + (i35 << 3) + 68 >> 2];
     i20 = d25 < d24;
     i34 = i20 ? i35 : i34;
     i35 = i35 + 1 | 0;
     if ((i35 | 0) < (i15 | 0)) {
      d24 = i20 ? d25 : d24;
     } else {
      break;
     }
    }
   } else {
    i34 = 0;
   }
   i20 = i34 + 1 | 0;
   i40 = (i20 | 0) < (i15 | 0) ? i20 : 0;
   i41 = i12 + (i34 << 3) | 0;
   i38 = HEAP32[i41 + 4 >> 2] | 0;
   i35 = i11;
   HEAP32[i35 >> 2] = HEAP32[i41 >> 2];
   HEAP32[i35 + 4 >> 2] = i38;
   i35 = i11 + 8 | 0;
   HEAP8[i35] = 0;
   HEAP8[i35 + 1 | 0] = i34;
   HEAP8[i35 + 2 | 0] = 1;
   HEAP8[i35 + 3 | 0] = 0;
   i35 = i12 + (i40 << 3) | 0;
   i38 = HEAP32[i35 + 4 >> 2] | 0;
   i41 = i11 + 12 | 0;
   HEAP32[i41 >> 2] = HEAP32[i35 >> 2];
   HEAP32[i41 + 4 >> 2] = i38;
   i41 = i11 + 20 | 0;
   HEAP8[i41] = 0;
   HEAP8[i41 + 1 | 0] = i40;
   HEAP8[i41 + 2 | 0] = 1;
   HEAP8[i41 + 3 | 0] = 0;
   if ((HEAP8[i29] | 0) == 0) {
    HEAP32[i9 >> 2] = 1;
    HEAP32[i9 + 4 >> 2] = 0;
    i11 = i13;
    i13 = HEAP32[i11 >> 2] | 0;
    i11 = HEAP32[i11 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i13;
    HEAP32[i29 + 4 >> 2] = i11;
    i29 = HEAP32[i14 >> 2] | 0;
    i14 = HEAP32[i14 + 4 >> 2] | 0;
    i12 = i9 + 16 | 0;
    HEAP32[i12 >> 2] = i29;
    HEAP32[i12 + 4 >> 2] = i14;
    i12 = (HEAPF32[tempDoublePtr >> 2] = -+HEAPF32[i16 >> 2], HEAP32[tempDoublePtr >> 2] | 0);
    i20 = (HEAPF32[tempDoublePtr >> 2] = -+HEAPF32[i17 >> 2], HEAP32[tempDoublePtr >> 2] | 0);
    i16 = i9 + 24 | 0;
    HEAP32[i16 >> 2] = i12;
    HEAP32[i16 + 4 >> 2] = i20;
    i16 = i14;
    i17 = i11;
    i11 = i18;
    i18 = 1;
    i14 = 1;
    break;
   } else {
    HEAP32[i9 >> 2] = 0;
    HEAP32[i9 + 4 >> 2] = 1;
    i17 = i14;
    i11 = HEAP32[i17 >> 2] | 0;
    i17 = HEAP32[i17 + 4 >> 2] | 0;
    i29 = i9 + 8 | 0;
    HEAP32[i29 >> 2] = i11;
    HEAP32[i29 + 4 >> 2] = i17;
    i29 = HEAP32[i13 >> 2] | 0;
    i13 = HEAP32[i13 + 4 >> 2] | 0;
    i20 = i9 + 16 | 0;
    HEAP32[i20 >> 2] = i29;
    HEAP32[i20 + 4 >> 2] = i13;
    i20 = i16;
    i12 = HEAP32[i20 >> 2] | 0;
    i20 = HEAP32[i20 + 4 >> 2] | 0;
    i16 = i9 + 24 | 0;
    HEAP32[i16 >> 2] = i12;
    HEAP32[i16 + 4 >> 2] = i20;
    i16 = i13;
    i13 = i11;
    i11 = i18;
    i18 = 0;
    i14 = 1;
    break;
   }
  }
 } while (0);
 d30 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]);
 d39 = (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]);
 d31 = (HEAP32[tempDoublePtr >> 2] = i13, +HEAPF32[tempDoublePtr >> 2]);
 d32 = (HEAP32[tempDoublePtr >> 2] = i17, +HEAPF32[tempDoublePtr >> 2]);
 d33 = (HEAP32[tempDoublePtr >> 2] = i29, +HEAPF32[tempDoublePtr >> 2]);
 d37 = (HEAP32[tempDoublePtr >> 2] = i16, +HEAPF32[tempDoublePtr >> 2]);
 i41 = i9 + 32 | 0;
 i16 = i9 + 24 | 0;
 i13 = i9 + 28 | 0;
 d39 = -d39;
 HEAPF32[i41 >> 2] = d30;
 HEAPF32[i9 + 36 >> 2] = d39;
 i20 = i9 + 44 | 0;
 d36 = -d30;
 i17 = i20;
 HEAPF32[i17 >> 2] = d36;
 HEAP32[i17 + 4 >> 2] = i12;
 i17 = i9 + 8 | 0;
 i15 = i9 + 12 | 0;
 d39 = d30 * d31 + d32 * d39;
 HEAPF32[i9 + 40 >> 2] = d39;
 i29 = i9 + 52 | 0;
 HEAPF32[i29 >> 2] = d33 * d36 + (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]) * d37;
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i10, i11, i41, d39, i18) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i3, i10, i20, +HEAPF32[i29 >> 2], HEAP32[i9 + 4 >> 2] | 0) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 i10 = i2 + 40 | 0;
 if (i14) {
  i40 = i16;
  i41 = HEAP32[i40 >> 2] | 0;
  i40 = HEAP32[i40 + 4 >> 2] | 0;
  i35 = i10;
  HEAP32[i35 >> 2] = i41;
  HEAP32[i35 + 4 >> 2] = i40;
  i35 = i17;
  i40 = HEAP32[i35 >> 2] | 0;
  i35 = HEAP32[i35 + 4 >> 2] | 0;
  i38 = i2 + 48 | 0;
  HEAP32[i38 >> 2] = i40;
  HEAP32[i38 + 4 >> 2] = i35;
  d23 = (HEAP32[tempDoublePtr >> 2] = i40, +HEAPF32[tempDoublePtr >> 2]);
  d22 = (HEAP32[tempDoublePtr >> 2] = i41, +HEAPF32[tempDoublePtr >> 2]);
  d24 = +HEAPF32[i15 >> 2];
  d25 = +HEAPF32[i13 >> 2];
  d28 = +HEAPF32[i3 >> 2];
  d27 = +HEAPF32[i3 + 4 >> 2];
  d26 = +HEAPF32[i21 >> 2];
  if (!((d28 - d23) * d22 + (d27 - d24) * d25 <= d26)) {
   d28 = d26;
   i8 = 0;
  } else {
   d37 = d28 - +HEAPF32[i4 >> 2];
   d36 = d27 - +HEAPF32[i6 >> 2];
   d33 = +HEAPF32[i5 >> 2];
   d28 = +HEAPF32[i7 >> 2];
   d39 = +(d37 * d33 + d36 * d28);
   d28 = +(d33 * d36 - d37 * d28);
   i8 = i2;
   HEAPF32[i8 >> 2] = d39;
   HEAPF32[i8 + 4 >> 2] = d28;
   HEAP32[i2 + 16 >> 2] = HEAP32[i3 + 8 >> 2];
   d28 = +HEAPF32[i21 >> 2];
   i8 = 1;
  }
  d26 = +HEAPF32[i3 + 12 >> 2];
  d27 = +HEAPF32[i3 + 16 >> 2];
  if ((d26 - d23) * d22 + (d27 - d24) * d25 <= d28) {
   d36 = d26 - +HEAPF32[i4 >> 2];
   d33 = d27 - +HEAPF32[i6 >> 2];
   d32 = +HEAPF32[i5 >> 2];
   d39 = +HEAPF32[i7 >> 2];
   d37 = +(d36 * d32 + d33 * d39);
   d39 = +(d32 * d33 - d36 * d39);
   i41 = i2 + (i8 * 20 | 0) | 0;
   HEAPF32[i41 >> 2] = d37;
   HEAPF32[i41 + 4 >> 2] = d39;
   HEAP32[i2 + (i8 * 20 | 0) + 16 >> 2] = HEAP32[i3 + 20 >> 2];
   i8 = i8 + 1 | 0;
  }
 } else {
  i38 = HEAP32[i9 >> 2] | 0;
  i35 = i8 + (i38 << 3) + 84 | 0;
  i41 = HEAP32[i35 + 4 >> 2] | 0;
  i40 = i10;
  HEAP32[i40 >> 2] = HEAP32[i35 >> 2];
  HEAP32[i40 + 4 >> 2] = i41;
  i38 = i8 + (i38 << 3) + 20 | 0;
  i40 = HEAP32[i38 + 4 >> 2] | 0;
  i41 = i2 + 48 | 0;
  HEAP32[i41 >> 2] = HEAP32[i38 >> 2];
  HEAP32[i41 + 4 >> 2] = i40;
  d22 = +HEAPF32[i17 >> 2];
  d23 = +HEAPF32[i16 >> 2];
  d24 = +HEAPF32[i15 >> 2];
  d25 = +HEAPF32[i13 >> 2];
  d26 = +HEAPF32[i21 >> 2];
  if (!((+HEAPF32[i3 >> 2] - d22) * d23 + (+HEAPF32[i3 + 4 >> 2] - d24) * d25 <= d26)) {
   i8 = 0;
  } else {
   i40 = i3;
   i8 = HEAP32[i40 + 4 >> 2] | 0;
   i41 = i2;
   HEAP32[i41 >> 2] = HEAP32[i40 >> 2];
   HEAP32[i41 + 4 >> 2] = i8;
   i41 = i3 + 8 | 0;
   i8 = i2 + 16 | 0;
   HEAP8[i8 + 2 | 0] = HEAP8[i41 + 3 | 0] | 0;
   HEAP8[i8 + 3 | 0] = HEAP8[i41 + 2 | 0] | 0;
   HEAP8[i8] = HEAP8[i41 + 1 | 0] | 0;
   HEAP8[i8 + 1 | 0] = HEAP8[i41] | 0;
   d26 = +HEAPF32[i21 >> 2];
   i8 = 1;
  }
  i4 = i3 + 12 | 0;
  if ((+HEAPF32[i4 >> 2] - d22) * d23 + (+HEAPF32[i3 + 16 >> 2] - d24) * d25 <= d26) {
   i38 = i4;
   i41 = HEAP32[i38 + 4 >> 2] | 0;
   i40 = i2 + (i8 * 20 | 0) | 0;
   HEAP32[i40 >> 2] = HEAP32[i38 >> 2];
   HEAP32[i40 + 4 >> 2] = i41;
   i40 = i3 + 20 | 0;
   i41 = i2 + (i8 * 20 | 0) + 16 | 0;
   HEAP8[i41 + 2 | 0] = HEAP8[i40 + 3 | 0] | 0;
   HEAP8[i41 + 3 | 0] = HEAP8[i40 + 2 | 0] | 0;
   HEAP8[i41] = HEAP8[i40 + 1 | 0] | 0;
   HEAP8[i41 + 1 | 0] = HEAP8[i40] | 0;
   i8 = i8 + 1 | 0;
  }
 }
 HEAP32[i19 >> 2] = i8;
 STACKTOP = i1;
 return;
}
function __ZN7b2World8SolveTOIERK10b2TimeStep(i30, i11) {
 i30 = i30 | 0;
 i11 = i11 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, i39 = 0, i40 = 0, i41 = 0, d42 = 0.0, i43 = 0, i44 = 0, i45 = 0, i46 = 0, i47 = 0, i48 = 0, i49 = 0, i50 = 0, i51 = 0, i52 = 0, i53 = 0, i54 = 0, i55 = 0, i56 = 0, i57 = 0, i58 = 0, i59 = 0, i60 = 0, i61 = 0, i62 = 0, i63 = 0, i64 = 0, i65 = 0, i66 = 0, d67 = 0.0, d68 = 0.0, d69 = 0.0, d70 = 0.0, d71 = 0.0, d72 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 336 | 0;
 i3 = i1 + 284 | 0;
 i6 = i1 + 152 | 0;
 i5 = i1 + 144 | 0;
 i4 = i1 + 108 | 0;
 i8 = i1 + 72 | 0;
 i7 = i1 + 64 | 0;
 i14 = i1 + 24 | 0;
 i9 = i1;
 i10 = i30 + 102872 | 0;
 i13 = i30 + 102944 | 0;
 __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i3, 64, 32, 0, i30 + 68 | 0, HEAP32[i13 >> 2] | 0);
 i2 = i30 + 102995 | 0;
 if ((HEAP8[i2] | 0) != 0) {
  i15 = HEAP32[i30 + 102952 >> 2] | 0;
  if ((i15 | 0) != 0) {
   do {
    i66 = i15 + 4 | 0;
    HEAP16[i66 >> 1] = HEAP16[i66 >> 1] & 65534;
    HEAPF32[i15 + 60 >> 2] = 0.0;
    i15 = HEAP32[i15 + 96 >> 2] | 0;
   } while ((i15 | 0) != 0);
  }
  i15 = i30 + 102932 | 0;
  i16 = HEAP32[i15 >> 2] | 0;
  if ((i16 | 0) != 0) {
   do {
    i66 = i16 + 4 | 0;
    HEAP32[i66 >> 2] = HEAP32[i66 >> 2] & -34;
    HEAP32[i16 + 128 >> 2] = 0;
    HEAPF32[i16 + 132 >> 2] = 1.0;
    i16 = HEAP32[i16 + 12 >> 2] | 0;
   } while ((i16 | 0) != 0);
  }
 } else {
  i15 = i30 + 102932 | 0;
 }
 i25 = i3 + 28 | 0;
 i26 = i3 + 36 | 0;
 i27 = i3 + 32 | 0;
 i28 = i3 + 40 | 0;
 i29 = i3 + 8 | 0;
 i24 = i3 + 44 | 0;
 i23 = i3 + 12 | 0;
 i22 = i7 + 4 | 0;
 i21 = i9 + 4 | 0;
 i20 = i9 + 8 | 0;
 i19 = i9 + 16 | 0;
 i18 = i11 + 12 | 0;
 i17 = i9 + 12 | 0;
 i16 = i9 + 20 | 0;
 i39 = i30 + 102994 | 0;
 i37 = i6 + 16 | 0;
 i36 = i6 + 20 | 0;
 i35 = i6 + 24 | 0;
 i34 = i6 + 44 | 0;
 i33 = i6 + 48 | 0;
 i32 = i6 + 52 | 0;
 i41 = i6 + 28 | 0;
 i31 = i6 + 56 | 0;
 i40 = i6 + 92 | 0;
 i30 = i6 + 128 | 0;
 i38 = i5 + 4 | 0;
 L11 : while (1) {
  i47 = HEAP32[i15 >> 2] | 0;
  if ((i47 | 0) == 0) {
   i4 = 36;
   break;
  } else {
   d42 = 1.0;
   i44 = 0;
  }
  do {
   i48 = i47 + 4 | 0;
   i43 = HEAP32[i48 >> 2] | 0;
   do {
    if ((i43 & 4 | 0) != 0 ? (HEAP32[i47 + 128 >> 2] | 0) <= 8 : 0) {
     if ((i43 & 32 | 0) == 0) {
      i43 = HEAP32[i47 + 48 >> 2] | 0;
      i45 = HEAP32[i47 + 52 >> 2] | 0;
      if ((HEAP8[i43 + 38 | 0] | 0) != 0) {
       break;
      }
      if ((HEAP8[i45 + 38 | 0] | 0) != 0) {
       break;
      }
      i46 = HEAP32[i43 + 8 >> 2] | 0;
      i50 = HEAP32[i45 + 8 >> 2] | 0;
      i53 = HEAP32[i46 >> 2] | 0;
      i52 = HEAP32[i50 >> 2] | 0;
      if (!((i53 | 0) == 2 | (i52 | 0) == 2)) {
       i4 = 16;
       break L11;
      }
      i51 = HEAP16[i46 + 4 >> 1] | 0;
      i49 = HEAP16[i50 + 4 >> 1] | 0;
      if (!((i51 & 2) != 0 & (i53 | 0) != 0 | (i49 & 2) != 0 & (i52 | 0) != 0)) {
       break;
      }
      if (!((i51 & 8) != 0 | (i53 | 0) != 2 | ((i49 & 8) != 0 | (i52 | 0) != 2))) {
       break;
      }
      i51 = i46 + 28 | 0;
      i52 = i46 + 60 | 0;
      d68 = +HEAPF32[i52 >> 2];
      i49 = i50 + 28 | 0;
      i53 = i50 + 60 | 0;
      d67 = +HEAPF32[i53 >> 2];
      if (!(d68 < d67)) {
       if (d67 < d68) {
        if (!(d67 < 1.0)) {
         i4 = 25;
         break L11;
        }
        d67 = (d68 - d67) / (1.0 - d67);
        i66 = i50 + 36 | 0;
        d69 = 1.0 - d67;
        d71 = +(+HEAPF32[i66 >> 2] * d69 + d67 * +HEAPF32[i50 + 44 >> 2]);
        d70 = +(d69 * +HEAPF32[i50 + 40 >> 2] + d67 * +HEAPF32[i50 + 48 >> 2]);
        HEAPF32[i66 >> 2] = d71;
        HEAPF32[i66 + 4 >> 2] = d70;
        i66 = i50 + 52 | 0;
        HEAPF32[i66 >> 2] = d69 * +HEAPF32[i66 >> 2] + d67 * +HEAPF32[i50 + 56 >> 2];
        HEAPF32[i53 >> 2] = d68;
        d67 = d68;
       } else {
        d67 = d68;
       }
      } else {
       if (!(d68 < 1.0)) {
        i4 = 21;
        break L11;
       }
       d71 = (d67 - d68) / (1.0 - d68);
       i66 = i46 + 36 | 0;
       d70 = 1.0 - d71;
       d68 = +(+HEAPF32[i66 >> 2] * d70 + d71 * +HEAPF32[i46 + 44 >> 2]);
       d69 = +(d70 * +HEAPF32[i46 + 40 >> 2] + d71 * +HEAPF32[i46 + 48 >> 2]);
       HEAPF32[i66 >> 2] = d68;
       HEAPF32[i66 + 4 >> 2] = d69;
       i66 = i46 + 52 | 0;
       HEAPF32[i66 >> 2] = d70 * +HEAPF32[i66 >> 2] + d71 * +HEAPF32[i46 + 56 >> 2];
       HEAPF32[i52 >> 2] = d67;
      }
      if (!(d67 < 1.0)) {
       i4 = 28;
       break L11;
      }
      i66 = HEAP32[i47 + 56 >> 2] | 0;
      i46 = HEAP32[i47 + 60 >> 2] | 0;
      HEAP32[i37 >> 2] = 0;
      HEAP32[i36 >> 2] = 0;
      HEAPF32[i35 >> 2] = 0.0;
      HEAP32[i34 >> 2] = 0;
      HEAP32[i33 >> 2] = 0;
      HEAPF32[i32 >> 2] = 0.0;
      __ZN15b2DistanceProxy3SetEPK7b2Shapei(i6, HEAP32[i43 + 12 >> 2] | 0, i66);
      __ZN15b2DistanceProxy3SetEPK7b2Shapei(i41, HEAP32[i45 + 12 >> 2] | 0, i46);
      i43 = i31 + 0 | 0;
      i45 = i51 + 0 | 0;
      i46 = i43 + 36 | 0;
      do {
       HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
       i43 = i43 + 4 | 0;
       i45 = i45 + 4 | 0;
      } while ((i43 | 0) < (i46 | 0));
      i43 = i40 + 0 | 0;
      i45 = i49 + 0 | 0;
      i46 = i43 + 36 | 0;
      do {
       HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
       i43 = i43 + 4 | 0;
       i45 = i45 + 4 | 0;
      } while ((i43 | 0) < (i46 | 0));
      HEAPF32[i30 >> 2] = 1.0;
      __Z14b2TimeOfImpactP11b2TOIOutputPK10b2TOIInput(i5, i6);
      if ((HEAP32[i5 >> 2] | 0) == 3) {
       d67 = d67 + (1.0 - d67) * +HEAPF32[i38 >> 2];
       d67 = d67 < 1.0 ? d67 : 1.0;
      } else {
       d67 = 1.0;
      }
      HEAPF32[i47 + 132 >> 2] = d67;
      HEAP32[i48 >> 2] = HEAP32[i48 >> 2] | 32;
     } else {
      d67 = +HEAPF32[i47 + 132 >> 2];
     }
     if (d67 < d42) {
      d42 = d67;
      i44 = i47;
     }
    }
   } while (0);
   i47 = HEAP32[i47 + 12 >> 2] | 0;
  } while ((i47 | 0) != 0);
  if ((i44 | 0) == 0 | d42 > .9999988079071045) {
   i4 = 36;
   break;
  }
  i47 = HEAP32[(HEAP32[i44 + 48 >> 2] | 0) + 8 >> 2] | 0;
  i48 = HEAP32[(HEAP32[i44 + 52 >> 2] | 0) + 8 >> 2] | 0;
  i49 = i47 + 28 | 0;
  i43 = i4 + 0 | 0;
  i45 = i49 + 0 | 0;
  i46 = i43 + 36 | 0;
  do {
   HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
   i43 = i43 + 4 | 0;
   i45 = i45 + 4 | 0;
  } while ((i43 | 0) < (i46 | 0));
  i50 = i48 + 28 | 0;
  i43 = i8 + 0 | 0;
  i45 = i50 + 0 | 0;
  i46 = i43 + 36 | 0;
  do {
   HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
   i43 = i43 + 4 | 0;
   i45 = i45 + 4 | 0;
  } while ((i43 | 0) < (i46 | 0));
  i43 = i47 + 60 | 0;
  d67 = +HEAPF32[i43 >> 2];
  if (!(d67 < 1.0)) {
   i4 = 38;
   break;
  }
  d70 = (d42 - d67) / (1.0 - d67);
  i57 = i47 + 36 | 0;
  d67 = 1.0 - d70;
  i52 = i47 + 44 | 0;
  i53 = i47 + 48 | 0;
  d71 = +HEAPF32[i57 >> 2] * d67 + d70 * +HEAPF32[i52 >> 2];
  d72 = d67 * +HEAPF32[i47 + 40 >> 2] + d70 * +HEAPF32[i53 >> 2];
  d69 = +d71;
  d68 = +d72;
  HEAPF32[i57 >> 2] = d69;
  HEAPF32[i57 + 4 >> 2] = d68;
  i57 = i47 + 52 | 0;
  i51 = i47 + 56 | 0;
  d70 = d67 * +HEAPF32[i57 >> 2] + d70 * +HEAPF32[i51 >> 2];
  HEAPF32[i57 >> 2] = d70;
  HEAPF32[i43 >> 2] = d42;
  i57 = i47 + 44 | 0;
  HEAPF32[i57 >> 2] = d69;
  HEAPF32[i57 + 4 >> 2] = d68;
  HEAPF32[i51 >> 2] = d70;
  d68 = +Math_sin(+d70);
  i57 = i47 + 20 | 0;
  HEAPF32[i57 >> 2] = d68;
  d70 = +Math_cos(+d70);
  i56 = i47 + 24 | 0;
  HEAPF32[i56 >> 2] = d70;
  i58 = i47 + 12 | 0;
  i55 = i47 + 28 | 0;
  d69 = +HEAPF32[i55 >> 2];
  i54 = i47 + 32 | 0;
  d67 = +HEAPF32[i54 >> 2];
  d71 = +(d71 - (d70 * d69 - d68 * d67));
  d67 = +(d72 - (d68 * d69 + d70 * d67));
  i43 = i58;
  HEAPF32[i43 >> 2] = d71;
  HEAPF32[i43 + 4 >> 2] = d67;
  i43 = i48 + 60 | 0;
  d67 = +HEAPF32[i43 >> 2];
  if (!(d67 < 1.0)) {
   i4 = 40;
   break;
  }
  d70 = (d42 - d67) / (1.0 - d67);
  i64 = i48 + 36 | 0;
  d72 = 1.0 - d70;
  i61 = i48 + 44 | 0;
  i60 = i48 + 48 | 0;
  d71 = +HEAPF32[i64 >> 2] * d72 + d70 * +HEAPF32[i61 >> 2];
  d67 = d72 * +HEAPF32[i48 + 40 >> 2] + d70 * +HEAPF32[i60 >> 2];
  d69 = +d71;
  d68 = +d67;
  HEAPF32[i64 >> 2] = d69;
  HEAPF32[i64 + 4 >> 2] = d68;
  i64 = i48 + 52 | 0;
  i59 = i48 + 56 | 0;
  d70 = d72 * +HEAPF32[i64 >> 2] + d70 * +HEAPF32[i59 >> 2];
  HEAPF32[i64 >> 2] = d70;
  HEAPF32[i43 >> 2] = d42;
  i64 = i48 + 44 | 0;
  HEAPF32[i64 >> 2] = d69;
  HEAPF32[i64 + 4 >> 2] = d68;
  HEAPF32[i59 >> 2] = d70;
  d68 = +Math_sin(+d70);
  i64 = i48 + 20 | 0;
  HEAPF32[i64 >> 2] = d68;
  d70 = +Math_cos(+d70);
  i63 = i48 + 24 | 0;
  HEAPF32[i63 >> 2] = d70;
  i65 = i48 + 12 | 0;
  i62 = i48 + 28 | 0;
  d69 = +HEAPF32[i62 >> 2];
  i66 = i48 + 32 | 0;
  d72 = +HEAPF32[i66 >> 2];
  d71 = +(d71 - (d70 * d69 - d68 * d72));
  d72 = +(d67 - (d68 * d69 + d70 * d72));
  i43 = i65;
  HEAPF32[i43 >> 2] = d71;
  HEAPF32[i43 + 4 >> 2] = d72;
  __ZN9b2Contact6UpdateEP17b2ContactListener(i44, HEAP32[i13 >> 2] | 0);
  i43 = i44 + 4 | 0;
  i45 = HEAP32[i43 >> 2] | 0;
  HEAP32[i43 >> 2] = i45 & -33;
  i46 = i44 + 128 | 0;
  HEAP32[i46 >> 2] = (HEAP32[i46 >> 2] | 0) + 1;
  if ((i45 & 6 | 0) != 6) {
   HEAP32[i43 >> 2] = i45 & -37;
   i43 = i49 + 0 | 0;
   i45 = i4 + 0 | 0;
   i46 = i43 + 36 | 0;
   do {
    HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
    i43 = i43 + 4 | 0;
    i45 = i45 + 4 | 0;
   } while ((i43 | 0) < (i46 | 0));
   i43 = i50 + 0 | 0;
   i45 = i8 + 0 | 0;
   i46 = i43 + 36 | 0;
   do {
    HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
    i43 = i43 + 4 | 0;
    i45 = i45 + 4 | 0;
   } while ((i43 | 0) < (i46 | 0));
   d69 = +HEAPF32[i51 >> 2];
   d71 = +Math_sin(+d69);
   HEAPF32[i57 >> 2] = d71;
   d69 = +Math_cos(+d69);
   HEAPF32[i56 >> 2] = d69;
   d72 = +HEAPF32[i55 >> 2];
   d70 = +HEAPF32[i54 >> 2];
   d68 = +(+HEAPF32[i52 >> 2] - (d69 * d72 - d71 * d70));
   d70 = +(+HEAPF32[i53 >> 2] - (d71 * d72 + d69 * d70));
   HEAPF32[i58 >> 2] = d68;
   HEAPF32[i58 + 4 >> 2] = d70;
   d70 = +HEAPF32[i59 >> 2];
   d68 = +Math_sin(+d70);
   HEAPF32[i64 >> 2] = d68;
   d70 = +Math_cos(+d70);
   HEAPF32[i63 >> 2] = d70;
   d69 = +HEAPF32[i62 >> 2];
   d72 = +HEAPF32[i66 >> 2];
   d71 = +(+HEAPF32[i61 >> 2] - (d70 * d69 - d68 * d72));
   d72 = +(+HEAPF32[i60 >> 2] - (d68 * d69 + d70 * d72));
   i66 = i65;
   HEAPF32[i66 >> 2] = d71;
   HEAPF32[i66 + 4 >> 2] = d72;
   continue;
  }
  i45 = i47 + 4 | 0;
  i46 = HEAPU16[i45 >> 1] | 0;
  if ((i46 & 2 | 0) == 0) {
   HEAP16[i45 >> 1] = i46 | 2;
   HEAPF32[i47 + 144 >> 2] = 0.0;
  }
  i46 = i48 + 4 | 0;
  i49 = HEAPU16[i46 >> 1] | 0;
  if ((i49 & 2 | 0) == 0) {
   HEAP16[i46 >> 1] = i49 | 2;
   HEAPF32[i48 + 144 >> 2] = 0.0;
  }
  HEAP32[i25 >> 2] = 0;
  HEAP32[i26 >> 2] = 0;
  HEAP32[i27 >> 2] = 0;
  if ((HEAP32[i28 >> 2] | 0) <= 0) {
   i4 = 48;
   break;
  }
  i49 = i47 + 8 | 0;
  HEAP32[i49 >> 2] = 0;
  i51 = HEAP32[i25 >> 2] | 0;
  HEAP32[(HEAP32[i29 >> 2] | 0) + (i51 << 2) >> 2] = i47;
  i51 = i51 + 1 | 0;
  HEAP32[i25 >> 2] = i51;
  if ((i51 | 0) >= (HEAP32[i28 >> 2] | 0)) {
   i4 = 50;
   break;
  }
  i50 = i48 + 8 | 0;
  HEAP32[i50 >> 2] = i51;
  i51 = HEAP32[i25 >> 2] | 0;
  HEAP32[(HEAP32[i29 >> 2] | 0) + (i51 << 2) >> 2] = i48;
  HEAP32[i25 >> 2] = i51 + 1;
  i51 = HEAP32[i26 >> 2] | 0;
  if ((i51 | 0) >= (HEAP32[i24 >> 2] | 0)) {
   i4 = 52;
   break;
  }
  HEAP32[i26 >> 2] = i51 + 1;
  HEAP32[(HEAP32[i23 >> 2] | 0) + (i51 << 2) >> 2] = i44;
  HEAP16[i45 >> 1] = HEAPU16[i45 >> 1] | 1;
  HEAP16[i46 >> 1] = HEAPU16[i46 >> 1] | 1;
  HEAP32[i43 >> 2] = HEAP32[i43 >> 2] | 1;
  HEAP32[i7 >> 2] = i47;
  HEAP32[i22 >> 2] = i48;
  i44 = 1;
  while (1) {
   L58 : do {
    if ((HEAP32[i47 >> 2] | 0) == 2 ? (i12 = HEAP32[i47 + 112 >> 2] | 0, (i12 | 0) != 0) : 0) {
     i47 = i47 + 4 | 0;
     i51 = i12;
     do {
      if ((HEAP32[i25 >> 2] | 0) == (HEAP32[i28 >> 2] | 0)) {
       break L58;
      }
      if ((HEAP32[i26 >> 2] | 0) == (HEAP32[i24 >> 2] | 0)) {
       break L58;
      }
      i52 = HEAP32[i51 + 4 >> 2] | 0;
      i53 = i52 + 4 | 0;
      do {
       if ((HEAP32[i53 >> 2] & 1 | 0) == 0) {
        i48 = HEAP32[i51 >> 2] | 0;
        if (((HEAP32[i48 >> 2] | 0) == 2 ? (HEAP16[i47 >> 1] & 8) == 0 : 0) ? (HEAP16[i48 + 4 >> 1] & 8) == 0 : 0) {
         break;
        }
        if ((HEAP8[(HEAP32[i52 + 48 >> 2] | 0) + 38 | 0] | 0) == 0 ? (HEAP8[(HEAP32[i52 + 52 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) {
         i54 = i48 + 28 | 0;
         i43 = i14 + 0 | 0;
         i45 = i54 + 0 | 0;
         i46 = i43 + 36 | 0;
         do {
          HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
          i43 = i43 + 4 | 0;
          i45 = i45 + 4 | 0;
         } while ((i43 | 0) < (i46 | 0));
         i43 = i48 + 4 | 0;
         if ((HEAP16[i43 >> 1] & 1) == 0) {
          i45 = i48 + 60 | 0;
          d67 = +HEAPF32[i45 >> 2];
          if (!(d67 < 1.0)) {
           i4 = 67;
           break L11;
          }
          d70 = (d42 - d67) / (1.0 - d67);
          i65 = i48 + 36 | 0;
          d72 = 1.0 - d70;
          d71 = +HEAPF32[i65 >> 2] * d72 + d70 * +HEAPF32[i48 + 44 >> 2];
          d67 = d72 * +HEAPF32[i48 + 40 >> 2] + d70 * +HEAPF32[i48 + 48 >> 2];
          d69 = +d71;
          d68 = +d67;
          HEAPF32[i65 >> 2] = d69;
          HEAPF32[i65 + 4 >> 2] = d68;
          i65 = i48 + 52 | 0;
          i66 = i48 + 56 | 0;
          d70 = d72 * +HEAPF32[i65 >> 2] + d70 * +HEAPF32[i66 >> 2];
          HEAPF32[i65 >> 2] = d70;
          HEAPF32[i45 >> 2] = d42;
          i65 = i48 + 44 | 0;
          HEAPF32[i65 >> 2] = d69;
          HEAPF32[i65 + 4 >> 2] = d68;
          HEAPF32[i66 >> 2] = d70;
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(d71 - (d70 * d69 - d68 * d72));
          d72 = +(d67 - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
         }
         __ZN9b2Contact6UpdateEP17b2ContactListener(i52, HEAP32[i13 >> 2] | 0);
         i45 = HEAP32[i53 >> 2] | 0;
         if ((i45 & 4 | 0) == 0) {
          i43 = i54 + 0 | 0;
          i45 = i14 + 0 | 0;
          i46 = i43 + 36 | 0;
          do {
           HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
           i43 = i43 + 4 | 0;
           i45 = i45 + 4 | 0;
          } while ((i43 | 0) < (i46 | 0));
          d70 = +HEAPF32[i48 + 56 >> 2];
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(+HEAPF32[i48 + 44 >> 2] - (d70 * d69 - d68 * d72));
          d72 = +(+HEAPF32[i48 + 48 >> 2] - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
          break;
         }
         if ((i45 & 2 | 0) == 0) {
          i43 = i54 + 0 | 0;
          i45 = i14 + 0 | 0;
          i46 = i43 + 36 | 0;
          do {
           HEAP32[i43 >> 2] = HEAP32[i45 >> 2];
           i43 = i43 + 4 | 0;
           i45 = i45 + 4 | 0;
          } while ((i43 | 0) < (i46 | 0));
          d70 = +HEAPF32[i48 + 56 >> 2];
          d68 = +Math_sin(+d70);
          HEAPF32[i48 + 20 >> 2] = d68;
          d70 = +Math_cos(+d70);
          HEAPF32[i48 + 24 >> 2] = d70;
          d69 = +HEAPF32[i48 + 28 >> 2];
          d72 = +HEAPF32[i48 + 32 >> 2];
          d71 = +(+HEAPF32[i48 + 44 >> 2] - (d70 * d69 - d68 * d72));
          d72 = +(+HEAPF32[i48 + 48 >> 2] - (d68 * d69 + d70 * d72));
          i66 = i48 + 12 | 0;
          HEAPF32[i66 >> 2] = d71;
          HEAPF32[i66 + 4 >> 2] = d72;
          break;
         }
         HEAP32[i53 >> 2] = i45 | 1;
         i45 = HEAP32[i26 >> 2] | 0;
         if ((i45 | 0) >= (HEAP32[i24 >> 2] | 0)) {
          i4 = 74;
          break L11;
         }
         HEAP32[i26 >> 2] = i45 + 1;
         HEAP32[(HEAP32[i23 >> 2] | 0) + (i45 << 2) >> 2] = i52;
         i45 = HEAPU16[i43 >> 1] | 0;
         if ((i45 & 1 | 0) == 0) {
          HEAP16[i43 >> 1] = i45 | 1;
          if ((HEAP32[i48 >> 2] | 0) != 0 ? (i45 & 2 | 0) == 0 : 0) {
           HEAP16[i43 >> 1] = i45 | 3;
           HEAPF32[i48 + 144 >> 2] = 0.0;
          }
          i43 = HEAP32[i25 >> 2] | 0;
          if ((i43 | 0) >= (HEAP32[i28 >> 2] | 0)) {
           i4 = 80;
           break L11;
          }
          HEAP32[i48 + 8 >> 2] = i43;
          i66 = HEAP32[i25 >> 2] | 0;
          HEAP32[(HEAP32[i29 >> 2] | 0) + (i66 << 2) >> 2] = i48;
          HEAP32[i25 >> 2] = i66 + 1;
         }
        }
       }
      } while (0);
      i51 = HEAP32[i51 + 12 >> 2] | 0;
     } while ((i51 | 0) != 0);
    }
   } while (0);
   if ((i44 | 0) >= 2) {
    break;
   }
   i47 = HEAP32[i7 + (i44 << 2) >> 2] | 0;
   i44 = i44 + 1 | 0;
  }
  d72 = (1.0 - d42) * +HEAPF32[i11 >> 2];
  HEAPF32[i9 >> 2] = d72;
  HEAPF32[i21 >> 2] = 1.0 / d72;
  HEAPF32[i20 >> 2] = 1.0;
  HEAP32[i19 >> 2] = 20;
  HEAP32[i17 >> 2] = HEAP32[i18 >> 2];
  HEAP8[i16] = 0;
  __ZN8b2Island8SolveTOIERK10b2TimeStepii(i3, i9, HEAP32[i49 >> 2] | 0, HEAP32[i50 >> 2] | 0);
  i44 = HEAP32[i25 >> 2] | 0;
  if ((i44 | 0) > 0) {
   i43 = 0;
   do {
    i45 = HEAP32[(HEAP32[i29 >> 2] | 0) + (i43 << 2) >> 2] | 0;
    i66 = i45 + 4 | 0;
    HEAP16[i66 >> 1] = HEAP16[i66 >> 1] & 65534;
    if ((HEAP32[i45 >> 2] | 0) == 2) {
     __ZN6b2Body19SynchronizeFixturesEv(i45);
     i44 = HEAP32[i45 + 112 >> 2] | 0;
     if ((i44 | 0) != 0) {
      do {
       i66 = (HEAP32[i44 + 4 >> 2] | 0) + 4 | 0;
       HEAP32[i66 >> 2] = HEAP32[i66 >> 2] & -34;
       i44 = HEAP32[i44 + 12 >> 2] | 0;
      } while ((i44 | 0) != 0);
     }
     i44 = HEAP32[i25 >> 2] | 0;
    }
    i43 = i43 + 1 | 0;
   } while ((i43 | 0) < (i44 | 0));
  }
  __ZN16b2ContactManager15FindNewContactsEv(i10);
  if ((HEAP8[i39] | 0) != 0) {
   i4 = 92;
   break;
  }
 }
 if ((i4 | 0) == 16) {
  ___assert_fail(2288, 2184, 641, 2344);
 } else if ((i4 | 0) == 21) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 25) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 28) {
  ___assert_fail(2360, 2184, 676, 2344);
 } else if ((i4 | 0) == 36) {
  HEAP8[i2] = 1;
  __ZN8b2IslandD2Ev(i3);
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 38) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 40) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 48) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 50) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 52) {
  ___assert_fail(2480, 2440, 62, 2472);
 } else if ((i4 | 0) == 67) {
  ___assert_fail(2360, 2376, 723, 2400);
 } else if ((i4 | 0) == 74) {
  ___assert_fail(2480, 2440, 62, 2472);
 } else if ((i4 | 0) == 80) {
  ___assert_fail(2520, 2440, 54, 2472);
 } else if ((i4 | 0) == 92) {
  HEAP8[i2] = 0;
  __ZN8b2IslandD2Ev(i3);
  STACKTOP = i1;
  return;
 }
}
function __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i8, i1) {
 i5 = i5 | 0;
 i8 = i8 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i2 = i3;
 L1 : while (1) {
  i7 = i8;
  i4 = i8 + -12 | 0;
  L3 : while (1) {
   i9 = i5;
   i11 = i7 - i9 | 0;
   switch ((i11 | 0) / 12 | 0 | 0) {
   case 4:
    {
     i6 = 14;
     break L1;
    }
   case 2:
    {
     i6 = 4;
     break L1;
    }
   case 3:
    {
     i6 = 6;
     break L1;
    }
   case 5:
    {
     i6 = 15;
     break L1;
    }
   case 1:
   case 0:
    {
     i6 = 67;
     break L1;
    }
   default:
    {}
   }
   if ((i11 | 0) < 372) {
    i6 = 21;
    break L1;
   }
   i12 = (i11 | 0) / 24 | 0;
   i10 = i5 + (i12 * 12 | 0) | 0;
   do {
    if ((i11 | 0) > 11988) {
     i14 = (i11 | 0) / 48 | 0;
     i11 = i5 + (i14 * 12 | 0) | 0;
     i14 = i5 + ((i14 + i12 | 0) * 12 | 0) | 0;
     i12 = __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i11, i10, i14, i1) | 0;
     if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i14) | 0) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
      HEAP32[i14 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i14 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i14 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i13 = i12 + 1 | 0;
      if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i14, i10) | 0) {
       HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
       HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
       HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
       HEAP32[i10 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
       HEAP32[i10 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
       HEAP32[i10 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
       HEAP32[i14 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
       HEAP32[i14 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
       HEAP32[i14 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
       i13 = i12 + 2 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i11) | 0) {
        HEAP32[i2 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
        HEAP32[i2 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
        HEAP32[i2 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
        HEAP32[i11 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
        HEAP32[i11 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
        HEAP32[i11 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
        HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
        HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
        HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
        if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i11, i5) | 0) {
         HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
         HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
         HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
         HEAP32[i5 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
         HEAP32[i5 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
         HEAP32[i5 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
         HEAP32[i11 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
         HEAP32[i11 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
         HEAP32[i11 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
         i12 = i12 + 4 | 0;
        } else {
         i12 = i12 + 3 | 0;
        }
       } else {
        i12 = i13;
       }
      } else {
       i12 = i13;
      }
     }
    } else {
     i15 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i5) | 0;
     i11 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i10) | 0;
     if (!i15) {
      if (!i11) {
       i12 = 0;
       break;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i5) | 0)) {
       i12 = 1;
       break;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 2;
      break;
     }
     if (i11) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 1;
      break;
     }
     HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
     HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
     HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
     HEAP32[i5 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
     HEAP32[i5 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
     HEAP32[i5 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
     HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
     HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
     HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
     if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i10) | 0) {
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = 2;
     } else {
      i12 = 1;
     }
    }
   } while (0);
   do {
    if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
     i13 = i4;
    } else {
     i13 = i4;
     while (1) {
      i13 = i13 + -12 | 0;
      if ((i5 | 0) == (i13 | 0)) {
       break;
      }
      if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i13, i10) | 0) {
       i6 = 50;
       break;
      }
     }
     if ((i6 | 0) == 50) {
      i6 = 0;
      HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
      HEAP32[i5 + 0 >> 2] = HEAP32[i13 + 0 >> 2];
      HEAP32[i5 + 4 >> 2] = HEAP32[i13 + 4 >> 2];
      HEAP32[i5 + 8 >> 2] = HEAP32[i13 + 8 >> 2];
      HEAP32[i13 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i13 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i13 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i12 = i12 + 1 | 0;
      break;
     }
     i10 = i5 + 12 | 0;
     if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i4) | 0)) {
      if ((i10 | 0) == (i4 | 0)) {
       i6 = 67;
       break L1;
      }
      while (1) {
       i9 = i10 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
        break;
       }
       if ((i9 | 0) == (i4 | 0)) {
        i6 = 67;
        break L1;
       } else {
        i10 = i9;
       }
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
      HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i10 = i9;
     }
     if ((i10 | 0) == (i4 | 0)) {
      i6 = 67;
      break L1;
     } else {
      i9 = i4;
     }
     while (1) {
      while (1) {
       i11 = i10 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i10) | 0) {
        break;
       } else {
        i10 = i11;
       }
      }
      do {
       i9 = i9 + -12 | 0;
      } while (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i9) | 0);
      if (!(i10 >>> 0 < i9 >>> 0)) {
       i5 = i10;
       continue L3;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i10 = i11;
     }
    }
   } while (0);
   i11 = i5 + 12 | 0;
   L47 : do {
    if (i11 >>> 0 < i13 >>> 0) {
     while (1) {
      i15 = i11;
      while (1) {
       i11 = i15 + 12 | 0;
       if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i15, i10) | 0) {
        i15 = i11;
       } else {
        i14 = i13;
        break;
       }
      }
      do {
       i14 = i14 + -12 | 0;
      } while (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i14, i10) | 0));
      if (i15 >>> 0 > i14 >>> 0) {
       i11 = i15;
       break L47;
      }
      HEAP32[i2 + 0 >> 2] = HEAP32[i15 + 0 >> 2];
      HEAP32[i2 + 4 >> 2] = HEAP32[i15 + 4 >> 2];
      HEAP32[i2 + 8 >> 2] = HEAP32[i15 + 8 >> 2];
      HEAP32[i15 + 0 >> 2] = HEAP32[i14 + 0 >> 2];
      HEAP32[i15 + 4 >> 2] = HEAP32[i14 + 4 >> 2];
      HEAP32[i15 + 8 >> 2] = HEAP32[i14 + 8 >> 2];
      HEAP32[i14 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
      HEAP32[i14 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
      HEAP32[i14 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
      i13 = i14;
      i10 = (i10 | 0) == (i15 | 0) ? i14 : i10;
      i12 = i12 + 1 | 0;
     }
    }
   } while (0);
   if ((i11 | 0) != (i10 | 0) ? FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i10, i11) | 0 : 0) {
    HEAP32[i2 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
    HEAP32[i2 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
    HEAP32[i2 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
    HEAP32[i11 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
    HEAP32[i11 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
    HEAP32[i11 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
    HEAP32[i10 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
    HEAP32[i10 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
    HEAP32[i10 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
    i12 = i12 + 1 | 0;
   }
   if ((i12 | 0) == 0) {
    i12 = __ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i5, i11, i1) | 0;
    i10 = i11 + 12 | 0;
    if (__ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i10, i8, i1) | 0) {
     i6 = 62;
     break;
    }
    if (i12) {
     i5 = i10;
     continue;
    }
   }
   i15 = i11;
   if ((i15 - i9 | 0) >= (i7 - i15 | 0)) {
    i6 = 66;
    break;
   }
   __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i11, i1);
   i5 = i11 + 12 | 0;
  }
  if ((i6 | 0) == 62) {
   i6 = 0;
   if (i12) {
    i6 = 67;
    break;
   } else {
    i8 = i11;
    continue;
   }
  } else if ((i6 | 0) == 66) {
   i6 = 0;
   __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i11 + 12 | 0, i8, i1);
   i8 = i11;
   continue;
  }
 }
 if ((i6 | 0) == 4) {
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i5) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 6) {
  i6 = i5 + 12 | 0;
  i15 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0;
  i7 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i6) | 0;
  if (!i15) {
   if (!i7) {
    STACKTOP = i3;
    return;
   }
   HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0)) {
    STACKTOP = i3;
    return;
   }
   HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   STACKTOP = i3;
   return;
  }
  if (i7) {
   HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i6) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 14) {
  __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i5 + 12 | 0, i5 + 24 | 0, i4, i1) | 0;
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 15) {
  i6 = i5 + 12 | 0;
  i7 = i5 + 24 | 0;
  i8 = i5 + 36 | 0;
  __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i5, i6, i7, i8, i1) | 0;
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i8) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
  HEAP32[i8 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
  HEAP32[i8 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
  HEAP32[i8 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
  HEAP32[i4 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i8, i7) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  HEAP32[i7 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
  HEAP32[i7 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
  HEAP32[i7 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
  HEAP32[i8 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i8 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i8 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
  HEAP32[i7 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i7 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i7 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i6, i5) | 0)) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i2 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
  HEAP32[i2 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
  HEAP32[i5 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i5 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i5 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
  HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
  HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 21) {
  __ZNSt3__118__insertion_sort_3IRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i8, i1);
  STACKTOP = i3;
  return;
 } else if ((i6 | 0) == 67) {
  STACKTOP = i3;
  return;
 }
}
function _free(i7) {
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0;
 i1 = STACKTOP;
 if ((i7 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 i15 = i7 + -8 | 0;
 i16 = HEAP32[7176 >> 2] | 0;
 if (i15 >>> 0 < i16 >>> 0) {
  _abort();
 }
 i13 = HEAP32[i7 + -4 >> 2] | 0;
 i12 = i13 & 3;
 if ((i12 | 0) == 1) {
  _abort();
 }
 i8 = i13 & -8;
 i6 = i7 + (i8 + -8) | 0;
 do {
  if ((i13 & 1 | 0) == 0) {
   i19 = HEAP32[i15 >> 2] | 0;
   if ((i12 | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   i15 = -8 - i19 | 0;
   i13 = i7 + i15 | 0;
   i12 = i19 + i8 | 0;
   if (i13 >>> 0 < i16 >>> 0) {
    _abort();
   }
   if ((i13 | 0) == (HEAP32[7180 >> 2] | 0)) {
    i2 = i7 + (i8 + -4) | 0;
    if ((HEAP32[i2 >> 2] & 3 | 0) != 3) {
     i2 = i13;
     i11 = i12;
     break;
    }
    HEAP32[7168 >> 2] = i12;
    HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2;
    HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1;
    HEAP32[i6 >> 2] = i12;
    STACKTOP = i1;
    return;
   }
   i18 = i19 >>> 3;
   if (i19 >>> 0 < 256) {
    i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
    i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
    i14 = 7200 + (i18 << 1 << 2) | 0;
    if ((i2 | 0) != (i14 | 0)) {
     if (i2 >>> 0 < i16 >>> 0) {
      _abort();
     }
     if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) {
      _abort();
     }
    }
    if ((i11 | 0) == (i2 | 0)) {
     HEAP32[1790] = HEAP32[1790] & ~(1 << i18);
     i2 = i13;
     i11 = i12;
     break;
    }
    if ((i11 | 0) != (i14 | 0)) {
     if (i11 >>> 0 < i16 >>> 0) {
      _abort();
     }
     i14 = i11 + 8 | 0;
     if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) {
      i17 = i14;
     } else {
      _abort();
     }
    } else {
     i17 = i11 + 8 | 0;
    }
    HEAP32[i2 + 12 >> 2] = i11;
    HEAP32[i17 >> 2] = i2;
    i2 = i13;
    i11 = i12;
    break;
   }
   i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0;
   i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0;
   do {
    if ((i18 | 0) == (i13 | 0)) {
     i19 = i7 + (i15 + 20) | 0;
     i18 = HEAP32[i19 >> 2] | 0;
     if ((i18 | 0) == 0) {
      i19 = i7 + (i15 + 16) | 0;
      i18 = HEAP32[i19 >> 2] | 0;
      if ((i18 | 0) == 0) {
       i14 = 0;
       break;
      }
     }
     while (1) {
      i21 = i18 + 20 | 0;
      i20 = HEAP32[i21 >> 2] | 0;
      if ((i20 | 0) != 0) {
       i18 = i20;
       i19 = i21;
       continue;
      }
      i20 = i18 + 16 | 0;
      i21 = HEAP32[i20 >> 2] | 0;
      if ((i21 | 0) == 0) {
       break;
      } else {
       i18 = i21;
       i19 = i20;
      }
     }
     if (i19 >>> 0 < i16 >>> 0) {
      _abort();
     } else {
      HEAP32[i19 >> 2] = 0;
      i14 = i18;
      break;
     }
    } else {
     i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0;
     if (i19 >>> 0 < i16 >>> 0) {
      _abort();
     }
     i16 = i19 + 12 | 0;
     if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) {
      _abort();
     }
     i20 = i18 + 8 | 0;
     if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) {
      HEAP32[i16 >> 2] = i18;
      HEAP32[i20 >> 2] = i19;
      i14 = i18;
      break;
     } else {
      _abort();
     }
    }
   } while (0);
   if ((i17 | 0) != 0) {
    i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0;
    i16 = 7464 + (i18 << 2) | 0;
    if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) {
     HEAP32[i16 >> 2] = i14;
     if ((i14 | 0) == 0) {
      HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i18);
      i2 = i13;
      i11 = i12;
      break;
     }
    } else {
     if (i17 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     i16 = i17 + 16 | 0;
     if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) {
      HEAP32[i16 >> 2] = i14;
     } else {
      HEAP32[i17 + 20 >> 2] = i14;
     }
     if ((i14 | 0) == 0) {
      i2 = i13;
      i11 = i12;
      break;
     }
    }
    if (i14 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
     _abort();
    }
    HEAP32[i14 + 24 >> 2] = i17;
    i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0;
    do {
     if ((i16 | 0) != 0) {
      if (i16 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i14 + 16 >> 2] = i16;
       HEAP32[i16 + 24 >> 2] = i14;
       break;
      }
     }
    } while (0);
    i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0;
    if ((i15 | 0) != 0) {
     if (i15 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i14 + 20 >> 2] = i15;
      HEAP32[i15 + 24 >> 2] = i14;
      i2 = i13;
      i11 = i12;
      break;
     }
    } else {
     i2 = i13;
     i11 = i12;
    }
   } else {
    i2 = i13;
    i11 = i12;
   }
  } else {
   i2 = i15;
   i11 = i8;
  }
 } while (0);
 if (!(i2 >>> 0 < i6 >>> 0)) {
  _abort();
 }
 i12 = i7 + (i8 + -4) | 0;
 i13 = HEAP32[i12 >> 2] | 0;
 if ((i13 & 1 | 0) == 0) {
  _abort();
 }
 if ((i13 & 2 | 0) == 0) {
  if ((i6 | 0) == (HEAP32[7184 >> 2] | 0)) {
   i21 = (HEAP32[7172 >> 2] | 0) + i11 | 0;
   HEAP32[7172 >> 2] = i21;
   HEAP32[7184 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i21 | 1;
   if ((i2 | 0) != (HEAP32[7180 >> 2] | 0)) {
    STACKTOP = i1;
    return;
   }
   HEAP32[7180 >> 2] = 0;
   HEAP32[7168 >> 2] = 0;
   STACKTOP = i1;
   return;
  }
  if ((i6 | 0) == (HEAP32[7180 >> 2] | 0)) {
   i21 = (HEAP32[7168 >> 2] | 0) + i11 | 0;
   HEAP32[7168 >> 2] = i21;
   HEAP32[7180 >> 2] = i2;
   HEAP32[i2 + 4 >> 2] = i21 | 1;
   HEAP32[i2 + i21 >> 2] = i21;
   STACKTOP = i1;
   return;
  }
  i11 = (i13 & -8) + i11 | 0;
  i12 = i13 >>> 3;
  do {
   if (!(i13 >>> 0 < 256)) {
    i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0;
    i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
    do {
     if ((i15 | 0) == (i6 | 0)) {
      i13 = i7 + (i8 + 12) | 0;
      i12 = HEAP32[i13 >> 2] | 0;
      if ((i12 | 0) == 0) {
       i13 = i7 + (i8 + 8) | 0;
       i12 = HEAP32[i13 >> 2] | 0;
       if ((i12 | 0) == 0) {
        i9 = 0;
        break;
       }
      }
      while (1) {
       i14 = i12 + 20 | 0;
       i15 = HEAP32[i14 >> 2] | 0;
       if ((i15 | 0) != 0) {
        i12 = i15;
        i13 = i14;
        continue;
       }
       i14 = i12 + 16 | 0;
       i15 = HEAP32[i14 >> 2] | 0;
       if ((i15 | 0) == 0) {
        break;
       } else {
        i12 = i15;
        i13 = i14;
       }
      }
      if (i13 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i13 >> 2] = 0;
       i9 = i12;
       break;
      }
     } else {
      i13 = HEAP32[i7 + i8 >> 2] | 0;
      if (i13 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i14 = i13 + 12 | 0;
      if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) {
       _abort();
      }
      i12 = i15 + 8 | 0;
      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
       HEAP32[i14 >> 2] = i15;
       HEAP32[i12 >> 2] = i13;
       i9 = i15;
       break;
      } else {
       _abort();
      }
     }
    } while (0);
    if ((i10 | 0) != 0) {
     i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0;
     i13 = 7464 + (i12 << 2) | 0;
     if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) {
      HEAP32[i13 >> 2] = i9;
      if ((i9 | 0) == 0) {
       HEAP32[7164 >> 2] = HEAP32[7164 >> 2] & ~(1 << i12);
       break;
      }
     } else {
      if (i10 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      }
      i12 = i10 + 16 | 0;
      if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
       HEAP32[i12 >> 2] = i9;
      } else {
       HEAP32[i10 + 20 >> 2] = i9;
      }
      if ((i9 | 0) == 0) {
       break;
      }
     }
     if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     HEAP32[i9 + 24 >> 2] = i10;
     i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0;
     do {
      if ((i6 | 0) != 0) {
       if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
        _abort();
       } else {
        HEAP32[i9 + 16 >> 2] = i6;
        HEAP32[i6 + 24 >> 2] = i9;
        break;
       }
      }
     } while (0);
     i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0;
     if ((i6 | 0) != 0) {
      if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
       _abort();
      } else {
       HEAP32[i9 + 20 >> 2] = i6;
       HEAP32[i6 + 24 >> 2] = i9;
       break;
      }
     }
    }
   } else {
    i9 = HEAP32[i7 + i8 >> 2] | 0;
    i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0;
    i8 = 7200 + (i12 << 1 << 2) | 0;
    if ((i9 | 0) != (i8 | 0)) {
     if (i9 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) {
      _abort();
     }
    }
    if ((i7 | 0) == (i9 | 0)) {
     HEAP32[1790] = HEAP32[1790] & ~(1 << i12);
     break;
    }
    if ((i7 | 0) != (i8 | 0)) {
     if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     }
     i8 = i7 + 8 | 0;
     if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) {
      i10 = i8;
     } else {
      _abort();
     }
    } else {
     i10 = i7 + 8 | 0;
    }
    HEAP32[i9 + 12 >> 2] = i7;
    HEAP32[i10 >> 2] = i9;
   }
  } while (0);
  HEAP32[i2 + 4 >> 2] = i11 | 1;
  HEAP32[i2 + i11 >> 2] = i11;
  if ((i2 | 0) == (HEAP32[7180 >> 2] | 0)) {
   HEAP32[7168 >> 2] = i11;
   STACKTOP = i1;
   return;
  }
 } else {
  HEAP32[i12 >> 2] = i13 & -2;
  HEAP32[i2 + 4 >> 2] = i11 | 1;
  HEAP32[i2 + i11 >> 2] = i11;
 }
 i6 = i11 >>> 3;
 if (i11 >>> 0 < 256) {
  i7 = i6 << 1;
  i3 = 7200 + (i7 << 2) | 0;
  i8 = HEAP32[1790] | 0;
  i6 = 1 << i6;
  if ((i8 & i6 | 0) != 0) {
   i6 = 7200 + (i7 + 2 << 2) | 0;
   i7 = HEAP32[i6 >> 2] | 0;
   if (i7 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
    _abort();
   } else {
    i4 = i6;
    i5 = i7;
   }
  } else {
   HEAP32[1790] = i8 | i6;
   i4 = 7200 + (i7 + 2 << 2) | 0;
   i5 = i3;
  }
  HEAP32[i4 >> 2] = i2;
  HEAP32[i5 + 12 >> 2] = i2;
  HEAP32[i2 + 8 >> 2] = i5;
  HEAP32[i2 + 12 >> 2] = i3;
  STACKTOP = i1;
  return;
 }
 i4 = i11 >>> 8;
 if ((i4 | 0) != 0) {
  if (i11 >>> 0 > 16777215) {
   i4 = 31;
  } else {
   i20 = (i4 + 1048320 | 0) >>> 16 & 8;
   i21 = i4 << i20;
   i19 = (i21 + 520192 | 0) >>> 16 & 4;
   i21 = i21 << i19;
   i4 = (i21 + 245760 | 0) >>> 16 & 2;
   i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0;
   i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1;
  }
 } else {
  i4 = 0;
 }
 i5 = 7464 + (i4 << 2) | 0;
 HEAP32[i2 + 28 >> 2] = i4;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 i7 = HEAP32[7164 >> 2] | 0;
 i6 = 1 << i4;
 L199 : do {
  if ((i7 & i6 | 0) != 0) {
   i5 = HEAP32[i5 >> 2] | 0;
   if ((i4 | 0) == 31) {
    i4 = 0;
   } else {
    i4 = 25 - (i4 >>> 1) | 0;
   }
   L204 : do {
    if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) {
     i4 = i11 << i4;
     i7 = i5;
     while (1) {
      i6 = i7 + (i4 >>> 31 << 2) + 16 | 0;
      i5 = HEAP32[i6 >> 2] | 0;
      if ((i5 | 0) == 0) {
       break;
      }
      if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) {
       i3 = i5;
       break L204;
      } else {
       i4 = i4 << 1;
       i7 = i5;
      }
     }
     if (i6 >>> 0 < (HEAP32[7176 >> 2] | 0) >>> 0) {
      _abort();
     } else {
      HEAP32[i6 >> 2] = i2;
      HEAP32[i2 + 24 >> 2] = i7;
      HEAP32[i2 + 12 >> 2] = i2;
      HEAP32[i2 + 8 >> 2] = i2;
      break L199;
     }
    } else {
     i3 = i5;
    }
   } while (0);
   i5 = i3 + 8 | 0;
   i4 = HEAP32[i5 >> 2] | 0;
   i6 = HEAP32[7176 >> 2] | 0;
   if (i3 >>> 0 < i6 >>> 0) {
    _abort();
   }
   if (i4 >>> 0 < i6 >>> 0) {
    _abort();
   } else {
    HEAP32[i4 + 12 >> 2] = i2;
    HEAP32[i5 >> 2] = i2;
    HEAP32[i2 + 8 >> 2] = i4;
    HEAP32[i2 + 12 >> 2] = i3;
    HEAP32[i2 + 24 >> 2] = 0;
    break;
   }
  } else {
   HEAP32[7164 >> 2] = i7 | i6;
   HEAP32[i5 >> 2] = i2;
   HEAP32[i2 + 24 >> 2] = i5;
   HEAP32[i2 + 12 >> 2] = i2;
   HEAP32[i2 + 8 >> 2] = i2;
  }
 } while (0);
 i21 = (HEAP32[7192 >> 2] | 0) + -1 | 0;
 HEAP32[7192 >> 2] = i21;
 if ((i21 | 0) == 0) {
  i2 = 7616 | 0;
 } else {
  STACKTOP = i1;
  return;
 }
 while (1) {
  i2 = HEAP32[i2 >> 2] | 0;
  if ((i2 | 0) == 0) {
   break;
  } else {
   i2 = i2 + 8 | 0;
  }
 }
 HEAP32[7192 >> 2] = -1;
 STACKTOP = i1;
 return;
}
function __ZNSt3__127__insertion_sort_incompleteIRPFbRK6b2PairS3_EPS1_EEbT0_S8_T_(i3, i4, i2) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i7 = i1 + 12 | 0;
 i6 = i1;
 switch ((i4 - i3 | 0) / 12 | 0 | 0) {
 case 5:
  {
   i6 = i3 + 12 | 0;
   i8 = i3 + 24 | 0;
   i5 = i3 + 36 | 0;
   i4 = i4 + -12 | 0;
   __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i3, i6, i8, i5, i2) | 0;
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i8) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i6) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i3) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 4:
  {
   __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i3, i3 + 12 | 0, i3 + 24 | 0, i4 + -12 | 0, i2) | 0;
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 3:
  {
   i5 = i3 + 12 | 0;
   i4 = i4 + -12 | 0;
   i10 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i3) | 0;
   i6 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0;
   if (!i10) {
    if (!i6) {
     i10 = 1;
     STACKTOP = i1;
     return i10 | 0;
    }
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
    HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i5, i3) | 0)) {
     i10 = 1;
     STACKTOP = i1;
     return i10 | 0;
    }
    HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   if (i6) {
    HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    HEAP32[i3 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
    HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i5) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 2:
  {
   i4 = i4 + -12 | 0;
   if (!(FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i4, i3) | 0)) {
    i10 = 1;
    STACKTOP = i1;
    return i10 | 0;
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   HEAP32[i3 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
   HEAP32[i4 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i4 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i4 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 case 1:
 case 0:
  {
   i10 = 1;
   STACKTOP = i1;
   return i10 | 0;
  }
 default:
  {
   i9 = i3 + 24 | 0;
   i10 = i3 + 12 | 0;
   i11 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i10, i3) | 0;
   i8 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i9, i10) | 0;
   do {
    if (i11) {
     if (i8) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
      HEAP32[i3 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i3 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i3 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      break;
     }
     HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
     HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
     HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
     HEAP32[i3 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
     HEAP32[i3 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
     HEAP32[i3 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
     HEAP32[i10 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i10 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i10 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i9, i10) | 0) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     }
    } else {
     if (i8) {
      HEAP32[i7 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
      HEAP32[i7 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
      HEAP32[i7 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      HEAP32[i9 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
      HEAP32[i9 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
      HEAP32[i9 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i10, i3) | 0) {
       HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
       HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
       HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
       HEAP32[i3 + 0 >> 2] = HEAP32[i10 + 0 >> 2];
       HEAP32[i3 + 4 >> 2] = HEAP32[i10 + 4 >> 2];
       HEAP32[i3 + 8 >> 2] = HEAP32[i10 + 8 >> 2];
       HEAP32[i10 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
       HEAP32[i10 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
       HEAP32[i10 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
      }
     }
    }
   } while (0);
   i7 = i3 + 36 | 0;
   if ((i7 | 0) == (i4 | 0)) {
    i11 = 1;
    STACKTOP = i1;
    return i11 | 0;
   }
   i8 = 0;
   while (1) {
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i9) | 0) {
     HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     i10 = i7;
     while (1) {
      HEAP32[i10 + 0 >> 2] = HEAP32[i9 + 0 >> 2];
      HEAP32[i10 + 4 >> 2] = HEAP32[i9 + 4 >> 2];
      HEAP32[i10 + 8 >> 2] = HEAP32[i9 + 8 >> 2];
      if ((i9 | 0) == (i3 | 0)) {
       break;
      }
      i10 = i9 + -12 | 0;
      if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i10) | 0) {
       i11 = i9;
       i9 = i10;
       i10 = i11;
      } else {
       break;
      }
     }
     HEAP32[i9 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i9 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i9 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
     i8 = i8 + 1 | 0;
     if ((i8 | 0) == 8) {
      break;
     }
    }
    i9 = i7 + 12 | 0;
    if ((i9 | 0) == (i4 | 0)) {
     i2 = 1;
     i5 = 35;
     break;
    } else {
     i11 = i7;
     i7 = i9;
     i9 = i11;
    }
   }
   if ((i5 | 0) == 35) {
    STACKTOP = i1;
    return i2 | 0;
   }
   i11 = (i7 + 12 | 0) == (i4 | 0);
   STACKTOP = i1;
   return i11 | 0;
  }
 }
 return 0;
}
function __ZN13b2DynamicTree7BalanceEi(i11, i6) {
 i11 = i11 | 0;
 i6 = i6 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, d19 = 0.0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0;
 i1 = STACKTOP;
 if ((i6 | 0) == -1) {
  ___assert_fail(3216, 2944, 382, 3232);
 }
 i5 = HEAP32[i11 + 4 >> 2] | 0;
 i13 = i5 + (i6 * 36 | 0) | 0;
 i18 = i5 + (i6 * 36 | 0) + 24 | 0;
 i8 = HEAP32[i18 >> 2] | 0;
 if ((i8 | 0) == -1) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i2 = i5 + (i6 * 36 | 0) + 32 | 0;
 if ((HEAP32[i2 >> 2] | 0) < 2) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i20 = i5 + (i6 * 36 | 0) + 28 | 0;
 i7 = HEAP32[i20 >> 2] | 0;
 if (!((i8 | 0) > -1)) {
  ___assert_fail(3240, 2944, 392, 3232);
 }
 i12 = HEAP32[i11 + 12 >> 2] | 0;
 if ((i8 | 0) >= (i12 | 0)) {
  ___assert_fail(3240, 2944, 392, 3232);
 }
 if (!((i7 | 0) > -1 & (i7 | 0) < (i12 | 0))) {
  ___assert_fail(3272, 2944, 393, 3232);
 }
 i9 = i5 + (i8 * 36 | 0) | 0;
 i10 = i5 + (i7 * 36 | 0) | 0;
 i3 = i5 + (i7 * 36 | 0) + 32 | 0;
 i4 = i5 + (i8 * 36 | 0) + 32 | 0;
 i14 = (HEAP32[i3 >> 2] | 0) - (HEAP32[i4 >> 2] | 0) | 0;
 if ((i14 | 0) > 1) {
  i21 = i5 + (i7 * 36 | 0) + 24 | 0;
  i14 = HEAP32[i21 >> 2] | 0;
  i18 = i5 + (i7 * 36 | 0) + 28 | 0;
  i15 = HEAP32[i18 >> 2] | 0;
  i16 = i5 + (i14 * 36 | 0) | 0;
  i17 = i5 + (i15 * 36 | 0) | 0;
  if (!((i14 | 0) > -1 & (i14 | 0) < (i12 | 0))) {
   ___assert_fail(3304, 2944, 407, 3232);
  }
  if (!((i15 | 0) > -1 & (i15 | 0) < (i12 | 0))) {
   ___assert_fail(3336, 2944, 408, 3232);
  }
  HEAP32[i21 >> 2] = i6;
  i21 = i5 + (i6 * 36 | 0) + 20 | 0;
  i12 = i5 + (i7 * 36 | 0) + 20 | 0;
  HEAP32[i12 >> 2] = HEAP32[i21 >> 2];
  HEAP32[i21 >> 2] = i7;
  i12 = HEAP32[i12 >> 2] | 0;
  do {
   if (!((i12 | 0) == -1)) {
    i11 = i5 + (i12 * 36 | 0) + 24 | 0;
    if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
     HEAP32[i11 >> 2] = i7;
     break;
    }
    i11 = i5 + (i12 * 36 | 0) + 28 | 0;
    if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
     HEAP32[i11 >> 2] = i7;
     break;
    } else {
     ___assert_fail(3368, 2944, 424, 3232);
    }
   } else {
    HEAP32[i11 >> 2] = i7;
   }
  } while (0);
  i11 = i5 + (i14 * 36 | 0) + 32 | 0;
  i12 = i5 + (i15 * 36 | 0) + 32 | 0;
  if ((HEAP32[i11 >> 2] | 0) > (HEAP32[i12 >> 2] | 0)) {
   HEAP32[i18 >> 2] = i14;
   HEAP32[i20 >> 2] = i15;
   HEAP32[i5 + (i15 * 36 | 0) + 20 >> 2] = i6;
   d19 = +HEAPF32[i9 >> 2];
   d22 = +HEAPF32[i17 >> 2];
   d19 = d19 < d22 ? d19 : d22;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 4 >> 2];
   d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
   d24 = +d19;
   d23 = +(d23 < d22 ? d23 : d22);
   i21 = i13;
   HEAPF32[i21 >> 2] = d24;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 8 >> 2];
   d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i8 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
   d23 = +(d23 > d24 ? d23 : d24);
   d24 = +(d22 > d25 ? d22 : d25);
   i21 = i5 + (i6 * 36 | 0) + 8 | 0;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d24;
   d24 = +HEAPF32[i16 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
   d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
   d19 = +(d19 < d24 ? d19 : d24);
   d22 = +(d22 < d23 ? d22 : d23);
   i21 = i10;
   HEAPF32[i21 >> 2] = d19;
   HEAPF32[i21 + 4 >> 2] = d22;
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
   d19 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
   d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
   d19 = +(d22 > d19 ? d22 : d19);
   d25 = +(d23 > d24 ? d23 : d24);
   i5 = i5 + (i7 * 36 | 0) + 8 | 0;
   HEAPF32[i5 >> 2] = d19;
   HEAPF32[i5 + 4 >> 2] = d25;
   i4 = HEAP32[i4 >> 2] | 0;
   i5 = HEAP32[i12 >> 2] | 0;
   i4 = ((i4 | 0) > (i5 | 0) ? i4 : i5) + 1 | 0;
   HEAP32[i2 >> 2] = i4;
   i2 = HEAP32[i11 >> 2] | 0;
   i2 = (i4 | 0) > (i2 | 0) ? i4 : i2;
  } else {
   HEAP32[i18 >> 2] = i15;
   HEAP32[i20 >> 2] = i14;
   HEAP32[i5 + (i14 * 36 | 0) + 20 >> 2] = i6;
   d19 = +HEAPF32[i9 >> 2];
   d22 = +HEAPF32[i16 >> 2];
   d19 = d19 < d22 ? d19 : d22;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 4 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
   d22 = +d19;
   d23 = +(d23 < d24 ? d23 : d24);
   i21 = i13;
   HEAPF32[i21 >> 2] = d22;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i8 * 36 | 0) + 8 >> 2];
   d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i8 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
   d23 = +(d23 > d24 ? d23 : d24);
   d24 = +(d22 > d25 ? d22 : d25);
   i21 = i5 + (i6 * 36 | 0) + 8 | 0;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d24;
   d24 = +HEAPF32[i17 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
   d23 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
   d19 = +(d19 < d24 ? d19 : d24);
   d23 = +(d22 < d23 ? d22 : d23);
   i21 = i10;
   HEAPF32[i21 >> 2] = d19;
   HEAPF32[i21 + 4 >> 2] = d23;
   d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
   d19 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
   d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
   d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
   d19 = +(d23 > d19 ? d23 : d19);
   d25 = +(d22 > d24 ? d22 : d24);
   i5 = i5 + (i7 * 36 | 0) + 8 | 0;
   HEAPF32[i5 >> 2] = d19;
   HEAPF32[i5 + 4 >> 2] = d25;
   i4 = HEAP32[i4 >> 2] | 0;
   i5 = HEAP32[i11 >> 2] | 0;
   i4 = ((i4 | 0) > (i5 | 0) ? i4 : i5) + 1 | 0;
   HEAP32[i2 >> 2] = i4;
   i2 = HEAP32[i12 >> 2] | 0;
   i2 = (i4 | 0) > (i2 | 0) ? i4 : i2;
  }
  HEAP32[i3 >> 2] = i2 + 1;
  i21 = i7;
  STACKTOP = i1;
  return i21 | 0;
 }
 if (!((i14 | 0) < -1)) {
  i21 = i6;
  STACKTOP = i1;
  return i21 | 0;
 }
 i21 = i5 + (i8 * 36 | 0) + 24 | 0;
 i14 = HEAP32[i21 >> 2] | 0;
 i20 = i5 + (i8 * 36 | 0) + 28 | 0;
 i15 = HEAP32[i20 >> 2] | 0;
 i17 = i5 + (i14 * 36 | 0) | 0;
 i16 = i5 + (i15 * 36 | 0) | 0;
 if (!((i14 | 0) > -1 & (i14 | 0) < (i12 | 0))) {
  ___assert_fail(3400, 2944, 467, 3232);
 }
 if (!((i15 | 0) > -1 & (i15 | 0) < (i12 | 0))) {
  ___assert_fail(3432, 2944, 468, 3232);
 }
 HEAP32[i21 >> 2] = i6;
 i21 = i5 + (i6 * 36 | 0) + 20 | 0;
 i12 = i5 + (i8 * 36 | 0) + 20 | 0;
 HEAP32[i12 >> 2] = HEAP32[i21 >> 2];
 HEAP32[i21 >> 2] = i8;
 i12 = HEAP32[i12 >> 2] | 0;
 do {
  if (!((i12 | 0) == -1)) {
   i11 = i5 + (i12 * 36 | 0) + 24 | 0;
   if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
    HEAP32[i11 >> 2] = i8;
    break;
   }
   i11 = i5 + (i12 * 36 | 0) + 28 | 0;
   if ((HEAP32[i11 >> 2] | 0) == (i6 | 0)) {
    HEAP32[i11 >> 2] = i8;
    break;
   } else {
    ___assert_fail(3464, 2944, 484, 3232);
   }
  } else {
   HEAP32[i11 >> 2] = i8;
  }
 } while (0);
 i12 = i5 + (i14 * 36 | 0) + 32 | 0;
 i11 = i5 + (i15 * 36 | 0) + 32 | 0;
 if ((HEAP32[i12 >> 2] | 0) > (HEAP32[i11 >> 2] | 0)) {
  HEAP32[i20 >> 2] = i14;
  HEAP32[i18 >> 2] = i15;
  HEAP32[i5 + (i15 * 36 | 0) + 20 >> 2] = i6;
  d19 = +HEAPF32[i10 >> 2];
  d22 = +HEAPF32[i16 >> 2];
  d19 = d19 < d22 ? d19 : d22;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
  d24 = +d19;
  d23 = +(d23 < d22 ? d23 : d22);
  i21 = i13;
  HEAPF32[i21 >> 2] = d24;
  HEAPF32[i21 + 4 >> 2] = d23;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 8 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
  d24 = +HEAPF32[i5 + (i7 * 36 | 0) + 12 >> 2];
  d25 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
  d22 = +(d23 > d22 ? d23 : d22);
  d24 = +(d24 > d25 ? d24 : d25);
  i21 = i5 + (i6 * 36 | 0) + 8 | 0;
  HEAPF32[i21 >> 2] = d22;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i17 >> 2];
  d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
  d19 = +(d19 < d24 ? d19 : d24);
  d22 = +(d23 < d22 ? d23 : d22);
  i21 = i9;
  HEAPF32[i21 >> 2] = d19;
  HEAPF32[i21 + 4 >> 2] = d22;
  d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
  d19 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
  d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
  d22 = +(d22 > d23 ? d22 : d23);
  d25 = +(d19 > d24 ? d19 : d24);
  i5 = i5 + (i8 * 36 | 0) + 8 | 0;
  HEAPF32[i5 >> 2] = d22;
  HEAPF32[i5 + 4 >> 2] = d25;
  i3 = HEAP32[i3 >> 2] | 0;
  i5 = HEAP32[i11 >> 2] | 0;
  i3 = ((i3 | 0) > (i5 | 0) ? i3 : i5) + 1 | 0;
  HEAP32[i2 >> 2] = i3;
  i2 = HEAP32[i12 >> 2] | 0;
  i2 = (i3 | 0) > (i2 | 0) ? i3 : i2;
 } else {
  HEAP32[i20 >> 2] = i15;
  HEAP32[i18 >> 2] = i14;
  HEAP32[i5 + (i14 * 36 | 0) + 20 >> 2] = i6;
  d19 = +HEAPF32[i10 >> 2];
  d22 = +HEAPF32[i17 >> 2];
  d19 = d19 < d22 ? d19 : d22;
  d23 = +HEAPF32[i5 + (i7 * 36 | 0) + 4 >> 2];
  d24 = +HEAPF32[i5 + (i14 * 36 | 0) + 4 >> 2];
  d22 = +d19;
  d24 = +(d23 < d24 ? d23 : d24);
  i21 = i13;
  HEAPF32[i21 >> 2] = d22;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i5 + (i7 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i14 * 36 | 0) + 8 >> 2];
  d22 = +HEAPF32[i5 + (i7 * 36 | 0) + 12 >> 2];
  d25 = +HEAPF32[i5 + (i14 * 36 | 0) + 12 >> 2];
  d23 = +(d24 > d23 ? d24 : d23);
  d24 = +(d22 > d25 ? d22 : d25);
  i21 = i5 + (i6 * 36 | 0) + 8 | 0;
  HEAPF32[i21 >> 2] = d23;
  HEAPF32[i21 + 4 >> 2] = d24;
  d24 = +HEAPF32[i16 >> 2];
  d23 = +HEAPF32[i5 + (i6 * 36 | 0) + 4 >> 2];
  d22 = +HEAPF32[i5 + (i15 * 36 | 0) + 4 >> 2];
  d19 = +(d19 < d24 ? d19 : d24);
  d22 = +(d23 < d22 ? d23 : d22);
  i21 = i9;
  HEAPF32[i21 >> 2] = d19;
  HEAPF32[i21 + 4 >> 2] = d22;
  d22 = +HEAPF32[i5 + (i6 * 36 | 0) + 8 >> 2];
  d23 = +HEAPF32[i5 + (i15 * 36 | 0) + 8 >> 2];
  d19 = +HEAPF32[i5 + (i6 * 36 | 0) + 12 >> 2];
  d24 = +HEAPF32[i5 + (i15 * 36 | 0) + 12 >> 2];
  d22 = +(d22 > d23 ? d22 : d23);
  d25 = +(d19 > d24 ? d19 : d24);
  i5 = i5 + (i8 * 36 | 0) + 8 | 0;
  HEAPF32[i5 >> 2] = d22;
  HEAPF32[i5 + 4 >> 2] = d25;
  i3 = HEAP32[i3 >> 2] | 0;
  i5 = HEAP32[i12 >> 2] | 0;
  i3 = ((i3 | 0) > (i5 | 0) ? i3 : i5) + 1 | 0;
  HEAP32[i2 >> 2] = i3;
  i2 = HEAP32[i11 >> 2] | 0;
  i2 = (i3 | 0) > (i2 | 0) ? i3 : i2;
 }
 HEAP32[i4 >> 2] = i2 + 1;
 i21 = i8;
 STACKTOP = i1;
 return i21 | 0;
}
function __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i2, i5, i3) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 var i1 = 0, i4 = 0, i6 = 0, d7 = 0.0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, i23 = 0, d24 = 0.0, d25 = 0.0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, d36 = 0.0, d37 = 0.0, d38 = 0.0, i39 = 0, i40 = 0, i41 = 0, i42 = 0, d43 = 0.0, d44 = 0.0, d45 = 0.0, i46 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 176 | 0;
 i11 = i1 + 152 | 0;
 i10 = i1 + 136 | 0;
 i4 = i1 + 24 | 0;
 i14 = i1 + 12 | 0;
 i15 = i1;
 HEAP32[652] = (HEAP32[652] | 0) + 1;
 i9 = i3 + 28 | 0;
 i31 = i3 + 56 | 0;
 HEAP32[i11 + 0 >> 2] = HEAP32[i31 + 0 >> 2];
 HEAP32[i11 + 4 >> 2] = HEAP32[i31 + 4 >> 2];
 HEAP32[i11 + 8 >> 2] = HEAP32[i31 + 8 >> 2];
 HEAP32[i11 + 12 >> 2] = HEAP32[i31 + 12 >> 2];
 i31 = i3 + 72 | 0;
 HEAP32[i10 + 0 >> 2] = HEAP32[i31 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i31 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i31 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i31 + 12 >> 2];
 __ZN9b2Simplex9ReadCacheEPK14b2SimplexCachePK15b2DistanceProxyRK11b2TransformS5_S8_(i4, i5, i3, i11, i9, i10);
 i9 = i4 + 108 | 0;
 i31 = HEAP32[i9 >> 2] | 0;
 if ((i31 | 0) == 3 | (i31 | 0) == 2 | (i31 | 0) == 1) {
  i8 = i4 + 16 | 0;
  i6 = i4 + 20 | 0;
  d17 = +HEAPF32[i11 + 12 >> 2];
  d18 = +HEAPF32[i11 + 8 >> 2];
  i13 = i3 + 16 | 0;
  i12 = i3 + 20 | 0;
  d16 = +HEAPF32[i11 >> 2];
  d21 = +HEAPF32[i11 + 4 >> 2];
  d19 = +HEAPF32[i10 + 12 >> 2];
  d22 = +HEAPF32[i10 + 8 >> 2];
  i23 = i3 + 44 | 0;
  i20 = i3 + 48 | 0;
  d24 = +HEAPF32[i10 >> 2];
  d25 = +HEAPF32[i10 + 4 >> 2];
  i11 = i4 + 52 | 0;
  i10 = i4 + 56 | 0;
  i30 = i4 + 16 | 0;
  i27 = i4 + 36 | 0;
  i26 = i4 + 52 | 0;
  i29 = i4 + 24 | 0;
  i28 = i4 + 60 | 0;
  i33 = 0;
  L3 : while (1) {
   i32 = (i31 | 0) > 0;
   if (i32) {
    i34 = 0;
    do {
     HEAP32[i14 + (i34 << 2) >> 2] = HEAP32[i4 + (i34 * 36 | 0) + 28 >> 2];
     HEAP32[i15 + (i34 << 2) >> 2] = HEAP32[i4 + (i34 * 36 | 0) + 32 >> 2];
     i34 = i34 + 1 | 0;
    } while ((i34 | 0) != (i31 | 0));
   }
   do {
    if ((i31 | 0) == 2) {
     i46 = i30;
     d45 = +HEAPF32[i46 >> 2];
     d36 = +HEAPF32[i46 + 4 >> 2];
     i46 = i26;
     d38 = +HEAPF32[i46 >> 2];
     d37 = +HEAPF32[i46 + 4 >> 2];
     d43 = d38 - d45;
     d44 = d37 - d36;
     d36 = d45 * d43 + d36 * d44;
     if (d36 >= -0.0) {
      HEAPF32[i29 >> 2] = 1.0;
      HEAP32[i9 >> 2] = 1;
      i35 = 17;
      break;
     }
     d37 = d38 * d43 + d37 * d44;
     if (!(d37 <= 0.0)) {
      d45 = 1.0 / (d37 - d36);
      HEAPF32[i29 >> 2] = d37 * d45;
      HEAPF32[i28 >> 2] = -(d36 * d45);
      HEAP32[i9 >> 2] = 2;
      i35 = 18;
      break;
     } else {
      HEAPF32[i28 >> 2] = 1.0;
      HEAP32[i9 >> 2] = 1;
      i34 = i4 + 0 | 0;
      i39 = i27 + 0 | 0;
      i35 = i34 + 36 | 0;
      do {
       HEAP32[i34 >> 2] = HEAP32[i39 >> 2];
       i34 = i34 + 4 | 0;
       i39 = i39 + 4 | 0;
      } while ((i34 | 0) < (i35 | 0));
      i35 = 17;
      break;
     }
    } else if ((i31 | 0) == 3) {
     __ZN9b2Simplex6Solve3Ev(i4);
     i34 = HEAP32[i9 >> 2] | 0;
     if ((i34 | 0) == 1) {
      i35 = 17;
     } else if ((i34 | 0) == 0) {
      i35 = 15;
      break L3;
     } else if ((i34 | 0) == 2) {
      i35 = 18;
     } else if ((i34 | 0) == 3) {
      i35 = 42;
      break L3;
     } else {
      i35 = 16;
      break L3;
     }
    } else if ((i31 | 0) == 1) {
     i35 = 17;
    } else {
     i35 = 13;
     break L3;
    }
   } while (0);
   do {
    if ((i35 | 0) == 17) {
     d36 = -+HEAPF32[i8 >> 2];
     d37 = -+HEAPF32[i6 >> 2];
     i34 = 1;
    } else if ((i35 | 0) == 18) {
     d44 = +HEAPF32[i8 >> 2];
     d37 = +HEAPF32[i11 >> 2] - d44;
     d45 = +HEAPF32[i6 >> 2];
     d36 = +HEAPF32[i10 >> 2] - d45;
     if (d44 * d36 - d37 * d45 > 0.0) {
      d36 = -d36;
      i34 = 2;
      break;
     } else {
      d37 = -d37;
      i34 = 2;
      break;
     }
    }
   } while (0);
   if (d37 * d37 + d36 * d36 < 1.4210854715202004e-14) {
    i35 = 42;
    break;
   }
   i39 = i4 + (i34 * 36 | 0) | 0;
   d44 = -d36;
   d45 = -d37;
   d43 = d17 * d44 + d18 * d45;
   d44 = d17 * d45 - d18 * d44;
   i40 = HEAP32[i13 >> 2] | 0;
   i41 = HEAP32[i12 >> 2] | 0;
   if ((i41 | 0) > 1) {
    i42 = 0;
    d45 = d44 * +HEAPF32[i40 + 4 >> 2] + d43 * +HEAPF32[i40 >> 2];
    i46 = 1;
    while (1) {
     d38 = d43 * +HEAPF32[i40 + (i46 << 3) >> 2] + d44 * +HEAPF32[i40 + (i46 << 3) + 4 >> 2];
     i35 = d38 > d45;
     i42 = i35 ? i46 : i42;
     i46 = i46 + 1 | 0;
     if ((i46 | 0) == (i41 | 0)) {
      break;
     } else {
      d45 = i35 ? d38 : d45;
     }
    }
    i35 = i4 + (i34 * 36 | 0) + 28 | 0;
    HEAP32[i35 >> 2] = i42;
    if (!((i42 | 0) > -1)) {
     i35 = 28;
     break;
    }
   } else {
    i35 = i4 + (i34 * 36 | 0) + 28 | 0;
    HEAP32[i35 >> 2] = 0;
    i42 = 0;
   }
   if ((i41 | 0) <= (i42 | 0)) {
    i35 = 28;
    break;
   }
   d45 = +HEAPF32[i40 + (i42 << 3) >> 2];
   d43 = +HEAPF32[i40 + (i42 << 3) + 4 >> 2];
   d38 = d16 + (d17 * d45 - d18 * d43);
   d44 = +d38;
   d43 = +(d45 * d18 + d17 * d43 + d21);
   i40 = i39;
   HEAPF32[i40 >> 2] = d44;
   HEAPF32[i40 + 4 >> 2] = d43;
   d43 = d36 * d19 + d37 * d22;
   d44 = d37 * d19 - d36 * d22;
   i40 = HEAP32[i23 >> 2] | 0;
   i39 = HEAP32[i20 >> 2] | 0;
   if ((i39 | 0) > 1) {
    i41 = 0;
    d37 = d44 * +HEAPF32[i40 + 4 >> 2] + d43 * +HEAPF32[i40 >> 2];
    i42 = 1;
    while (1) {
     d36 = d43 * +HEAPF32[i40 + (i42 << 3) >> 2] + d44 * +HEAPF32[i40 + (i42 << 3) + 4 >> 2];
     i46 = d36 > d37;
     i41 = i46 ? i42 : i41;
     i42 = i42 + 1 | 0;
     if ((i42 | 0) == (i39 | 0)) {
      break;
     } else {
      d37 = i46 ? d36 : d37;
     }
    }
    i42 = i4 + (i34 * 36 | 0) + 32 | 0;
    HEAP32[i42 >> 2] = i41;
    if (!((i41 | 0) > -1)) {
     i35 = 35;
     break;
    }
   } else {
    i42 = i4 + (i34 * 36 | 0) + 32 | 0;
    HEAP32[i42 >> 2] = 0;
    i41 = 0;
   }
   if ((i39 | 0) <= (i41 | 0)) {
    i35 = 35;
    break;
   }
   d37 = +HEAPF32[i40 + (i41 << 3) >> 2];
   d45 = +HEAPF32[i40 + (i41 << 3) + 4 >> 2];
   d44 = d24 + (d19 * d37 - d22 * d45);
   d43 = +d44;
   d45 = +(d37 * d22 + d19 * d45 + d25);
   i46 = i4 + (i34 * 36 | 0) + 8 | 0;
   HEAPF32[i46 >> 2] = d43;
   HEAPF32[i46 + 4 >> 2] = d45;
   d44 = +(d44 - d38);
   d45 = +(+HEAPF32[i4 + (i34 * 36 | 0) + 12 >> 2] - +HEAPF32[i4 + (i34 * 36 | 0) + 4 >> 2]);
   i46 = i4 + (i34 * 36 | 0) + 16 | 0;
   HEAPF32[i46 >> 2] = d44;
   HEAPF32[i46 + 4 >> 2] = d45;
   i33 = i33 + 1 | 0;
   HEAP32[654] = (HEAP32[654] | 0) + 1;
   if (i32) {
    i34 = HEAP32[i35 >> 2] | 0;
    i32 = 0;
    do {
     if ((i34 | 0) == (HEAP32[i14 + (i32 << 2) >> 2] | 0) ? (HEAP32[i42 >> 2] | 0) == (HEAP32[i15 + (i32 << 2) >> 2] | 0) : 0) {
      i35 = 42;
      break L3;
     }
     i32 = i32 + 1 | 0;
    } while ((i32 | 0) < (i31 | 0));
   }
   i31 = (HEAP32[i9 >> 2] | 0) + 1 | 0;
   HEAP32[i9 >> 2] = i31;
   if ((i33 | 0) >= 20) {
    i35 = 42;
    break;
   }
  }
  if ((i35 | 0) == 13) {
   ___assert_fail(2712, 2672, 498, 2720);
  } else if ((i35 | 0) == 15) {
   ___assert_fail(2712, 2672, 194, 2856);
  } else if ((i35 | 0) == 16) {
   ___assert_fail(2712, 2672, 207, 2856);
  } else if ((i35 | 0) == 28) {
   ___assert_fail(2776, 2808, 103, 2840);
  } else if ((i35 | 0) == 35) {
   ___assert_fail(2776, 2808, 103, 2840);
  } else if ((i35 | 0) == 42) {
   i12 = HEAP32[656] | 0;
   HEAP32[656] = (i12 | 0) > (i33 | 0) ? i12 : i33;
   i14 = i2 + 8 | 0;
   __ZNK9b2Simplex16GetWitnessPointsEP6b2Vec2S1_(i4, i2, i14);
   d44 = +HEAPF32[i2 >> 2] - +HEAPF32[i14 >> 2];
   i13 = i2 + 4 | 0;
   i12 = i2 + 12 | 0;
   d45 = +HEAPF32[i13 >> 2] - +HEAPF32[i12 >> 2];
   i15 = i2 + 16 | 0;
   HEAPF32[i15 >> 2] = +Math_sqrt(+(d44 * d44 + d45 * d45));
   HEAP32[i2 + 20 >> 2] = i33;
   i9 = HEAP32[i9 >> 2] | 0;
   if ((i9 | 0) == 2) {
    d45 = +HEAPF32[i8 >> 2] - +HEAPF32[i11 >> 2];
    d7 = +HEAPF32[i6 >> 2] - +HEAPF32[i10 >> 2];
    d7 = +Math_sqrt(+(d45 * d45 + d7 * d7));
   } else if ((i9 | 0) == 3) {
    d7 = +HEAPF32[i8 >> 2];
    d45 = +HEAPF32[i6 >> 2];
    d7 = (+HEAPF32[i11 >> 2] - d7) * (+HEAPF32[i4 + 92 >> 2] - d45) - (+HEAPF32[i10 >> 2] - d45) * (+HEAPF32[i4 + 88 >> 2] - d7);
   } else if ((i9 | 0) == 1) {
    d7 = 0.0;
   } else if ((i9 | 0) == 0) {
    ___assert_fail(2712, 2672, 246, 2736);
   } else {
    ___assert_fail(2712, 2672, 259, 2736);
   }
   HEAPF32[i5 >> 2] = d7;
   HEAP16[i5 + 4 >> 1] = i9;
   i6 = 0;
   do {
    HEAP8[i5 + i6 + 6 | 0] = HEAP32[i4 + (i6 * 36 | 0) + 28 >> 2];
    HEAP8[i5 + i6 + 9 | 0] = HEAP32[i4 + (i6 * 36 | 0) + 32 >> 2];
    i6 = i6 + 1 | 0;
   } while ((i6 | 0) < (i9 | 0));
   if ((HEAP8[i3 + 88 | 0] | 0) == 0) {
    STACKTOP = i1;
    return;
   }
   d7 = +HEAPF32[i3 + 24 >> 2];
   d16 = +HEAPF32[i3 + 52 >> 2];
   d18 = +HEAPF32[i15 >> 2];
   d17 = d7 + d16;
   if (!(d18 > d17 & d18 > 1.1920928955078125e-7)) {
    d44 = +((+HEAPF32[i2 >> 2] + +HEAPF32[i14 >> 2]) * .5);
    d45 = +((+HEAPF32[i13 >> 2] + +HEAPF32[i12 >> 2]) * .5);
    i46 = i2;
    HEAPF32[i46 >> 2] = d44;
    HEAPF32[i46 + 4 >> 2] = d45;
    i46 = i14;
    HEAPF32[i46 >> 2] = d44;
    HEAPF32[i46 + 4 >> 2] = d45;
    HEAPF32[i15 >> 2] = 0.0;
    STACKTOP = i1;
    return;
   }
   HEAPF32[i15 >> 2] = d18 - d17;
   d18 = +HEAPF32[i14 >> 2];
   d21 = +HEAPF32[i2 >> 2];
   d24 = d18 - d21;
   d17 = +HEAPF32[i12 >> 2];
   d19 = +HEAPF32[i13 >> 2];
   d22 = d17 - d19;
   d25 = +Math_sqrt(+(d24 * d24 + d22 * d22));
   if (!(d25 < 1.1920928955078125e-7)) {
    d45 = 1.0 / d25;
    d24 = d24 * d45;
    d22 = d22 * d45;
   }
   HEAPF32[i2 >> 2] = d7 * d24 + d21;
   HEAPF32[i13 >> 2] = d7 * d22 + d19;
   HEAPF32[i14 >> 2] = d18 - d16 * d24;
   HEAPF32[i12 >> 2] = d17 - d16 * d22;
   STACKTOP = i1;
   return;
  }
 } else if ((i31 | 0) == 0) {
  ___assert_fail(2712, 2672, 194, 2856);
 } else {
  ___assert_fail(2712, 2672, 207, 2856);
 }
}
function __ZN8b2Island5SolveEP9b2ProfileRK10b2TimeStepRK6b2Vec2b(i4, i8, i11, i17, i7) {
 i4 = i4 | 0;
 i8 = i8 | 0;
 i11 = i11 | 0;
 i17 = i17 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, d5 = 0.0, i6 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i18 = 0, i19 = 0, i20 = 0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, i30 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 160 | 0;
 i6 = i3 + 128 | 0;
 i9 = i3 + 148 | 0;
 i10 = i3 + 96 | 0;
 i16 = i3 + 52 | 0;
 i2 = i3;
 __ZN7b2TimerC2Ev(i9);
 d5 = +HEAPF32[i11 >> 2];
 i1 = i4 + 28 | 0;
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i13 = i4 + 8 | 0;
  i12 = i17 + 4 | 0;
  i15 = i4 + 20 | 0;
  i14 = i4 + 24 | 0;
  i19 = 0;
  do {
   i22 = HEAP32[(HEAP32[i13 >> 2] | 0) + (i19 << 2) >> 2] | 0;
   i18 = i22 + 44 | 0;
   i20 = HEAP32[i18 >> 2] | 0;
   i18 = HEAP32[i18 + 4 >> 2] | 0;
   d21 = +HEAPF32[i22 + 56 >> 2];
   i30 = i22 + 64 | 0;
   d27 = +HEAPF32[i30 >> 2];
   d24 = +HEAPF32[i30 + 4 >> 2];
   d23 = +HEAPF32[i22 + 72 >> 2];
   i30 = i22 + 36 | 0;
   HEAP32[i30 >> 2] = i20;
   HEAP32[i30 + 4 >> 2] = i18;
   HEAPF32[i22 + 52 >> 2] = d21;
   if ((HEAP32[i22 >> 2] | 0) == 2) {
    d25 = +HEAPF32[i22 + 140 >> 2];
    d26 = +HEAPF32[i22 + 120 >> 2];
    d28 = 1.0 - d5 * +HEAPF32[i22 + 132 >> 2];
    d28 = d28 < 1.0 ? d28 : 1.0;
    d28 = d28 < 0.0 ? 0.0 : d28;
    d29 = 1.0 - d5 * +HEAPF32[i22 + 136 >> 2];
    d29 = d29 < 1.0 ? d29 : 1.0;
    d27 = (d27 + d5 * (d25 * +HEAPF32[i17 >> 2] + d26 * +HEAPF32[i22 + 76 >> 2])) * d28;
    d24 = (d24 + d5 * (d25 * +HEAPF32[i12 >> 2] + d26 * +HEAPF32[i22 + 80 >> 2])) * d28;
    d23 = (d23 + d5 * +HEAPF32[i22 + 128 >> 2] * +HEAPF32[i22 + 84 >> 2]) * (d29 < 0.0 ? 0.0 : d29);
   }
   i30 = (HEAP32[i15 >> 2] | 0) + (i19 * 12 | 0) | 0;
   HEAP32[i30 >> 2] = i20;
   HEAP32[i30 + 4 >> 2] = i18;
   HEAPF32[(HEAP32[i15 >> 2] | 0) + (i19 * 12 | 0) + 8 >> 2] = d21;
   d28 = +d27;
   d29 = +d24;
   i30 = (HEAP32[i14 >> 2] | 0) + (i19 * 12 | 0) | 0;
   HEAPF32[i30 >> 2] = d28;
   HEAPF32[i30 + 4 >> 2] = d29;
   HEAPF32[(HEAP32[i14 >> 2] | 0) + (i19 * 12 | 0) + 8 >> 2] = d23;
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i1 >> 2] | 0));
 } else {
  i14 = i4 + 24 | 0;
  i15 = i4 + 20 | 0;
 }
 HEAP32[i10 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i10 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i10 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 i22 = HEAP32[i15 >> 2] | 0;
 HEAP32[i10 + 24 >> 2] = i22;
 i30 = HEAP32[i14 >> 2] | 0;
 HEAP32[i10 + 28 >> 2] = i30;
 HEAP32[i16 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i16 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i16 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i16 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i16 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i16 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 i13 = i4 + 12 | 0;
 HEAP32[i16 + 24 >> 2] = HEAP32[i13 >> 2];
 i12 = i4 + 36 | 0;
 HEAP32[i16 + 28 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i16 + 32 >> 2] = i22;
 HEAP32[i16 + 36 >> 2] = i30;
 HEAP32[i16 + 40 >> 2] = HEAP32[i4 >> 2];
 __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i2, i16);
 __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i2);
 if ((HEAP8[i11 + 20 | 0] | 0) != 0) {
  __ZN15b2ContactSolver9WarmStartEv(i2);
 }
 i16 = i4 + 32 | 0;
 if ((HEAP32[i16 >> 2] | 0) > 0) {
  i18 = i4 + 16 | 0;
  i17 = 0;
  do {
   i30 = HEAP32[(HEAP32[i18 >> 2] | 0) + (i17 << 2) >> 2] | 0;
   FUNCTION_TABLE_vii[HEAP32[(HEAP32[i30 >> 2] | 0) + 28 >> 2] & 15](i30, i10);
   i17 = i17 + 1 | 0;
  } while ((i17 | 0) < (HEAP32[i16 >> 2] | 0));
 }
 HEAPF32[i8 + 12 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 i17 = i11 + 12 | 0;
 if ((HEAP32[i17 >> 2] | 0) > 0) {
  i20 = i4 + 16 | 0;
  i19 = 0;
  do {
   if ((HEAP32[i16 >> 2] | 0) > 0) {
    i18 = 0;
    do {
     i30 = HEAP32[(HEAP32[i20 >> 2] | 0) + (i18 << 2) >> 2] | 0;
     FUNCTION_TABLE_vii[HEAP32[(HEAP32[i30 >> 2] | 0) + 32 >> 2] & 15](i30, i10);
     i18 = i18 + 1 | 0;
    } while ((i18 | 0) < (HEAP32[i16 >> 2] | 0));
   }
   __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i2);
   i19 = i19 + 1 | 0;
  } while ((i19 | 0) < (HEAP32[i17 >> 2] | 0));
 }
 __ZN15b2ContactSolver13StoreImpulsesEv(i2);
 HEAPF32[i8 + 16 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i19 = HEAP32[i14 >> 2] | 0;
  i18 = 0;
  do {
   i30 = HEAP32[i15 >> 2] | 0;
   i17 = i30 + (i18 * 12 | 0) | 0;
   i22 = i17;
   d23 = +HEAPF32[i22 >> 2];
   d21 = +HEAPF32[i22 + 4 >> 2];
   d24 = +HEAPF32[i30 + (i18 * 12 | 0) + 8 >> 2];
   i30 = i19 + (i18 * 12 | 0) | 0;
   d26 = +HEAPF32[i30 >> 2];
   d27 = +HEAPF32[i30 + 4 >> 2];
   d25 = +HEAPF32[i19 + (i18 * 12 | 0) + 8 >> 2];
   d29 = d5 * d26;
   d28 = d5 * d27;
   d28 = d29 * d29 + d28 * d28;
   if (d28 > 4.0) {
    d29 = 2.0 / +Math_sqrt(+d28);
    d26 = d26 * d29;
    d27 = d27 * d29;
   }
   d28 = d5 * d25;
   if (d28 * d28 > 2.4674012660980225) {
    if (!(d28 > 0.0)) {
     d28 = -d28;
    }
    d25 = d25 * (1.5707963705062866 / d28);
   }
   d29 = +(d23 + d5 * d26);
   d28 = +(d21 + d5 * d27);
   i19 = i17;
   HEAPF32[i19 >> 2] = d29;
   HEAPF32[i19 + 4 >> 2] = d28;
   HEAPF32[(HEAP32[i15 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2] = d24 + d5 * d25;
   d28 = +d26;
   d29 = +d27;
   i19 = (HEAP32[i14 >> 2] | 0) + (i18 * 12 | 0) | 0;
   HEAPF32[i19 >> 2] = d28;
   HEAPF32[i19 + 4 >> 2] = d29;
   i19 = HEAP32[i14 >> 2] | 0;
   HEAPF32[i19 + (i18 * 12 | 0) + 8 >> 2] = d25;
   i18 = i18 + 1 | 0;
  } while ((i18 | 0) < (HEAP32[i1 >> 2] | 0));
 }
 i11 = i11 + 16 | 0;
 L41 : do {
  if ((HEAP32[i11 >> 2] | 0) > 0) {
   i17 = i4 + 16 | 0;
   i19 = 0;
   while (1) {
    i18 = __ZN15b2ContactSolver24SolvePositionConstraintsEv(i2) | 0;
    if ((HEAP32[i16 >> 2] | 0) > 0) {
     i20 = 0;
     i22 = 1;
     do {
      i30 = HEAP32[(HEAP32[i17 >> 2] | 0) + (i20 << 2) >> 2] | 0;
      i22 = i22 & (FUNCTION_TABLE_iii[HEAP32[(HEAP32[i30 >> 2] | 0) + 36 >> 2] & 3](i30, i10) | 0);
      i20 = i20 + 1 | 0;
     } while ((i20 | 0) < (HEAP32[i16 >> 2] | 0));
    } else {
     i22 = 1;
    }
    i19 = i19 + 1 | 0;
    if (i18 & i22) {
     i10 = 0;
     break L41;
    }
    if ((i19 | 0) >= (HEAP32[i11 >> 2] | 0)) {
     i10 = 1;
     break;
    }
   }
  } else {
   i10 = 1;
  }
 } while (0);
 if ((HEAP32[i1 >> 2] | 0) > 0) {
  i11 = i4 + 8 | 0;
  i16 = 0;
  do {
   i30 = HEAP32[(HEAP32[i11 >> 2] | 0) + (i16 << 2) >> 2] | 0;
   i22 = (HEAP32[i15 >> 2] | 0) + (i16 * 12 | 0) | 0;
   i20 = HEAP32[i22 >> 2] | 0;
   i22 = HEAP32[i22 + 4 >> 2] | 0;
   i17 = i30 + 44 | 0;
   HEAP32[i17 >> 2] = i20;
   HEAP32[i17 + 4 >> 2] = i22;
   d27 = +HEAPF32[(HEAP32[i15 >> 2] | 0) + (i16 * 12 | 0) + 8 >> 2];
   HEAPF32[i30 + 56 >> 2] = d27;
   i17 = (HEAP32[i14 >> 2] | 0) + (i16 * 12 | 0) | 0;
   i18 = HEAP32[i17 + 4 >> 2] | 0;
   i19 = i30 + 64 | 0;
   HEAP32[i19 >> 2] = HEAP32[i17 >> 2];
   HEAP32[i19 + 4 >> 2] = i18;
   HEAPF32[i30 + 72 >> 2] = +HEAPF32[(HEAP32[i14 >> 2] | 0) + (i16 * 12 | 0) + 8 >> 2];
   d25 = +Math_sin(+d27);
   HEAPF32[i30 + 20 >> 2] = d25;
   d27 = +Math_cos(+d27);
   HEAPF32[i30 + 24 >> 2] = d27;
   d26 = +HEAPF32[i30 + 28 >> 2];
   d29 = +HEAPF32[i30 + 32 >> 2];
   d28 = (HEAP32[tempDoublePtr >> 2] = i20, +HEAPF32[tempDoublePtr >> 2]) - (d27 * d26 - d25 * d29);
   d29 = (HEAP32[tempDoublePtr >> 2] = i22, +HEAPF32[tempDoublePtr >> 2]) - (d25 * d26 + d27 * d29);
   d28 = +d28;
   d29 = +d29;
   i30 = i30 + 12 | 0;
   HEAPF32[i30 >> 2] = d28;
   HEAPF32[i30 + 4 >> 2] = d29;
   i16 = i16 + 1 | 0;
  } while ((i16 | 0) < (HEAP32[i1 >> 2] | 0));
 }
 HEAPF32[i8 + 20 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i9);
 i9 = HEAP32[i2 + 40 >> 2] | 0;
 i8 = i4 + 4 | 0;
 if ((HEAP32[i8 >> 2] | 0) != 0 ? (HEAP32[i12 >> 2] | 0) > 0 : 0) {
  i11 = i6 + 16 | 0;
  i14 = 0;
  do {
   i15 = HEAP32[(HEAP32[i13 >> 2] | 0) + (i14 << 2) >> 2] | 0;
   i16 = HEAP32[i9 + (i14 * 152 | 0) + 144 >> 2] | 0;
   HEAP32[i11 >> 2] = i16;
   if ((i16 | 0) > 0) {
    i17 = 0;
    do {
     HEAPF32[i6 + (i17 << 2) >> 2] = +HEAPF32[i9 + (i14 * 152 | 0) + (i17 * 36 | 0) + 16 >> 2];
     HEAPF32[i6 + (i17 << 2) + 8 >> 2] = +HEAPF32[i9 + (i14 * 152 | 0) + (i17 * 36 | 0) + 20 >> 2];
     i17 = i17 + 1 | 0;
    } while ((i17 | 0) != (i16 | 0));
   }
   i30 = HEAP32[i8 >> 2] | 0;
   FUNCTION_TABLE_viii[HEAP32[(HEAP32[i30 >> 2] | 0) + 20 >> 2] & 3](i30, i15, i6);
   i14 = i14 + 1 | 0;
  } while ((i14 | 0) < (HEAP32[i12 >> 2] | 0));
 }
 if (!i7) {
  __ZN15b2ContactSolverD2Ev(i2);
  STACKTOP = i3;
  return;
 }
 i7 = HEAP32[i1 >> 2] | 0;
 i6 = (i7 | 0) > 0;
 if (i6) {
  i8 = HEAP32[i4 + 8 >> 2] | 0;
  i9 = 0;
  d21 = 3.4028234663852886e+38;
  do {
   i11 = HEAP32[i8 + (i9 << 2) >> 2] | 0;
   do {
    if ((HEAP32[i11 >> 2] | 0) != 0) {
     if ((!((HEAP16[i11 + 4 >> 1] & 4) == 0) ? (d29 = +HEAPF32[i11 + 72 >> 2], !(d29 * d29 > .001218469929881394)) : 0) ? (d28 = +HEAPF32[i11 + 64 >> 2], d29 = +HEAPF32[i11 + 68 >> 2], !(d28 * d28 + d29 * d29 > 9999999747378752.0e-20)) : 0) {
      i30 = i11 + 144 | 0;
      d23 = d5 + +HEAPF32[i30 >> 2];
      HEAPF32[i30 >> 2] = d23;
      d21 = d21 < d23 ? d21 : d23;
      break;
     }
     HEAPF32[i11 + 144 >> 2] = 0.0;
     d21 = 0.0;
    }
   } while (0);
   i9 = i9 + 1 | 0;
  } while ((i9 | 0) < (i7 | 0));
 } else {
  d21 = 3.4028234663852886e+38;
 }
 if (!(d21 >= .5) | i10 | i6 ^ 1) {
  __ZN15b2ContactSolverD2Ev(i2);
  STACKTOP = i3;
  return;
 }
 i4 = i4 + 8 | 0;
 i6 = 0;
 do {
  i30 = HEAP32[(HEAP32[i4 >> 2] | 0) + (i6 << 2) >> 2] | 0;
  i22 = i30 + 4 | 0;
  HEAP16[i22 >> 1] = HEAP16[i22 >> 1] & 65533;
  HEAPF32[i30 + 144 >> 2] = 0.0;
  i30 = i30 + 64 | 0;
  HEAP32[i30 + 0 >> 2] = 0;
  HEAP32[i30 + 4 >> 2] = 0;
  HEAP32[i30 + 8 >> 2] = 0;
  HEAP32[i30 + 12 >> 2] = 0;
  HEAP32[i30 + 16 >> 2] = 0;
  HEAP32[i30 + 20 >> 2] = 0;
  i6 = i6 + 1 | 0;
 } while ((i6 | 0) < (HEAP32[i1 >> 2] | 0));
 __ZN15b2ContactSolverD2Ev(i2);
 STACKTOP = i3;
 return;
}
function __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, i32 = 0, i33 = 0, d34 = 0.0, d35 = 0.0, d36 = 0.0, d37 = 0.0, d38 = 0.0, d39 = 0.0, d40 = 0.0, i41 = 0, i42 = 0, d43 = 0.0, d44 = 0.0;
 i1 = STACKTOP;
 i2 = i4 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 40 | 0;
 i4 = i4 + 28 | 0;
 i42 = HEAP32[i4 >> 2] | 0;
 i5 = 0;
 L4 : while (1) {
  i19 = HEAP32[i3 >> 2] | 0;
  i22 = i19 + (i5 * 152 | 0) | 0;
  i8 = HEAP32[i19 + (i5 * 152 | 0) + 112 >> 2] | 0;
  i6 = HEAP32[i19 + (i5 * 152 | 0) + 116 >> 2] | 0;
  d12 = +HEAPF32[i19 + (i5 * 152 | 0) + 120 >> 2];
  d10 = +HEAPF32[i19 + (i5 * 152 | 0) + 128 >> 2];
  d11 = +HEAPF32[i19 + (i5 * 152 | 0) + 124 >> 2];
  d9 = +HEAPF32[i19 + (i5 * 152 | 0) + 132 >> 2];
  i32 = i19 + (i5 * 152 | 0) + 144 | 0;
  i33 = HEAP32[i32 >> 2] | 0;
  i7 = i42 + (i8 * 12 | 0) | 0;
  i41 = i7;
  d21 = +HEAPF32[i41 >> 2];
  d20 = +HEAPF32[i41 + 4 >> 2];
  i41 = i42 + (i6 * 12 | 0) | 0;
  d14 = +HEAPF32[i41 >> 2];
  d13 = +HEAPF32[i41 + 4 >> 2];
  i41 = i19 + (i5 * 152 | 0) + 72 | 0;
  d17 = +HEAPF32[i41 >> 2];
  d16 = +HEAPF32[i41 + 4 >> 2];
  d23 = -d17;
  d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 136 >> 2];
  if ((i33 + -1 | 0) >>> 0 < 2) {
   i41 = 0;
   d18 = +HEAPF32[i42 + (i8 * 12 | 0) + 8 >> 2];
   d15 = +HEAPF32[i42 + (i6 * 12 | 0) + 8 >> 2];
  } else {
   i2 = 4;
   break;
  }
  do {
   d30 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 12 >> 2];
   d25 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 8 >> 2];
   d26 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 4 >> 2];
   d27 = +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) >> 2];
   d34 = d24 * +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 16 >> 2];
   i42 = i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 20 | 0;
   d28 = +HEAPF32[i42 >> 2];
   d31 = d28 - +HEAPF32[i19 + (i5 * 152 | 0) + (i41 * 36 | 0) + 28 >> 2] * (d16 * (d14 - d15 * d30 - d21 + d18 * d26) + (d13 + d15 * d25 - d20 - d18 * d27) * d23);
   d29 = -d34;
   d31 = d31 < d34 ? d31 : d34;
   d40 = d31 < d29 ? d29 : d31;
   d39 = d40 - d28;
   HEAPF32[i42 >> 2] = d40;
   d40 = d16 * d39;
   d39 = d39 * d23;
   d21 = d21 - d12 * d40;
   d20 = d20 - d12 * d39;
   d18 = d18 - d10 * (d27 * d39 - d26 * d40);
   d14 = d14 + d11 * d40;
   d13 = d13 + d11 * d39;
   d15 = d15 + d9 * (d25 * d39 - d30 * d40);
   i41 = i41 + 1 | 0;
  } while ((i41 | 0) != (i33 | 0));
  do {
   if ((HEAP32[i32 >> 2] | 0) != 1) {
    i32 = i19 + (i5 * 152 | 0) + 16 | 0;
    d31 = +HEAPF32[i32 >> 2];
    i33 = i19 + (i5 * 152 | 0) + 52 | 0;
    d34 = +HEAPF32[i33 >> 2];
    if (!(d31 >= 0.0) | !(d34 >= 0.0)) {
     i2 = 9;
     break L4;
    }
    d23 = +HEAPF32[i19 + (i5 * 152 | 0) + 12 >> 2];
    d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 8 >> 2];
    d26 = +HEAPF32[i19 + (i5 * 152 | 0) + 4 >> 2];
    d30 = +HEAPF32[i22 >> 2];
    d27 = +HEAPF32[i19 + (i5 * 152 | 0) + 48 >> 2];
    d25 = +HEAPF32[i19 + (i5 * 152 | 0) + 44 >> 2];
    d28 = +HEAPF32[i19 + (i5 * 152 | 0) + 40 >> 2];
    d29 = +HEAPF32[i19 + (i5 * 152 | 0) + 36 >> 2];
    d37 = +HEAPF32[i19 + (i5 * 152 | 0) + 104 >> 2];
    d38 = +HEAPF32[i19 + (i5 * 152 | 0) + 100 >> 2];
    d35 = d17 * (d14 - d15 * d23 - d21 + d18 * d26) + d16 * (d13 + d15 * d24 - d20 - d18 * d30) - +HEAPF32[i19 + (i5 * 152 | 0) + 32 >> 2] - (d31 * +HEAPF32[i19 + (i5 * 152 | 0) + 96 >> 2] + d34 * d37);
    d36 = d17 * (d14 - d15 * d27 - d21 + d18 * d28) + d16 * (d13 + d15 * d25 - d20 - d18 * d29) - +HEAPF32[i19 + (i5 * 152 | 0) + 68 >> 2] - (d31 * d38 + d34 * +HEAPF32[i19 + (i5 * 152 | 0) + 108 >> 2]);
    d44 = +HEAPF32[i19 + (i5 * 152 | 0) + 80 >> 2] * d35 + +HEAPF32[i19 + (i5 * 152 | 0) + 88 >> 2] * d36;
    d43 = d35 * +HEAPF32[i19 + (i5 * 152 | 0) + 84 >> 2] + d36 * +HEAPF32[i19 + (i5 * 152 | 0) + 92 >> 2];
    d40 = -d44;
    d39 = -d43;
    if (!(!(d44 <= -0.0) | !(d43 <= -0.0))) {
     d37 = d40 - d31;
     d43 = d39 - d34;
     d38 = d17 * d37;
     d37 = d16 * d37;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d35 = d38 + d44;
     d36 = d37 + d43;
     HEAPF32[i32 >> 2] = d40;
     HEAPF32[i33 >> 2] = d39;
     d21 = d21 - d12 * d35;
     d20 = d20 - d12 * d36;
     d14 = d14 + d11 * d35;
     d13 = d13 + d11 * d36;
     d18 = d18 - d10 * (d30 * d37 - d26 * d38 + (d29 * d43 - d28 * d44));
     d15 = d15 + d9 * (d24 * d37 - d23 * d38 + (d25 * d43 - d27 * d44));
     break;
    }
    d44 = d35 * +HEAPF32[i19 + (i5 * 152 | 0) + 24 >> 2];
    d39 = -d44;
    if (d44 <= -0.0 ? d36 + d38 * d39 >= 0.0 : 0) {
     d38 = d39 - d31;
     d43 = 0.0 - d34;
     d40 = d17 * d38;
     d38 = d16 * d38;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d36 = d44 + d40;
     d37 = d43 + d38;
     HEAPF32[i32 >> 2] = d39;
     HEAPF32[i33 >> 2] = 0.0;
     d21 = d21 - d12 * d36;
     d20 = d20 - d12 * d37;
     d14 = d14 + d11 * d36;
     d13 = d13 + d11 * d37;
     d18 = d18 - d10 * (d38 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d38 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
     break;
    }
    d44 = d36 * +HEAPF32[i19 + (i5 * 152 | 0) + 60 >> 2];
    d38 = -d44;
    if (d44 <= -0.0 ? d35 + d37 * d38 >= 0.0 : 0) {
     d39 = 0.0 - d31;
     d43 = d38 - d34;
     d40 = d17 * d39;
     d39 = d16 * d39;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d36 = d40 + d44;
     d37 = d39 + d43;
     HEAPF32[i32 >> 2] = 0.0;
     HEAPF32[i33 >> 2] = d38;
     d21 = d21 - d12 * d36;
     d20 = d20 - d12 * d37;
     d14 = d14 + d11 * d36;
     d13 = d13 + d11 * d37;
     d18 = d18 - d10 * (d39 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d39 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
     break;
    }
    if (!(!(d35 >= 0.0) | !(d36 >= 0.0))) {
     d39 = 0.0 - d31;
     d43 = 0.0 - d34;
     d40 = d17 * d39;
     d39 = d16 * d39;
     d44 = d17 * d43;
     d43 = d16 * d43;
     d37 = d40 + d44;
     d38 = d39 + d43;
     HEAPF32[i32 >> 2] = 0.0;
     HEAPF32[i33 >> 2] = 0.0;
     d21 = d21 - d12 * d37;
     d20 = d20 - d12 * d38;
     d14 = d14 + d11 * d37;
     d13 = d13 + d11 * d38;
     d18 = d18 - d10 * (d39 * d30 - d40 * d26 + (d43 * d29 - d44 * d28));
     d15 = d15 + d9 * (d39 * d24 - d40 * d23 + (d43 * d25 - d44 * d27));
    }
   } else {
    d23 = +HEAPF32[i19 + (i5 * 152 | 0) + 12 >> 2];
    d24 = +HEAPF32[i19 + (i5 * 152 | 0) + 8 >> 2];
    d25 = +HEAPF32[i19 + (i5 * 152 | 0) + 4 >> 2];
    d26 = +HEAPF32[i22 >> 2];
    i22 = i19 + (i5 * 152 | 0) + 16 | 0;
    d27 = +HEAPF32[i22 >> 2];
    d28 = d27 - +HEAPF32[i19 + (i5 * 152 | 0) + 24 >> 2] * (d17 * (d14 - d15 * d23 - d21 + d18 * d25) + d16 * (d13 + d15 * d24 - d20 - d18 * d26) - +HEAPF32[i19 + (i5 * 152 | 0) + 32 >> 2]);
    d44 = d28 > 0.0 ? d28 : 0.0;
    d43 = d44 - d27;
    HEAPF32[i22 >> 2] = d44;
    d44 = d17 * d43;
    d43 = d16 * d43;
    d21 = d21 - d12 * d44;
    d20 = d20 - d12 * d43;
    d14 = d14 + d11 * d44;
    d13 = d13 + d11 * d43;
    d18 = d18 - d10 * (d26 * d43 - d25 * d44);
    d15 = d15 + d9 * (d24 * d43 - d23 * d44);
   }
  } while (0);
  d44 = +d21;
  d43 = +d20;
  i42 = i7;
  HEAPF32[i42 >> 2] = d44;
  HEAPF32[i42 + 4 >> 2] = d43;
  i42 = HEAP32[i4 >> 2] | 0;
  HEAPF32[i42 + (i8 * 12 | 0) + 8 >> 2] = d18;
  d43 = +d14;
  d44 = +d13;
  i42 = i42 + (i6 * 12 | 0) | 0;
  HEAPF32[i42 >> 2] = d43;
  HEAPF32[i42 + 4 >> 2] = d44;
  i42 = HEAP32[i4 >> 2] | 0;
  HEAPF32[i42 + (i6 * 12 | 0) + 8 >> 2] = d15;
  i5 = i5 + 1 | 0;
  if ((i5 | 0) >= (HEAP32[i2 >> 2] | 0)) {
   i2 = 21;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6648, 6520, 311, 6688);
 } else if ((i2 | 0) == 9) {
  ___assert_fail(6720, 6520, 406, 6688);
 } else if ((i2 | 0) == 21) {
  STACKTOP = i1;
  return;
 }
}
function __Z14b2TimeOfImpactP11b2TOIOutputPK10b2TOIInput(i3, i11) {
 i3 = i3 | 0;
 i11 = i11 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0, d14 = 0.0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, d28 = 0.0, i29 = 0, d30 = 0.0, d31 = 0.0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, i39 = 0, d40 = 0.0, i41 = 0, d42 = 0.0, d43 = 0.0, i44 = 0, i45 = 0, d46 = 0.0, i47 = 0, d48 = 0.0, d49 = 0.0, d50 = 0.0, d51 = 0.0, i52 = 0, d53 = 0.0, d54 = 0.0, d55 = 0.0, d56 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 320 | 0;
 i12 = i1 + 276 | 0;
 i10 = i1 + 240 | 0;
 i13 = i1 + 228 | 0;
 i5 = i1 + 136 | 0;
 i7 = i1 + 112 | 0;
 i8 = i1 + 8 | 0;
 i9 = i1 + 4 | 0;
 i4 = i1;
 HEAP32[874] = (HEAP32[874] | 0) + 1;
 HEAP32[i3 >> 2] = 0;
 i19 = i11 + 128 | 0;
 i2 = i3 + 4 | 0;
 HEAPF32[i2 >> 2] = +HEAPF32[i19 >> 2];
 i6 = i11 + 28 | 0;
 i16 = i12 + 0 | 0;
 i15 = i11 + 56 | 0;
 i17 = i16 + 36 | 0;
 do {
  HEAP32[i16 >> 2] = HEAP32[i15 >> 2];
  i16 = i16 + 4 | 0;
  i15 = i15 + 4 | 0;
 } while ((i16 | 0) < (i17 | 0));
 i16 = i10 + 0 | 0;
 i15 = i11 + 92 | 0;
 i17 = i16 + 36 | 0;
 do {
  HEAP32[i16 >> 2] = HEAP32[i15 >> 2];
  i16 = i16 + 4 | 0;
  i15 = i15 + 4 | 0;
 } while ((i16 | 0) < (i17 | 0));
 i15 = i12 + 24 | 0;
 d42 = +HEAPF32[i15 >> 2];
 d43 = +Math_floor(+(d42 / 6.2831854820251465)) * 6.2831854820251465;
 d42 = d42 - d43;
 HEAPF32[i15 >> 2] = d42;
 i16 = i12 + 28 | 0;
 d43 = +HEAPF32[i16 >> 2] - d43;
 HEAPF32[i16 >> 2] = d43;
 i17 = i10 + 24 | 0;
 d46 = +HEAPF32[i17 >> 2];
 d40 = +Math_floor(+(d46 / 6.2831854820251465)) * 6.2831854820251465;
 d46 = d46 - d40;
 HEAPF32[i17 >> 2] = d46;
 i18 = i10 + 28 | 0;
 d40 = +HEAPF32[i18 >> 2] - d40;
 HEAPF32[i18 >> 2] = d40;
 d14 = +HEAPF32[i19 >> 2];
 d28 = +HEAPF32[i11 + 24 >> 2] + +HEAPF32[i11 + 52 >> 2] + -.014999999664723873;
 d28 = d28 < .004999999888241291 ? .004999999888241291 : d28;
 if (!(d28 > .0012499999720603228)) {
  ___assert_fail(3536, 3560, 280, 3600);
 }
 HEAP16[i13 + 4 >> 1] = 0;
 HEAP32[i5 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i5 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i5 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i5 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 HEAP32[i5 + 24 >> 2] = HEAP32[i11 + 24 >> 2];
 i38 = i5 + 28 | 0;
 HEAP32[i38 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
 HEAP32[i38 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
 HEAP32[i38 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
 HEAP32[i38 + 12 >> 2] = HEAP32[i6 + 12 >> 2];
 HEAP32[i38 + 16 >> 2] = HEAP32[i6 + 16 >> 2];
 HEAP32[i38 + 20 >> 2] = HEAP32[i6 + 20 >> 2];
 HEAP32[i38 + 24 >> 2] = HEAP32[i6 + 24 >> 2];
 HEAP8[i5 + 88 | 0] = 0;
 i38 = i12 + 8 | 0;
 i27 = i12 + 12 | 0;
 i29 = i12 + 16 | 0;
 i22 = i12 + 20 | 0;
 i32 = i12 + 4 | 0;
 i34 = i10 + 8 | 0;
 i36 = i10 + 12 | 0;
 i35 = i10 + 16 | 0;
 i37 = i10 + 20 | 0;
 i33 = i10 + 4 | 0;
 i26 = i5 + 56 | 0;
 i25 = i5 + 64 | 0;
 i24 = i5 + 68 | 0;
 i23 = i5 + 72 | 0;
 i20 = i5 + 80 | 0;
 i19 = i5 + 84 | 0;
 i21 = i7 + 16 | 0;
 d30 = d28 + .0012499999720603228;
 d31 = d28 + -.0012499999720603228;
 d48 = d40;
 i39 = 0;
 d40 = 0.0;
 L4 : while (1) {
  d56 = 1.0 - d40;
  d49 = d56 * d42 + d40 * d43;
  d43 = +Math_sin(+d49);
  d49 = +Math_cos(+d49);
  d55 = +HEAPF32[i12 >> 2];
  d54 = +HEAPF32[i32 >> 2];
  d42 = d56 * d46 + d40 * d48;
  d53 = +Math_sin(+d42);
  d42 = +Math_cos(+d42);
  d46 = +HEAPF32[i10 >> 2];
  d51 = +HEAPF32[i33 >> 2];
  d50 = d56 * +HEAPF32[i34 >> 2] + d40 * +HEAPF32[i35 >> 2] - (d42 * d46 - d53 * d51);
  d51 = d56 * +HEAPF32[i36 >> 2] + d40 * +HEAPF32[i37 >> 2] - (d53 * d46 + d42 * d51);
  d46 = +(d56 * +HEAPF32[i38 >> 2] + d40 * +HEAPF32[i29 >> 2] - (d49 * d55 - d43 * d54));
  d48 = +(d56 * +HEAPF32[i27 >> 2] + d40 * +HEAPF32[i22 >> 2] - (d43 * d55 + d49 * d54));
  i52 = i26;
  HEAPF32[i52 >> 2] = d46;
  HEAPF32[i52 + 4 >> 2] = d48;
  HEAPF32[i25 >> 2] = d43;
  HEAPF32[i24 >> 2] = d49;
  d50 = +d50;
  d51 = +d51;
  i52 = i23;
  HEAPF32[i52 >> 2] = d50;
  HEAPF32[i52 + 4 >> 2] = d51;
  HEAPF32[i20 >> 2] = d53;
  HEAPF32[i19 >> 2] = d42;
  __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i7, i13, i5);
  d42 = +HEAPF32[i21 >> 2];
  if (d42 <= 0.0) {
   i4 = 5;
   break;
  }
  if (d42 < d30) {
   i4 = 7;
   break;
  }
  +__ZN20b2SeparationFunction10InitializeEPK14b2SimplexCachePK15b2DistanceProxyRK7b2SweepS5_S8_f(i8, i13, i11, i12, i6, i10, d40);
  i41 = 0;
  d42 = d14;
  do {
   d50 = +__ZNK20b2SeparationFunction17FindMinSeparationEPiS0_f(i8, i9, i4, d42);
   if (d50 > d30) {
    i4 = 10;
    break L4;
   }
   if (d50 > d31) {
    d40 = d42;
    break;
   }
   i45 = HEAP32[i9 >> 2] | 0;
   i44 = HEAP32[i4 >> 2] | 0;
   d48 = +__ZNK20b2SeparationFunction8EvaluateEiif(i8, i45, i44, d40);
   if (d48 < d31) {
    i4 = 13;
    break L4;
   }
   if (!(d48 <= d30)) {
    d43 = d40;
    d46 = d42;
    i47 = 0;
   } else {
    i4 = 15;
    break L4;
   }
   while (1) {
    if ((i47 & 1 | 0) == 0) {
     d49 = (d43 + d46) * .5;
    } else {
     d49 = d43 + (d28 - d48) * (d46 - d43) / (d50 - d48);
    }
    d51 = +__ZNK20b2SeparationFunction8EvaluateEiif(i8, i45, i44, d49);
    d53 = d51 - d28;
    if (!(d53 > 0.0)) {
     d53 = -d53;
    }
    if (d53 < .0012499999720603228) {
     d42 = d49;
     break;
    }
    i52 = d51 > d28;
    i47 = i47 + 1 | 0;
    HEAP32[880] = (HEAP32[880] | 0) + 1;
    if ((i47 | 0) == 50) {
     i47 = 50;
     break;
    } else {
     d43 = i52 ? d49 : d43;
     d46 = i52 ? d46 : d49;
     d48 = i52 ? d51 : d48;
     d50 = i52 ? d50 : d51;
    }
   }
   i44 = HEAP32[882] | 0;
   HEAP32[882] = (i44 | 0) > (i47 | 0) ? i44 : i47;
   i41 = i41 + 1 | 0;
  } while ((i41 | 0) != 8);
  i39 = i39 + 1 | 0;
  HEAP32[876] = (HEAP32[876] | 0) + 1;
  if ((i39 | 0) == 20) {
   i4 = 27;
   break;
  }
  d42 = +HEAPF32[i15 >> 2];
  d43 = +HEAPF32[i16 >> 2];
  d46 = +HEAPF32[i17 >> 2];
  d48 = +HEAPF32[i18 >> 2];
 }
 if ((i4 | 0) == 5) {
  HEAP32[i3 >> 2] = 2;
  HEAPF32[i2 >> 2] = 0.0;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 7) {
  HEAP32[i3 >> 2] = 3;
  HEAPF32[i2 >> 2] = d40;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 } else if ((i4 | 0) == 10) {
  HEAP32[i3 >> 2] = 4;
  HEAPF32[i2 >> 2] = d14;
 } else if ((i4 | 0) == 13) {
  HEAP32[i3 >> 2] = 1;
  HEAPF32[i2 >> 2] = d40;
 } else if ((i4 | 0) == 15) {
  HEAP32[i3 >> 2] = 3;
  HEAPF32[i2 >> 2] = d40;
 } else if ((i4 | 0) == 27) {
  HEAP32[i3 >> 2] = 1;
  HEAPF32[i2 >> 2] = d40;
  i39 = 20;
  i2 = HEAP32[878] | 0;
  i52 = (i2 | 0) > (i39 | 0);
  i52 = i52 ? i2 : i39;
  HEAP32[878] = i52;
  STACKTOP = i1;
  return;
 }
 HEAP32[876] = (HEAP32[876] | 0) + 1;
 i39 = i39 + 1 | 0;
 i2 = HEAP32[878] | 0;
 i52 = (i2 | 0) > (i39 | 0);
 i52 = i52 ? i2 : i39;
 HEAP32[878] = i52;
 STACKTOP = i1;
 return;
}
function __ZN7b2World5SolveERK10b2TimeStep(i5, i15) {
 i5 = i5 | 0;
 i15 = i15 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, d39 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 96 | 0;
 i4 = i3 + 32 | 0;
 i9 = i3;
 i2 = i3 + 84 | 0;
 i11 = i5 + 103008 | 0;
 HEAPF32[i11 >> 2] = 0.0;
 i14 = i5 + 103012 | 0;
 HEAPF32[i14 >> 2] = 0.0;
 i8 = i5 + 103016 | 0;
 HEAPF32[i8 >> 2] = 0.0;
 i16 = i5 + 102960 | 0;
 i1 = i5 + 102872 | 0;
 i6 = i5 + 68 | 0;
 __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i4, HEAP32[i16 >> 2] | 0, HEAP32[i5 + 102936 >> 2] | 0, HEAP32[i5 + 102964 >> 2] | 0, i6, HEAP32[i5 + 102944 >> 2] | 0);
 i7 = i5 + 102952 | 0;
 i17 = HEAP32[i7 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   i38 = i17 + 4 | 0;
   HEAP16[i38 >> 1] = HEAP16[i38 >> 1] & 65534;
   i17 = HEAP32[i17 + 96 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i17 = HEAP32[i5 + 102932 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   i38 = i17 + 4 | 0;
   HEAP32[i38 >> 2] = HEAP32[i38 >> 2] & -2;
   i17 = HEAP32[i17 + 12 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i17 = HEAP32[i5 + 102956 >> 2] | 0;
 if ((i17 | 0) != 0) {
  do {
   HEAP8[i17 + 60 | 0] = 0;
   i17 = HEAP32[i17 + 12 >> 2] | 0;
  } while ((i17 | 0) != 0);
 }
 i24 = HEAP32[i16 >> 2] | 0;
 i16 = __ZN16b2StackAllocator8AllocateEi(i6, i24 << 2) | 0;
 i32 = HEAP32[i7 >> 2] | 0;
 L13 : do {
  if ((i32 | 0) != 0) {
   i18 = i4 + 28 | 0;
   i30 = i4 + 36 | 0;
   i27 = i4 + 32 | 0;
   i17 = i4 + 40 | 0;
   i23 = i4 + 8 | 0;
   i29 = i4 + 48 | 0;
   i28 = i4 + 16 | 0;
   i26 = i4 + 44 | 0;
   i31 = i4 + 12 | 0;
   i25 = i5 + 102968 | 0;
   i22 = i5 + 102976 | 0;
   i21 = i9 + 12 | 0;
   i20 = i9 + 16 | 0;
   i19 = i9 + 20 | 0;
   L15 : while (1) {
    i33 = i32 + 4 | 0;
    i34 = HEAP16[i33 >> 1] | 0;
    if ((i34 & 35) == 34 ? (HEAP32[i32 >> 2] | 0) != 0 : 0) {
     HEAP32[i18 >> 2] = 0;
     HEAP32[i30 >> 2] = 0;
     HEAP32[i27 >> 2] = 0;
     HEAP32[i16 >> 2] = i32;
     HEAP16[i33 >> 1] = i34 & 65535 | 1;
     i35 = 1;
     do {
      i35 = i35 + -1 | 0;
      i33 = HEAP32[i16 + (i35 << 2) >> 2] | 0;
      i34 = i33 + 4 | 0;
      i36 = HEAP16[i34 >> 1] | 0;
      if ((i36 & 32) == 0) {
       i8 = 13;
       break L15;
      }
      i37 = HEAP32[i18 >> 2] | 0;
      if ((i37 | 0) >= (HEAP32[i17 >> 2] | 0)) {
       i8 = 15;
       break L15;
      }
      HEAP32[i33 + 8 >> 2] = i37;
      i38 = HEAP32[i18 >> 2] | 0;
      HEAP32[(HEAP32[i23 >> 2] | 0) + (i38 << 2) >> 2] = i33;
      HEAP32[i18 >> 2] = i38 + 1;
      i36 = i36 & 65535;
      if ((i36 & 2 | 0) == 0) {
       HEAP16[i34 >> 1] = i36 | 2;
       HEAPF32[i33 + 144 >> 2] = 0.0;
      }
      if ((HEAP32[i33 >> 2] | 0) != 0) {
       i34 = HEAP32[i33 + 112 >> 2] | 0;
       if ((i34 | 0) != 0) {
        do {
         i38 = HEAP32[i34 + 4 >> 2] | 0;
         i36 = i38 + 4 | 0;
         if (((HEAP32[i36 >> 2] & 7 | 0) == 6 ? (HEAP8[(HEAP32[i38 + 48 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) ? (HEAP8[(HEAP32[i38 + 52 >> 2] | 0) + 38 | 0] | 0) == 0 : 0) {
          i37 = HEAP32[i30 >> 2] | 0;
          if ((i37 | 0) >= (HEAP32[i26 >> 2] | 0)) {
           i8 = 25;
           break L15;
          }
          HEAP32[i30 >> 2] = i37 + 1;
          HEAP32[(HEAP32[i31 >> 2] | 0) + (i37 << 2) >> 2] = i38;
          HEAP32[i36 >> 2] = HEAP32[i36 >> 2] | 1;
          i38 = HEAP32[i34 >> 2] | 0;
          i36 = i38 + 4 | 0;
          i37 = HEAP16[i36 >> 1] | 0;
          if ((i37 & 1) == 0) {
           if ((i35 | 0) >= (i24 | 0)) {
            i8 = 28;
            break L15;
           }
           HEAP32[i16 + (i35 << 2) >> 2] = i38;
           HEAP16[i36 >> 1] = i37 & 65535 | 1;
           i35 = i35 + 1 | 0;
          }
         }
         i34 = HEAP32[i34 + 12 >> 2] | 0;
        } while ((i34 | 0) != 0);
       }
       i33 = HEAP32[i33 + 108 >> 2] | 0;
       if ((i33 | 0) != 0) {
        do {
         i37 = i33 + 4 | 0;
         i36 = HEAP32[i37 >> 2] | 0;
         if ((HEAP8[i36 + 60 | 0] | 0) == 0 ? (i10 = HEAP32[i33 >> 2] | 0, i13 = i10 + 4 | 0, i12 = HEAP16[i13 >> 1] | 0, !((i12 & 32) == 0)) : 0) {
          i34 = HEAP32[i27 >> 2] | 0;
          if ((i34 | 0) >= (HEAP32[i29 >> 2] | 0)) {
           i8 = 35;
           break L15;
          }
          HEAP32[i27 >> 2] = i34 + 1;
          HEAP32[(HEAP32[i28 >> 2] | 0) + (i34 << 2) >> 2] = i36;
          HEAP8[(HEAP32[i37 >> 2] | 0) + 60 | 0] = 1;
          if ((i12 & 1) == 0) {
           if ((i35 | 0) >= (i24 | 0)) {
            i8 = 38;
            break L15;
           }
           HEAP32[i16 + (i35 << 2) >> 2] = i10;
           HEAP16[i13 >> 1] = i12 & 65535 | 1;
           i35 = i35 + 1 | 0;
          }
         }
         i33 = HEAP32[i33 + 12 >> 2] | 0;
        } while ((i33 | 0) != 0);
       }
      }
     } while ((i35 | 0) > 0);
     __ZN8b2Island5SolveEP9b2ProfileRK10b2TimeStepRK6b2Vec2b(i4, i9, i15, i25, (HEAP8[i22] | 0) != 0);
     HEAPF32[i11 >> 2] = +HEAPF32[i21 >> 2] + +HEAPF32[i11 >> 2];
     HEAPF32[i14 >> 2] = +HEAPF32[i20 >> 2] + +HEAPF32[i14 >> 2];
     HEAPF32[i8 >> 2] = +HEAPF32[i19 >> 2] + +HEAPF32[i8 >> 2];
     i35 = HEAP32[i18 >> 2] | 0;
     if ((i35 | 0) > 0) {
      i33 = HEAP32[i23 >> 2] | 0;
      i36 = 0;
      do {
       i34 = HEAP32[i33 + (i36 << 2) >> 2] | 0;
       if ((HEAP32[i34 >> 2] | 0) == 0) {
        i38 = i34 + 4 | 0;
        HEAP16[i38 >> 1] = HEAP16[i38 >> 1] & 65534;
       }
       i36 = i36 + 1 | 0;
      } while ((i36 | 0) < (i35 | 0));
     }
    }
    i32 = HEAP32[i32 + 96 >> 2] | 0;
    if ((i32 | 0) == 0) {
     break L13;
    }
   }
   if ((i8 | 0) == 13) {
    ___assert_fail(2232, 2184, 445, 2256);
   } else if ((i8 | 0) == 15) {
    ___assert_fail(2520, 2440, 54, 2472);
   } else if ((i8 | 0) == 25) {
    ___assert_fail(2480, 2440, 62, 2472);
   } else if ((i8 | 0) == 28) {
    ___assert_fail(2264, 2184, 495, 2256);
   } else if ((i8 | 0) == 35) {
    ___assert_fail(2408, 2440, 68, 2472);
   } else if ((i8 | 0) == 38) {
    ___assert_fail(2264, 2184, 524, 2256);
   }
  }
 } while (0);
 __ZN16b2StackAllocator4FreeEPv(i6, i16);
 __ZN7b2TimerC2Ev(i2);
 i6 = HEAP32[i7 >> 2] | 0;
 if ((i6 | 0) == 0) {
  __ZN16b2ContactManager15FindNewContactsEv(i1);
  d39 = +__ZNK7b2Timer15GetMillisecondsEv(i2);
  i38 = i5 + 103020 | 0;
  HEAPF32[i38 >> 2] = d39;
  __ZN8b2IslandD2Ev(i4);
  STACKTOP = i3;
  return;
 }
 do {
  if (!((HEAP16[i6 + 4 >> 1] & 1) == 0) ? (HEAP32[i6 >> 2] | 0) != 0 : 0) {
   __ZN6b2Body19SynchronizeFixturesEv(i6);
  }
  i6 = HEAP32[i6 + 96 >> 2] | 0;
 } while ((i6 | 0) != 0);
 __ZN16b2ContactManager15FindNewContactsEv(i1);
 d39 = +__ZNK7b2Timer15GetMillisecondsEv(i2);
 i38 = i5 + 103020 | 0;
 HEAPF32[i38 >> 2] = d39;
 __ZN8b2IslandD2Ev(i4);
 STACKTOP = i3;
 return;
}
function __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i10) {
 i10 = i10 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, i31 = 0, d32 = 0.0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, i42 = 0, d43 = 0.0, d44 = 0.0, d45 = 0.0, d46 = 0.0, d47 = 0.0, d48 = 0.0, i49 = 0, i50 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i8 = i1 + 40 | 0;
 i3 = i1 + 24 | 0;
 i5 = i1;
 i4 = i10 + 48 | 0;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i9 = i10 + 40 | 0;
 i2 = i10 + 36 | 0;
 i7 = i10 + 44 | 0;
 i6 = i10 + 24 | 0;
 i13 = i10 + 28 | 0;
 i14 = i8 + 8 | 0;
 i12 = i8 + 12 | 0;
 i11 = i3 + 8 | 0;
 i10 = i3 + 12 | 0;
 i16 = 0;
 while (1) {
  i15 = HEAP32[i9 >> 2] | 0;
  i33 = HEAP32[i2 >> 2] | 0;
  i31 = HEAP32[(HEAP32[i7 >> 2] | 0) + (HEAP32[i15 + (i16 * 152 | 0) + 148 >> 2] << 2) >> 2] | 0;
  i35 = HEAP32[i15 + (i16 * 152 | 0) + 112 >> 2] | 0;
  i42 = HEAP32[i15 + (i16 * 152 | 0) + 116 >> 2] | 0;
  d30 = +HEAPF32[i15 + (i16 * 152 | 0) + 120 >> 2];
  d24 = +HEAPF32[i15 + (i16 * 152 | 0) + 124 >> 2];
  d17 = +HEAPF32[i15 + (i16 * 152 | 0) + 128 >> 2];
  d18 = +HEAPF32[i15 + (i16 * 152 | 0) + 132 >> 2];
  i36 = i33 + (i16 * 88 | 0) + 48 | 0;
  d39 = +HEAPF32[i36 >> 2];
  d40 = +HEAPF32[i36 + 4 >> 2];
  i36 = i33 + (i16 * 88 | 0) + 56 | 0;
  d41 = +HEAPF32[i36 >> 2];
  d43 = +HEAPF32[i36 + 4 >> 2];
  i36 = HEAP32[i6 >> 2] | 0;
  i37 = i36 + (i35 * 12 | 0) | 0;
  d26 = +HEAPF32[i37 >> 2];
  d27 = +HEAPF32[i37 + 4 >> 2];
  d32 = +HEAPF32[i36 + (i35 * 12 | 0) + 8 >> 2];
  i37 = HEAP32[i13 >> 2] | 0;
  i34 = i37 + (i35 * 12 | 0) | 0;
  d22 = +HEAPF32[i34 >> 2];
  d25 = +HEAPF32[i34 + 4 >> 2];
  d23 = +HEAPF32[i37 + (i35 * 12 | 0) + 8 >> 2];
  i35 = i36 + (i42 * 12 | 0) | 0;
  d28 = +HEAPF32[i35 >> 2];
  d29 = +HEAPF32[i35 + 4 >> 2];
  d38 = +HEAPF32[i36 + (i42 * 12 | 0) + 8 >> 2];
  i36 = i37 + (i42 * 12 | 0) | 0;
  d20 = +HEAPF32[i36 >> 2];
  d19 = +HEAPF32[i36 + 4 >> 2];
  d21 = +HEAPF32[i37 + (i42 * 12 | 0) + 8 >> 2];
  if ((HEAP32[i31 + 124 >> 2] | 0) <= 0) {
   i2 = 4;
   break;
  }
  d44 = +HEAPF32[i33 + (i16 * 88 | 0) + 80 >> 2];
  d45 = +HEAPF32[i33 + (i16 * 88 | 0) + 76 >> 2];
  d47 = +Math_sin(+d32);
  HEAPF32[i14 >> 2] = d47;
  d48 = +Math_cos(+d32);
  HEAPF32[i12 >> 2] = d48;
  d32 = +Math_sin(+d38);
  HEAPF32[i11 >> 2] = d32;
  d38 = +Math_cos(+d38);
  HEAPF32[i10 >> 2] = d38;
  d46 = +(d26 - (d39 * d48 - d40 * d47));
  d40 = +(d27 - (d40 * d48 + d39 * d47));
  i37 = i8;
  HEAPF32[i37 >> 2] = d46;
  HEAPF32[i37 + 4 >> 2] = d40;
  d40 = +(d28 - (d41 * d38 - d43 * d32));
  d43 = +(d29 - (d43 * d38 + d41 * d32));
  i37 = i3;
  HEAPF32[i37 >> 2] = d40;
  HEAPF32[i37 + 4 >> 2] = d43;
  __ZN15b2WorldManifold10InitializeEPK10b2ManifoldRK11b2TransformfS5_f(i5, i31 + 64 | 0, i8, d45, i3, d44);
  i37 = i15 + (i16 * 152 | 0) + 72 | 0;
  i42 = i5;
  i33 = HEAP32[i42 + 4 >> 2] | 0;
  i31 = i37;
  HEAP32[i31 >> 2] = HEAP32[i42 >> 2];
  HEAP32[i31 + 4 >> 2] = i33;
  i31 = i15 + (i16 * 152 | 0) + 144 | 0;
  i33 = HEAP32[i31 >> 2] | 0;
  do {
   if ((i33 | 0) > 0) {
    i36 = i15 + (i16 * 152 | 0) + 76 | 0;
    d32 = d30 + d24;
    i35 = i15 + (i16 * 152 | 0) + 140 | 0;
    i34 = 0;
    do {
     i49 = i5 + (i34 << 3) + 8 | 0;
     d41 = +HEAPF32[i49 >> 2] - d26;
     i42 = i5 + (i34 << 3) + 12 | 0;
     d39 = +d41;
     d40 = +(+HEAPF32[i42 >> 2] - d27);
     i50 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) | 0;
     HEAPF32[i50 >> 2] = d39;
     HEAPF32[i50 + 4 >> 2] = d40;
     d40 = +HEAPF32[i49 >> 2] - d28;
     d39 = +d40;
     d47 = +(+HEAPF32[i42 >> 2] - d29);
     i42 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 8 | 0;
     HEAPF32[i42 >> 2] = d39;
     HEAPF32[i42 + 4 >> 2] = d47;
     d47 = +HEAPF32[i36 >> 2];
     d39 = +HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 4 >> 2];
     d43 = +HEAPF32[i37 >> 2];
     d48 = d41 * d47 - d39 * d43;
     d38 = +HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 12 >> 2];
     d43 = d47 * d40 - d43 * d38;
     d43 = d32 + d48 * d17 * d48 + d43 * d18 * d43;
     if (d43 > 0.0) {
      d43 = 1.0 / d43;
     } else {
      d43 = 0.0;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 24 >> 2] = d43;
     d43 = +HEAPF32[i36 >> 2];
     d47 = -+HEAPF32[i37 >> 2];
     d48 = d41 * d47 - d43 * d39;
     d43 = d40 * d47 - d43 * d38;
     d43 = d32 + d48 * d17 * d48 + d43 * d18 * d43;
     if (d43 > 0.0) {
      d43 = 1.0 / d43;
     } else {
      d43 = 0.0;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 28 >> 2] = d43;
     i42 = i15 + (i16 * 152 | 0) + (i34 * 36 | 0) + 32 | 0;
     HEAPF32[i42 >> 2] = 0.0;
     d38 = +HEAPF32[i37 >> 2] * (d20 - d21 * d38 - d22 + d23 * d39) + +HEAPF32[i36 >> 2] * (d19 + d21 * d40 - d25 - d23 * d41);
     if (d38 < -1.0) {
      HEAPF32[i42 >> 2] = -(d38 * +HEAPF32[i35 >> 2]);
     }
     i34 = i34 + 1 | 0;
    } while ((i34 | 0) != (i33 | 0));
    if ((HEAP32[i31 >> 2] | 0) == 2) {
     d45 = +HEAPF32[i15 + (i16 * 152 | 0) + 76 >> 2];
     d20 = +HEAPF32[i37 >> 2];
     d44 = +HEAPF32[i15 + (i16 * 152 | 0) >> 2] * d45 - +HEAPF32[i15 + (i16 * 152 | 0) + 4 >> 2] * d20;
     d19 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 8 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 12 >> 2];
     d47 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 36 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 40 >> 2];
     d20 = d45 * +HEAPF32[i15 + (i16 * 152 | 0) + 44 >> 2] - d20 * +HEAPF32[i15 + (i16 * 152 | 0) + 48 >> 2];
     d45 = d30 + d24;
     d46 = d17 * d44;
     d48 = d18 * d19;
     d19 = d45 + d44 * d46 + d19 * d48;
     d18 = d45 + d47 * d17 * d47 + d20 * d18 * d20;
     d17 = d45 + d46 * d47 + d48 * d20;
     d20 = d19 * d18 - d17 * d17;
     if (!(d19 * d19 < d20 * 1.0e3)) {
      HEAP32[i31 >> 2] = 1;
      break;
     }
     HEAPF32[i15 + (i16 * 152 | 0) + 96 >> 2] = d19;
     HEAPF32[i15 + (i16 * 152 | 0) + 100 >> 2] = d17;
     HEAPF32[i15 + (i16 * 152 | 0) + 104 >> 2] = d17;
     HEAPF32[i15 + (i16 * 152 | 0) + 108 >> 2] = d18;
     if (d20 != 0.0) {
      d20 = 1.0 / d20;
     }
     d48 = -(d20 * d17);
     HEAPF32[i15 + (i16 * 152 | 0) + 80 >> 2] = d18 * d20;
     HEAPF32[i15 + (i16 * 152 | 0) + 84 >> 2] = d48;
     HEAPF32[i15 + (i16 * 152 | 0) + 88 >> 2] = d48;
     HEAPF32[i15 + (i16 * 152 | 0) + 92 >> 2] = d19 * d20;
    }
   }
  } while (0);
  i16 = i16 + 1 | 0;
  if ((i16 | 0) >= (HEAP32[i4 >> 2] | 0)) {
   i2 = 21;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6584, 6520, 168, 6616);
 } else if ((i2 | 0) == 21) {
  STACKTOP = i1;
  return;
 }
}
function __Z17b2CollidePolygonsP10b2ManifoldPK14b2PolygonShapeRK11b2TransformS3_S6_(i5, i27, i28, i24, i14) {
 i5 = i5 | 0;
 i27 = i27 | 0;
 i28 = i28 | 0;
 i24 = i24 | 0;
 i14 = i14 | 0;
 var i1 = 0, i2 = 0, d3 = 0.0, i4 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d25 = 0.0, d26 = 0.0, d29 = 0.0, d30 = 0.0, i31 = 0, d32 = 0.0, i33 = 0, i34 = 0, d35 = 0.0, d36 = 0.0, d37 = 0.0, d38 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 96 | 0;
 i17 = i1 + 92 | 0;
 i20 = i1 + 88 | 0;
 i13 = i1;
 i11 = i1 + 80 | 0;
 i12 = i1 + 56 | 0;
 i4 = i1 + 32 | 0;
 i10 = i1 + 24 | 0;
 i2 = i5 + 60 | 0;
 HEAP32[i2 >> 2] = 0;
 d3 = +HEAPF32[i27 + 8 >> 2] + +HEAPF32[i24 + 8 >> 2];
 HEAP32[i17 >> 2] = 0;
 d7 = +__ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i17, i27, i28, i24, i14);
 if (d7 > d3) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i20 >> 2] = 0;
 d6 = +__ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i20, i24, i14, i27, i28);
 if (d6 > d3) {
  STACKTOP = i1;
  return;
 }
 if (d6 > d7 * .9800000190734863 + .0010000000474974513) {
  d18 = +HEAPF32[i14 >> 2];
  d19 = +HEAPF32[i14 + 4 >> 2];
  d15 = +HEAPF32[i14 + 8 >> 2];
  d16 = +HEAPF32[i14 + 12 >> 2];
  d9 = +HEAPF32[i28 >> 2];
  d6 = +HEAPF32[i28 + 4 >> 2];
  d7 = +HEAPF32[i28 + 8 >> 2];
  d8 = +HEAPF32[i28 + 12 >> 2];
  i17 = HEAP32[i20 >> 2] | 0;
  HEAP32[i5 + 56 >> 2] = 2;
  i14 = 1;
  i20 = i24;
 } else {
  d18 = +HEAPF32[i28 >> 2];
  d19 = +HEAPF32[i28 + 4 >> 2];
  d15 = +HEAPF32[i28 + 8 >> 2];
  d16 = +HEAPF32[i28 + 12 >> 2];
  d9 = +HEAPF32[i14 >> 2];
  d6 = +HEAPF32[i14 + 4 >> 2];
  d7 = +HEAPF32[i14 + 8 >> 2];
  d8 = +HEAPF32[i14 + 12 >> 2];
  i17 = HEAP32[i17 >> 2] | 0;
  HEAP32[i5 + 56 >> 2] = 1;
  i14 = 0;
  i20 = i27;
  i27 = i24;
 }
 i28 = HEAP32[i27 + 148 >> 2] | 0;
 if (!((i17 | 0) > -1)) {
  ___assert_fail(5640, 5688, 151, 5728);
 }
 i24 = HEAP32[i20 + 148 >> 2] | 0;
 if ((i24 | 0) <= (i17 | 0)) {
  ___assert_fail(5640, 5688, 151, 5728);
 }
 d21 = +HEAPF32[i20 + (i17 << 3) + 84 >> 2];
 d36 = +HEAPF32[i20 + (i17 << 3) + 88 >> 2];
 d22 = d16 * d21 - d15 * d36;
 d36 = d15 * d21 + d16 * d36;
 d21 = d8 * d22 + d7 * d36;
 d22 = d8 * d36 - d7 * d22;
 if ((i28 | 0) > 0) {
  i33 = 0;
  i34 = 0;
  d23 = 3.4028234663852886e+38;
  while (1) {
   d25 = d21 * +HEAPF32[i27 + (i33 << 3) + 84 >> 2] + d22 * +HEAPF32[i27 + (i33 << 3) + 88 >> 2];
   i31 = d25 < d23;
   i34 = i31 ? i33 : i34;
   i33 = i33 + 1 | 0;
   if ((i33 | 0) == (i28 | 0)) {
    break;
   } else {
    d23 = i31 ? d25 : d23;
   }
  }
 } else {
  i34 = 0;
 }
 i31 = i34 + 1 | 0;
 i33 = (i31 | 0) < (i28 | 0) ? i31 : 0;
 d35 = +HEAPF32[i27 + (i34 << 3) + 20 >> 2];
 d32 = +HEAPF32[i27 + (i34 << 3) + 24 >> 2];
 d36 = +(d9 + (d8 * d35 - d7 * d32));
 d32 = +(d6 + (d7 * d35 + d8 * d32));
 i31 = i13;
 HEAPF32[i31 >> 2] = d36;
 HEAPF32[i31 + 4 >> 2] = d32;
 i31 = i17 & 255;
 i28 = i13 + 8 | 0;
 HEAP8[i28] = i31;
 HEAP8[i28 + 1 | 0] = i34;
 HEAP8[i28 + 2 | 0] = 1;
 HEAP8[i28 + 3 | 0] = 0;
 d32 = +HEAPF32[i27 + (i33 << 3) + 20 >> 2];
 d36 = +HEAPF32[i27 + (i33 << 3) + 24 >> 2];
 d35 = +(d9 + (d8 * d32 - d7 * d36));
 d36 = +(d6 + (d7 * d32 + d8 * d36));
 i27 = i13 + 12 | 0;
 HEAPF32[i27 >> 2] = d35;
 HEAPF32[i27 + 4 >> 2] = d36;
 i27 = i13 + 20 | 0;
 HEAP8[i27] = i31;
 HEAP8[i27 + 1 | 0] = i33;
 HEAP8[i27 + 2 | 0] = 1;
 HEAP8[i27 + 3 | 0] = 0;
 i27 = i17 + 1 | 0;
 i24 = (i27 | 0) < (i24 | 0) ? i27 : 0;
 i34 = i20 + (i17 << 3) + 20 | 0;
 d26 = +HEAPF32[i34 >> 2];
 d25 = +HEAPF32[i34 + 4 >> 2];
 i34 = i20 + (i24 << 3) + 20 | 0;
 d30 = +HEAPF32[i34 >> 2];
 d29 = +HEAPF32[i34 + 4 >> 2];
 d32 = d30 - d26;
 d35 = d29 - d25;
 d21 = +Math_sqrt(+(d32 * d32 + d35 * d35));
 if (!(d21 < 1.1920928955078125e-7)) {
  d36 = 1.0 / d21;
  d32 = d32 * d36;
  d35 = d35 * d36;
 }
 d36 = d16 * d32 - d15 * d35;
 d21 = d16 * d35 + d15 * d32;
 HEAPF32[i11 >> 2] = d36;
 HEAPF32[i11 + 4 >> 2] = d21;
 d22 = -d36;
 d38 = d18 + (d16 * d26 - d15 * d25);
 d37 = d19 + (d15 * d26 + d16 * d25);
 d23 = d38 * d21 + d37 * d22;
 HEAPF32[i10 >> 2] = d22;
 HEAPF32[i10 + 4 >> 2] = -d21;
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i12, i13, i10, d3 - (d38 * d36 + d37 * d21), i17) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 if ((__Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i4, i12, i11, d3 + ((d18 + (d16 * d30 - d15 * d29)) * d36 + (d19 + (d15 * d30 + d16 * d29)) * d21), i24) | 0) < 2) {
  STACKTOP = i1;
  return;
 }
 d16 = +d35;
 d15 = +-d32;
 i10 = i5 + 40 | 0;
 HEAPF32[i10 >> 2] = d16;
 HEAPF32[i10 + 4 >> 2] = d15;
 d15 = +((d26 + d30) * .5);
 d16 = +((d25 + d29) * .5);
 i10 = i5 + 48 | 0;
 HEAPF32[i10 >> 2] = d15;
 HEAPF32[i10 + 4 >> 2] = d16;
 d16 = +HEAPF32[i4 >> 2];
 d15 = +HEAPF32[i4 + 4 >> 2];
 i10 = !(d21 * d16 + d15 * d22 - d23 <= d3);
 if (i14 << 24 >> 24 == 0) {
  if (i10) {
   i10 = 0;
  } else {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i10 = i5;
   HEAPF32[i10 >> 2] = d37;
   HEAPF32[i10 + 4 >> 2] = d38;
   HEAP32[i5 + 16 >> 2] = HEAP32[i4 + 8 >> 2];
   i10 = 1;
  }
  d16 = +HEAPF32[i4 + 12 >> 2];
  d15 = +HEAPF32[i4 + 16 >> 2];
  if (d21 * d16 + d15 * d22 - d23 <= d3) {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i34 = i5 + (i10 * 20 | 0) | 0;
   HEAPF32[i34 >> 2] = d37;
   HEAPF32[i34 + 4 >> 2] = d38;
   HEAP32[i5 + (i10 * 20 | 0) + 16 >> 2] = HEAP32[i4 + 20 >> 2];
   i10 = i10 + 1 | 0;
  }
 } else {
  if (i10) {
   i10 = 0;
  } else {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i10 = i5;
   HEAPF32[i10 >> 2] = d37;
   HEAPF32[i10 + 4 >> 2] = d38;
   i10 = i5 + 16 | 0;
   i34 = HEAP32[i4 + 8 >> 2] | 0;
   HEAP32[i10 >> 2] = i34;
   HEAP8[i10] = i34 >>> 8;
   HEAP8[i10 + 1 | 0] = i34;
   HEAP8[i10 + 2 | 0] = i34 >>> 24;
   HEAP8[i10 + 3 | 0] = i34 >>> 16;
   i10 = 1;
  }
  d16 = +HEAPF32[i4 + 12 >> 2];
  d15 = +HEAPF32[i4 + 16 >> 2];
  if (d21 * d16 + d15 * d22 - d23 <= d3) {
   d38 = d16 - d9;
   d36 = d15 - d6;
   d37 = +(d8 * d38 + d7 * d36);
   d38 = +(d8 * d36 - d7 * d38);
   i34 = i5 + (i10 * 20 | 0) | 0;
   HEAPF32[i34 >> 2] = d37;
   HEAPF32[i34 + 4 >> 2] = d38;
   i34 = i5 + (i10 * 20 | 0) + 16 | 0;
   i33 = HEAP32[i4 + 20 >> 2] | 0;
   HEAP32[i34 >> 2] = i33;
   HEAP8[i34] = i33 >>> 8;
   HEAP8[i34 + 1 | 0] = i33;
   HEAP8[i34 + 2 | 0] = i33 >>> 24;
   HEAP8[i34 + 3 | 0] = i33 >>> 16;
   i10 = i10 + 1 | 0;
  }
 }
 HEAP32[i2 >> 2] = i10;
 STACKTOP = i1;
 return;
}
function __ZN8b2Island8SolveTOIERK10b2TimeStepii(i4, i11, i15, i18) {
 i4 = i4 | 0;
 i11 = i11 | 0;
 i15 = i15 | 0;
 i18 = i18 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d16 = 0.0, d17 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, d26 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 128 | 0;
 i2 = i1 + 96 | 0;
 i10 = i1 + 52 | 0;
 i3 = i1;
 i6 = i4 + 28 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 if ((i5 | 0) <= (i15 | 0)) {
  ___assert_fail(5464, 5488, 386, 5520);
 }
 if ((i5 | 0) <= (i18 | 0)) {
  ___assert_fail(5536, 5488, 387, 5520);
 }
 if ((i5 | 0) > 0) {
  i9 = i4 + 8 | 0;
  i8 = i4 + 20 | 0;
  i7 = i4 + 24 | 0;
  i22 = 0;
  while (1) {
   i23 = HEAP32[(HEAP32[i9 >> 2] | 0) + (i22 << 2) >> 2] | 0;
   i5 = i23 + 44 | 0;
   i24 = HEAP32[i5 + 4 >> 2] | 0;
   i25 = (HEAP32[i8 >> 2] | 0) + (i22 * 12 | 0) | 0;
   HEAP32[i25 >> 2] = HEAP32[i5 >> 2];
   HEAP32[i25 + 4 >> 2] = i24;
   HEAPF32[(HEAP32[i8 >> 2] | 0) + (i22 * 12 | 0) + 8 >> 2] = +HEAPF32[i23 + 56 >> 2];
   i25 = i23 + 64 | 0;
   i24 = HEAP32[i25 + 4 >> 2] | 0;
   i5 = (HEAP32[i7 >> 2] | 0) + (i22 * 12 | 0) | 0;
   HEAP32[i5 >> 2] = HEAP32[i25 >> 2];
   HEAP32[i5 + 4 >> 2] = i24;
   i5 = HEAP32[i7 >> 2] | 0;
   HEAPF32[i5 + (i22 * 12 | 0) + 8 >> 2] = +HEAPF32[i23 + 72 >> 2];
   i22 = i22 + 1 | 0;
   if ((i22 | 0) >= (HEAP32[i6 >> 2] | 0)) {
    i22 = i5;
    break;
   }
  }
 } else {
  i8 = i4 + 20 | 0;
  i22 = HEAP32[i4 + 24 >> 2] | 0;
 }
 i5 = i4 + 12 | 0;
 HEAP32[i10 + 24 >> 2] = HEAP32[i5 >> 2];
 i7 = i4 + 36 | 0;
 HEAP32[i10 + 28 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i10 + 40 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i10 + 0 >> 2] = HEAP32[i11 + 0 >> 2];
 HEAP32[i10 + 4 >> 2] = HEAP32[i11 + 4 >> 2];
 HEAP32[i10 + 8 >> 2] = HEAP32[i11 + 8 >> 2];
 HEAP32[i10 + 12 >> 2] = HEAP32[i11 + 12 >> 2];
 HEAP32[i10 + 16 >> 2] = HEAP32[i11 + 16 >> 2];
 HEAP32[i10 + 20 >> 2] = HEAP32[i11 + 20 >> 2];
 HEAP32[i10 + 32 >> 2] = HEAP32[i8 >> 2];
 i9 = i4 + 24 | 0;
 HEAP32[i10 + 36 >> 2] = i22;
 __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i3, i10);
 i10 = i11 + 16 | 0;
 L13 : do {
  if ((HEAP32[i10 >> 2] | 0) > 0) {
   i22 = 0;
   do {
    i22 = i22 + 1 | 0;
    if (__ZN15b2ContactSolver27SolveTOIPositionConstraintsEii(i3, i15, i18) | 0) {
     break L13;
    }
   } while ((i22 | 0) < (HEAP32[i10 >> 2] | 0));
  }
 } while (0);
 i10 = i4 + 8 | 0;
 i24 = (HEAP32[i8 >> 2] | 0) + (i15 * 12 | 0) | 0;
 i25 = HEAP32[i24 + 4 >> 2] | 0;
 i23 = (HEAP32[(HEAP32[i10 >> 2] | 0) + (i15 << 2) >> 2] | 0) + 36 | 0;
 HEAP32[i23 >> 2] = HEAP32[i24 >> 2];
 HEAP32[i23 + 4 >> 2] = i25;
 i23 = HEAP32[i8 >> 2] | 0;
 i25 = HEAP32[i10 >> 2] | 0;
 HEAPF32[(HEAP32[i25 + (i15 << 2) >> 2] | 0) + 52 >> 2] = +HEAPF32[i23 + (i15 * 12 | 0) + 8 >> 2];
 i23 = i23 + (i18 * 12 | 0) | 0;
 i24 = HEAP32[i23 + 4 >> 2] | 0;
 i25 = (HEAP32[i25 + (i18 << 2) >> 2] | 0) + 36 | 0;
 HEAP32[i25 >> 2] = HEAP32[i23 >> 2];
 HEAP32[i25 + 4 >> 2] = i24;
 HEAPF32[(HEAP32[(HEAP32[i10 >> 2] | 0) + (i18 << 2) >> 2] | 0) + 52 >> 2] = +HEAPF32[(HEAP32[i8 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2];
 __ZN15b2ContactSolver29InitializeVelocityConstraintsEv(i3);
 i18 = i11 + 12 | 0;
 if ((HEAP32[i18 >> 2] | 0) > 0) {
  i15 = 0;
  do {
   __ZN15b2ContactSolver24SolveVelocityConstraintsEv(i3);
   i15 = i15 + 1 | 0;
  } while ((i15 | 0) < (HEAP32[i18 >> 2] | 0));
 }
 d16 = +HEAPF32[i11 >> 2];
 if ((HEAP32[i6 >> 2] | 0) > 0) {
  i15 = 0;
  do {
   i25 = HEAP32[i8 >> 2] | 0;
   i11 = i25 + (i15 * 12 | 0) | 0;
   i24 = i11;
   d12 = +HEAPF32[i24 >> 2];
   d14 = +HEAPF32[i24 + 4 >> 2];
   d13 = +HEAPF32[i25 + (i15 * 12 | 0) + 8 >> 2];
   i25 = HEAP32[i9 >> 2] | 0;
   i24 = i25 + (i15 * 12 | 0) | 0;
   d19 = +HEAPF32[i24 >> 2];
   d20 = +HEAPF32[i24 + 4 >> 2];
   d17 = +HEAPF32[i25 + (i15 * 12 | 0) + 8 >> 2];
   d26 = d16 * d19;
   d21 = d16 * d20;
   d21 = d26 * d26 + d21 * d21;
   if (d21 > 4.0) {
    d26 = 2.0 / +Math_sqrt(+d21);
    d19 = d19 * d26;
    d20 = d20 * d26;
   }
   d21 = d16 * d17;
   if (d21 * d21 > 2.4674012660980225) {
    if (!(d21 > 0.0)) {
     d21 = -d21;
    }
    d17 = d17 * (1.5707963705062866 / d21);
   }
   d21 = d12 + d16 * d19;
   d14 = d14 + d16 * d20;
   d26 = d13 + d16 * d17;
   d12 = +d21;
   d13 = +d14;
   i25 = i11;
   HEAPF32[i25 >> 2] = d12;
   HEAPF32[i25 + 4 >> 2] = d13;
   HEAPF32[(HEAP32[i8 >> 2] | 0) + (i15 * 12 | 0) + 8 >> 2] = d26;
   d19 = +d19;
   d20 = +d20;
   i25 = (HEAP32[i9 >> 2] | 0) + (i15 * 12 | 0) | 0;
   HEAPF32[i25 >> 2] = d19;
   HEAPF32[i25 + 4 >> 2] = d20;
   HEAPF32[(HEAP32[i9 >> 2] | 0) + (i15 * 12 | 0) + 8 >> 2] = d17;
   i25 = HEAP32[(HEAP32[i10 >> 2] | 0) + (i15 << 2) >> 2] | 0;
   i24 = i25 + 44 | 0;
   HEAPF32[i24 >> 2] = d12;
   HEAPF32[i24 + 4 >> 2] = d13;
   HEAPF32[i25 + 56 >> 2] = d26;
   i24 = i25 + 64 | 0;
   HEAPF32[i24 >> 2] = d19;
   HEAPF32[i24 + 4 >> 2] = d20;
   HEAPF32[i25 + 72 >> 2] = d17;
   d17 = +Math_sin(+d26);
   HEAPF32[i25 + 20 >> 2] = d17;
   d20 = +Math_cos(+d26);
   HEAPF32[i25 + 24 >> 2] = d20;
   d19 = +HEAPF32[i25 + 28 >> 2];
   d26 = +HEAPF32[i25 + 32 >> 2];
   d21 = +(d21 - (d20 * d19 - d17 * d26));
   d26 = +(d14 - (d17 * d19 + d20 * d26));
   i25 = i25 + 12 | 0;
   HEAPF32[i25 >> 2] = d21;
   HEAPF32[i25 + 4 >> 2] = d26;
   i15 = i15 + 1 | 0;
  } while ((i15 | 0) < (HEAP32[i6 >> 2] | 0));
 }
 i6 = HEAP32[i3 + 40 >> 2] | 0;
 i4 = i4 + 4 | 0;
 if ((HEAP32[i4 >> 2] | 0) == 0) {
  __ZN15b2ContactSolverD2Ev(i3);
  STACKTOP = i1;
  return;
 }
 if ((HEAP32[i7 >> 2] | 0) <= 0) {
  __ZN15b2ContactSolverD2Ev(i3);
  STACKTOP = i1;
  return;
 }
 i8 = i2 + 16 | 0;
 i9 = 0;
 do {
  i10 = HEAP32[(HEAP32[i5 >> 2] | 0) + (i9 << 2) >> 2] | 0;
  i11 = HEAP32[i6 + (i9 * 152 | 0) + 144 >> 2] | 0;
  HEAP32[i8 >> 2] = i11;
  if ((i11 | 0) > 0) {
   i15 = 0;
   do {
    HEAPF32[i2 + (i15 << 2) >> 2] = +HEAPF32[i6 + (i9 * 152 | 0) + (i15 * 36 | 0) + 16 >> 2];
    HEAPF32[i2 + (i15 << 2) + 8 >> 2] = +HEAPF32[i6 + (i9 * 152 | 0) + (i15 * 36 | 0) + 20 >> 2];
    i15 = i15 + 1 | 0;
   } while ((i15 | 0) != (i11 | 0));
  }
  i25 = HEAP32[i4 >> 2] | 0;
  FUNCTION_TABLE_viii[HEAP32[(HEAP32[i25 >> 2] | 0) + 20 >> 2] & 3](i25, i10, i2);
  i9 = i9 + 1 | 0;
 } while ((i9 | 0) < (HEAP32[i7 >> 2] | 0));
 __ZN15b2ContactSolverD2Ev(i3);
 STACKTOP = i1;
 return;
}
function __ZN20b2SeparationFunction10InitializeEPK14b2SimplexCachePK15b2DistanceProxyRK7b2SweepS5_S8_f(i2, i11, i13, i21, i12, i24, d9) {
 i2 = i2 | 0;
 i11 = i11 | 0;
 i13 = i13 | 0;
 i21 = i21 | 0;
 i12 = i12 | 0;
 i24 = i24 | 0;
 d9 = +d9;
 var i1 = 0, d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d10 = 0.0, i14 = 0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d22 = 0.0, i23 = 0, i25 = 0, i26 = 0, i27 = 0, d28 = 0.0, d29 = 0.0;
 i1 = STACKTOP;
 HEAP32[i2 >> 2] = i13;
 HEAP32[i2 + 4 >> 2] = i12;
 i14 = HEAP16[i11 + 4 >> 1] | 0;
 if (!(i14 << 16 >> 16 != 0 & (i14 & 65535) < 3)) {
  ___assert_fail(3744, 3560, 50, 3768);
 }
 i23 = i2 + 8 | 0;
 i25 = i23 + 0 | 0;
 i27 = i21 + 0 | 0;
 i26 = i25 + 36 | 0;
 do {
  HEAP32[i25 >> 2] = HEAP32[i27 >> 2];
  i25 = i25 + 4 | 0;
  i27 = i27 + 4 | 0;
 } while ((i25 | 0) < (i26 | 0));
 i21 = i2 + 44 | 0;
 i25 = i21 + 0 | 0;
 i27 = i24 + 0 | 0;
 i26 = i25 + 36 | 0;
 do {
  HEAP32[i25 >> 2] = HEAP32[i27 >> 2];
  i25 = i25 + 4 | 0;
  i27 = i27 + 4 | 0;
 } while ((i25 | 0) < (i26 | 0));
 d19 = 1.0 - d9;
 d4 = d19 * +HEAPF32[i2 + 32 >> 2] + +HEAPF32[i2 + 36 >> 2] * d9;
 d3 = +Math_sin(+d4);
 d4 = +Math_cos(+d4);
 d7 = +HEAPF32[i23 >> 2];
 d5 = +HEAPF32[i2 + 12 >> 2];
 d8 = d19 * +HEAPF32[i2 + 16 >> 2] + +HEAPF32[i2 + 24 >> 2] * d9 - (d4 * d7 - d3 * d5);
 d5 = d19 * +HEAPF32[i2 + 20 >> 2] + +HEAPF32[i2 + 28 >> 2] * d9 - (d3 * d7 + d4 * d5);
 d7 = d19 * +HEAPF32[i2 + 68 >> 2] + +HEAPF32[i2 + 72 >> 2] * d9;
 d6 = +Math_sin(+d7);
 d7 = +Math_cos(+d7);
 d20 = +HEAPF32[i21 >> 2];
 d22 = +HEAPF32[i2 + 48 >> 2];
 d10 = d19 * +HEAPF32[i2 + 52 >> 2] + +HEAPF32[i2 + 60 >> 2] * d9 - (d7 * d20 - d6 * d22);
 d9 = d19 * +HEAPF32[i2 + 56 >> 2] + +HEAPF32[i2 + 64 >> 2] * d9 - (d6 * d20 + d7 * d22);
 if (i14 << 16 >> 16 == 1) {
  HEAP32[i2 + 80 >> 2] = 0;
  i14 = HEAPU8[i11 + 6 | 0] | 0;
  if ((HEAP32[i13 + 20 >> 2] | 0) <= (i14 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i13 + 16 >> 2] | 0) + (i14 << 3) | 0;
  d15 = +HEAPF32[i27 >> 2];
  d16 = +HEAPF32[i27 + 4 >> 2];
  i11 = HEAPU8[i11 + 9 | 0] | 0;
  if ((HEAP32[i12 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i11 = (HEAP32[i12 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d20 = +HEAPF32[i11 >> 2];
  d22 = +HEAPF32[i11 + 4 >> 2];
  i11 = i2 + 92 | 0;
  d8 = d10 + (d7 * d20 - d6 * d22) - (d8 + (d4 * d15 - d3 * d16));
  d4 = d9 + (d6 * d20 + d7 * d22) - (d5 + (d3 * d15 + d4 * d16));
  d22 = +d8;
  d3 = +d4;
  i27 = i11;
  HEAPF32[i27 >> 2] = d22;
  HEAPF32[i27 + 4 >> 2] = d3;
  d3 = +Math_sqrt(+(d8 * d8 + d4 * d4));
  if (d3 < 1.1920928955078125e-7) {
   d22 = 0.0;
   STACKTOP = i1;
   return +d22;
  }
  d22 = 1.0 / d3;
  HEAPF32[i11 >> 2] = d8 * d22;
  HEAPF32[i2 + 96 >> 2] = d4 * d22;
  d22 = d3;
  STACKTOP = i1;
  return +d22;
 }
 i14 = i11 + 6 | 0;
 i21 = i11 + 7 | 0;
 i23 = i2 + 80 | 0;
 if ((HEAP8[i14] | 0) == (HEAP8[i21] | 0)) {
  HEAP32[i23 >> 2] = 2;
  i23 = HEAPU8[i11 + 9 | 0] | 0;
  i21 = HEAP32[i12 + 20 >> 2] | 0;
  if ((i21 | 0) <= (i23 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i12 = HEAP32[i12 + 16 >> 2] | 0;
  i27 = i12 + (i23 << 3) | 0;
  d16 = +HEAPF32[i27 >> 2];
  d15 = +HEAPF32[i27 + 4 >> 2];
  i11 = HEAPU8[i11 + 10 | 0] | 0;
  if ((i21 | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i11 = i12 + (i11 << 3) | 0;
  d20 = +HEAPF32[i11 >> 2];
  d18 = +HEAPF32[i11 + 4 >> 2];
  i11 = i2 + 92 | 0;
  d22 = d20 - d16;
  d19 = d18 - d15;
  d17 = -d22;
  d29 = +d19;
  d28 = +d17;
  i27 = i11;
  HEAPF32[i27 >> 2] = d29;
  HEAPF32[i27 + 4 >> 2] = d28;
  d22 = +Math_sqrt(+(d19 * d19 + d22 * d22));
  if (!(d22 < 1.1920928955078125e-7)) {
   d29 = 1.0 / d22;
   d19 = d19 * d29;
   HEAPF32[i11 >> 2] = d19;
   d17 = d29 * d17;
   HEAPF32[i2 + 96 >> 2] = d17;
  }
  d16 = (d16 + d20) * .5;
  d15 = (d15 + d18) * .5;
  d28 = +d16;
  d29 = +d15;
  i2 = i2 + 84 | 0;
  HEAPF32[i2 >> 2] = d28;
  HEAPF32[i2 + 4 >> 2] = d29;
  i2 = HEAPU8[i14] | 0;
  if ((HEAP32[i13 + 20 >> 2] | 0) <= (i2 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i13 + 16 >> 2] | 0) + (i2 << 3) | 0;
  d28 = +HEAPF32[i27 >> 2];
  d29 = +HEAPF32[i27 + 4 >> 2];
  d3 = (d7 * d19 - d6 * d17) * (d8 + (d4 * d28 - d3 * d29) - (d10 + (d7 * d16 - d6 * d15))) + (d6 * d19 + d7 * d17) * (d5 + (d3 * d28 + d4 * d29) - (d9 + (d6 * d16 + d7 * d15)));
  if (!(d3 < 0.0)) {
   d29 = d3;
   STACKTOP = i1;
   return +d29;
  }
  d28 = +-d19;
  d29 = +-d17;
  i27 = i11;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d29 = -d3;
  STACKTOP = i1;
  return +d29;
 } else {
  HEAP32[i23 >> 2] = 1;
  i23 = HEAPU8[i14] | 0;
  i14 = HEAP32[i13 + 20 >> 2] | 0;
  if ((i14 | 0) <= (i23 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i13 = HEAP32[i13 + 16 >> 2] | 0;
  i27 = i13 + (i23 << 3) | 0;
  d16 = +HEAPF32[i27 >> 2];
  d15 = +HEAPF32[i27 + 4 >> 2];
  i21 = HEAPU8[i21] | 0;
  if ((i14 | 0) <= (i21 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i13 = i13 + (i21 << 3) | 0;
  d20 = +HEAPF32[i13 >> 2];
  d18 = +HEAPF32[i13 + 4 >> 2];
  i13 = i2 + 92 | 0;
  d22 = d20 - d16;
  d19 = d18 - d15;
  d17 = -d22;
  d28 = +d19;
  d29 = +d17;
  i27 = i13;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d22 = +Math_sqrt(+(d19 * d19 + d22 * d22));
  if (!(d22 < 1.1920928955078125e-7)) {
   d29 = 1.0 / d22;
   d19 = d19 * d29;
   HEAPF32[i13 >> 2] = d19;
   d17 = d29 * d17;
   HEAPF32[i2 + 96 >> 2] = d17;
  }
  d16 = (d16 + d20) * .5;
  d15 = (d15 + d18) * .5;
  d28 = +d16;
  d29 = +d15;
  i2 = i2 + 84 | 0;
  HEAPF32[i2 >> 2] = d28;
  HEAPF32[i2 + 4 >> 2] = d29;
  i2 = HEAPU8[i11 + 9 | 0] | 0;
  if ((HEAP32[i12 + 20 >> 2] | 0) <= (i2 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i12 + 16 >> 2] | 0) + (i2 << 3) | 0;
  d28 = +HEAPF32[i27 >> 2];
  d29 = +HEAPF32[i27 + 4 >> 2];
  d3 = (d4 * d19 - d3 * d17) * (d10 + (d7 * d28 - d6 * d29) - (d8 + (d4 * d16 - d3 * d15))) + (d3 * d19 + d4 * d17) * (d9 + (d6 * d28 + d7 * d29) - (d5 + (d3 * d16 + d4 * d15)));
  if (!(d3 < 0.0)) {
   d29 = d3;
   STACKTOP = i1;
   return +d29;
  }
  d28 = +-d19;
  d29 = +-d17;
  i27 = i13;
  HEAPF32[i27 >> 2] = d28;
  HEAPF32[i27 + 4 >> 2] = d29;
  d29 = -d3;
  STACKTOP = i1;
  return +d29;
 }
 return 0.0;
}
function __ZNK20b2SeparationFunction17FindMinSeparationEPiS0_f(i12, i10, i9, d5) {
 i12 = i12 | 0;
 i10 = i10 | 0;
 i9 = i9 | 0;
 d5 = +d5;
 var i1 = 0, d2 = 0.0, d3 = 0.0, d4 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d11 = 0.0, d13 = 0.0, d14 = 0.0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, d24 = 0.0, i25 = 0, i26 = 0, i27 = 0;
 i1 = STACKTOP;
 d21 = 1.0 - d5;
 d6 = d21 * +HEAPF32[i12 + 32 >> 2] + +HEAPF32[i12 + 36 >> 2] * d5;
 d7 = +Math_sin(+d6);
 d6 = +Math_cos(+d6);
 d3 = +HEAPF32[i12 + 8 >> 2];
 d8 = +HEAPF32[i12 + 12 >> 2];
 d11 = d21 * +HEAPF32[i12 + 16 >> 2] + +HEAPF32[i12 + 24 >> 2] * d5 - (d6 * d3 - d7 * d8);
 d8 = d21 * +HEAPF32[i12 + 20 >> 2] + +HEAPF32[i12 + 28 >> 2] * d5 - (d7 * d3 + d6 * d8);
 d3 = d21 * +HEAPF32[i12 + 68 >> 2] + +HEAPF32[i12 + 72 >> 2] * d5;
 d2 = +Math_sin(+d3);
 d3 = +Math_cos(+d3);
 d23 = +HEAPF32[i12 + 44 >> 2];
 d24 = +HEAPF32[i12 + 48 >> 2];
 d4 = d21 * +HEAPF32[i12 + 52 >> 2] + +HEAPF32[i12 + 60 >> 2] * d5 - (d3 * d23 - d2 * d24);
 d5 = d21 * +HEAPF32[i12 + 56 >> 2] + +HEAPF32[i12 + 64 >> 2] * d5 - (d2 * d23 + d3 * d24);
 i19 = HEAP32[i12 + 80 >> 2] | 0;
 if ((i19 | 0) == 1) {
  d23 = +HEAPF32[i12 + 92 >> 2];
  d14 = +HEAPF32[i12 + 96 >> 2];
  d13 = d6 * d23 - d7 * d14;
  d14 = d7 * d23 + d6 * d14;
  d23 = +HEAPF32[i12 + 84 >> 2];
  d24 = +HEAPF32[i12 + 88 >> 2];
  d11 = d11 + (d6 * d23 - d7 * d24);
  d6 = d8 + (d7 * d23 + d6 * d24);
  d7 = -d13;
  d24 = -d14;
  d8 = d3 * d7 + d2 * d24;
  d7 = d3 * d24 - d2 * d7;
  HEAP32[i10 >> 2] = -1;
  i25 = i12 + 4 | 0;
  i22 = HEAP32[i25 >> 2] | 0;
  i19 = HEAP32[i22 + 16 >> 2] | 0;
  i22 = HEAP32[i22 + 20 >> 2] | 0;
  if ((i22 | 0) > 1) {
   i10 = 0;
   d18 = d7 * +HEAPF32[i19 + 4 >> 2] + d8 * +HEAPF32[i19 >> 2];
   i12 = 1;
   while (1) {
    d17 = d8 * +HEAPF32[i19 + (i12 << 3) >> 2] + d7 * +HEAPF32[i19 + (i12 << 3) + 4 >> 2];
    i16 = d17 > d18;
    i10 = i16 ? i12 : i10;
    i12 = i12 + 1 | 0;
    if ((i12 | 0) == (i22 | 0)) {
     break;
    } else {
     d18 = i16 ? d17 : d18;
    }
   }
   HEAP32[i9 >> 2] = i10;
   if ((i10 | 0) > -1) {
    i15 = i10;
   } else {
    ___assert_fail(3640, 3672, 103, 3704);
   }
  } else {
   HEAP32[i9 >> 2] = 0;
   i15 = 0;
  }
  i9 = HEAP32[i25 >> 2] | 0;
  if ((HEAP32[i9 + 20 >> 2] | 0) <= (i15 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i9 + 16 >> 2] | 0) + (i15 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d13 * (d4 + (d3 * d23 - d2 * d24) - d11) + d14 * (d5 + (d2 * d23 + d3 * d24) - d6);
  STACKTOP = i1;
  return +d24;
 } else if ((i19 | 0) == 0) {
  d13 = +HEAPF32[i12 + 92 >> 2];
  d14 = +HEAPF32[i12 + 96 >> 2];
  d21 = d6 * d13 + d7 * d14;
  d24 = d6 * d14 - d7 * d13;
  d17 = -d13;
  d23 = -d14;
  d18 = d3 * d17 + d2 * d23;
  d17 = d3 * d23 - d2 * d17;
  i15 = HEAP32[i12 >> 2] | 0;
  i16 = HEAP32[i15 + 16 >> 2] | 0;
  i15 = i15 + 20 | 0;
  i19 = HEAP32[i15 >> 2] | 0;
  if ((i19 | 0) > 1) {
   i25 = 0;
   d23 = d24 * +HEAPF32[i16 + 4 >> 2] + d21 * +HEAPF32[i16 >> 2];
   i26 = 1;
   while (1) {
    d20 = d21 * +HEAPF32[i16 + (i26 << 3) >> 2] + d24 * +HEAPF32[i16 + (i26 << 3) + 4 >> 2];
    i22 = d20 > d23;
    i25 = i22 ? i26 : i25;
    i26 = i26 + 1 | 0;
    if ((i26 | 0) == (i19 | 0)) {
     break;
    } else {
     d23 = i22 ? d20 : d23;
    }
   }
  } else {
   i25 = 0;
  }
  HEAP32[i10 >> 2] = i25;
  i19 = HEAP32[i12 + 4 >> 2] | 0;
  i12 = HEAP32[i19 + 16 >> 2] | 0;
  i19 = i19 + 20 | 0;
  i25 = HEAP32[i19 >> 2] | 0;
  if ((i25 | 0) > 1) {
   i27 = 0;
   d20 = d17 * +HEAPF32[i12 + 4 >> 2] + d18 * +HEAPF32[i12 >> 2];
   i26 = 1;
   while (1) {
    d21 = d18 * +HEAPF32[i12 + (i26 << 3) >> 2] + d17 * +HEAPF32[i12 + (i26 << 3) + 4 >> 2];
    i22 = d21 > d20;
    i27 = i22 ? i26 : i27;
    i26 = i26 + 1 | 0;
    if ((i26 | 0) == (i25 | 0)) {
     break;
    } else {
     d20 = i22 ? d21 : d20;
    }
   }
  } else {
   i27 = 0;
  }
  HEAP32[i9 >> 2] = i27;
  i9 = HEAP32[i10 >> 2] | 0;
  if (!((i9 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i15 >> 2] | 0) <= (i9 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i26 = i16 + (i9 << 3) | 0;
  d18 = +HEAPF32[i26 >> 2];
  d17 = +HEAPF32[i26 + 4 >> 2];
  if (!((i27 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i19 >> 2] | 0) <= (i27 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = i12 + (i27 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d13 * (d4 + (d3 * d23 - d2 * d24) - (d11 + (d6 * d18 - d7 * d17))) + d14 * (d5 + (d2 * d23 + d3 * d24) - (d8 + (d7 * d18 + d6 * d17)));
  STACKTOP = i1;
  return +d24;
 } else if ((i19 | 0) == 2) {
  d23 = +HEAPF32[i12 + 92 >> 2];
  d13 = +HEAPF32[i12 + 96 >> 2];
  d14 = d3 * d23 - d2 * d13;
  d13 = d2 * d23 + d3 * d13;
  d23 = +HEAPF32[i12 + 84 >> 2];
  d24 = +HEAPF32[i12 + 88 >> 2];
  d4 = d4 + (d3 * d23 - d2 * d24);
  d2 = d5 + (d2 * d23 + d3 * d24);
  d3 = -d14;
  d24 = -d13;
  d5 = d6 * d3 + d7 * d24;
  d3 = d6 * d24 - d7 * d3;
  HEAP32[i9 >> 2] = -1;
  i22 = HEAP32[i12 >> 2] | 0;
  i15 = HEAP32[i22 + 16 >> 2] | 0;
  i22 = HEAP32[i22 + 20 >> 2] | 0;
  if ((i22 | 0) > 1) {
   i9 = 0;
   d17 = d3 * +HEAPF32[i15 + 4 >> 2] + d5 * +HEAPF32[i15 >> 2];
   i19 = 1;
   while (1) {
    d18 = d5 * +HEAPF32[i15 + (i19 << 3) >> 2] + d3 * +HEAPF32[i15 + (i19 << 3) + 4 >> 2];
    i25 = d18 > d17;
    i9 = i25 ? i19 : i9;
    i19 = i19 + 1 | 0;
    if ((i19 | 0) == (i22 | 0)) {
     break;
    } else {
     d17 = i25 ? d18 : d17;
    }
   }
   HEAP32[i10 >> 2] = i9;
   if ((i9 | 0) > -1) {
    i16 = i9;
   } else {
    ___assert_fail(3640, 3672, 103, 3704);
   }
  } else {
   HEAP32[i10 >> 2] = 0;
   i16 = 0;
  }
  i9 = HEAP32[i12 >> 2] | 0;
  if ((HEAP32[i9 + 20 >> 2] | 0) <= (i16 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i27 = (HEAP32[i9 + 16 >> 2] | 0) + (i16 << 3) | 0;
  d23 = +HEAPF32[i27 >> 2];
  d24 = +HEAPF32[i27 + 4 >> 2];
  d24 = d14 * (d11 + (d6 * d23 - d7 * d24) - d4) + d13 * (d8 + (d7 * d23 + d6 * d24) - d2);
  STACKTOP = i1;
  return +d24;
 } else {
  ___assert_fail(3616, 3560, 183, 3720);
 }
 return 0.0;
}
function __ZN13b2DynamicTree10InsertLeafEi(i3, i4) {
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0, i24 = 0;
 i1 = STACKTOP;
 i11 = i3 + 24 | 0;
 HEAP32[i11 >> 2] = (HEAP32[i11 >> 2] | 0) + 1;
 i11 = HEAP32[i3 >> 2] | 0;
 if ((i11 | 0) == -1) {
  HEAP32[i3 >> 2] = i4;
  HEAP32[(HEAP32[i3 + 4 >> 2] | 0) + (i4 * 36 | 0) + 20 >> 2] = -1;
  STACKTOP = i1;
  return;
 }
 i2 = i3 + 4 | 0;
 i9 = HEAP32[i2 >> 2] | 0;
 d8 = +HEAPF32[i9 + (i4 * 36 | 0) >> 2];
 d7 = +HEAPF32[i9 + (i4 * 36 | 0) + 4 >> 2];
 d6 = +HEAPF32[i9 + (i4 * 36 | 0) + 8 >> 2];
 d5 = +HEAPF32[i9 + (i4 * 36 | 0) + 12 >> 2];
 i10 = HEAP32[i9 + (i11 * 36 | 0) + 24 >> 2] | 0;
 L5 : do {
  if (!((i10 | 0) == -1)) {
   do {
    i12 = HEAP32[i9 + (i11 * 36 | 0) + 28 >> 2] | 0;
    d14 = +HEAPF32[i9 + (i11 * 36 | 0) + 8 >> 2];
    d15 = +HEAPF32[i9 + (i11 * 36 | 0) >> 2];
    d17 = +HEAPF32[i9 + (i11 * 36 | 0) + 12 >> 2];
    d16 = +HEAPF32[i9 + (i11 * 36 | 0) + 4 >> 2];
    d21 = ((d14 > d6 ? d14 : d6) - (d15 < d8 ? d15 : d8) + ((d17 > d5 ? d17 : d5) - (d16 < d7 ? d16 : d7))) * 2.0;
    d13 = d21 * 2.0;
    d14 = (d21 - (d14 - d15 + (d17 - d16)) * 2.0) * 2.0;
    d21 = +HEAPF32[i9 + (i10 * 36 | 0) >> 2];
    d16 = d8 < d21 ? d8 : d21;
    d17 = +HEAPF32[i9 + (i10 * 36 | 0) + 4 >> 2];
    d18 = d7 < d17 ? d7 : d17;
    d19 = +HEAPF32[i9 + (i10 * 36 | 0) + 8 >> 2];
    d20 = d6 > d19 ? d6 : d19;
    d15 = +HEAPF32[i9 + (i10 * 36 | 0) + 12 >> 2];
    d22 = d5 > d15 ? d5 : d15;
    if ((HEAP32[i9 + (i10 * 36 | 0) + 24 >> 2] | 0) == -1) {
     d15 = (d20 - d16 + (d22 - d18)) * 2.0;
    } else {
     d15 = (d20 - d16 + (d22 - d18)) * 2.0 - (d19 - d21 + (d15 - d17)) * 2.0;
    }
    d15 = d14 + d15;
    d17 = +HEAPF32[i9 + (i12 * 36 | 0) >> 2];
    d18 = d8 < d17 ? d8 : d17;
    d23 = +HEAPF32[i9 + (i12 * 36 | 0) + 4 >> 2];
    d22 = d7 < d23 ? d7 : d23;
    d21 = +HEAPF32[i9 + (i12 * 36 | 0) + 8 >> 2];
    d20 = d6 > d21 ? d6 : d21;
    d19 = +HEAPF32[i9 + (i12 * 36 | 0) + 12 >> 2];
    d16 = d5 > d19 ? d5 : d19;
    if ((HEAP32[i9 + (i12 * 36 | 0) + 24 >> 2] | 0) == -1) {
     d16 = (d20 - d18 + (d16 - d22)) * 2.0;
    } else {
     d16 = (d20 - d18 + (d16 - d22)) * 2.0 - (d21 - d17 + (d19 - d23)) * 2.0;
    }
    d14 = d14 + d16;
    if (d13 < d15 & d13 < d14) {
     break L5;
    }
    i11 = d15 < d14 ? i10 : i12;
    i10 = HEAP32[i9 + (i11 * 36 | 0) + 24 >> 2] | 0;
   } while (!((i10 | 0) == -1));
  }
 } while (0);
 i9 = HEAP32[i9 + (i11 * 36 | 0) + 20 >> 2] | 0;
 i10 = __ZN13b2DynamicTree12AllocateNodeEv(i3) | 0;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i12 + (i10 * 36 | 0) + 20 >> 2] = i9;
 HEAP32[i12 + (i10 * 36 | 0) + 16 >> 2] = 0;
 i12 = HEAP32[i2 >> 2] | 0;
 d14 = +HEAPF32[i12 + (i11 * 36 | 0) >> 2];
 d13 = +HEAPF32[i12 + (i11 * 36 | 0) + 4 >> 2];
 d8 = +(d8 < d14 ? d8 : d14);
 d7 = +(d7 < d13 ? d7 : d13);
 i24 = i12 + (i10 * 36 | 0) | 0;
 HEAPF32[i24 >> 2] = d8;
 HEAPF32[i24 + 4 >> 2] = d7;
 d8 = +HEAPF32[i12 + (i11 * 36 | 0) + 8 >> 2];
 d7 = +HEAPF32[i12 + (i11 * 36 | 0) + 12 >> 2];
 d6 = +(d6 > d8 ? d6 : d8);
 d23 = +(d5 > d7 ? d5 : d7);
 i12 = i12 + (i10 * 36 | 0) + 8 | 0;
 HEAPF32[i12 >> 2] = d6;
 HEAPF32[i12 + 4 >> 2] = d23;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i12 + (i10 * 36 | 0) + 32 >> 2] = (HEAP32[i12 + (i11 * 36 | 0) + 32 >> 2] | 0) + 1;
 if ((i9 | 0) == -1) {
  HEAP32[i12 + (i10 * 36 | 0) + 24 >> 2] = i11;
  HEAP32[i12 + (i10 * 36 | 0) + 28 >> 2] = i4;
  HEAP32[i12 + (i11 * 36 | 0) + 20 >> 2] = i10;
  i24 = i12 + (i4 * 36 | 0) + 20 | 0;
  HEAP32[i24 >> 2] = i10;
  HEAP32[i3 >> 2] = i10;
  i10 = HEAP32[i24 >> 2] | 0;
 } else {
  i24 = i12 + (i9 * 36 | 0) + 24 | 0;
  if ((HEAP32[i24 >> 2] | 0) == (i11 | 0)) {
   HEAP32[i24 >> 2] = i10;
  } else {
   HEAP32[i12 + (i9 * 36 | 0) + 28 >> 2] = i10;
  }
  HEAP32[i12 + (i10 * 36 | 0) + 24 >> 2] = i11;
  HEAP32[i12 + (i10 * 36 | 0) + 28 >> 2] = i4;
  HEAP32[i12 + (i11 * 36 | 0) + 20 >> 2] = i10;
  HEAP32[i12 + (i4 * 36 | 0) + 20 >> 2] = i10;
 }
 if ((i10 | 0) == -1) {
  STACKTOP = i1;
  return;
 }
 while (1) {
  i9 = __ZN13b2DynamicTree7BalanceEi(i3, i10) | 0;
  i4 = HEAP32[i2 >> 2] | 0;
  i11 = HEAP32[i4 + (i9 * 36 | 0) + 24 >> 2] | 0;
  i10 = HEAP32[i4 + (i9 * 36 | 0) + 28 >> 2] | 0;
  if ((i11 | 0) == -1) {
   i2 = 20;
   break;
  }
  if ((i10 | 0) == -1) {
   i2 = 22;
   break;
  }
  i12 = HEAP32[i4 + (i11 * 36 | 0) + 32 >> 2] | 0;
  i24 = HEAP32[i4 + (i10 * 36 | 0) + 32 >> 2] | 0;
  HEAP32[i4 + (i9 * 36 | 0) + 32 >> 2] = ((i12 | 0) > (i24 | 0) ? i12 : i24) + 1;
  d7 = +HEAPF32[i4 + (i11 * 36 | 0) >> 2];
  d8 = +HEAPF32[i4 + (i10 * 36 | 0) >> 2];
  d5 = +HEAPF32[i4 + (i11 * 36 | 0) + 4 >> 2];
  d6 = +HEAPF32[i4 + (i10 * 36 | 0) + 4 >> 2];
  d7 = +(d7 < d8 ? d7 : d8);
  d5 = +(d5 < d6 ? d5 : d6);
  i24 = i4 + (i9 * 36 | 0) | 0;
  HEAPF32[i24 >> 2] = d7;
  HEAPF32[i24 + 4 >> 2] = d5;
  d5 = +HEAPF32[i4 + (i11 * 36 | 0) + 8 >> 2];
  d6 = +HEAPF32[i4 + (i10 * 36 | 0) + 8 >> 2];
  d7 = +HEAPF32[i4 + (i11 * 36 | 0) + 12 >> 2];
  d8 = +HEAPF32[i4 + (i10 * 36 | 0) + 12 >> 2];
  d5 = +(d5 > d6 ? d5 : d6);
  d23 = +(d7 > d8 ? d7 : d8);
  i10 = i4 + (i9 * 36 | 0) + 8 | 0;
  HEAPF32[i10 >> 2] = d5;
  HEAPF32[i10 + 4 >> 2] = d23;
  i10 = HEAP32[(HEAP32[i2 >> 2] | 0) + (i9 * 36 | 0) + 20 >> 2] | 0;
  if ((i10 | 0) == -1) {
   i2 = 24;
   break;
  }
 }
 if ((i2 | 0) == 20) {
  ___assert_fail(3168, 2944, 307, 3184);
 } else if ((i2 | 0) == 22) {
  ___assert_fail(3200, 2944, 308, 3184);
 } else if ((i2 | 0) == 24) {
  STACKTOP = i1;
  return;
 }
}
function __ZN15b2ContactSolverC2EP18b2ContactSolverDef(i7, i5) {
 i7 = i7 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, d15 = 0.0, d16 = 0.0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0;
 i1 = STACKTOP;
 HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i7 + 12 >> 2] = HEAP32[i5 + 12 >> 2];
 HEAP32[i7 + 16 >> 2] = HEAP32[i5 + 16 >> 2];
 HEAP32[i7 + 20 >> 2] = HEAP32[i5 + 20 >> 2];
 i14 = HEAP32[i5 + 40 >> 2] | 0;
 i9 = i7 + 32 | 0;
 HEAP32[i9 >> 2] = i14;
 i2 = HEAP32[i5 + 28 >> 2] | 0;
 i4 = i7 + 48 | 0;
 HEAP32[i4 >> 2] = i2;
 i3 = i7 + 36 | 0;
 HEAP32[i3 >> 2] = __ZN16b2StackAllocator8AllocateEi(i14, i2 * 88 | 0) | 0;
 i2 = i7 + 40 | 0;
 HEAP32[i2 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i9 >> 2] | 0, (HEAP32[i4 >> 2] | 0) * 152 | 0) | 0;
 HEAP32[i7 + 24 >> 2] = HEAP32[i5 + 32 >> 2];
 HEAP32[i7 + 28 >> 2] = HEAP32[i5 + 36 >> 2];
 i9 = HEAP32[i5 + 24 >> 2] | 0;
 i5 = i7 + 44 | 0;
 HEAP32[i5 >> 2] = i9;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i6 = i7 + 20 | 0;
 i7 = i7 + 8 | 0;
 i8 = 0;
 while (1) {
  i10 = HEAP32[i9 + (i8 << 2) >> 2] | 0;
  i11 = HEAP32[i10 + 48 >> 2] | 0;
  i12 = HEAP32[i10 + 52 >> 2] | 0;
  i14 = HEAP32[i11 + 8 >> 2] | 0;
  i13 = HEAP32[i12 + 8 >> 2] | 0;
  i9 = HEAP32[i10 + 124 >> 2] | 0;
  if ((i9 | 0) <= 0) {
   i2 = 4;
   break;
  }
  d15 = +HEAPF32[(HEAP32[i12 + 12 >> 2] | 0) + 8 >> 2];
  d16 = +HEAPF32[(HEAP32[i11 + 12 >> 2] | 0) + 8 >> 2];
  i12 = HEAP32[i2 >> 2] | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 136 >> 2] = +HEAPF32[i10 + 136 >> 2];
  HEAPF32[i12 + (i8 * 152 | 0) + 140 >> 2] = +HEAPF32[i10 + 140 >> 2];
  i22 = i14 + 8 | 0;
  HEAP32[i12 + (i8 * 152 | 0) + 112 >> 2] = HEAP32[i22 >> 2];
  i21 = i13 + 8 | 0;
  HEAP32[i12 + (i8 * 152 | 0) + 116 >> 2] = HEAP32[i21 >> 2];
  i19 = i14 + 120 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 120 >> 2] = +HEAPF32[i19 >> 2];
  i20 = i13 + 120 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 124 >> 2] = +HEAPF32[i20 >> 2];
  i18 = i14 + 128 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 128 >> 2] = +HEAPF32[i18 >> 2];
  i17 = i13 + 128 | 0;
  HEAPF32[i12 + (i8 * 152 | 0) + 132 >> 2] = +HEAPF32[i17 >> 2];
  HEAP32[i12 + (i8 * 152 | 0) + 148 >> 2] = i8;
  HEAP32[i12 + (i8 * 152 | 0) + 144 >> 2] = i9;
  i11 = i12 + (i8 * 152 | 0) + 80 | 0;
  HEAP32[i11 + 0 >> 2] = 0;
  HEAP32[i11 + 4 >> 2] = 0;
  HEAP32[i11 + 8 >> 2] = 0;
  HEAP32[i11 + 12 >> 2] = 0;
  HEAP32[i11 + 16 >> 2] = 0;
  HEAP32[i11 + 20 >> 2] = 0;
  HEAP32[i11 + 24 >> 2] = 0;
  HEAP32[i11 + 28 >> 2] = 0;
  i11 = HEAP32[i3 >> 2] | 0;
  HEAP32[i11 + (i8 * 88 | 0) + 32 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i11 + (i8 * 88 | 0) + 36 >> 2] = HEAP32[i21 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 40 >> 2] = +HEAPF32[i19 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 44 >> 2] = +HEAPF32[i20 >> 2];
  i20 = i14 + 28 | 0;
  i14 = HEAP32[i20 + 4 >> 2] | 0;
  i19 = i11 + (i8 * 88 | 0) + 48 | 0;
  HEAP32[i19 >> 2] = HEAP32[i20 >> 2];
  HEAP32[i19 + 4 >> 2] = i14;
  i19 = i13 + 28 | 0;
  i14 = HEAP32[i19 + 4 >> 2] | 0;
  i13 = i11 + (i8 * 88 | 0) + 56 | 0;
  HEAP32[i13 >> 2] = HEAP32[i19 >> 2];
  HEAP32[i13 + 4 >> 2] = i14;
  HEAPF32[i11 + (i8 * 88 | 0) + 64 >> 2] = +HEAPF32[i18 >> 2];
  HEAPF32[i11 + (i8 * 88 | 0) + 68 >> 2] = +HEAPF32[i17 >> 2];
  i13 = i10 + 104 | 0;
  i14 = HEAP32[i13 + 4 >> 2] | 0;
  i17 = i11 + (i8 * 88 | 0) + 16 | 0;
  HEAP32[i17 >> 2] = HEAP32[i13 >> 2];
  HEAP32[i17 + 4 >> 2] = i14;
  i17 = i10 + 112 | 0;
  i14 = HEAP32[i17 + 4 >> 2] | 0;
  i13 = i11 + (i8 * 88 | 0) + 24 | 0;
  HEAP32[i13 >> 2] = HEAP32[i17 >> 2];
  HEAP32[i13 + 4 >> 2] = i14;
  HEAP32[i11 + (i8 * 88 | 0) + 84 >> 2] = i9;
  HEAPF32[i11 + (i8 * 88 | 0) + 76 >> 2] = d16;
  HEAPF32[i11 + (i8 * 88 | 0) + 80 >> 2] = d15;
  HEAP32[i11 + (i8 * 88 | 0) + 72 >> 2] = HEAP32[i10 + 120 >> 2];
  i13 = 0;
  do {
   i14 = i10 + (i13 * 20 | 0) + 64 | 0;
   if ((HEAP8[i6] | 0) == 0) {
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 16 >> 2] = 0.0;
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 20 >> 2] = 0.0;
   } else {
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 16 >> 2] = +HEAPF32[i7 >> 2] * +HEAPF32[i10 + (i13 * 20 | 0) + 72 >> 2];
    HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 20 >> 2] = +HEAPF32[i7 >> 2] * +HEAPF32[i10 + (i13 * 20 | 0) + 76 >> 2];
   }
   i20 = i12 + (i8 * 152 | 0) + (i13 * 36 | 0) | 0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 24 >> 2] = 0.0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 28 >> 2] = 0.0;
   HEAPF32[i12 + (i8 * 152 | 0) + (i13 * 36 | 0) + 32 >> 2] = 0.0;
   i22 = i11 + (i8 * 88 | 0) + (i13 << 3) | 0;
   HEAP32[i20 + 0 >> 2] = 0;
   HEAP32[i20 + 4 >> 2] = 0;
   HEAP32[i20 + 8 >> 2] = 0;
   HEAP32[i20 + 12 >> 2] = 0;
   i20 = i14;
   i21 = HEAP32[i20 + 4 >> 2] | 0;
   HEAP32[i22 >> 2] = HEAP32[i20 >> 2];
   HEAP32[i22 + 4 >> 2] = i21;
   i13 = i13 + 1 | 0;
  } while ((i13 | 0) != (i9 | 0));
  i8 = i8 + 1 | 0;
  if ((i8 | 0) >= (HEAP32[i4 >> 2] | 0)) {
   i2 = 12;
   break;
  }
  i9 = HEAP32[i5 >> 2] | 0;
 }
 if ((i2 | 0) == 4) {
  ___assert_fail(6504, 6520, 71, 6568);
 } else if ((i2 | 0) == 12) {
  STACKTOP = i1;
  return;
 }
}
function __Z25b2CollidePolygonAndCircleP10b2ManifoldPK14b2PolygonShapeRK11b2TransformPK13b2CircleShapeS6_(i1, i4, i11, i9, i10) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i11 = i11 | 0;
 i9 = i9 | 0;
 i10 = i10 | 0;
 var i2 = 0, i3 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i12 = 0, d13 = 0.0, d14 = 0.0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0;
 i3 = STACKTOP;
 i5 = i1 + 60 | 0;
 HEAP32[i5 >> 2] = 0;
 i2 = i9 + 12 | 0;
 d20 = +HEAPF32[i10 + 12 >> 2];
 d7 = +HEAPF32[i2 >> 2];
 d6 = +HEAPF32[i10 + 8 >> 2];
 d21 = +HEAPF32[i9 + 16 >> 2];
 d8 = +HEAPF32[i10 >> 2] + (d20 * d7 - d6 * d21) - +HEAPF32[i11 >> 2];
 d21 = d7 * d6 + d20 * d21 + +HEAPF32[i10 + 4 >> 2] - +HEAPF32[i11 + 4 >> 2];
 d20 = +HEAPF32[i11 + 12 >> 2];
 d6 = +HEAPF32[i11 + 8 >> 2];
 d7 = d8 * d20 + d21 * d6;
 d6 = d20 * d21 - d8 * d6;
 d8 = +HEAPF32[i4 + 8 >> 2] + +HEAPF32[i9 + 8 >> 2];
 i12 = HEAP32[i4 + 148 >> 2] | 0;
 do {
  if ((i12 | 0) > 0) {
   i10 = 0;
   i9 = 0;
   d13 = -3.4028234663852886e+38;
   while (1) {
    d14 = (d7 - +HEAPF32[i4 + (i10 << 3) + 20 >> 2]) * +HEAPF32[i4 + (i10 << 3) + 84 >> 2] + (d6 - +HEAPF32[i4 + (i10 << 3) + 24 >> 2]) * +HEAPF32[i4 + (i10 << 3) + 88 >> 2];
    if (d14 > d8) {
     i10 = 19;
     break;
    }
    i11 = d14 > d13;
    d13 = i11 ? d14 : d13;
    i9 = i11 ? i10 : i9;
    i10 = i10 + 1 | 0;
    if ((i10 | 0) >= (i12 | 0)) {
     i10 = 4;
     break;
    }
   }
   if ((i10 | 0) == 4) {
    i22 = d13 < 1.1920928955078125e-7;
    break;
   } else if ((i10 | 0) == 19) {
    STACKTOP = i3;
    return;
   }
  } else {
   i9 = 0;
   i22 = 1;
  }
 } while (0);
 i15 = i9 + 1 | 0;
 i11 = i4 + (i9 << 3) + 20 | 0;
 i10 = HEAP32[i11 >> 2] | 0;
 i11 = HEAP32[i11 + 4 >> 2] | 0;
 d14 = (HEAP32[tempDoublePtr >> 2] = i10, +HEAPF32[tempDoublePtr >> 2]);
 d13 = (HEAP32[tempDoublePtr >> 2] = i11, +HEAPF32[tempDoublePtr >> 2]);
 i12 = i4 + (((i15 | 0) < (i12 | 0) ? i15 : 0) << 3) + 20 | 0;
 i15 = HEAP32[i12 >> 2] | 0;
 i12 = HEAP32[i12 + 4 >> 2] | 0;
 d21 = (HEAP32[tempDoublePtr >> 2] = i15, +HEAPF32[tempDoublePtr >> 2]);
 d18 = (HEAP32[tempDoublePtr >> 2] = i12, +HEAPF32[tempDoublePtr >> 2]);
 if (i22) {
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i22 = i4 + (i9 << 3) + 84 | 0;
  i15 = HEAP32[i22 + 4 >> 2] | 0;
  i12 = i1 + 40 | 0;
  HEAP32[i12 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i12 + 4 >> 2] = i15;
  d20 = +((d14 + d21) * .5);
  d21 = +((d13 + d18) * .5);
  i12 = i1 + 48 | 0;
  HEAPF32[i12 >> 2] = d20;
  HEAPF32[i12 + 4 >> 2] = d21;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 d16 = d7 - d14;
 d20 = d6 - d13;
 d19 = d7 - d21;
 d17 = d6 - d18;
 if (d16 * (d21 - d14) + d20 * (d18 - d13) <= 0.0) {
  if (d16 * d16 + d20 * d20 > d8 * d8) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i4 = i1 + 40 | 0;
  d21 = +d16;
  d6 = +d20;
  i22 = i4;
  HEAPF32[i22 >> 2] = d21;
  HEAPF32[i22 + 4 >> 2] = d6;
  d6 = +Math_sqrt(+(d16 * d16 + d20 * d20));
  if (!(d6 < 1.1920928955078125e-7)) {
   d21 = 1.0 / d6;
   HEAPF32[i4 >> 2] = d16 * d21;
   HEAPF32[i1 + 44 >> 2] = d20 * d21;
  }
  i12 = i1 + 48 | 0;
  HEAP32[i12 >> 2] = i10;
  HEAP32[i12 + 4 >> 2] = i11;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 if (!(d19 * (d14 - d21) + d17 * (d13 - d18) <= 0.0)) {
  d14 = (d14 + d21) * .5;
  d13 = (d13 + d18) * .5;
  i10 = i4 + (i9 << 3) + 84 | 0;
  if ((d7 - d14) * +HEAPF32[i10 >> 2] + (d6 - d13) * +HEAPF32[i4 + (i9 << 3) + 88 >> 2] > d8) {
   STACKTOP = i3;
   return;
  }
  HEAP32[i5 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 1;
  i22 = i10;
  i15 = HEAP32[i22 + 4 >> 2] | 0;
  i12 = i1 + 40 | 0;
  HEAP32[i12 >> 2] = HEAP32[i22 >> 2];
  HEAP32[i12 + 4 >> 2] = i15;
  d20 = +d14;
  d21 = +d13;
  i12 = i1 + 48 | 0;
  HEAPF32[i12 >> 2] = d20;
  HEAPF32[i12 + 4 >> 2] = d21;
  i12 = i2;
  i15 = HEAP32[i12 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  HEAP32[i1 + 16 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
 if (d19 * d19 + d17 * d17 > d8 * d8) {
  STACKTOP = i3;
  return;
 }
 HEAP32[i5 >> 2] = 1;
 HEAP32[i1 + 56 >> 2] = 1;
 i4 = i1 + 40 | 0;
 d21 = +d19;
 d6 = +d17;
 i22 = i4;
 HEAPF32[i22 >> 2] = d21;
 HEAPF32[i22 + 4 >> 2] = d6;
 d6 = +Math_sqrt(+(d19 * d19 + d17 * d17));
 if (!(d6 < 1.1920928955078125e-7)) {
  d21 = 1.0 / d6;
  HEAPF32[i4 >> 2] = d19 * d21;
  HEAPF32[i1 + 44 >> 2] = d17 * d21;
 }
 i22 = i1 + 48 | 0;
 HEAP32[i22 >> 2] = i15;
 HEAP32[i22 + 4 >> 2] = i12;
 i12 = i2;
 i15 = HEAP32[i12 + 4 >> 2] | 0;
 i22 = i1;
 HEAP32[i22 >> 2] = HEAP32[i12 >> 2];
 HEAP32[i22 + 4 >> 2] = i15;
 HEAP32[i1 + 16 >> 2] = 0;
 STACKTOP = i3;
 return;
}
function __ZN15b2WorldManifold10InitializeEPK10b2ManifoldRK11b2TransformfS5_f(i1, i5, i7, d4, i8, d3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i7 = i7 | 0;
 d4 = +d4;
 i8 = i8 | 0;
 d3 = +d3;
 var i2 = 0, i6 = 0, d9 = 0.0, d10 = 0.0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0;
 i2 = STACKTOP;
 i6 = i5 + 60 | 0;
 if ((HEAP32[i6 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i11 = HEAP32[i5 + 56 >> 2] | 0;
 if ((i11 | 0) == 2) {
  i13 = i8 + 12 | 0;
  d17 = +HEAPF32[i13 >> 2];
  d18 = +HEAPF32[i5 + 40 >> 2];
  i16 = i8 + 8 | 0;
  d19 = +HEAPF32[i16 >> 2];
  d15 = +HEAPF32[i5 + 44 >> 2];
  d14 = d17 * d18 - d19 * d15;
  d15 = d18 * d19 + d17 * d15;
  d17 = +d14;
  d19 = +d15;
  i12 = i1;
  HEAPF32[i12 >> 2] = d17;
  HEAPF32[i12 + 4 >> 2] = d19;
  d19 = +HEAPF32[i13 >> 2];
  d17 = +HEAPF32[i5 + 48 >> 2];
  d18 = +HEAPF32[i16 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i8 >> 2] + (d19 * d17 - d18 * d10);
  d10 = d17 * d18 + d19 * d10 + +HEAPF32[i8 + 4 >> 2];
  if ((HEAP32[i6 >> 2] | 0) > 0) {
   i8 = i7 + 12 | 0;
   i11 = i7 + 8 | 0;
   i12 = i7 + 4 | 0;
   i13 = i1 + 4 | 0;
   i16 = 0;
   do {
    d18 = +HEAPF32[i8 >> 2];
    d22 = +HEAPF32[i5 + (i16 * 20 | 0) >> 2];
    d21 = +HEAPF32[i11 >> 2];
    d17 = +HEAPF32[i5 + (i16 * 20 | 0) + 4 >> 2];
    d19 = +HEAPF32[i7 >> 2] + (d18 * d22 - d21 * d17);
    d17 = d22 * d21 + d18 * d17 + +HEAPF32[i12 >> 2];
    d18 = d3 - (d14 * (d19 - d9) + (d17 - d10) * d15);
    d19 = +((d19 - d14 * d4 + (d19 + d14 * d18)) * .5);
    d14 = +((d17 - d15 * d4 + (d17 + d15 * d18)) * .5);
    i20 = i1 + (i16 << 3) + 8 | 0;
    HEAPF32[i20 >> 2] = d19;
    HEAPF32[i20 + 4 >> 2] = d14;
    i16 = i16 + 1 | 0;
    d14 = +HEAPF32[i1 >> 2];
    d15 = +HEAPF32[i13 >> 2];
   } while ((i16 | 0) < (HEAP32[i6 >> 2] | 0));
  }
  d21 = +-d14;
  d22 = +-d15;
  i20 = i1;
  HEAPF32[i20 >> 2] = d21;
  HEAPF32[i20 + 4 >> 2] = d22;
  STACKTOP = i2;
  return;
 } else if ((i11 | 0) == 1) {
  i16 = i7 + 12 | 0;
  d19 = +HEAPF32[i16 >> 2];
  d21 = +HEAPF32[i5 + 40 >> 2];
  i20 = i7 + 8 | 0;
  d22 = +HEAPF32[i20 >> 2];
  d15 = +HEAPF32[i5 + 44 >> 2];
  d14 = d19 * d21 - d22 * d15;
  d15 = d21 * d22 + d19 * d15;
  d19 = +d14;
  d22 = +d15;
  i13 = i1;
  HEAPF32[i13 >> 2] = d19;
  HEAPF32[i13 + 4 >> 2] = d22;
  d22 = +HEAPF32[i16 >> 2];
  d19 = +HEAPF32[i5 + 48 >> 2];
  d21 = +HEAPF32[i20 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i7 >> 2] + (d22 * d19 - d21 * d10);
  d10 = d19 * d21 + d22 * d10 + +HEAPF32[i7 + 4 >> 2];
  if ((HEAP32[i6 >> 2] | 0) <= 0) {
   STACKTOP = i2;
   return;
  }
  i12 = i8 + 12 | 0;
  i11 = i8 + 8 | 0;
  i7 = i8 + 4 | 0;
  i13 = i1 + 4 | 0;
  i16 = 0;
  while (1) {
   d22 = +HEAPF32[i12 >> 2];
   d17 = +HEAPF32[i5 + (i16 * 20 | 0) >> 2];
   d18 = +HEAPF32[i11 >> 2];
   d19 = +HEAPF32[i5 + (i16 * 20 | 0) + 4 >> 2];
   d21 = +HEAPF32[i8 >> 2] + (d22 * d17 - d18 * d19);
   d19 = d17 * d18 + d22 * d19 + +HEAPF32[i7 >> 2];
   d22 = d4 - (d14 * (d21 - d9) + (d19 - d10) * d15);
   d21 = +((d21 - d14 * d3 + (d21 + d14 * d22)) * .5);
   d22 = +((d19 - d15 * d3 + (d19 + d15 * d22)) * .5);
   i20 = i1 + (i16 << 3) + 8 | 0;
   HEAPF32[i20 >> 2] = d21;
   HEAPF32[i20 + 4 >> 2] = d22;
   i16 = i16 + 1 | 0;
   if ((i16 | 0) >= (HEAP32[i6 >> 2] | 0)) {
    break;
   }
   d14 = +HEAPF32[i1 >> 2];
   d15 = +HEAPF32[i13 >> 2];
  }
  STACKTOP = i2;
  return;
 } else if ((i11 | 0) == 0) {
  HEAPF32[i1 >> 2] = 1.0;
  i6 = i1 + 4 | 0;
  HEAPF32[i6 >> 2] = 0.0;
  d21 = +HEAPF32[i7 + 12 >> 2];
  d22 = +HEAPF32[i5 + 48 >> 2];
  d19 = +HEAPF32[i7 + 8 >> 2];
  d10 = +HEAPF32[i5 + 52 >> 2];
  d9 = +HEAPF32[i7 >> 2] + (d21 * d22 - d19 * d10);
  d10 = d22 * d19 + d21 * d10 + +HEAPF32[i7 + 4 >> 2];
  d21 = +HEAPF32[i8 + 12 >> 2];
  d19 = +HEAPF32[i5 >> 2];
  d22 = +HEAPF32[i8 + 8 >> 2];
  d15 = +HEAPF32[i5 + 4 >> 2];
  d14 = +HEAPF32[i8 >> 2] + (d21 * d19 - d22 * d15);
  d15 = d19 * d22 + d21 * d15 + +HEAPF32[i8 + 4 >> 2];
  d21 = d9 - d14;
  d22 = d10 - d15;
  if (d21 * d21 + d22 * d22 > 1.4210854715202004e-14) {
   d19 = d14 - d9;
   d17 = d15 - d10;
   d22 = +d19;
   d18 = +d17;
   i20 = i1;
   HEAPF32[i20 >> 2] = d22;
   HEAPF32[i20 + 4 >> 2] = d18;
   d18 = +Math_sqrt(+(d19 * d19 + d17 * d17));
   if (!(d18 < 1.1920928955078125e-7)) {
    d22 = 1.0 / d18;
    d19 = d19 * d22;
    HEAPF32[i1 >> 2] = d19;
    d17 = d17 * d22;
    HEAPF32[i6 >> 2] = d17;
   }
  } else {
   d19 = 1.0;
   d17 = 0.0;
  }
  d21 = +((d9 + d19 * d4 + (d14 - d19 * d3)) * .5);
  d22 = +((d10 + d17 * d4 + (d15 - d17 * d3)) * .5);
  i20 = i1 + 8 | 0;
  HEAPF32[i20 >> 2] = d21;
  HEAPF32[i20 + 4 >> 2] = d22;
  STACKTOP = i2;
  return;
 } else {
  STACKTOP = i2;
  return;
 }
}
function _main(i3, i2) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i4 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, i8 = 0, i9 = 0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, d22 = 0.0, d23 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 240 | 0;
 i5 = i1;
 i12 = i1 + 224 | 0;
 i4 = i1 + 168 | 0;
 i9 = i1 + 160 | 0;
 i8 = i1 + 152 | 0;
 L1 : do {
  if ((i3 | 0) > 1) {
   i14 = HEAP8[HEAP32[i2 + 4 >> 2] | 0] | 0;
   switch (i14 | 0) {
   case 49:
    {
     HEAP32[2] = 5;
     HEAP32[4] = 35;
     i15 = 35;
     i14 = 5;
     break L1;
    }
   case 50:
    {
     HEAP32[2] = 32;
     HEAP32[4] = 161;
     i15 = 161;
     i14 = 32;
     break L1;
    }
   case 51:
    {
     i13 = 5;
     break L1;
    }
   case 52:
    {
     HEAP32[2] = 320;
     HEAP32[4] = 2331;
     i15 = 2331;
     i14 = 320;
     break L1;
    }
   case 53:
    {
     HEAP32[2] = 640;
     HEAP32[4] = 5661;
     i15 = 5661;
     i14 = 640;
     break L1;
    }
   case 48:
    {
     i20 = 0;
     STACKTOP = i1;
     return i20 | 0;
    }
   default:
    {
     HEAP32[i5 >> 2] = i14 + -48;
     _printf(80, i5 | 0) | 0;
     i20 = -1;
     STACKTOP = i1;
     return i20 | 0;
    }
   }
  } else {
   i13 = 5;
  }
 } while (0);
 if ((i13 | 0) == 5) {
  HEAP32[2] = 64;
  HEAP32[4] = 333;
  i15 = 333;
  i14 = 64;
 }
 i13 = i15 + i14 | 0;
 HEAP32[4] = i13;
 HEAP32[2] = 0;
 HEAP32[8] = __Znaj(i13 >>> 0 > 1073741823 ? -1 : i13 << 2) | 0;
 HEAPF32[i12 >> 2] = 0.0;
 HEAPF32[i12 + 4 >> 2] = -10.0;
 i15 = __Znwj(103028) | 0;
 __ZN7b2WorldC2ERK6b2Vec2(i15, i12);
 HEAP32[6] = i15;
 __ZN7b2World16SetAllowSleepingEb(i15, 0);
 HEAP32[i5 + 44 >> 2] = 0;
 i15 = i5 + 4 | 0;
 i14 = i5 + 36 | 0;
 HEAP32[i15 + 0 >> 2] = 0;
 HEAP32[i15 + 4 >> 2] = 0;
 HEAP32[i15 + 8 >> 2] = 0;
 HEAP32[i15 + 12 >> 2] = 0;
 HEAP32[i15 + 16 >> 2] = 0;
 HEAP32[i15 + 20 >> 2] = 0;
 HEAP32[i15 + 24 >> 2] = 0;
 HEAP32[i15 + 28 >> 2] = 0;
 HEAP8[i14] = 1;
 HEAP8[i5 + 37 | 0] = 1;
 HEAP8[i5 + 38 | 0] = 0;
 HEAP8[i5 + 39 | 0] = 0;
 HEAP32[i5 >> 2] = 0;
 HEAP8[i5 + 40 | 0] = 1;
 HEAPF32[i5 + 48 >> 2] = 1.0;
 i14 = __ZN7b2World10CreateBodyEPK9b2BodyDef(HEAP32[6] | 0, i5) | 0;
 HEAP32[i4 >> 2] = 240;
 HEAP32[i4 + 4 >> 2] = 1;
 HEAPF32[i4 + 8 >> 2] = .009999999776482582;
 i15 = i4 + 28 | 0;
 HEAP32[i15 + 0 >> 2] = 0;
 HEAP32[i15 + 4 >> 2] = 0;
 HEAP32[i15 + 8 >> 2] = 0;
 HEAP32[i15 + 12 >> 2] = 0;
 HEAP16[i15 + 16 >> 1] = 0;
 HEAPF32[i9 >> 2] = -40.0;
 HEAPF32[i9 + 4 >> 2] = 0.0;
 HEAPF32[i8 >> 2] = 40.0;
 HEAPF32[i8 + 4 >> 2] = 0.0;
 __ZN11b2EdgeShape3SetERK6b2Vec2S2_(i4, i9, i8);
 __ZN6b2Body13CreateFixtureEPK7b2Shapef(i14, i4, 0.0) | 0;
 HEAP32[i5 >> 2] = 504;
 HEAP32[i5 + 4 >> 2] = 2;
 HEAPF32[i5 + 8 >> 2] = .009999999776482582;
 HEAP32[i5 + 148 >> 2] = 0;
 HEAPF32[i5 + 12 >> 2] = 0.0;
 HEAPF32[i5 + 16 >> 2] = 0.0;
 __ZN14b2PolygonShape8SetAsBoxEff(i5, .5, .5);
 i14 = i4 + 44 | 0;
 i15 = i4 + 4 | 0;
 i8 = i4 + 36 | 0;
 i17 = i4 + 37 | 0;
 i18 = i4 + 38 | 0;
 i19 = i4 + 39 | 0;
 i20 = i4 + 40 | 0;
 i13 = i4 + 48 | 0;
 i12 = i4 + 4 | 0;
 d11 = -7.0;
 d10 = .75;
 i9 = 0;
 while (1) {
  d7 = d11;
  d6 = d10;
  i16 = i9;
  while (1) {
   HEAP32[i14 >> 2] = 0;
   HEAP32[i15 + 0 >> 2] = 0;
   HEAP32[i15 + 4 >> 2] = 0;
   HEAP32[i15 + 8 >> 2] = 0;
   HEAP32[i15 + 12 >> 2] = 0;
   HEAP32[i15 + 16 >> 2] = 0;
   HEAP32[i15 + 20 >> 2] = 0;
   HEAP32[i15 + 24 >> 2] = 0;
   HEAP32[i15 + 28 >> 2] = 0;
   HEAP8[i8] = 1;
   HEAP8[i17] = 1;
   HEAP8[i18] = 0;
   HEAP8[i19] = 0;
   HEAP8[i20] = 1;
   HEAPF32[i13 >> 2] = 1.0;
   HEAP32[i4 >> 2] = 2;
   d23 = +d7;
   d22 = +d6;
   i21 = i12;
   HEAPF32[i21 >> 2] = d23;
   HEAPF32[i21 + 4 >> 2] = d22;
   i21 = __ZN7b2World10CreateBodyEPK9b2BodyDef(HEAP32[6] | 0, i4) | 0;
   __ZN6b2Body13CreateFixtureEPK7b2Shapef(i21, i5, 5.0) | 0;
   HEAP32[14] = i21;
   i16 = i16 + 1 | 0;
   if ((i16 | 0) >= 40) {
    break;
   } else {
    d7 = d7 + 1.125;
    d6 = d6 + 0.0;
   }
  }
  i9 = i9 + 1 | 0;
  if ((i9 | 0) >= 40) {
   break;
  } else {
   d11 = d11 + .5625;
   d10 = d10 + 1.0;
  }
 }
 if ((HEAP32[2] | 0) > 0) {
  i4 = 0;
  do {
   __ZN7b2World4StepEfii(HEAP32[6] | 0, .01666666753590107, 3, 3);
   i4 = i4 + 1 | 0;
  } while ((i4 | 0) < (HEAP32[2] | 0));
 }
 if ((i3 | 0) > 2) {
  i21 = (HEAP8[HEAP32[i2 + 8 >> 2] | 0] | 0) + -48 | 0;
  HEAP32[18] = i21;
  if ((i21 | 0) != 0) {
   _puts(208) | 0;
   _emscripten_set_main_loop(2, 60, 1);
   i21 = 0;
   STACKTOP = i1;
   return i21 | 0;
  }
 } else {
  HEAP32[18] = 0;
 }
 while (1) {
  __Z4iterv();
  if ((HEAP32[16] | 0) > (HEAP32[4] | 0)) {
   i2 = 0;
   break;
  }
 }
 STACKTOP = i1;
 return i2 | 0;
}
function __ZN9b2Simplex9ReadCacheEPK14b2SimplexCachePK15b2DistanceProxyRK11b2TransformS5_S8_(i2, i11, i10, i4, i3, i5) {
 i2 = i2 | 0;
 i11 = i11 | 0;
 i10 = i10 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i1 = 0, i6 = 0, i7 = 0, d8 = 0.0, i9 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, d24 = 0.0, d25 = 0.0, i26 = 0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0;
 i1 = STACKTOP;
 i13 = HEAP16[i11 + 4 >> 1] | 0;
 if (!((i13 & 65535) < 4)) {
  ___assert_fail(2872, 2672, 102, 2896);
 }
 i12 = i13 & 65535;
 i6 = i2 + 108 | 0;
 HEAP32[i6 >> 2] = i12;
 L4 : do {
  if (!(i13 << 16 >> 16 == 0)) {
   i17 = i10 + 20 | 0;
   i21 = i10 + 16 | 0;
   i13 = i3 + 20 | 0;
   i14 = i3 + 16 | 0;
   i15 = i4 + 12 | 0;
   i16 = i4 + 8 | 0;
   i12 = i4 + 4 | 0;
   i18 = i5 + 12 | 0;
   i19 = i5 + 8 | 0;
   i20 = i5 + 4 | 0;
   i22 = 0;
   while (1) {
    i26 = HEAPU8[i11 + i22 + 6 | 0] | 0;
    HEAP32[i2 + (i22 * 36 | 0) + 28 >> 2] = i26;
    i23 = HEAPU8[i11 + i22 + 9 | 0] | 0;
    HEAP32[i2 + (i22 * 36 | 0) + 32 >> 2] = i23;
    if ((HEAP32[i17 >> 2] | 0) <= (i26 | 0)) {
     i9 = 6;
     break;
    }
    i26 = (HEAP32[i21 >> 2] | 0) + (i26 << 3) | 0;
    d25 = +HEAPF32[i26 >> 2];
    d24 = +HEAPF32[i26 + 4 >> 2];
    if ((HEAP32[i13 >> 2] | 0) <= (i23 | 0)) {
     i9 = 8;
     break;
    }
    i23 = (HEAP32[i14 >> 2] | 0) + (i23 << 3) | 0;
    d29 = +HEAPF32[i23 >> 2];
    d31 = +HEAPF32[i23 + 4 >> 2];
    d32 = +HEAPF32[i15 >> 2];
    d30 = +HEAPF32[i16 >> 2];
    d27 = +HEAPF32[i4 >> 2] + (d25 * d32 - d24 * d30);
    d28 = +d27;
    d30 = +(d24 * d32 + d25 * d30 + +HEAPF32[i12 >> 2]);
    i23 = i2 + (i22 * 36 | 0) | 0;
    HEAPF32[i23 >> 2] = d28;
    HEAPF32[i23 + 4 >> 2] = d30;
    d30 = +HEAPF32[i18 >> 2];
    d25 = +HEAPF32[i19 >> 2];
    d24 = +HEAPF32[i5 >> 2] + (d29 * d30 - d31 * d25);
    d28 = +d24;
    d25 = +(d31 * d30 + d29 * d25 + +HEAPF32[i20 >> 2]);
    i23 = i2 + (i22 * 36 | 0) + 8 | 0;
    HEAPF32[i23 >> 2] = d28;
    HEAPF32[i23 + 4 >> 2] = d25;
    d24 = +(d24 - d27);
    d25 = +(+HEAPF32[i2 + (i22 * 36 | 0) + 12 >> 2] - +HEAPF32[i2 + (i22 * 36 | 0) + 4 >> 2]);
    i23 = i2 + (i22 * 36 | 0) + 16 | 0;
    HEAPF32[i23 >> 2] = d24;
    HEAPF32[i23 + 4 >> 2] = d25;
    HEAPF32[i2 + (i22 * 36 | 0) + 24 >> 2] = 0.0;
    i22 = i22 + 1 | 0;
    i23 = HEAP32[i6 >> 2] | 0;
    if ((i22 | 0) >= (i23 | 0)) {
     i7 = i23;
     break L4;
    }
   }
   if ((i9 | 0) == 6) {
    ___assert_fail(2776, 2808, 103, 2840);
   } else if ((i9 | 0) == 8) {
    ___assert_fail(2776, 2808, 103, 2840);
   }
  } else {
   i7 = i12;
  }
 } while (0);
 do {
  if ((i7 | 0) > 1) {
   d24 = +HEAPF32[i11 >> 2];
   if ((i7 | 0) == 2) {
    d32 = +HEAPF32[i2 + 16 >> 2] - +HEAPF32[i2 + 52 >> 2];
    d8 = +HEAPF32[i2 + 20 >> 2] - +HEAPF32[i2 + 56 >> 2];
    d8 = +Math_sqrt(+(d32 * d32 + d8 * d8));
   } else if ((i7 | 0) == 3) {
    d8 = +HEAPF32[i2 + 16 >> 2];
    d32 = +HEAPF32[i2 + 20 >> 2];
    d8 = (+HEAPF32[i2 + 52 >> 2] - d8) * (+HEAPF32[i2 + 92 >> 2] - d32) - (+HEAPF32[i2 + 56 >> 2] - d32) * (+HEAPF32[i2 + 88 >> 2] - d8);
   } else {
    ___assert_fail(2712, 2672, 259, 2736);
   }
   if (!(d8 < d24 * .5) ? !(d24 * 2.0 < d8 | d8 < 1.1920928955078125e-7) : 0) {
    i9 = 18;
    break;
   }
   HEAP32[i6 >> 2] = 0;
  } else {
   i9 = 18;
  }
 } while (0);
 if ((i9 | 0) == 18 ? (i7 | 0) != 0 : 0) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i2 + 28 >> 2] = 0;
 HEAP32[i2 + 32 >> 2] = 0;
 if ((HEAP32[i10 + 20 >> 2] | 0) <= 0) {
  ___assert_fail(2776, 2808, 103, 2840);
 }
 i26 = HEAP32[i10 + 16 >> 2] | 0;
 d8 = +HEAPF32[i26 >> 2];
 d24 = +HEAPF32[i26 + 4 >> 2];
 if ((HEAP32[i3 + 20 >> 2] | 0) <= 0) {
  ___assert_fail(2776, 2808, 103, 2840);
 }
 i26 = HEAP32[i3 + 16 >> 2] | 0;
 d27 = +HEAPF32[i26 >> 2];
 d25 = +HEAPF32[i26 + 4 >> 2];
 d30 = +HEAPF32[i4 + 12 >> 2];
 d32 = +HEAPF32[i4 + 8 >> 2];
 d31 = +HEAPF32[i4 >> 2] + (d8 * d30 - d24 * d32);
 d32 = d24 * d30 + d8 * d32 + +HEAPF32[i4 + 4 >> 2];
 d30 = +d31;
 d28 = +d32;
 i26 = i2;
 HEAPF32[i26 >> 2] = d30;
 HEAPF32[i26 + 4 >> 2] = d28;
 d28 = +HEAPF32[i5 + 12 >> 2];
 d30 = +HEAPF32[i5 + 8 >> 2];
 d29 = +HEAPF32[i5 >> 2] + (d27 * d28 - d25 * d30);
 d30 = d25 * d28 + d27 * d30 + +HEAPF32[i5 + 4 >> 2];
 d27 = +d29;
 d28 = +d30;
 i26 = i2 + 8 | 0;
 HEAPF32[i26 >> 2] = d27;
 HEAPF32[i26 + 4 >> 2] = d28;
 d31 = +(d29 - d31);
 d32 = +(d30 - d32);
 i26 = i2 + 16 | 0;
 HEAPF32[i26 >> 2] = d31;
 HEAPF32[i26 + 4 >> 2] = d32;
 HEAP32[i6 >> 2] = 1;
 STACKTOP = i1;
 return;
}
function __ZNSt3__17__sort4IRPFbRK6b2PairS3_EPS1_EEjT0_S8_S8_S8_T_(i6, i7, i5, i4, i1) {
 i6 = i6 | 0;
 i7 = i7 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i2;
 i9 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0;
 i8 = FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0;
 do {
  if (i9) {
   if (i8) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    i8 = 1;
    break;
   }
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
   if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    i8 = 2;
   } else {
    i8 = 1;
   }
  } else {
   if (i8) {
    HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
    if (FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0) {
     HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
     HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
     HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
     HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
     HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
     i8 = 2;
    } else {
     i8 = 1;
    }
   } else {
    i8 = 0;
   }
  }
 } while (0);
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i4, i5) | 0)) {
  i9 = i8;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i5 + 0 >> 2] = HEAP32[i4 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i4 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i4 + 8 >> 2];
 HEAP32[i4 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i4 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i4 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i5, i7) | 0)) {
  i9 = i8 + 1 | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 HEAP32[i7 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
 HEAP32[i5 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i5 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i5 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 if (!(FUNCTION_TABLE_iii[HEAP32[i1 >> 2] & 3](i7, i6) | 0)) {
  i9 = i8 + 2 | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
 HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
 HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
 HEAP32[i6 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
 HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
 HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
 i9 = i8 + 3 | 0;
 STACKTOP = i2;
 return i9 | 0;
}
function __ZN15b2ContactSolver27SolveTOIPositionConstraintsEii(i9, i2, i5) {
 i9 = i9 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, d34 = 0.0, d35 = 0.0, d36 = 0.0, i37 = 0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, d42 = 0.0, d43 = 0.0, d44 = 0.0, d45 = 0.0, i46 = 0, d47 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i8 = i1 + 40 | 0;
 i3 = i1 + 24 | 0;
 i4 = i1;
 i6 = i9 + 48 | 0;
 if ((HEAP32[i6 >> 2] | 0) <= 0) {
  d45 = 0.0;
  i37 = d45 >= -.007499999832361937;
  STACKTOP = i1;
  return i37 | 0;
 }
 i7 = i9 + 36 | 0;
 i14 = i9 + 24 | 0;
 i9 = i8 + 8 | 0;
 i15 = i8 + 12 | 0;
 i10 = i3 + 8 | 0;
 i11 = i3 + 12 | 0;
 i12 = i4 + 8 | 0;
 i13 = i4 + 16 | 0;
 i16 = 0;
 d34 = 0.0;
 do {
  i37 = HEAP32[i7 >> 2] | 0;
  i19 = i37 + (i16 * 88 | 0) | 0;
  i17 = HEAP32[i37 + (i16 * 88 | 0) + 32 >> 2] | 0;
  i18 = HEAP32[i37 + (i16 * 88 | 0) + 36 >> 2] | 0;
  i20 = i37 + (i16 * 88 | 0) + 48 | 0;
  d21 = +HEAPF32[i20 >> 2];
  d22 = +HEAPF32[i20 + 4 >> 2];
  i20 = i37 + (i16 * 88 | 0) + 56 | 0;
  d23 = +HEAPF32[i20 >> 2];
  d24 = +HEAPF32[i20 + 4 >> 2];
  i20 = HEAP32[i37 + (i16 * 88 | 0) + 84 >> 2] | 0;
  if ((i17 | 0) == (i2 | 0) | (i17 | 0) == (i5 | 0)) {
   d26 = +HEAPF32[i37 + (i16 * 88 | 0) + 64 >> 2];
   d27 = +HEAPF32[i37 + (i16 * 88 | 0) + 40 >> 2];
  } else {
   d26 = 0.0;
   d27 = 0.0;
  }
  d25 = +HEAPF32[i37 + (i16 * 88 | 0) + 44 >> 2];
  d28 = +HEAPF32[i37 + (i16 * 88 | 0) + 68 >> 2];
  i37 = HEAP32[i14 >> 2] | 0;
  i46 = i37 + (i17 * 12 | 0) | 0;
  d33 = +HEAPF32[i46 >> 2];
  d35 = +HEAPF32[i46 + 4 >> 2];
  d29 = +HEAPF32[i37 + (i17 * 12 | 0) + 8 >> 2];
  i46 = i37 + (i18 * 12 | 0) | 0;
  d32 = +HEAPF32[i46 >> 2];
  d36 = +HEAPF32[i46 + 4 >> 2];
  d31 = +HEAPF32[i37 + (i18 * 12 | 0) + 8 >> 2];
  if ((i20 | 0) > 0) {
   d30 = d27 + d25;
   i37 = 0;
   do {
    d38 = +Math_sin(+d29);
    HEAPF32[i9 >> 2] = d38;
    d44 = +Math_cos(+d29);
    HEAPF32[i15 >> 2] = d44;
    d43 = +Math_sin(+d31);
    HEAPF32[i10 >> 2] = d43;
    d41 = +Math_cos(+d31);
    HEAPF32[i11 >> 2] = d41;
    d40 = +(d33 - (d21 * d44 - d22 * d38));
    d38 = +(d35 - (d22 * d44 + d21 * d38));
    i46 = i8;
    HEAPF32[i46 >> 2] = d40;
    HEAPF32[i46 + 4 >> 2] = d38;
    d38 = +(d32 - (d23 * d41 - d24 * d43));
    d43 = +(d36 - (d24 * d41 + d23 * d43));
    i46 = i3;
    HEAPF32[i46 >> 2] = d38;
    HEAPF32[i46 + 4 >> 2] = d43;
    __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i4, i19, i8, i3, i37);
    i46 = i4;
    d43 = +HEAPF32[i46 >> 2];
    d38 = +HEAPF32[i46 + 4 >> 2];
    i46 = i12;
    d41 = +HEAPF32[i46 >> 2];
    d40 = +HEAPF32[i46 + 4 >> 2];
    d44 = +HEAPF32[i13 >> 2];
    d39 = d41 - d33;
    d42 = d40 - d35;
    d41 = d41 - d32;
    d40 = d40 - d36;
    d34 = d34 < d44 ? d34 : d44;
    d44 = (d44 + .004999999888241291) * .75;
    d44 = d44 < 0.0 ? d44 : 0.0;
    d45 = d38 * d39 - d43 * d42;
    d47 = d38 * d41 - d43 * d40;
    d45 = d47 * d28 * d47 + (d30 + d45 * d26 * d45);
    if (d45 > 0.0) {
     d44 = -(d44 < -.20000000298023224 ? -.20000000298023224 : d44) / d45;
    } else {
     d44 = 0.0;
    }
    d47 = d43 * d44;
    d45 = d38 * d44;
    d33 = d33 - d27 * d47;
    d35 = d35 - d27 * d45;
    d29 = d29 - d26 * (d39 * d45 - d42 * d47);
    d32 = d32 + d25 * d47;
    d36 = d36 + d25 * d45;
    d31 = d31 + d28 * (d41 * d45 - d40 * d47);
    i37 = i37 + 1 | 0;
   } while ((i37 | 0) != (i20 | 0));
   i37 = HEAP32[i14 >> 2] | 0;
  }
  d47 = +d33;
  d45 = +d35;
  i46 = i37 + (i17 * 12 | 0) | 0;
  HEAPF32[i46 >> 2] = d47;
  HEAPF32[i46 + 4 >> 2] = d45;
  i46 = HEAP32[i14 >> 2] | 0;
  HEAPF32[i46 + (i17 * 12 | 0) + 8 >> 2] = d29;
  d45 = +d32;
  d47 = +d36;
  i46 = i46 + (i18 * 12 | 0) | 0;
  HEAPF32[i46 >> 2] = d45;
  HEAPF32[i46 + 4 >> 2] = d47;
  HEAPF32[(HEAP32[i14 >> 2] | 0) + (i18 * 12 | 0) + 8 >> 2] = d31;
  i16 = i16 + 1 | 0;
 } while ((i16 | 0) < (HEAP32[i6 >> 2] | 0));
 i46 = d34 >= -.007499999832361937;
 STACKTOP = i1;
 return i46 | 0;
}
function __ZN15b2ContactSolver24SolvePositionConstraintsEv(i7) {
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, i21 = 0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, i26 = 0, d27 = 0.0, d28 = 0.0, d29 = 0.0, d30 = 0.0, d31 = 0.0, d32 = 0.0, d33 = 0.0, d34 = 0.0, i35 = 0, d36 = 0.0, d37 = 0.0, d38 = 0.0, d39 = 0.0, d40 = 0.0, d41 = 0.0, d42 = 0.0, d43 = 0.0, i44 = 0, d45 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i4 = i1 + 40 | 0;
 i5 = i1 + 24 | 0;
 i3 = i1;
 i2 = i7 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  d43 = 0.0;
  i35 = d43 >= -.014999999664723873;
  STACKTOP = i1;
  return i35 | 0;
 }
 i6 = i7 + 36 | 0;
 i9 = i7 + 24 | 0;
 i13 = i4 + 8 | 0;
 i7 = i4 + 12 | 0;
 i8 = i5 + 8 | 0;
 i12 = i5 + 12 | 0;
 i10 = i3 + 8 | 0;
 i11 = i3 + 16 | 0;
 i35 = HEAP32[i9 >> 2] | 0;
 i15 = 0;
 d32 = 0.0;
 do {
  i21 = HEAP32[i6 >> 2] | 0;
  i26 = i21 + (i15 * 88 | 0) | 0;
  i16 = HEAP32[i21 + (i15 * 88 | 0) + 32 >> 2] | 0;
  i14 = HEAP32[i21 + (i15 * 88 | 0) + 36 >> 2] | 0;
  i44 = i21 + (i15 * 88 | 0) + 48 | 0;
  d22 = +HEAPF32[i44 >> 2];
  d23 = +HEAPF32[i44 + 4 >> 2];
  d25 = +HEAPF32[i21 + (i15 * 88 | 0) + 40 >> 2];
  d18 = +HEAPF32[i21 + (i15 * 88 | 0) + 64 >> 2];
  i44 = i21 + (i15 * 88 | 0) + 56 | 0;
  d24 = +HEAPF32[i44 >> 2];
  d19 = +HEAPF32[i44 + 4 >> 2];
  d17 = +HEAPF32[i21 + (i15 * 88 | 0) + 44 >> 2];
  d20 = +HEAPF32[i21 + (i15 * 88 | 0) + 68 >> 2];
  i21 = HEAP32[i21 + (i15 * 88 | 0) + 84 >> 2] | 0;
  i44 = i35 + (i16 * 12 | 0) | 0;
  d28 = +HEAPF32[i44 >> 2];
  d33 = +HEAPF32[i44 + 4 >> 2];
  d29 = +HEAPF32[i35 + (i16 * 12 | 0) + 8 >> 2];
  i44 = i35 + (i14 * 12 | 0) | 0;
  d30 = +HEAPF32[i44 >> 2];
  d34 = +HEAPF32[i44 + 4 >> 2];
  d31 = +HEAPF32[i35 + (i14 * 12 | 0) + 8 >> 2];
  if ((i21 | 0) > 0) {
   d27 = d25 + d17;
   i35 = 0;
   do {
    d41 = +Math_sin(+d29);
    HEAPF32[i13 >> 2] = d41;
    d42 = +Math_cos(+d29);
    HEAPF32[i7 >> 2] = d42;
    d39 = +Math_sin(+d31);
    HEAPF32[i8 >> 2] = d39;
    d38 = +Math_cos(+d31);
    HEAPF32[i12 >> 2] = d38;
    d40 = +(d28 - (d22 * d42 - d23 * d41));
    d41 = +(d33 - (d23 * d42 + d22 * d41));
    i44 = i4;
    HEAPF32[i44 >> 2] = d40;
    HEAPF32[i44 + 4 >> 2] = d41;
    d41 = +(d30 - (d24 * d38 - d19 * d39));
    d39 = +(d34 - (d19 * d38 + d24 * d39));
    i44 = i5;
    HEAPF32[i44 >> 2] = d41;
    HEAPF32[i44 + 4 >> 2] = d39;
    __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i3, i26, i4, i5, i35);
    i44 = i3;
    d39 = +HEAPF32[i44 >> 2];
    d41 = +HEAPF32[i44 + 4 >> 2];
    i44 = i10;
    d38 = +HEAPF32[i44 >> 2];
    d40 = +HEAPF32[i44 + 4 >> 2];
    d42 = +HEAPF32[i11 >> 2];
    d36 = d38 - d28;
    d37 = d40 - d33;
    d38 = d38 - d30;
    d40 = d40 - d34;
    d32 = d32 < d42 ? d32 : d42;
    d42 = (d42 + .004999999888241291) * .20000000298023224;
    d43 = d42 < 0.0 ? d42 : 0.0;
    d42 = d41 * d36 - d39 * d37;
    d45 = d41 * d38 - d39 * d40;
    d42 = d45 * d20 * d45 + (d27 + d42 * d18 * d42);
    if (d42 > 0.0) {
     d42 = -(d43 < -.20000000298023224 ? -.20000000298023224 : d43) / d42;
    } else {
     d42 = 0.0;
    }
    d45 = d39 * d42;
    d43 = d41 * d42;
    d28 = d28 - d25 * d45;
    d33 = d33 - d25 * d43;
    d29 = d29 - d18 * (d36 * d43 - d37 * d45);
    d30 = d30 + d17 * d45;
    d34 = d34 + d17 * d43;
    d31 = d31 + d20 * (d38 * d43 - d40 * d45);
    i35 = i35 + 1 | 0;
   } while ((i35 | 0) != (i21 | 0));
   i35 = HEAP32[i9 >> 2] | 0;
  }
  d45 = +d28;
  d43 = +d33;
  i35 = i35 + (i16 * 12 | 0) | 0;
  HEAPF32[i35 >> 2] = d45;
  HEAPF32[i35 + 4 >> 2] = d43;
  i35 = HEAP32[i9 >> 2] | 0;
  HEAPF32[i35 + (i16 * 12 | 0) + 8 >> 2] = d29;
  d43 = +d30;
  d45 = +d34;
  i35 = i35 + (i14 * 12 | 0) | 0;
  HEAPF32[i35 >> 2] = d43;
  HEAPF32[i35 + 4 >> 2] = d45;
  i35 = HEAP32[i9 >> 2] | 0;
  HEAPF32[i35 + (i14 * 12 | 0) + 8 >> 2] = d31;
  i15 = i15 + 1 | 0;
 } while ((i15 | 0) < (HEAP32[i2 >> 2] | 0));
 i44 = d32 >= -.014999999664723873;
 STACKTOP = i1;
 return i44 | 0;
}
function __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i1, i7, i6, i22, i5) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i6 = i6 | 0;
 i22 = i22 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, d23 = 0.0, d24 = 0.0;
 i4 = STACKTOP;
 i2 = i1 + 60 | 0;
 HEAP32[i2 >> 2] = 0;
 i3 = i22 + 12 | 0;
 d9 = +HEAPF32[i5 + 12 >> 2];
 d23 = +HEAPF32[i3 >> 2];
 d17 = +HEAPF32[i5 + 8 >> 2];
 d18 = +HEAPF32[i22 + 16 >> 2];
 d21 = +HEAPF32[i5 >> 2] + (d9 * d23 - d17 * d18) - +HEAPF32[i6 >> 2];
 d18 = d23 * d17 + d9 * d18 + +HEAPF32[i5 + 4 >> 2] - +HEAPF32[i6 + 4 >> 2];
 d9 = +HEAPF32[i6 + 12 >> 2];
 d17 = +HEAPF32[i6 + 8 >> 2];
 d23 = d21 * d9 + d18 * d17;
 d17 = d9 * d18 - d21 * d17;
 i6 = i7 + 12 | 0;
 i5 = HEAP32[i6 >> 2] | 0;
 i6 = HEAP32[i6 + 4 >> 2] | 0;
 d21 = (HEAP32[tempDoublePtr >> 2] = i5, +HEAPF32[tempDoublePtr >> 2]);
 d18 = (HEAP32[tempDoublePtr >> 2] = i6, +HEAPF32[tempDoublePtr >> 2]);
 i15 = i7 + 20 | 0;
 i14 = HEAP32[i15 >> 2] | 0;
 i15 = HEAP32[i15 + 4 >> 2] | 0;
 d9 = (HEAP32[tempDoublePtr >> 2] = i14, +HEAPF32[tempDoublePtr >> 2]);
 d10 = (HEAP32[tempDoublePtr >> 2] = i15, +HEAPF32[tempDoublePtr >> 2]);
 d8 = d9 - d21;
 d16 = d10 - d18;
 d19 = d8 * (d9 - d23) + d16 * (d10 - d17);
 d13 = d23 - d21;
 d12 = d17 - d18;
 d20 = d13 * d8 + d12 * d16;
 d11 = +HEAPF32[i7 + 8 >> 2] + +HEAPF32[i22 + 8 >> 2];
 if (d20 <= 0.0) {
  if (d13 * d13 + d12 * d12 > d11 * d11) {
   STACKTOP = i4;
   return;
  }
  if ((HEAP8[i7 + 44 | 0] | 0) != 0 ? (i22 = i7 + 28 | 0, d24 = +HEAPF32[i22 >> 2], (d21 - d23) * (d21 - d24) + (d18 - d17) * (d18 - +HEAPF32[i22 + 4 >> 2]) > 0.0) : 0) {
   STACKTOP = i4;
   return;
  }
  HEAP32[i2 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 0;
  HEAPF32[i1 + 40 >> 2] = 0.0;
  HEAPF32[i1 + 44 >> 2] = 0.0;
  i14 = i1 + 48 | 0;
  HEAP32[i14 >> 2] = i5;
  HEAP32[i14 + 4 >> 2] = i6;
  i14 = i1 + 16 | 0;
  HEAP32[i14 >> 2] = 0;
  HEAP8[i14] = 0;
  HEAP8[i14 + 1 | 0] = 0;
  HEAP8[i14 + 2 | 0] = 0;
  HEAP8[i14 + 3 | 0] = 0;
  i14 = i3;
  i15 = HEAP32[i14 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  STACKTOP = i4;
  return;
 }
 if (d19 <= 0.0) {
  d8 = d23 - d9;
  d12 = d17 - d10;
  if (d8 * d8 + d12 * d12 > d11 * d11) {
   STACKTOP = i4;
   return;
  }
  if ((HEAP8[i7 + 45 | 0] | 0) != 0 ? (i22 = i7 + 36 | 0, d24 = +HEAPF32[i22 >> 2], d8 * (d24 - d9) + d12 * (+HEAPF32[i22 + 4 >> 2] - d10) > 0.0) : 0) {
   STACKTOP = i4;
   return;
  }
  HEAP32[i2 >> 2] = 1;
  HEAP32[i1 + 56 >> 2] = 0;
  HEAPF32[i1 + 40 >> 2] = 0.0;
  HEAPF32[i1 + 44 >> 2] = 0.0;
  i22 = i1 + 48 | 0;
  HEAP32[i22 >> 2] = i14;
  HEAP32[i22 + 4 >> 2] = i15;
  i14 = i1 + 16 | 0;
  HEAP32[i14 >> 2] = 0;
  HEAP8[i14] = 1;
  HEAP8[i14 + 1 | 0] = 0;
  HEAP8[i14 + 2 | 0] = 0;
  HEAP8[i14 + 3 | 0] = 0;
  i14 = i3;
  i15 = HEAP32[i14 + 4 >> 2] | 0;
  i22 = i1;
  HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
  HEAP32[i22 + 4 >> 2] = i15;
  STACKTOP = i4;
  return;
 }
 d24 = d8 * d8 + d16 * d16;
 if (!(d24 > 0.0)) {
  ___assert_fail(5560, 5576, 127, 5616);
 }
 d24 = 1.0 / d24;
 d23 = d23 - (d21 * d19 + d9 * d20) * d24;
 d24 = d17 - (d18 * d19 + d10 * d20) * d24;
 if (d23 * d23 + d24 * d24 > d11 * d11) {
  STACKTOP = i4;
  return;
 }
 d9 = -d16;
 if (d8 * d12 + d13 * d9 < 0.0) {
  d8 = -d8;
 } else {
  d16 = d9;
 }
 d9 = +Math_sqrt(+(d8 * d8 + d16 * d16));
 if (!(d9 < 1.1920928955078125e-7)) {
  d24 = 1.0 / d9;
  d16 = d16 * d24;
  d8 = d8 * d24;
 }
 HEAP32[i2 >> 2] = 1;
 HEAP32[i1 + 56 >> 2] = 1;
 d23 = +d16;
 d24 = +d8;
 i14 = i1 + 40 | 0;
 HEAPF32[i14 >> 2] = d23;
 HEAPF32[i14 + 4 >> 2] = d24;
 i14 = i1 + 48 | 0;
 HEAP32[i14 >> 2] = i5;
 HEAP32[i14 + 4 >> 2] = i6;
 i14 = i1 + 16 | 0;
 HEAP32[i14 >> 2] = 0;
 HEAP8[i14] = 0;
 HEAP8[i14 + 1 | 0] = 0;
 HEAP8[i14 + 2 | 0] = 1;
 HEAP8[i14 + 3 | 0] = 0;
 i14 = i3;
 i15 = HEAP32[i14 + 4 >> 2] | 0;
 i22 = i1;
 HEAP32[i22 >> 2] = HEAP32[i14 >> 2];
 HEAP32[i22 + 4 >> 2] = i15;
 STACKTOP = i4;
 return;
}
function __ZN6b2BodyC2EPK9b2BodyDefP7b2World(i1, i2, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, d13 = 0.0;
 i3 = STACKTOP;
 i9 = i2 + 4 | 0;
 d13 = +HEAPF32[i9 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1496, 1520, 27, 1552);
 }
 d13 = +HEAPF32[i2 + 8 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1496, 1520, 27, 1552);
 }
 i6 = i2 + 16 | 0;
 d13 = +HEAPF32[i6 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1560, 1520, 28, 1552);
 }
 d13 = +HEAPF32[i2 + 20 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1560, 1520, 28, 1552);
 }
 i7 = i2 + 12 | 0;
 d13 = +HEAPF32[i7 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1592, 1520, 29, 1552);
 }
 i8 = i2 + 24 | 0;
 d13 = +HEAPF32[i8 >> 2];
 if (!(d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf)) {
  ___assert_fail(1616, 1520, 30, 1552);
 }
 i4 = i2 + 32 | 0;
 d13 = +HEAPF32[i4 >> 2];
 if (!(d13 >= 0.0) | d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf ^ 1) {
  ___assert_fail(1648, 1520, 31, 1552);
 }
 i10 = i2 + 28 | 0;
 d13 = +HEAPF32[i10 >> 2];
 if (!(d13 >= 0.0) | d13 == d13 & 0.0 == 0.0 & d13 > -inf & d13 < inf ^ 1) {
  ___assert_fail(1712, 1520, 32, 1552);
 }
 i11 = i1 + 4 | 0;
 i12 = (HEAP8[i2 + 39 | 0] | 0) == 0 ? 0 : 8;
 HEAP16[i11 >> 1] = i12;
 if ((HEAP8[i2 + 38 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 16) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 36 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 4) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 37 | 0] | 0) != 0) {
  i12 = (i12 & 65535 | 2) & 65535;
  HEAP16[i11 >> 1] = i12;
 }
 if ((HEAP8[i2 + 40 | 0] | 0) != 0) {
  HEAP16[i11 >> 1] = i12 & 65535 | 32;
 }
 HEAP32[i1 + 88 >> 2] = i5;
 i11 = i9;
 i12 = HEAP32[i11 >> 2] | 0;
 i11 = HEAP32[i11 + 4 >> 2] | 0;
 i9 = i1 + 12 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 d13 = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 20 >> 2] = +Math_sin(+d13);
 HEAPF32[i1 + 24 >> 2] = +Math_cos(+d13);
 HEAPF32[i1 + 28 >> 2] = 0.0;
 HEAPF32[i1 + 32 >> 2] = 0.0;
 i9 = i1 + 36 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 i9 = i1 + 44 | 0;
 HEAP32[i9 >> 2] = i12;
 HEAP32[i9 + 4 >> 2] = i11;
 HEAPF32[i1 + 52 >> 2] = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 56 >> 2] = +HEAPF32[i7 >> 2];
 HEAPF32[i1 + 60 >> 2] = 0.0;
 HEAP32[i1 + 108 >> 2] = 0;
 HEAP32[i1 + 112 >> 2] = 0;
 HEAP32[i1 + 92 >> 2] = 0;
 HEAP32[i1 + 96 >> 2] = 0;
 i9 = i6;
 i11 = HEAP32[i9 + 4 >> 2] | 0;
 i12 = i1 + 64 | 0;
 HEAP32[i12 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i12 + 4 >> 2] = i11;
 HEAPF32[i1 + 72 >> 2] = +HEAPF32[i8 >> 2];
 HEAPF32[i1 + 132 >> 2] = +HEAPF32[i10 >> 2];
 HEAPF32[i1 + 136 >> 2] = +HEAPF32[i4 >> 2];
 HEAPF32[i1 + 140 >> 2] = +HEAPF32[i2 + 48 >> 2];
 HEAPF32[i1 + 76 >> 2] = 0.0;
 HEAPF32[i1 + 80 >> 2] = 0.0;
 HEAPF32[i1 + 84 >> 2] = 0.0;
 HEAPF32[i1 + 144 >> 2] = 0.0;
 i12 = HEAP32[i2 >> 2] | 0;
 HEAP32[i1 >> 2] = i12;
 i4 = i1 + 116 | 0;
 if ((i12 | 0) == 2) {
  HEAPF32[i4 >> 2] = 1.0;
  HEAPF32[i1 + 120 >> 2] = 1.0;
  i11 = i1 + 124 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i1 + 128 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i2 + 44 | 0;
  i11 = HEAP32[i11 >> 2] | 0;
  i12 = i1 + 148 | 0;
  HEAP32[i12 >> 2] = i11;
  i12 = i1 + 100 | 0;
  HEAP32[i12 >> 2] = 0;
  i12 = i1 + 104 | 0;
  HEAP32[i12 >> 2] = 0;
  STACKTOP = i3;
  return;
 } else {
  HEAPF32[i4 >> 2] = 0.0;
  HEAPF32[i1 + 120 >> 2] = 0.0;
  i11 = i1 + 124 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i1 + 128 | 0;
  HEAPF32[i11 >> 2] = 0.0;
  i11 = i2 + 44 | 0;
  i11 = HEAP32[i11 >> 2] | 0;
  i12 = i1 + 148 | 0;
  HEAP32[i12 >> 2] = i11;
  i12 = i1 + 100 | 0;
  HEAP32[i12 >> 2] = 0;
  i12 = i1 + 104 | 0;
  HEAP32[i12 >> 2] = 0;
  STACKTOP = i3;
  return;
 }
}
function __ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i(i2, i1, i13, i12, i15) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 i13 = i13 | 0;
 i12 = i12 | 0;
 i15 = i15 | 0;
 var i3 = 0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i14 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, i19 = 0, i20 = 0;
 i3 = STACKTOP;
 if ((HEAP32[i1 + 84 >> 2] | 0) <= 0) {
  ___assert_fail(6752, 6520, 617, 6776);
 }
 i14 = HEAP32[i1 + 72 >> 2] | 0;
 if ((i14 | 0) == 1) {
  i19 = i13 + 12 | 0;
  d5 = +HEAPF32[i19 >> 2];
  d6 = +HEAPF32[i1 + 16 >> 2];
  i14 = i13 + 8 | 0;
  d7 = +HEAPF32[i14 >> 2];
  d9 = +HEAPF32[i1 + 20 >> 2];
  d4 = d5 * d6 - d7 * d9;
  d9 = d6 * d7 + d5 * d9;
  d5 = +d4;
  d7 = +d9;
  i20 = i2;
  HEAPF32[i20 >> 2] = d5;
  HEAPF32[i20 + 4 >> 2] = d7;
  d7 = +HEAPF32[i19 >> 2];
  d5 = +HEAPF32[i1 + 24 >> 2];
  d6 = +HEAPF32[i14 >> 2];
  d8 = +HEAPF32[i1 + 28 >> 2];
  d16 = +HEAPF32[i12 + 12 >> 2];
  d18 = +HEAPF32[i1 + (i15 << 3) >> 2];
  d17 = +HEAPF32[i12 + 8 >> 2];
  d11 = +HEAPF32[i1 + (i15 << 3) + 4 >> 2];
  d10 = +HEAPF32[i12 >> 2] + (d16 * d18 - d17 * d11);
  d11 = d18 * d17 + d16 * d11 + +HEAPF32[i12 + 4 >> 2];
  HEAPF32[i2 + 16 >> 2] = d4 * (d10 - (+HEAPF32[i13 >> 2] + (d7 * d5 - d6 * d8))) + (d11 - (d5 * d6 + d7 * d8 + +HEAPF32[i13 + 4 >> 2])) * d9 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  d10 = +d10;
  d11 = +d11;
  i15 = i2 + 8 | 0;
  HEAPF32[i15 >> 2] = d10;
  HEAPF32[i15 + 4 >> 2] = d11;
  STACKTOP = i3;
  return;
 } else if ((i14 | 0) == 2) {
  i19 = i12 + 12 | 0;
  d7 = +HEAPF32[i19 >> 2];
  d8 = +HEAPF32[i1 + 16 >> 2];
  i20 = i12 + 8 | 0;
  d9 = +HEAPF32[i20 >> 2];
  d18 = +HEAPF32[i1 + 20 >> 2];
  d17 = d7 * d8 - d9 * d18;
  d18 = d8 * d9 + d7 * d18;
  d7 = +d17;
  d9 = +d18;
  i14 = i2;
  HEAPF32[i14 >> 2] = d7;
  HEAPF32[i14 + 4 >> 2] = d9;
  d9 = +HEAPF32[i19 >> 2];
  d7 = +HEAPF32[i1 + 24 >> 2];
  d8 = +HEAPF32[i20 >> 2];
  d10 = +HEAPF32[i1 + 28 >> 2];
  d6 = +HEAPF32[i13 + 12 >> 2];
  d4 = +HEAPF32[i1 + (i15 << 3) >> 2];
  d5 = +HEAPF32[i13 + 8 >> 2];
  d16 = +HEAPF32[i1 + (i15 << 3) + 4 >> 2];
  d11 = +HEAPF32[i13 >> 2] + (d6 * d4 - d5 * d16);
  d16 = d4 * d5 + d6 * d16 + +HEAPF32[i13 + 4 >> 2];
  HEAPF32[i2 + 16 >> 2] = d17 * (d11 - (+HEAPF32[i12 >> 2] + (d9 * d7 - d8 * d10))) + (d16 - (d7 * d8 + d9 * d10 + +HEAPF32[i12 + 4 >> 2])) * d18 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  d11 = +d11;
  d16 = +d16;
  i20 = i2 + 8 | 0;
  HEAPF32[i20 >> 2] = d11;
  HEAPF32[i20 + 4 >> 2] = d16;
  d17 = +-d17;
  d18 = +-d18;
  i20 = i2;
  HEAPF32[i20 >> 2] = d17;
  HEAPF32[i20 + 4 >> 2] = d18;
  STACKTOP = i3;
  return;
 } else if ((i14 | 0) == 0) {
  d7 = +HEAPF32[i13 + 12 >> 2];
  d8 = +HEAPF32[i1 + 24 >> 2];
  d18 = +HEAPF32[i13 + 8 >> 2];
  d6 = +HEAPF32[i1 + 28 >> 2];
  d4 = +HEAPF32[i13 >> 2] + (d7 * d8 - d18 * d6);
  d6 = d8 * d18 + d7 * d6 + +HEAPF32[i13 + 4 >> 2];
  d7 = +HEAPF32[i12 + 12 >> 2];
  d18 = +HEAPF32[i1 >> 2];
  d8 = +HEAPF32[i12 + 8 >> 2];
  d9 = +HEAPF32[i1 + 4 >> 2];
  d5 = +HEAPF32[i12 >> 2] + (d7 * d18 - d8 * d9);
  d9 = d18 * d8 + d7 * d9 + +HEAPF32[i12 + 4 >> 2];
  d7 = d5 - d4;
  d8 = d9 - d6;
  d18 = +d7;
  d10 = +d8;
  i20 = i2;
  HEAPF32[i20 >> 2] = d18;
  HEAPF32[i20 + 4 >> 2] = d10;
  d10 = +Math_sqrt(+(d7 * d7 + d8 * d8));
  if (d10 < 1.1920928955078125e-7) {
   d10 = d7;
   d11 = d8;
  } else {
   d11 = 1.0 / d10;
   d10 = d7 * d11;
   HEAPF32[i2 >> 2] = d10;
   d11 = d8 * d11;
   HEAPF32[i2 + 4 >> 2] = d11;
  }
  d17 = +((d4 + d5) * .5);
  d18 = +((d6 + d9) * .5);
  i20 = i2 + 8 | 0;
  HEAPF32[i20 >> 2] = d17;
  HEAPF32[i20 + 4 >> 2] = d18;
  HEAPF32[i2 + 16 >> 2] = d7 * d10 + d8 * d11 - +HEAPF32[i1 + 76 >> 2] - +HEAPF32[i1 + 80 >> 2];
  STACKTOP = i3;
  return;
 } else {
  STACKTOP = i3;
  return;
 }
}
function __ZNSt3__118__insertion_sort_3IRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i5, i1, i2) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i6 = i4 + 12 | 0;
 i3 = i4;
 i7 = i5 + 24 | 0;
 i8 = i5 + 12 | 0;
 i10 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i5) | 0;
 i9 = FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i8) | 0;
 do {
  if (i10) {
   if (i9) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
    HEAP32[i5 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i5 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i5 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    break;
   }
   HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
   HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
   HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
   HEAP32[i5 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
   HEAP32[i5 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
   HEAP32[i5 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
   HEAP32[i8 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i8 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i8 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i7, i8) | 0) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   }
  } else {
   if (i9) {
    HEAP32[i6 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
    HEAP32[i6 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
    HEAP32[i6 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    HEAP32[i7 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
    HEAP32[i7 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
    HEAP32[i7 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i8, i5) | 0) {
     HEAP32[i6 + 0 >> 2] = HEAP32[i5 + 0 >> 2];
     HEAP32[i6 + 4 >> 2] = HEAP32[i5 + 4 >> 2];
     HEAP32[i6 + 8 >> 2] = HEAP32[i5 + 8 >> 2];
     HEAP32[i5 + 0 >> 2] = HEAP32[i8 + 0 >> 2];
     HEAP32[i5 + 4 >> 2] = HEAP32[i8 + 4 >> 2];
     HEAP32[i5 + 8 >> 2] = HEAP32[i8 + 8 >> 2];
     HEAP32[i8 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
     HEAP32[i8 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
     HEAP32[i8 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
    }
   }
  }
 } while (0);
 i6 = i5 + 36 | 0;
 if ((i6 | 0) == (i1 | 0)) {
  STACKTOP = i4;
  return;
 }
 while (1) {
  if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i6, i7) | 0) {
   HEAP32[i3 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
   HEAP32[i3 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
   HEAP32[i3 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
   i8 = i6;
   while (1) {
    HEAP32[i8 + 0 >> 2] = HEAP32[i7 + 0 >> 2];
    HEAP32[i8 + 4 >> 2] = HEAP32[i7 + 4 >> 2];
    HEAP32[i8 + 8 >> 2] = HEAP32[i7 + 8 >> 2];
    if ((i7 | 0) == (i5 | 0)) {
     break;
    }
    i8 = i7 + -12 | 0;
    if (FUNCTION_TABLE_iii[HEAP32[i2 >> 2] & 3](i3, i8) | 0) {
     i10 = i7;
     i7 = i8;
     i8 = i10;
    } else {
     break;
    }
   }
   HEAP32[i7 + 0 >> 2] = HEAP32[i3 + 0 >> 2];
   HEAP32[i7 + 4 >> 2] = HEAP32[i3 + 4 >> 2];
   HEAP32[i7 + 8 >> 2] = HEAP32[i3 + 8 >> 2];
  }
  i7 = i6 + 12 | 0;
  if ((i7 | 0) == (i1 | 0)) {
   break;
  } else {
   i10 = i6;
   i6 = i7;
   i7 = i10;
  }
 }
 STACKTOP = i4;
 return;
}
function __ZNK20b2SeparationFunction8EvaluateEiif(i10, i12, i11, d9) {
 i10 = i10 | 0;
 i12 = i12 | 0;
 i11 = i11 | 0;
 d9 = +d9;
 var d1 = 0.0, d2 = 0.0, d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, i7 = 0, d8 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0;
 i7 = STACKTOP;
 d14 = 1.0 - d9;
 d3 = d14 * +HEAPF32[i10 + 32 >> 2] + +HEAPF32[i10 + 36 >> 2] * d9;
 d4 = +Math_sin(+d3);
 d3 = +Math_cos(+d3);
 d5 = +HEAPF32[i10 + 8 >> 2];
 d6 = +HEAPF32[i10 + 12 >> 2];
 d2 = d14 * +HEAPF32[i10 + 16 >> 2] + +HEAPF32[i10 + 24 >> 2] * d9 - (d3 * d5 - d4 * d6);
 d6 = d14 * +HEAPF32[i10 + 20 >> 2] + +HEAPF32[i10 + 28 >> 2] * d9 - (d4 * d5 + d3 * d6);
 d5 = d14 * +HEAPF32[i10 + 68 >> 2] + +HEAPF32[i10 + 72 >> 2] * d9;
 d1 = +Math_sin(+d5);
 d5 = +Math_cos(+d5);
 d15 = +HEAPF32[i10 + 44 >> 2];
 d16 = +HEAPF32[i10 + 48 >> 2];
 d8 = d14 * +HEAPF32[i10 + 52 >> 2] + +HEAPF32[i10 + 60 >> 2] * d9 - (d5 * d15 - d1 * d16);
 d9 = d14 * +HEAPF32[i10 + 56 >> 2] + +HEAPF32[i10 + 64 >> 2] * d9 - (d1 * d15 + d5 * d16);
 i17 = HEAP32[i10 + 80 >> 2] | 0;
 if ((i17 | 0) == 0) {
  d14 = +HEAPF32[i10 + 92 >> 2];
  d13 = +HEAPF32[i10 + 96 >> 2];
  i17 = HEAP32[i10 >> 2] | 0;
  if (!((i12 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i17 + 20 >> 2] | 0) <= (i12 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i17 + 16 >> 2] | 0) + (i12 << 3) | 0;
  d15 = +HEAPF32[i17 >> 2];
  d16 = +HEAPF32[i17 + 4 >> 2];
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if (!((i11 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d19 = +HEAPF32[i17 >> 2];
  d18 = +HEAPF32[i17 + 4 >> 2];
  d16 = d14 * (d8 + (d5 * d19 - d1 * d18) - (d2 + (d3 * d15 - d4 * d16))) + d13 * (d9 + (d1 * d19 + d5 * d18) - (d6 + (d4 * d15 + d3 * d16)));
  STACKTOP = i7;
  return +d16;
 } else if ((i17 | 0) == 1) {
  d14 = +HEAPF32[i10 + 92 >> 2];
  d13 = +HEAPF32[i10 + 96 >> 2];
  d16 = +HEAPF32[i10 + 84 >> 2];
  d15 = +HEAPF32[i10 + 88 >> 2];
  i10 = HEAP32[i10 + 4 >> 2] | 0;
  if (!((i11 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i11 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i11 << 3) | 0;
  d18 = +HEAPF32[i17 >> 2];
  d19 = +HEAPF32[i17 + 4 >> 2];
  d19 = (d3 * d14 - d4 * d13) * (d8 + (d5 * d18 - d1 * d19) - (d2 + (d3 * d16 - d4 * d15))) + (d4 * d14 + d3 * d13) * (d9 + (d1 * d18 + d5 * d19) - (d6 + (d4 * d16 + d3 * d15)));
  STACKTOP = i7;
  return +d19;
 } else if ((i17 | 0) == 2) {
  d16 = +HEAPF32[i10 + 92 >> 2];
  d15 = +HEAPF32[i10 + 96 >> 2];
  d14 = +HEAPF32[i10 + 84 >> 2];
  d13 = +HEAPF32[i10 + 88 >> 2];
  i10 = HEAP32[i10 >> 2] | 0;
  if (!((i12 | 0) > -1)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  if ((HEAP32[i10 + 20 >> 2] | 0) <= (i12 | 0)) {
   ___assert_fail(3640, 3672, 103, 3704);
  }
  i17 = (HEAP32[i10 + 16 >> 2] | 0) + (i12 << 3) | 0;
  d18 = +HEAPF32[i17 >> 2];
  d19 = +HEAPF32[i17 + 4 >> 2];
  d19 = (d5 * d16 - d1 * d15) * (d2 + (d3 * d18 - d4 * d19) - (d8 + (d5 * d14 - d1 * d13))) + (d1 * d16 + d5 * d15) * (d6 + (d4 * d18 + d3 * d19) - (d9 + (d1 * d14 + d5 * d13)));
  STACKTOP = i7;
  return +d19;
 } else {
  ___assert_fail(3616, 3560, 242, 3624);
 }
 return 0.0;
}
function __ZN6b2Body13ResetMassDataEv(i2) {
 i2 = i2 | 0;
 var d1 = 0.0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, i17 = 0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i10 = i3;
 i8 = i2 + 116 | 0;
 i9 = i2 + 120 | 0;
 i4 = i2 + 124 | 0;
 i5 = i2 + 128 | 0;
 i6 = i2 + 28 | 0;
 HEAPF32[i6 >> 2] = 0.0;
 HEAPF32[i2 + 32 >> 2] = 0.0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 i11 = HEAP32[i2 >> 2] | 0;
 if ((i11 | 0) == 2) {
  i17 = 3784;
  d16 = +HEAPF32[i17 >> 2];
  d18 = +HEAPF32[i17 + 4 >> 2];
  i17 = HEAP32[i2 + 100 >> 2] | 0;
  if ((i17 | 0) != 0) {
   i11 = i10 + 4 | 0;
   i12 = i10 + 8 | 0;
   i13 = i10 + 12 | 0;
   d14 = 0.0;
   d15 = 0.0;
   do {
    d19 = +HEAPF32[i17 >> 2];
    if (!(d19 == 0.0)) {
     i20 = HEAP32[i17 + 12 >> 2] | 0;
     FUNCTION_TABLE_viid[HEAP32[(HEAP32[i20 >> 2] | 0) + 28 >> 2] & 3](i20, i10, d19);
     d14 = +HEAPF32[i10 >> 2];
     d15 = d14 + +HEAPF32[i8 >> 2];
     HEAPF32[i8 >> 2] = d15;
     d16 = d16 + d14 * +HEAPF32[i11 >> 2];
     d18 = d18 + d14 * +HEAPF32[i12 >> 2];
     d14 = +HEAPF32[i13 >> 2] + +HEAPF32[i4 >> 2];
     HEAPF32[i4 >> 2] = d14;
    }
    i17 = HEAP32[i17 + 4 >> 2] | 0;
   } while ((i17 | 0) != 0);
   if (d15 > 0.0) {
    d19 = 1.0 / d15;
    HEAPF32[i9 >> 2] = d19;
    d16 = d16 * d19;
    d18 = d18 * d19;
   } else {
    i7 = 11;
   }
  } else {
   d14 = 0.0;
   i7 = 11;
  }
  if ((i7 | 0) == 11) {
   HEAPF32[i8 >> 2] = 1.0;
   HEAPF32[i9 >> 2] = 1.0;
   d15 = 1.0;
  }
  do {
   if (d14 > 0.0 ? (HEAP16[i2 + 4 >> 1] & 16) == 0 : 0) {
    d14 = d14 - (d18 * d18 + d16 * d16) * d15;
    HEAPF32[i4 >> 2] = d14;
    if (d14 > 0.0) {
     d1 = 1.0 / d14;
     break;
    } else {
     ___assert_fail(1872, 1520, 319, 1856);
    }
   } else {
    i7 = 17;
   }
  } while (0);
  if ((i7 | 0) == 17) {
   HEAPF32[i4 >> 2] = 0.0;
   d1 = 0.0;
  }
  HEAPF32[i5 >> 2] = d1;
  i20 = i2 + 44 | 0;
  i17 = i20;
  d19 = +HEAPF32[i17 >> 2];
  d14 = +HEAPF32[i17 + 4 >> 2];
  d21 = +d16;
  d1 = +d18;
  i17 = i6;
  HEAPF32[i17 >> 2] = d21;
  HEAPF32[i17 + 4 >> 2] = d1;
  d1 = +HEAPF32[i2 + 24 >> 2];
  d21 = +HEAPF32[i2 + 20 >> 2];
  d15 = +HEAPF32[i2 + 12 >> 2] + (d1 * d16 - d21 * d18);
  d16 = d16 * d21 + d1 * d18 + +HEAPF32[i2 + 16 >> 2];
  d1 = +d15;
  d18 = +d16;
  HEAPF32[i20 >> 2] = d1;
  HEAPF32[i20 + 4 >> 2] = d18;
  i20 = i2 + 36 | 0;
  HEAPF32[i20 >> 2] = d1;
  HEAPF32[i20 + 4 >> 2] = d18;
  d18 = +HEAPF32[i2 + 72 >> 2];
  i20 = i2 + 64 | 0;
  HEAPF32[i20 >> 2] = +HEAPF32[i20 >> 2] - d18 * (d16 - d14);
  i20 = i2 + 68 | 0;
  HEAPF32[i20 >> 2] = d18 * (d15 - d19) + +HEAPF32[i20 >> 2];
  STACKTOP = i3;
  return;
 } else if ((i11 | 0) == 1 | (i11 | 0) == 0) {
  i17 = i2 + 12 | 0;
  i13 = HEAP32[i17 >> 2] | 0;
  i17 = HEAP32[i17 + 4 >> 2] | 0;
  i20 = i2 + 36 | 0;
  HEAP32[i20 >> 2] = i13;
  HEAP32[i20 + 4 >> 2] = i17;
  i20 = i2 + 44 | 0;
  HEAP32[i20 >> 2] = i13;
  HEAP32[i20 + 4 >> 2] = i17;
  HEAPF32[i2 + 52 >> 2] = +HEAPF32[i2 + 56 >> 2];
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(1824, 1520, 284, 1856);
 }
}
function __ZN9b2Contact6UpdateEP17b2ContactListener(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i2 = i3;
 i10 = i1 + 64 | 0;
 i6 = i2 + 0 | 0;
 i7 = i10 + 0 | 0;
 i5 = i6 + 64 | 0;
 do {
  HEAP32[i6 >> 2] = HEAP32[i7 >> 2];
  i6 = i6 + 4 | 0;
  i7 = i7 + 4 | 0;
 } while ((i6 | 0) < (i5 | 0));
 i6 = i1 + 4 | 0;
 i11 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i11 | 4;
 i11 = i11 >>> 1;
 i14 = HEAP32[i1 + 48 >> 2] | 0;
 i15 = HEAP32[i1 + 52 >> 2] | 0;
 i5 = (HEAP8[i15 + 38 | 0] | HEAP8[i14 + 38 | 0]) << 24 >> 24 != 0;
 i8 = HEAP32[i14 + 8 >> 2] | 0;
 i7 = HEAP32[i15 + 8 >> 2] | 0;
 i12 = i8 + 12 | 0;
 i13 = i7 + 12 | 0;
 if (!i5) {
  FUNCTION_TABLE_viiii[HEAP32[HEAP32[i1 >> 2] >> 2] & 15](i1, i10, i12, i13);
  i12 = i1 + 124 | 0;
  i10 = (HEAP32[i12 >> 2] | 0) > 0;
  L4 : do {
   if (i10) {
    i19 = HEAP32[i2 + 60 >> 2] | 0;
    if ((i19 | 0) > 0) {
     i18 = 0;
    } else {
     i9 = 0;
     while (1) {
      HEAPF32[i1 + (i9 * 20 | 0) + 72 >> 2] = 0.0;
      HEAPF32[i1 + (i9 * 20 | 0) + 76 >> 2] = 0.0;
      i9 = i9 + 1 | 0;
      if ((i9 | 0) >= (HEAP32[i12 >> 2] | 0)) {
       break L4;
      }
     }
    }
    do {
     i16 = i1 + (i18 * 20 | 0) + 72 | 0;
     HEAPF32[i16 >> 2] = 0.0;
     i15 = i1 + (i18 * 20 | 0) + 76 | 0;
     HEAPF32[i15 >> 2] = 0.0;
     i14 = HEAP32[i1 + (i18 * 20 | 0) + 80 >> 2] | 0;
     i17 = 0;
     while (1) {
      i13 = i17 + 1 | 0;
      if ((HEAP32[i2 + (i17 * 20 | 0) + 16 >> 2] | 0) == (i14 | 0)) {
       i9 = 7;
       break;
      }
      if ((i13 | 0) < (i19 | 0)) {
       i17 = i13;
      } else {
       break;
      }
     }
     if ((i9 | 0) == 7) {
      i9 = 0;
      HEAPF32[i16 >> 2] = +HEAPF32[i2 + (i17 * 20 | 0) + 8 >> 2];
      HEAPF32[i15 >> 2] = +HEAPF32[i2 + (i17 * 20 | 0) + 12 >> 2];
     }
     i18 = i18 + 1 | 0;
    } while ((i18 | 0) < (HEAP32[i12 >> 2] | 0));
   }
  } while (0);
  i9 = i11 & 1;
  if (i10 ^ (i9 | 0) != 0) {
   i11 = i8 + 4 | 0;
   i12 = HEAPU16[i11 >> 1] | 0;
   if ((i12 & 2 | 0) == 0) {
    HEAP16[i11 >> 1] = i12 | 2;
    HEAPF32[i8 + 144 >> 2] = 0.0;
   }
   i8 = i7 + 4 | 0;
   i11 = HEAPU16[i8 >> 1] | 0;
   if ((i11 & 2 | 0) == 0) {
    HEAP16[i8 >> 1] = i11 | 2;
    HEAPF32[i7 + 144 >> 2] = 0.0;
   }
  }
 } else {
  i10 = __Z13b2TestOverlapPK7b2ShapeiS1_iRK11b2TransformS4_(HEAP32[i14 + 12 >> 2] | 0, HEAP32[i1 + 56 >> 2] | 0, HEAP32[i15 + 12 >> 2] | 0, HEAP32[i1 + 60 >> 2] | 0, i12, i13) | 0;
  HEAP32[i1 + 124 >> 2] = 0;
  i9 = i11 & 1;
 }
 i7 = HEAP32[i6 >> 2] | 0;
 HEAP32[i6 >> 2] = i10 ? i7 | 2 : i7 & -3;
 i8 = (i9 | 0) == 0;
 i6 = i10 ^ 1;
 i7 = (i4 | 0) == 0;
 if (!(i8 ^ 1 | i6 | i7)) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] & 15](i4, i1);
 }
 if (!(i8 | i10 | i7)) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] & 15](i4, i1);
 }
 if (i5 | i6 | i7) {
  STACKTOP = i3;
  return;
 }
 FUNCTION_TABLE_viii[HEAP32[(HEAP32[i4 >> 2] | 0) + 16 >> 2] & 3](i4, i1, i2);
 STACKTOP = i3;
 return;
}
function __ZN13b2DynamicTree10RemoveLeafEi(i1, i12) {
 i1 = i1 | 0;
 i12 = i12 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i13 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 >> 2] | 0) == (i12 | 0)) {
  HEAP32[i1 >> 2] = -1;
  STACKTOP = i2;
  return;
 }
 i3 = i1 + 4 | 0;
 i5 = HEAP32[i3 >> 2] | 0;
 i6 = HEAP32[i5 + (i12 * 36 | 0) + 20 >> 2] | 0;
 i4 = i5 + (i6 * 36 | 0) + 20 | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 i13 = HEAP32[i5 + (i6 * 36 | 0) + 24 >> 2] | 0;
 if ((i13 | 0) == (i12 | 0)) {
  i13 = HEAP32[i5 + (i6 * 36 | 0) + 28 >> 2] | 0;
 }
 if ((i7 | 0) == -1) {
  HEAP32[i1 >> 2] = i13;
  HEAP32[i5 + (i13 * 36 | 0) + 20 >> 2] = -1;
  if (!((i6 | 0) > -1)) {
   ___assert_fail(3e3, 2944, 97, 3040);
  }
  if ((HEAP32[i1 + 12 >> 2] | 0) <= (i6 | 0)) {
   ___assert_fail(3e3, 2944, 97, 3040);
  }
  i3 = i1 + 8 | 0;
  if ((HEAP32[i3 >> 2] | 0) <= 0) {
   ___assert_fail(3056, 2944, 98, 3040);
  }
  i13 = i1 + 16 | 0;
  HEAP32[i4 >> 2] = HEAP32[i13 >> 2];
  HEAP32[i5 + (i6 * 36 | 0) + 32 >> 2] = -1;
  HEAP32[i13 >> 2] = i6;
  HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + -1;
  STACKTOP = i2;
  return;
 }
 i12 = i5 + (i7 * 36 | 0) + 24 | 0;
 if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) {
  HEAP32[i12 >> 2] = i13;
 } else {
  HEAP32[i5 + (i7 * 36 | 0) + 28 >> 2] = i13;
 }
 HEAP32[i5 + (i13 * 36 | 0) + 20 >> 2] = i7;
 if (!((i6 | 0) > -1)) {
  ___assert_fail(3e3, 2944, 97, 3040);
 }
 if ((HEAP32[i1 + 12 >> 2] | 0) <= (i6 | 0)) {
  ___assert_fail(3e3, 2944, 97, 3040);
 }
 i12 = i1 + 8 | 0;
 if ((HEAP32[i12 >> 2] | 0) <= 0) {
  ___assert_fail(3056, 2944, 98, 3040);
 }
 i13 = i1 + 16 | 0;
 HEAP32[i4 >> 2] = HEAP32[i13 >> 2];
 HEAP32[i5 + (i6 * 36 | 0) + 32 >> 2] = -1;
 HEAP32[i13 >> 2] = i6;
 HEAP32[i12 >> 2] = (HEAP32[i12 >> 2] | 0) + -1;
 do {
  i4 = __ZN13b2DynamicTree7BalanceEi(i1, i7) | 0;
  i7 = HEAP32[i3 >> 2] | 0;
  i6 = HEAP32[i7 + (i4 * 36 | 0) + 24 >> 2] | 0;
  i5 = HEAP32[i7 + (i4 * 36 | 0) + 28 >> 2] | 0;
  d10 = +HEAPF32[i7 + (i6 * 36 | 0) >> 2];
  d11 = +HEAPF32[i7 + (i5 * 36 | 0) >> 2];
  d9 = +HEAPF32[i7 + (i6 * 36 | 0) + 4 >> 2];
  d8 = +HEAPF32[i7 + (i5 * 36 | 0) + 4 >> 2];
  d10 = +(d10 < d11 ? d10 : d11);
  d11 = +(d9 < d8 ? d9 : d8);
  i13 = i7 + (i4 * 36 | 0) | 0;
  HEAPF32[i13 >> 2] = d10;
  HEAPF32[i13 + 4 >> 2] = d11;
  d11 = +HEAPF32[i7 + (i6 * 36 | 0) + 8 >> 2];
  d10 = +HEAPF32[i7 + (i5 * 36 | 0) + 8 >> 2];
  d9 = +HEAPF32[i7 + (i6 * 36 | 0) + 12 >> 2];
  d8 = +HEAPF32[i7 + (i5 * 36 | 0) + 12 >> 2];
  d10 = +(d11 > d10 ? d11 : d10);
  d11 = +(d9 > d8 ? d9 : d8);
  i7 = i7 + (i4 * 36 | 0) + 8 | 0;
  HEAPF32[i7 >> 2] = d10;
  HEAPF32[i7 + 4 >> 2] = d11;
  i7 = HEAP32[i3 >> 2] | 0;
  i6 = HEAP32[i7 + (i6 * 36 | 0) + 32 >> 2] | 0;
  i5 = HEAP32[i7 + (i5 * 36 | 0) + 32 >> 2] | 0;
  HEAP32[i7 + (i4 * 36 | 0) + 32 >> 2] = ((i6 | 0) > (i5 | 0) ? i6 : i5) + 1;
  i7 = HEAP32[i7 + (i4 * 36 | 0) + 20 >> 2] | 0;
 } while (!((i7 | 0) == -1));
 STACKTOP = i2;
 return;
}
function __ZN9b2Simplex6Solve3Ev(i7) {
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0;
 i1 = STACKTOP;
 i2 = i7 + 16 | 0;
 d17 = +HEAPF32[i2 >> 2];
 d15 = +HEAPF32[i2 + 4 >> 2];
 i2 = i7 + 36 | 0;
 i3 = i7 + 52 | 0;
 d14 = +HEAPF32[i3 >> 2];
 d16 = +HEAPF32[i3 + 4 >> 2];
 i3 = i7 + 72 | 0;
 i22 = i7 + 88 | 0;
 d18 = +HEAPF32[i22 >> 2];
 d11 = +HEAPF32[i22 + 4 >> 2];
 d20 = d14 - d17;
 d10 = d16 - d15;
 d9 = d17 * d20 + d15 * d10;
 d8 = d14 * d20 + d16 * d10;
 d4 = d18 - d17;
 d19 = d11 - d15;
 d6 = d17 * d4 + d15 * d19;
 d5 = d18 * d4 + d11 * d19;
 d21 = d18 - d14;
 d12 = d11 - d16;
 d13 = d14 * d21 + d16 * d12;
 d12 = d18 * d21 + d11 * d12;
 d4 = d20 * d19 - d10 * d4;
 d10 = (d14 * d11 - d16 * d18) * d4;
 d11 = (d15 * d18 - d17 * d11) * d4;
 d4 = (d17 * d16 - d15 * d14) * d4;
 if (!(!(d9 >= -0.0) | !(d6 >= -0.0))) {
  HEAPF32[i7 + 24 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  STACKTOP = i1;
  return;
 }
 if (!(!(d9 < -0.0) | !(d8 > 0.0) | !(d4 <= 0.0))) {
  d21 = 1.0 / (d8 - d9);
  HEAPF32[i7 + 24 >> 2] = d8 * d21;
  HEAPF32[i7 + 60 >> 2] = -(d9 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  STACKTOP = i1;
  return;
 }
 if (!(!(d6 < -0.0) | !(d5 > 0.0) | !(d11 <= 0.0))) {
  d21 = 1.0 / (d5 - d6);
  HEAPF32[i7 + 24 >> 2] = d5 * d21;
  HEAPF32[i7 + 96 >> 2] = -(d6 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  i7 = i2 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(!(d8 <= 0.0) | !(d13 >= -0.0))) {
  HEAPF32[i7 + 60 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  i7 = i7 + 0 | 0;
  i3 = i2 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(!(d5 <= 0.0) | !(d12 <= 0.0))) {
  HEAPF32[i7 + 96 >> 2] = 1.0;
  HEAP32[i7 + 108 >> 2] = 1;
  i7 = i7 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
 if (!(d13 < -0.0) | !(d12 > 0.0) | !(d10 <= 0.0)) {
  d21 = 1.0 / (d4 + (d10 + d11));
  HEAPF32[i7 + 24 >> 2] = d10 * d21;
  HEAPF32[i7 + 60 >> 2] = d11 * d21;
  HEAPF32[i7 + 96 >> 2] = d4 * d21;
  HEAP32[i7 + 108 >> 2] = 3;
  STACKTOP = i1;
  return;
 } else {
  d21 = 1.0 / (d12 - d13);
  HEAPF32[i7 + 60 >> 2] = d12 * d21;
  HEAPF32[i7 + 96 >> 2] = -(d13 * d21);
  HEAP32[i7 + 108 >> 2] = 2;
  i7 = i7 + 0 | 0;
  i3 = i3 + 0 | 0;
  i2 = i7 + 36 | 0;
  do {
   HEAP32[i7 >> 2] = HEAP32[i3 >> 2];
   i7 = i7 + 4 | 0;
   i3 = i3 + 4 | 0;
  } while ((i7 | 0) < (i2 | 0));
  STACKTOP = i1;
  return;
 }
}
function __ZN16b2ContactManager7CollideEv(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0;
 i2 = STACKTOP;
 i8 = HEAP32[i3 + 60 >> 2] | 0;
 if ((i8 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i7 = i3 + 12 | 0;
 i6 = i3 + 4 | 0;
 i5 = i3 + 72 | 0;
 i4 = i3 + 68 | 0;
 L4 : while (1) {
  i12 = HEAP32[i8 + 48 >> 2] | 0;
  i10 = HEAP32[i8 + 52 >> 2] | 0;
  i11 = HEAP32[i8 + 56 >> 2] | 0;
  i9 = HEAP32[i8 + 60 >> 2] | 0;
  i15 = HEAP32[i12 + 8 >> 2] | 0;
  i13 = HEAP32[i10 + 8 >> 2] | 0;
  i16 = i8 + 4 | 0;
  do {
   if ((HEAP32[i16 >> 2] & 8 | 0) == 0) {
    i1 = 11;
   } else {
    if (!(__ZNK6b2Body13ShouldCollideEPKS_(i13, i15) | 0)) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    }
    i14 = HEAP32[i4 >> 2] | 0;
    if ((i14 | 0) != 0 ? !(FUNCTION_TABLE_iiii[HEAP32[(HEAP32[i14 >> 2] | 0) + 8 >> 2] & 7](i14, i12, i10) | 0) : 0) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    }
    HEAP32[i16 >> 2] = HEAP32[i16 >> 2] & -9;
    i1 = 11;
   }
  } while (0);
  do {
   if ((i1 | 0) == 11) {
    i1 = 0;
    if ((HEAP16[i15 + 4 >> 1] & 2) == 0) {
     i14 = 0;
    } else {
     i14 = (HEAP32[i15 >> 2] | 0) != 0;
    }
    if ((HEAP16[i13 + 4 >> 1] & 2) == 0) {
     i13 = 0;
    } else {
     i13 = (HEAP32[i13 >> 2] | 0) != 0;
    }
    if (!(i14 | i13)) {
     i8 = HEAP32[i8 + 12 >> 2] | 0;
     break;
    }
    i11 = HEAP32[(HEAP32[i12 + 24 >> 2] | 0) + (i11 * 28 | 0) + 24 >> 2] | 0;
    i9 = HEAP32[(HEAP32[i10 + 24 >> 2] | 0) + (i9 * 28 | 0) + 24 >> 2] | 0;
    if (!((i11 | 0) > -1)) {
     i1 = 19;
     break L4;
    }
    i10 = HEAP32[i7 >> 2] | 0;
    if ((i10 | 0) <= (i11 | 0)) {
     i1 = 19;
     break L4;
    }
    i12 = HEAP32[i6 >> 2] | 0;
    if (!((i9 | 0) > -1 & (i10 | 0) > (i9 | 0))) {
     i1 = 21;
     break L4;
    }
    if (+HEAPF32[i12 + (i9 * 36 | 0) >> 2] - +HEAPF32[i12 + (i11 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i12 + (i9 * 36 | 0) + 4 >> 2] - +HEAPF32[i12 + (i11 * 36 | 0) + 12 >> 2] > 0.0 | +HEAPF32[i12 + (i11 * 36 | 0) >> 2] - +HEAPF32[i12 + (i9 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i12 + (i11 * 36 | 0) + 4 >> 2] - +HEAPF32[i12 + (i9 * 36 | 0) + 12 >> 2] > 0.0) {
     i16 = HEAP32[i8 + 12 >> 2] | 0;
     __ZN16b2ContactManager7DestroyEP9b2Contact(i3, i8);
     i8 = i16;
     break;
    } else {
     __ZN9b2Contact6UpdateEP17b2ContactListener(i8, HEAP32[i5 >> 2] | 0);
     i8 = HEAP32[i8 + 12 >> 2] | 0;
     break;
    }
   }
  } while (0);
  if ((i8 | 0) == 0) {
   i1 = 25;
   break;
  }
 }
 if ((i1 | 0) == 19) {
  ___assert_fail(1904, 1952, 159, 2008);
 } else if ((i1 | 0) == 21) {
  ___assert_fail(1904, 1952, 159, 2008);
 } else if ((i1 | 0) == 25) {
  STACKTOP = i2;
  return;
 }
}
function __ZN16b2ContactManager7AddPairEPvS0_(i1, i5, i6) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i5 + 16 >> 2] | 0;
 i3 = HEAP32[i6 + 16 >> 2] | 0;
 i5 = HEAP32[i5 + 20 >> 2] | 0;
 i6 = HEAP32[i6 + 20 >> 2] | 0;
 i8 = HEAP32[i4 + 8 >> 2] | 0;
 i7 = HEAP32[i3 + 8 >> 2] | 0;
 if ((i8 | 0) == (i7 | 0)) {
  STACKTOP = i2;
  return;
 }
 i10 = HEAP32[i7 + 112 >> 2] | 0;
 L4 : do {
  if ((i10 | 0) != 0) {
   while (1) {
    if ((HEAP32[i10 >> 2] | 0) == (i8 | 0)) {
     i9 = HEAP32[i10 + 4 >> 2] | 0;
     i12 = HEAP32[i9 + 48 >> 2] | 0;
     i13 = HEAP32[i9 + 52 >> 2] | 0;
     i11 = HEAP32[i9 + 56 >> 2] | 0;
     i9 = HEAP32[i9 + 60 >> 2] | 0;
     if ((i12 | 0) == (i4 | 0) & (i13 | 0) == (i3 | 0) & (i11 | 0) == (i5 | 0) & (i9 | 0) == (i6 | 0)) {
      i9 = 22;
      break;
     }
     if ((i12 | 0) == (i3 | 0) & (i13 | 0) == (i4 | 0) & (i11 | 0) == (i6 | 0) & (i9 | 0) == (i5 | 0)) {
      i9 = 22;
      break;
     }
    }
    i10 = HEAP32[i10 + 12 >> 2] | 0;
    if ((i10 | 0) == 0) {
     break L4;
    }
   }
   if ((i9 | 0) == 22) {
    STACKTOP = i2;
    return;
   }
  }
 } while (0);
 if (!(__ZNK6b2Body13ShouldCollideEPKS_(i7, i8) | 0)) {
  STACKTOP = i2;
  return;
 }
 i7 = HEAP32[i1 + 68 >> 2] | 0;
 if ((i7 | 0) != 0 ? !(FUNCTION_TABLE_iiii[HEAP32[(HEAP32[i7 >> 2] | 0) + 8 >> 2] & 7](i7, i4, i3) | 0) : 0) {
  STACKTOP = i2;
  return;
 }
 i5 = __ZN9b2Contact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i4, i5, i3, i6, HEAP32[i1 + 76 >> 2] | 0) | 0;
 if ((i5 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 i4 = HEAP32[(HEAP32[i5 + 48 >> 2] | 0) + 8 >> 2] | 0;
 i3 = HEAP32[(HEAP32[i5 + 52 >> 2] | 0) + 8 >> 2] | 0;
 HEAP32[i5 + 8 >> 2] = 0;
 i7 = i1 + 60 | 0;
 HEAP32[i5 + 12 >> 2] = HEAP32[i7 >> 2];
 i6 = HEAP32[i7 >> 2] | 0;
 if ((i6 | 0) != 0) {
  HEAP32[i6 + 8 >> 2] = i5;
 }
 HEAP32[i7 >> 2] = i5;
 i8 = i5 + 16 | 0;
 HEAP32[i5 + 20 >> 2] = i5;
 HEAP32[i8 >> 2] = i3;
 HEAP32[i5 + 24 >> 2] = 0;
 i6 = i4 + 112 | 0;
 HEAP32[i5 + 28 >> 2] = HEAP32[i6 >> 2];
 i7 = HEAP32[i6 >> 2] | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 8 >> 2] = i8;
 }
 HEAP32[i6 >> 2] = i8;
 i6 = i5 + 32 | 0;
 HEAP32[i5 + 36 >> 2] = i5;
 HEAP32[i6 >> 2] = i4;
 HEAP32[i5 + 40 >> 2] = 0;
 i7 = i3 + 112 | 0;
 HEAP32[i5 + 44 >> 2] = HEAP32[i7 >> 2];
 i5 = HEAP32[i7 >> 2] | 0;
 if ((i5 | 0) != 0) {
  HEAP32[i5 + 8 >> 2] = i6;
 }
 HEAP32[i7 >> 2] = i6;
 i5 = i4 + 4 | 0;
 i6 = HEAPU16[i5 >> 1] | 0;
 if ((i6 & 2 | 0) == 0) {
  HEAP16[i5 >> 1] = i6 | 2;
  HEAPF32[i4 + 144 >> 2] = 0.0;
 }
 i4 = i3 + 4 | 0;
 i5 = HEAPU16[i4 >> 1] | 0;
 if ((i5 & 2 | 0) == 0) {
  HEAP16[i4 >> 1] = i5 | 2;
  HEAPF32[i3 + 144 >> 2] = 0.0;
 }
 i13 = i1 + 64 | 0;
 HEAP32[i13 >> 2] = (HEAP32[i13 >> 2] | 0) + 1;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhase11UpdatePairsI16b2ContactManagerEEvPT_(i5, i2) {
 i5 = i5 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0;
 i3 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i6 = i3;
 i1 = i5 + 52 | 0;
 HEAP32[i1 >> 2] = 0;
 i4 = i5 + 40 | 0;
 i12 = HEAP32[i4 >> 2] | 0;
 do {
  if ((i12 | 0) > 0) {
   i9 = i5 + 32 | 0;
   i11 = i5 + 56 | 0;
   i8 = i5 + 12 | 0;
   i10 = i5 + 4 | 0;
   i13 = 0;
   while (1) {
    i14 = HEAP32[(HEAP32[i9 >> 2] | 0) + (i13 << 2) >> 2] | 0;
    HEAP32[i11 >> 2] = i14;
    if (!((i14 | 0) == -1)) {
     if (!((i14 | 0) > -1)) {
      i8 = 6;
      break;
     }
     if ((HEAP32[i8 >> 2] | 0) <= (i14 | 0)) {
      i8 = 6;
      break;
     }
     __ZNK13b2DynamicTree5QueryI12b2BroadPhaseEEvPT_RK6b2AABB(i5, i5, (HEAP32[i10 >> 2] | 0) + (i14 * 36 | 0) | 0);
     i12 = HEAP32[i4 >> 2] | 0;
    }
    i13 = i13 + 1 | 0;
    if ((i13 | 0) >= (i12 | 0)) {
     i8 = 9;
     break;
    }
   }
   if ((i8 | 0) == 6) {
    ___assert_fail(1904, 1952, 159, 2008);
   } else if ((i8 | 0) == 9) {
    i7 = HEAP32[i1 >> 2] | 0;
    break;
   }
  } else {
   i7 = 0;
  }
 } while (0);
 HEAP32[i4 >> 2] = 0;
 i4 = i5 + 44 | 0;
 i14 = HEAP32[i4 >> 2] | 0;
 HEAP32[i6 >> 2] = 3;
 __ZNSt3__16__sortIRPFbRK6b2PairS3_EPS1_EEvT0_S8_T_(i14, i14 + (i7 * 12 | 0) | 0, i6);
 if ((HEAP32[i1 >> 2] | 0) <= 0) {
  STACKTOP = i3;
  return;
 }
 i6 = i5 + 12 | 0;
 i7 = i5 + 4 | 0;
 i9 = 0;
 L18 : while (1) {
  i8 = HEAP32[i4 >> 2] | 0;
  i5 = i8 + (i9 * 12 | 0) | 0;
  i10 = HEAP32[i5 >> 2] | 0;
  if (!((i10 | 0) > -1)) {
   i8 = 14;
   break;
  }
  i12 = HEAP32[i6 >> 2] | 0;
  if ((i12 | 0) <= (i10 | 0)) {
   i8 = 14;
   break;
  }
  i11 = HEAP32[i7 >> 2] | 0;
  i8 = i8 + (i9 * 12 | 0) + 4 | 0;
  i13 = HEAP32[i8 >> 2] | 0;
  if (!((i13 | 0) > -1 & (i12 | 0) > (i13 | 0))) {
   i8 = 16;
   break;
  }
  __ZN16b2ContactManager7AddPairEPvS0_(i2, HEAP32[i11 + (i10 * 36 | 0) + 16 >> 2] | 0, HEAP32[i11 + (i13 * 36 | 0) + 16 >> 2] | 0);
  i10 = HEAP32[i1 >> 2] | 0;
  while (1) {
   i9 = i9 + 1 | 0;
   if ((i9 | 0) >= (i10 | 0)) {
    i8 = 21;
    break L18;
   }
   i11 = HEAP32[i4 >> 2] | 0;
   if ((HEAP32[i11 + (i9 * 12 | 0) >> 2] | 0) != (HEAP32[i5 >> 2] | 0)) {
    continue L18;
   }
   if ((HEAP32[i11 + (i9 * 12 | 0) + 4 >> 2] | 0) != (HEAP32[i8 >> 2] | 0)) {
    continue L18;
   }
  }
 }
 if ((i8 | 0) == 14) {
  ___assert_fail(1904, 1952, 153, 1992);
 } else if ((i8 | 0) == 16) {
  ___assert_fail(1904, 1952, 153, 1992);
 } else if ((i8 | 0) == 21) {
  STACKTOP = i3;
  return;
 }
}
function __ZNK13b2DynamicTree5QueryI12b2BroadPhaseEEvPT_RK6b2AABB(i9, i4, i7) {
 i9 = i9 | 0;
 i4 = i4 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 1040 | 0;
 i3 = i2;
 i1 = i3 + 4 | 0;
 HEAP32[i3 >> 2] = i1;
 i5 = i3 + 1028 | 0;
 HEAP32[i5 >> 2] = 0;
 i6 = i3 + 1032 | 0;
 HEAP32[i6 >> 2] = 256;
 i14 = HEAP32[i3 >> 2] | 0;
 HEAP32[i14 + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i9 >> 2];
 i15 = HEAP32[i5 >> 2] | 0;
 i16 = i15 + 1 | 0;
 HEAP32[i5 >> 2] = i16;
 L1 : do {
  if ((i15 | 0) > -1) {
   i9 = i9 + 4 | 0;
   i11 = i7 + 4 | 0;
   i12 = i7 + 8 | 0;
   i10 = i7 + 12 | 0;
   while (1) {
    i16 = i16 + -1 | 0;
    HEAP32[i5 >> 2] = i16;
    i13 = HEAP32[i14 + (i16 << 2) >> 2] | 0;
    do {
     if (!((i13 | 0) == -1) ? (i8 = HEAP32[i9 >> 2] | 0, !(+HEAPF32[i7 >> 2] - +HEAPF32[i8 + (i13 * 36 | 0) + 8 >> 2] > 0.0 | +HEAPF32[i11 >> 2] - +HEAPF32[i8 + (i13 * 36 | 0) + 12 >> 2] > 0.0 | +HEAPF32[i8 + (i13 * 36 | 0) >> 2] - +HEAPF32[i12 >> 2] > 0.0 | +HEAPF32[i8 + (i13 * 36 | 0) + 4 >> 2] - +HEAPF32[i10 >> 2] > 0.0)) : 0) {
      i15 = i8 + (i13 * 36 | 0) + 24 | 0;
      if ((HEAP32[i15 >> 2] | 0) == -1) {
       if (!(__ZN12b2BroadPhase13QueryCallbackEi(i4, i13) | 0)) {
        break L1;
       }
       i16 = HEAP32[i5 >> 2] | 0;
       break;
      }
      if ((i16 | 0) == (HEAP32[i6 >> 2] | 0) ? (HEAP32[i6 >> 2] = i16 << 1, i16 = __Z7b2Alloci(i16 << 3) | 0, HEAP32[i3 >> 2] = i16, _memcpy(i16 | 0, i14 | 0, HEAP32[i5 >> 2] << 2 | 0) | 0, (i14 | 0) != (i1 | 0)) : 0) {
       __Z6b2FreePv(i14);
      }
      i14 = HEAP32[i3 >> 2] | 0;
      HEAP32[i14 + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i15 >> 2];
      i15 = (HEAP32[i5 >> 2] | 0) + 1 | 0;
      HEAP32[i5 >> 2] = i15;
      i13 = i8 + (i13 * 36 | 0) + 28 | 0;
      if ((i15 | 0) == (HEAP32[i6 >> 2] | 0) ? (HEAP32[i6 >> 2] = i15 << 1, i16 = __Z7b2Alloci(i15 << 3) | 0, HEAP32[i3 >> 2] = i16, _memcpy(i16 | 0, i14 | 0, HEAP32[i5 >> 2] << 2 | 0) | 0, (i14 | 0) != (i1 | 0)) : 0) {
       __Z6b2FreePv(i14);
      }
      HEAP32[(HEAP32[i3 >> 2] | 0) + (HEAP32[i5 >> 2] << 2) >> 2] = HEAP32[i13 >> 2];
      i16 = (HEAP32[i5 >> 2] | 0) + 1 | 0;
      HEAP32[i5 >> 2] = i16;
     }
    } while (0);
    if ((i16 | 0) <= 0) {
     break L1;
    }
    i14 = HEAP32[i3 >> 2] | 0;
   }
  }
 } while (0);
 i4 = HEAP32[i3 >> 2] | 0;
 if ((i4 | 0) == (i1 | 0)) {
  STACKTOP = i2;
  return;
 }
 __Z6b2FreePv(i4);
 HEAP32[i3 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN15b2ContactSolver9WarmStartEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, d10 = 0.0, d11 = 0.0, d12 = 0.0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0, d21 = 0.0, i22 = 0, d23 = 0.0, i24 = 0, d25 = 0.0, d26 = 0.0, d27 = 0.0;
 i1 = STACKTOP;
 i2 = i4 + 48 | 0;
 if ((HEAP32[i2 >> 2] | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 40 | 0;
 i5 = i4 + 28 | 0;
 i22 = HEAP32[i5 >> 2] | 0;
 i8 = 0;
 do {
  i9 = HEAP32[i3 >> 2] | 0;
  i7 = HEAP32[i9 + (i8 * 152 | 0) + 112 >> 2] | 0;
  i6 = HEAP32[i9 + (i8 * 152 | 0) + 116 >> 2] | 0;
  d10 = +HEAPF32[i9 + (i8 * 152 | 0) + 120 >> 2];
  d14 = +HEAPF32[i9 + (i8 * 152 | 0) + 128 >> 2];
  d12 = +HEAPF32[i9 + (i8 * 152 | 0) + 124 >> 2];
  d11 = +HEAPF32[i9 + (i8 * 152 | 0) + 132 >> 2];
  i13 = HEAP32[i9 + (i8 * 152 | 0) + 144 >> 2] | 0;
  i4 = i22 + (i7 * 12 | 0) | 0;
  i24 = i4;
  d17 = +HEAPF32[i24 >> 2];
  d19 = +HEAPF32[i24 + 4 >> 2];
  d20 = +HEAPF32[i22 + (i7 * 12 | 0) + 8 >> 2];
  i24 = i22 + (i6 * 12 | 0) | 0;
  d21 = +HEAPF32[i24 >> 2];
  d23 = +HEAPF32[i24 + 4 >> 2];
  d18 = +HEAPF32[i22 + (i6 * 12 | 0) + 8 >> 2];
  i22 = i9 + (i8 * 152 | 0) + 72 | 0;
  d15 = +HEAPF32[i22 >> 2];
  d16 = +HEAPF32[i22 + 4 >> 2];
  if ((i13 | 0) > 0) {
   i22 = 0;
   do {
    d27 = +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 16 >> 2];
    d25 = +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 20 >> 2];
    d26 = d15 * d27 + d16 * d25;
    d25 = d16 * d27 - d15 * d25;
    d20 = d20 - d14 * (+HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) >> 2] * d25 - +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 4 >> 2] * d26);
    d17 = d17 - d10 * d26;
    d19 = d19 - d10 * d25;
    d18 = d18 + d11 * (d25 * +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 8 >> 2] - d26 * +HEAPF32[i9 + (i8 * 152 | 0) + (i22 * 36 | 0) + 12 >> 2]);
    d21 = d21 + d12 * d26;
    d23 = d23 + d12 * d25;
    i22 = i22 + 1 | 0;
   } while ((i22 | 0) != (i13 | 0));
  }
  d27 = +d17;
  d26 = +d19;
  i22 = i4;
  HEAPF32[i22 >> 2] = d27;
  HEAPF32[i22 + 4 >> 2] = d26;
  i22 = HEAP32[i5 >> 2] | 0;
  HEAPF32[i22 + (i7 * 12 | 0) + 8 >> 2] = d20;
  d26 = +d21;
  d27 = +d23;
  i22 = i22 + (i6 * 12 | 0) | 0;
  HEAPF32[i22 >> 2] = d26;
  HEAPF32[i22 + 4 >> 2] = d27;
  i22 = HEAP32[i5 >> 2] | 0;
  HEAPF32[i22 + (i6 * 12 | 0) + 8 >> 2] = d18;
  i8 = i8 + 1 | 0;
 } while ((i8 | 0) < (HEAP32[i2 >> 2] | 0));
 STACKTOP = i1;
 return;
}
function __ZNK14b2PolygonShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi(i1, i5, i8, i7, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 var i2 = 0, d3 = 0.0, i6 = 0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, i14 = 0, i15 = 0, i16 = 0, d17 = 0.0, d18 = 0.0, d19 = 0.0, d20 = 0.0;
 i4 = STACKTOP;
 d10 = +HEAPF32[i7 >> 2];
 d9 = +HEAPF32[i8 >> 2] - d10;
 d18 = +HEAPF32[i7 + 4 >> 2];
 d11 = +HEAPF32[i8 + 4 >> 2] - d18;
 i6 = i7 + 12 | 0;
 d17 = +HEAPF32[i6 >> 2];
 i7 = i7 + 8 | 0;
 d19 = +HEAPF32[i7 >> 2];
 d12 = d9 * d17 + d11 * d19;
 d9 = d17 * d11 - d9 * d19;
 d10 = +HEAPF32[i8 + 8 >> 2] - d10;
 d18 = +HEAPF32[i8 + 12 >> 2] - d18;
 d11 = d17 * d10 + d19 * d18 - d12;
 d10 = d17 * d18 - d19 * d10 - d9;
 i8 = i8 + 16 | 0;
 i14 = HEAP32[i1 + 148 >> 2] | 0;
 do {
  if ((i14 | 0) > 0) {
   i16 = 0;
   i15 = -1;
   d13 = 0.0;
   d17 = +HEAPF32[i8 >> 2];
   L3 : while (1) {
    d20 = +HEAPF32[i1 + (i16 << 3) + 84 >> 2];
    d19 = +HEAPF32[i1 + (i16 << 3) + 88 >> 2];
    d18 = (+HEAPF32[i1 + (i16 << 3) + 20 >> 2] - d12) * d20 + (+HEAPF32[i1 + (i16 << 3) + 24 >> 2] - d9) * d19;
    d19 = d11 * d20 + d10 * d19;
    do {
     if (d19 == 0.0) {
      if (d18 < 0.0) {
       i1 = 0;
       i14 = 18;
       break L3;
      }
     } else {
      if (d19 < 0.0 ? d18 < d13 * d19 : 0) {
       i15 = i16;
       d13 = d18 / d19;
       break;
      }
      if (d19 > 0.0 ? d18 < d17 * d19 : 0) {
       d17 = d18 / d19;
      }
     }
    } while (0);
    i16 = i16 + 1 | 0;
    if (d17 < d13) {
     i1 = 0;
     i14 = 18;
     break;
    }
    if ((i16 | 0) >= (i14 | 0)) {
     i14 = 13;
     break;
    }
   }
   if ((i14 | 0) == 13) {
    if (d13 >= 0.0) {
     i2 = i15;
     d3 = d13;
     break;
    }
    ___assert_fail(376, 328, 249, 424);
   } else if ((i14 | 0) == 18) {
    STACKTOP = i4;
    return i1 | 0;
   }
  } else {
   i2 = -1;
   d3 = 0.0;
  }
 } while (0);
 if (!(d3 <= +HEAPF32[i8 >> 2])) {
  ___assert_fail(376, 328, 249, 424);
 }
 if (!((i2 | 0) > -1)) {
  i16 = 0;
  STACKTOP = i4;
  return i16 | 0;
 }
 HEAPF32[i5 + 8 >> 2] = d3;
 d18 = +HEAPF32[i6 >> 2];
 d13 = +HEAPF32[i1 + (i2 << 3) + 84 >> 2];
 d17 = +HEAPF32[i7 >> 2];
 d20 = +HEAPF32[i1 + (i2 << 3) + 88 >> 2];
 d19 = +(d18 * d13 - d17 * d20);
 d20 = +(d13 * d17 + d18 * d20);
 i16 = i5;
 HEAPF32[i16 >> 2] = d19;
 HEAPF32[i16 + 4 >> 2] = d20;
 i16 = 1;
 STACKTOP = i4;
 return i16 | 0;
}
function __ZN7b2World4StepEfii(i1, d9, i11, i12) {
 i1 = i1 | 0;
 d9 = +d9;
 i11 = i11 | 0;
 i12 = i12 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i13 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i3 = i4 + 27 | 0;
 i5 = i4;
 i8 = i4 + 26 | 0;
 i10 = i4 + 25 | 0;
 i7 = i4 + 24 | 0;
 __ZN7b2TimerC2Ev(i3);
 i2 = i1 + 102868 | 0;
 i13 = HEAP32[i2 >> 2] | 0;
 if ((i13 & 1 | 0) != 0) {
  __ZN16b2ContactManager15FindNewContactsEv(i1 + 102872 | 0);
  i13 = HEAP32[i2 >> 2] & -2;
  HEAP32[i2 >> 2] = i13;
 }
 HEAP32[i2 >> 2] = i13 | 2;
 HEAPF32[i5 >> 2] = d9;
 HEAP32[i5 + 12 >> 2] = i11;
 HEAP32[i5 + 16 >> 2] = i12;
 if (d9 > 0.0) {
  HEAPF32[i5 + 4 >> 2] = 1.0 / d9;
 } else {
  HEAPF32[i5 + 4 >> 2] = 0.0;
 }
 i11 = i1 + 102988 | 0;
 HEAPF32[i5 + 8 >> 2] = +HEAPF32[i11 >> 2] * d9;
 HEAP8[i5 + 20 | 0] = HEAP8[i1 + 102992 | 0] | 0;
 __ZN7b2TimerC2Ev(i8);
 __ZN16b2ContactManager7CollideEv(i1 + 102872 | 0);
 HEAPF32[i1 + 103e3 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i8);
 if ((HEAP8[i1 + 102995 | 0] | 0) != 0 ? +HEAPF32[i5 >> 2] > 0.0 : 0) {
  __ZN7b2TimerC2Ev(i10);
  __ZN7b2World5SolveERK10b2TimeStep(i1, i5);
  HEAPF32[i1 + 103004 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i10);
 }
 if ((HEAP8[i1 + 102993 | 0] | 0) != 0) {
  d9 = +HEAPF32[i5 >> 2];
  if (d9 > 0.0) {
   __ZN7b2TimerC2Ev(i7);
   __ZN7b2World8SolveTOIERK10b2TimeStep(i1, i5);
   HEAPF32[i1 + 103024 >> 2] = +__ZNK7b2Timer15GetMillisecondsEv(i7);
   i6 = 12;
  }
 } else {
  i6 = 12;
 }
 if ((i6 | 0) == 12) {
  d9 = +HEAPF32[i5 >> 2];
 }
 if (d9 > 0.0) {
  HEAPF32[i11 >> 2] = +HEAPF32[i5 + 4 >> 2];
 }
 i5 = HEAP32[i2 >> 2] | 0;
 if ((i5 & 4 | 0) == 0) {
  i13 = i5 & -3;
  HEAP32[i2 >> 2] = i13;
  d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
  i13 = i1 + 102996 | 0;
  HEAPF32[i13 >> 2] = d9;
  STACKTOP = i4;
  return;
 }
 i6 = HEAP32[i1 + 102952 >> 2] | 0;
 if ((i6 | 0) == 0) {
  i13 = i5 & -3;
  HEAP32[i2 >> 2] = i13;
  d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
  i13 = i1 + 102996 | 0;
  HEAPF32[i13 >> 2] = d9;
  STACKTOP = i4;
  return;
 }
 do {
  HEAPF32[i6 + 76 >> 2] = 0.0;
  HEAPF32[i6 + 80 >> 2] = 0.0;
  HEAPF32[i6 + 84 >> 2] = 0.0;
  i6 = HEAP32[i6 + 96 >> 2] | 0;
 } while ((i6 | 0) != 0);
 i13 = i5 & -3;
 HEAP32[i2 >> 2] = i13;
 d9 = +__ZNK7b2Timer15GetMillisecondsEv(i3);
 i13 = i1 + 102996 | 0;
 HEAPF32[i13 >> 2] = d9;
 STACKTOP = i4;
 return;
}
function __ZL19b2FindMaxSeparationPiPK14b2PolygonShapeRK11b2TransformS2_S5_(i1, i5, i6, i3, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 var i2 = 0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0;
 i2 = STACKTOP;
 i7 = HEAP32[i5 + 148 >> 2] | 0;
 d17 = +HEAPF32[i4 + 12 >> 2];
 d19 = +HEAPF32[i3 + 12 >> 2];
 d18 = +HEAPF32[i4 + 8 >> 2];
 d16 = +HEAPF32[i3 + 16 >> 2];
 d15 = +HEAPF32[i6 + 12 >> 2];
 d10 = +HEAPF32[i5 + 12 >> 2];
 d8 = +HEAPF32[i6 + 8 >> 2];
 d9 = +HEAPF32[i5 + 16 >> 2];
 d11 = +HEAPF32[i4 >> 2] + (d17 * d19 - d18 * d16) - (+HEAPF32[i6 >> 2] + (d15 * d10 - d8 * d9));
 d9 = d19 * d18 + d17 * d16 + +HEAPF32[i4 + 4 >> 2] - (d10 * d8 + d15 * d9 + +HEAPF32[i6 + 4 >> 2]);
 d10 = d15 * d11 + d8 * d9;
 d8 = d15 * d9 - d11 * d8;
 if ((i7 | 0) > 0) {
  i14 = 0;
  i13 = 0;
  d9 = -3.4028234663852886e+38;
  while (1) {
   d11 = d10 * +HEAPF32[i5 + (i13 << 3) + 84 >> 2] + d8 * +HEAPF32[i5 + (i13 << 3) + 88 >> 2];
   i12 = d11 > d9;
   i14 = i12 ? i13 : i14;
   i13 = i13 + 1 | 0;
   if ((i13 | 0) == (i7 | 0)) {
    break;
   } else {
    d9 = i12 ? d11 : d9;
   }
  }
 } else {
  i14 = 0;
 }
 d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i14, i3, i4);
 i12 = ((i14 | 0) > 0 ? i14 : i7) + -1 | 0;
 d8 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i12, i3, i4);
 i13 = i14 + 1 | 0;
 i13 = (i13 | 0) < (i7 | 0) ? i13 : 0;
 d10 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
 if (d8 > d9 & d8 > d10) {
  while (1) {
   i13 = ((i12 | 0) > 0 ? i12 : i7) + -1 | 0;
   d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
   if (d9 > d8) {
    i12 = i13;
    d8 = d9;
   } else {
    break;
   }
  }
  HEAP32[i1 >> 2] = i12;
  STACKTOP = i2;
  return +d8;
 }
 if (d10 > d9) {
  i12 = i13;
  d8 = d10;
 } else {
  d19 = d9;
  HEAP32[i1 >> 2] = i14;
  STACKTOP = i2;
  return +d19;
 }
 while (1) {
  i13 = i12 + 1 | 0;
  i13 = (i13 | 0) < (i7 | 0) ? i13 : 0;
  d9 = +__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i5, i6, i13, i3, i4);
  if (d9 > d8) {
   i12 = i13;
   d8 = d9;
  } else {
   break;
  }
 }
 HEAP32[i1 >> 2] = i12;
 STACKTOP = i2;
 return +d8;
}
function __ZN9b2Fixture11SynchronizeEP12b2BroadPhaseRK11b2TransformS4_(i10, i8, i7, i2) {
 i10 = i10 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i9 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0, i27 = 0;
 i9 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i5 = i9 + 24 | 0;
 i6 = i9 + 8 | 0;
 i3 = i9;
 i4 = i10 + 28 | 0;
 if ((HEAP32[i4 >> 2] | 0) <= 0) {
  STACKTOP = i9;
  return;
 }
 i1 = i10 + 24 | 0;
 i18 = i10 + 12 | 0;
 i19 = i5 + 4 | 0;
 i20 = i6 + 4 | 0;
 i13 = i5 + 8 | 0;
 i14 = i6 + 8 | 0;
 i15 = i5 + 12 | 0;
 i16 = i6 + 12 | 0;
 i11 = i2 + 4 | 0;
 i22 = i7 + 4 | 0;
 i12 = i3 + 4 | 0;
 i21 = 0;
 do {
  i10 = HEAP32[i1 >> 2] | 0;
  i27 = HEAP32[i18 >> 2] | 0;
  i17 = i10 + (i21 * 28 | 0) + 20 | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i27 >> 2] | 0) + 24 >> 2] & 15](i27, i5, i7, HEAP32[i17 >> 2] | 0);
  i27 = HEAP32[i18 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i27 >> 2] | 0) + 24 >> 2] & 15](i27, i6, i2, HEAP32[i17 >> 2] | 0);
  i17 = i10 + (i21 * 28 | 0) | 0;
  d25 = +HEAPF32[i5 >> 2];
  d26 = +HEAPF32[i6 >> 2];
  d24 = +HEAPF32[i19 >> 2];
  d23 = +HEAPF32[i20 >> 2];
  d25 = +(d25 < d26 ? d25 : d26);
  d26 = +(d24 < d23 ? d24 : d23);
  i27 = i17;
  HEAPF32[i27 >> 2] = d25;
  HEAPF32[i27 + 4 >> 2] = d26;
  d25 = +HEAPF32[i13 >> 2];
  d26 = +HEAPF32[i14 >> 2];
  d23 = +HEAPF32[i15 >> 2];
  d24 = +HEAPF32[i16 >> 2];
  d25 = +(d25 > d26 ? d25 : d26);
  d26 = +(d23 > d24 ? d23 : d24);
  i27 = i10 + (i21 * 28 | 0) + 8 | 0;
  HEAPF32[i27 >> 2] = d25;
  HEAPF32[i27 + 4 >> 2] = d26;
  d26 = +HEAPF32[i11 >> 2] - +HEAPF32[i22 >> 2];
  HEAPF32[i3 >> 2] = +HEAPF32[i2 >> 2] - +HEAPF32[i7 >> 2];
  HEAPF32[i12 >> 2] = d26;
  __ZN12b2BroadPhase9MoveProxyEiRK6b2AABBRK6b2Vec2(i8, HEAP32[i10 + (i21 * 28 | 0) + 24 >> 2] | 0, i17, i3);
  i21 = i21 + 1 | 0;
 } while ((i21 | 0) < (HEAP32[i4 >> 2] | 0));
 STACKTOP = i9;
 return;
}
function __ZN12b2EPCollider24ComputePolygonSeparationEv(i2, i9) {
 i2 = i2 | 0;
 i9 = i9 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, i8 = 0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, d16 = 0.0, d17 = 0.0, d18 = 0.0, d19 = 0.0, i20 = 0, d21 = 0.0, d22 = 0.0, d23 = 0.0, d24 = 0.0, d25 = 0.0, d26 = 0.0;
 i15 = STACKTOP;
 HEAP32[i2 >> 2] = 0;
 i3 = i2 + 4 | 0;
 HEAP32[i3 >> 2] = -1;
 i4 = i2 + 8 | 0;
 HEAPF32[i4 >> 2] = -3.4028234663852886e+38;
 d7 = +HEAPF32[i9 + 216 >> 2];
 d6 = +HEAPF32[i9 + 212 >> 2];
 i5 = HEAP32[i9 + 128 >> 2] | 0;
 if ((i5 | 0) <= 0) {
  STACKTOP = i15;
  return;
 }
 d17 = +HEAPF32[i9 + 164 >> 2];
 d18 = +HEAPF32[i9 + 168 >> 2];
 d11 = +HEAPF32[i9 + 172 >> 2];
 d10 = +HEAPF32[i9 + 176 >> 2];
 d16 = +HEAPF32[i9 + 244 >> 2];
 i12 = i9 + 228 | 0;
 i13 = i9 + 232 | 0;
 i14 = i9 + 236 | 0;
 i1 = i9 + 240 | 0;
 d19 = -3.4028234663852886e+38;
 i20 = 0;
 while (1) {
  d23 = +HEAPF32[i9 + (i20 << 3) + 64 >> 2];
  d21 = -d23;
  d22 = -+HEAPF32[i9 + (i20 << 3) + 68 >> 2];
  d26 = +HEAPF32[i9 + (i20 << 3) >> 2];
  d25 = +HEAPF32[i9 + (i20 << 3) + 4 >> 2];
  d24 = (d26 - d17) * d21 + (d25 - d18) * d22;
  d25 = (d26 - d11) * d21 + (d25 - d10) * d22;
  d24 = d24 < d25 ? d24 : d25;
  if (d24 > d16) {
   break;
  }
  if (!(d7 * d23 + d6 * d22 >= 0.0)) {
   if (!((d21 - +HEAPF32[i12 >> 2]) * d6 + (d22 - +HEAPF32[i13 >> 2]) * d7 < -.03490658849477768) & d24 > d19) {
    i8 = 8;
   }
  } else {
   if (!((d21 - +HEAPF32[i14 >> 2]) * d6 + (d22 - +HEAPF32[i1 >> 2]) * d7 < -.03490658849477768) & d24 > d19) {
    i8 = 8;
   }
  }
  if ((i8 | 0) == 8) {
   i8 = 0;
   HEAP32[i2 >> 2] = 2;
   HEAP32[i3 >> 2] = i20;
   HEAPF32[i4 >> 2] = d24;
   d19 = d24;
  }
  i20 = i20 + 1 | 0;
  if ((i20 | 0) >= (i5 | 0)) {
   i8 = 10;
   break;
  }
 }
 if ((i8 | 0) == 10) {
  STACKTOP = i15;
  return;
 }
 HEAP32[i2 >> 2] = 2;
 HEAP32[i3 >> 2] = i20;
 HEAPF32[i4 >> 2] = d24;
 STACKTOP = i15;
 return;
}
function __ZNK11b2EdgeShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi(i17, i1, i2, i18, i3) {
 i17 = i17 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 i18 = i18 | 0;
 i3 = i3 | 0;
 var d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0;
 i3 = STACKTOP;
 d6 = +HEAPF32[i18 >> 2];
 d7 = +HEAPF32[i2 >> 2] - d6;
 d9 = +HEAPF32[i18 + 4 >> 2];
 d4 = +HEAPF32[i2 + 4 >> 2] - d9;
 d11 = +HEAPF32[i18 + 12 >> 2];
 d5 = +HEAPF32[i18 + 8 >> 2];
 d8 = d7 * d11 + d4 * d5;
 d7 = d11 * d4 - d7 * d5;
 d6 = +HEAPF32[i2 + 8 >> 2] - d6;
 d9 = +HEAPF32[i2 + 12 >> 2] - d9;
 d4 = d11 * d6 + d5 * d9 - d8;
 d6 = d11 * d9 - d5 * d6 - d7;
 i18 = i17 + 12 | 0;
 d5 = +HEAPF32[i18 >> 2];
 d9 = +HEAPF32[i18 + 4 >> 2];
 i18 = i17 + 20 | 0;
 d11 = +HEAPF32[i18 >> 2];
 d11 = d11 - d5;
 d12 = +HEAPF32[i18 + 4 >> 2] - d9;
 d15 = -d11;
 d10 = d11 * d11 + d12 * d12;
 d13 = +Math_sqrt(+d10);
 if (d13 < 1.1920928955078125e-7) {
  d13 = d12;
 } else {
  d16 = 1.0 / d13;
  d13 = d12 * d16;
  d15 = d16 * d15;
 }
 d14 = (d9 - d7) * d15 + (d5 - d8) * d13;
 d16 = d6 * d15 + d4 * d13;
 if (d16 == 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 d16 = d14 / d16;
 if (d16 < 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 if (+HEAPF32[i2 + 16 >> 2] < d16 | d10 == 0.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 d12 = (d11 * (d8 + d4 * d16 - d5) + d12 * (d7 + d6 * d16 - d9)) / d10;
 if (d12 < 0.0 | d12 > 1.0) {
  i18 = 0;
  STACKTOP = i3;
  return i18 | 0;
 }
 HEAPF32[i1 + 8 >> 2] = d16;
 if (d14 > 0.0) {
  d14 = +-d13;
  d16 = +-d15;
  i18 = i1;
  HEAPF32[i18 >> 2] = d14;
  HEAPF32[i18 + 4 >> 2] = d16;
  i18 = 1;
  STACKTOP = i3;
  return i18 | 0;
 } else {
  d14 = +d13;
  d16 = +d15;
  i18 = i1;
  HEAPF32[i18 >> 2] = d14;
  HEAPF32[i18 + 4 >> 2] = d16;
  i18 = 1;
  STACKTOP = i3;
  return i18 | 0;
 }
 return 0;
}
function ___dynamic_cast(i7, i6, i11, i5) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i11 = i11 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i8 = 0, i9 = 0, i10 = 0, i12 = 0, i13 = 0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i2 = i1;
 i3 = HEAP32[i7 >> 2] | 0;
 i4 = i7 + (HEAP32[i3 + -8 >> 2] | 0) | 0;
 i3 = HEAP32[i3 + -4 >> 2] | 0;
 HEAP32[i2 >> 2] = i11;
 HEAP32[i2 + 4 >> 2] = i7;
 HEAP32[i2 + 8 >> 2] = i6;
 HEAP32[i2 + 12 >> 2] = i5;
 i9 = i2 + 16 | 0;
 i10 = i2 + 20 | 0;
 i6 = i2 + 24 | 0;
 i8 = i2 + 28 | 0;
 i5 = i2 + 32 | 0;
 i7 = i2 + 40 | 0;
 i12 = (i3 | 0) == (i11 | 0);
 i13 = i9 + 0 | 0;
 i11 = i13 + 36 | 0;
 do {
  HEAP32[i13 >> 2] = 0;
  i13 = i13 + 4 | 0;
 } while ((i13 | 0) < (i11 | 0));
 HEAP16[i9 + 36 >> 1] = 0;
 HEAP8[i9 + 38 | 0] = 0;
 if (i12) {
  HEAP32[i2 + 48 >> 2] = 1;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i3 >> 2] | 0) + 20 >> 2] & 3](i3, i2, i4, i4, 1, 0);
  i13 = (HEAP32[i6 >> 2] | 0) == 1 ? i4 : 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[i3 >> 2] | 0) + 24 >> 2] & 3](i3, i2, i4, 1, 0);
 i2 = HEAP32[i2 + 36 >> 2] | 0;
 if ((i2 | 0) == 0) {
  if ((HEAP32[i7 >> 2] | 0) != 1) {
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
  if ((HEAP32[i8 >> 2] | 0) != 1) {
   i13 = 0;
   STACKTOP = i1;
   return i13 | 0;
  }
  i13 = (HEAP32[i5 >> 2] | 0) == 1 ? HEAP32[i10 >> 2] | 0 : 0;
  STACKTOP = i1;
  return i13 | 0;
 } else if ((i2 | 0) == 1) {
  if ((HEAP32[i6 >> 2] | 0) != 1) {
   if ((HEAP32[i7 >> 2] | 0) != 0) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
   if ((HEAP32[i8 >> 2] | 0) != 1) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
   if ((HEAP32[i5 >> 2] | 0) != 1) {
    i13 = 0;
    STACKTOP = i1;
    return i13 | 0;
   }
  }
  i13 = HEAP32[i9 >> 2] | 0;
  STACKTOP = i1;
  return i13 | 0;
 } else {
  i13 = 0;
  STACKTOP = i1;
  return i13 | 0;
 }
 return 0;
}
function __ZNK14b2PolygonShape11ComputeMassEP10b2MassDataf(i4, i1, d2) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 d2 = +d2;
 var i3 = 0, i5 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, d13 = 0.0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, d18 = 0.0, i19 = 0, d20 = 0.0, d21 = 0.0, d22 = 0.0, d23 = 0.0;
 i3 = STACKTOP;
 i5 = HEAP32[i4 + 148 >> 2] | 0;
 if ((i5 | 0) > 2) {
  d7 = 0.0;
  d6 = 0.0;
  i12 = 0;
 } else {
  ___assert_fail(432, 328, 306, 456);
 }
 do {
  d6 = d6 + +HEAPF32[i4 + (i12 << 3) + 20 >> 2];
  d7 = d7 + +HEAPF32[i4 + (i12 << 3) + 24 >> 2];
  i12 = i12 + 1 | 0;
 } while ((i12 | 0) < (i5 | 0));
 d11 = 1.0 / +(i5 | 0);
 d6 = d6 * d11;
 d11 = d7 * d11;
 i16 = i4 + 20 | 0;
 i19 = i4 + 24 | 0;
 d9 = 0.0;
 d10 = 0.0;
 d7 = 0.0;
 d8 = 0.0;
 i17 = 0;
 do {
  d18 = +HEAPF32[i4 + (i17 << 3) + 20 >> 2] - d6;
  d13 = +HEAPF32[i4 + (i17 << 3) + 24 >> 2] - d11;
  i17 = i17 + 1 | 0;
  i12 = (i17 | 0) < (i5 | 0);
  if (i12) {
   i14 = i4 + (i17 << 3) + 20 | 0;
   i15 = i4 + (i17 << 3) + 24 | 0;
  } else {
   i14 = i16;
   i15 = i19;
  }
  d21 = +HEAPF32[i14 >> 2] - d6;
  d20 = +HEAPF32[i15 >> 2] - d11;
  d22 = d18 * d20 - d13 * d21;
  d23 = d22 * .5;
  d8 = d8 + d23;
  d23 = d23 * .3333333432674408;
  d9 = d9 + (d18 + d21) * d23;
  d10 = d10 + (d13 + d20) * d23;
  d7 = d7 + d22 * .0833333358168602 * (d21 * d21 + (d18 * d18 + d18 * d21) + (d20 * d20 + (d13 * d13 + d13 * d20)));
 } while (i12);
 d13 = d8 * d2;
 HEAPF32[i1 >> 2] = d13;
 if (d8 > 1.1920928955078125e-7) {
  d23 = 1.0 / d8;
  d22 = d9 * d23;
  d23 = d10 * d23;
  d20 = d6 + d22;
  d21 = d11 + d23;
  d11 = +d20;
  d18 = +d21;
  i19 = i1 + 4 | 0;
  HEAPF32[i19 >> 2] = d11;
  HEAPF32[i19 + 4 >> 2] = d18;
  HEAPF32[i1 + 12 >> 2] = d7 * d2 + d13 * (d20 * d20 + d21 * d21 - (d22 * d22 + d23 * d23));
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(472, 328, 352, 456);
 }
}
function __ZN16b2ContactManager7DestroyEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 i5 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 8 >> 2] | 0;
 i4 = HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 8 >> 2] | 0;
 i6 = HEAP32[i1 + 72 >> 2] | 0;
 if ((i6 | 0) != 0 ? (HEAP32[i2 + 4 >> 2] & 2 | 0) != 0 : 0) {
  FUNCTION_TABLE_vii[HEAP32[(HEAP32[i6 >> 2] | 0) + 12 >> 2] & 15](i6, i2);
 }
 i7 = i2 + 8 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i6 = i2 + 12 | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 12 >> 2] = HEAP32[i6 >> 2];
 }
 i8 = HEAP32[i6 >> 2] | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 8 >> 2] = HEAP32[i7 >> 2];
 }
 i7 = i1 + 60 | 0;
 if ((HEAP32[i7 >> 2] | 0) == (i2 | 0)) {
  HEAP32[i7 >> 2] = HEAP32[i6 >> 2];
 }
 i7 = i2 + 24 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 i6 = i2 + 28 | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 12 >> 2] = HEAP32[i6 >> 2];
 }
 i8 = HEAP32[i6 >> 2] | 0;
 if ((i8 | 0) != 0) {
  HEAP32[i8 + 8 >> 2] = HEAP32[i7 >> 2];
 }
 i5 = i5 + 112 | 0;
 if ((i2 + 16 | 0) == (HEAP32[i5 >> 2] | 0)) {
  HEAP32[i5 >> 2] = HEAP32[i6 >> 2];
 }
 i6 = i2 + 40 | 0;
 i7 = HEAP32[i6 >> 2] | 0;
 i5 = i2 + 44 | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 12 >> 2] = HEAP32[i5 >> 2];
 }
 i7 = HEAP32[i5 >> 2] | 0;
 if ((i7 | 0) != 0) {
  HEAP32[i7 + 8 >> 2] = HEAP32[i6 >> 2];
 }
 i4 = i4 + 112 | 0;
 if ((i2 + 32 | 0) != (HEAP32[i4 >> 2] | 0)) {
  i8 = i1 + 76 | 0;
  i8 = HEAP32[i8 >> 2] | 0;
  __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i2, i8);
  i8 = i1 + 64 | 0;
  i7 = HEAP32[i8 >> 2] | 0;
  i7 = i7 + -1 | 0;
  HEAP32[i8 >> 2] = i7;
  STACKTOP = i3;
  return;
 }
 HEAP32[i4 >> 2] = HEAP32[i5 >> 2];
 i8 = i1 + 76 | 0;
 i8 = HEAP32[i8 >> 2] | 0;
 __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i2, i8);
 i8 = i1 + 64 | 0;
 i7 = HEAP32[i8 >> 2] | 0;
 i7 = i7 + -1 | 0;
 HEAP32[i8 >> 2] = i7;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib(i6, i3, i4, i8, i7) {
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i8 = i8 | 0;
 i7 = i7 | 0;
 var i1 = 0, i2 = 0, i5 = 0, i9 = 0, i10 = 0;
 i1 = STACKTOP;
 if ((i6 | 0) == (HEAP32[i3 + 8 >> 2] | 0)) {
  if ((HEAP32[i3 + 4 >> 2] | 0) != (i4 | 0)) {
   STACKTOP = i1;
   return;
  }
  i2 = i3 + 28 | 0;
  if ((HEAP32[i2 >> 2] | 0) == 1) {
   STACKTOP = i1;
   return;
  }
  HEAP32[i2 >> 2] = i8;
  STACKTOP = i1;
  return;
 }
 if ((i6 | 0) != (HEAP32[i3 >> 2] | 0)) {
  i9 = HEAP32[i6 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[i9 >> 2] | 0) + 24 >> 2] & 3](i9, i3, i4, i8, i7);
  STACKTOP = i1;
  return;
 }
 if ((HEAP32[i3 + 16 >> 2] | 0) != (i4 | 0) ? (i5 = i3 + 20 | 0, (HEAP32[i5 >> 2] | 0) != (i4 | 0)) : 0) {
  HEAP32[i3 + 32 >> 2] = i8;
  i8 = i3 + 44 | 0;
  if ((HEAP32[i8 >> 2] | 0) == 4) {
   STACKTOP = i1;
   return;
  }
  i9 = i3 + 52 | 0;
  HEAP8[i9] = 0;
  i10 = i3 + 53 | 0;
  HEAP8[i10] = 0;
  i6 = HEAP32[i6 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i6 >> 2] | 0) + 20 >> 2] & 3](i6, i3, i4, i4, 1, i7);
  if ((HEAP8[i10] | 0) != 0) {
   if ((HEAP8[i9] | 0) == 0) {
    i6 = 1;
    i2 = 13;
   }
  } else {
   i6 = 0;
   i2 = 13;
  }
  do {
   if ((i2 | 0) == 13) {
    HEAP32[i5 >> 2] = i4;
    i10 = i3 + 40 | 0;
    HEAP32[i10 >> 2] = (HEAP32[i10 >> 2] | 0) + 1;
    if ((HEAP32[i3 + 36 >> 2] | 0) == 1 ? (HEAP32[i3 + 24 >> 2] | 0) == 2 : 0) {
     HEAP8[i3 + 54 | 0] = 1;
     if (i6) {
      break;
     }
    } else {
     i2 = 16;
    }
    if ((i2 | 0) == 16 ? i6 : 0) {
     break;
    }
    HEAP32[i8 >> 2] = 4;
    STACKTOP = i1;
    return;
   }
  } while (0);
  HEAP32[i8 >> 2] = 3;
  STACKTOP = i1;
  return;
 }
 if ((i8 | 0) != 1) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i3 + 32 >> 2] = 1;
 STACKTOP = i1;
 return;
}
function __ZN16b2BlockAllocator8AllocateEi(i4, i2) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i1 = STACKTOP;
 if ((i2 | 0) == 0) {
  i9 = 0;
  STACKTOP = i1;
  return i9 | 0;
 }
 if ((i2 | 0) <= 0) {
  ___assert_fail(1376, 1312, 104, 1392);
 }
 if ((i2 | 0) > 640) {
  i9 = __Z7b2Alloci(i2) | 0;
  STACKTOP = i1;
  return i9 | 0;
 }
 i9 = HEAP8[632 + i2 | 0] | 0;
 i5 = i9 & 255;
 if (!((i9 & 255) < 14)) {
  ___assert_fail(1408, 1312, 112, 1392);
 }
 i2 = i4 + (i5 << 2) + 12 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 if ((i3 | 0) != 0) {
  HEAP32[i2 >> 2] = HEAP32[i3 >> 2];
  i9 = i3;
  STACKTOP = i1;
  return i9 | 0;
 }
 i3 = i4 + 4 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i7 = i4 + 8 | 0;
 if ((i6 | 0) == (HEAP32[i7 >> 2] | 0)) {
  i9 = HEAP32[i4 >> 2] | 0;
  i6 = i6 + 128 | 0;
  HEAP32[i7 >> 2] = i6;
  i6 = __Z7b2Alloci(i6 << 3) | 0;
  HEAP32[i4 >> 2] = i6;
  _memcpy(i6 | 0, i9 | 0, HEAP32[i3 >> 2] << 3 | 0) | 0;
  _memset((HEAP32[i4 >> 2] | 0) + (HEAP32[i3 >> 2] << 3) | 0, 0, 1024) | 0;
  __Z6b2FreePv(i9);
  i6 = HEAP32[i3 >> 2] | 0;
 }
 i9 = HEAP32[i4 >> 2] | 0;
 i7 = __Z7b2Alloci(16384) | 0;
 i4 = i9 + (i6 << 3) + 4 | 0;
 HEAP32[i4 >> 2] = i7;
 i5 = HEAP32[576 + (i5 << 2) >> 2] | 0;
 HEAP32[i9 + (i6 << 3) >> 2] = i5;
 i6 = 16384 / (i5 | 0) | 0;
 if ((Math_imul(i6, i5) | 0) >= 16385) {
  ___assert_fail(1448, 1312, 140, 1392);
 }
 i6 = i6 + -1 | 0;
 if ((i6 | 0) > 0) {
  i9 = 0;
  while (1) {
   i8 = i9 + 1 | 0;
   HEAP32[i7 + (Math_imul(i9, i5) | 0) >> 2] = i7 + (Math_imul(i8, i5) | 0);
   i7 = HEAP32[i4 >> 2] | 0;
   if ((i8 | 0) == (i6 | 0)) {
    break;
   } else {
    i9 = i8;
   }
  }
 }
 HEAP32[i7 + (Math_imul(i6, i5) | 0) >> 2] = 0;
 HEAP32[i2 >> 2] = HEAP32[HEAP32[i4 >> 2] >> 2];
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 i9 = HEAP32[i4 >> 2] | 0;
 STACKTOP = i1;
 return i9 | 0;
}
function __ZN9b2Contact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i4, i5, i1, i3, i6) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 i1 = i1 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i2 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 if ((HEAP8[4200] | 0) == 0) {
  HEAP32[1002] = 3;
  HEAP32[4012 >> 2] = 3;
  HEAP8[4016 | 0] = 1;
  HEAP32[4104 >> 2] = 4;
  HEAP32[4108 >> 2] = 4;
  HEAP8[4112 | 0] = 1;
  HEAP32[4032 >> 2] = 4;
  HEAP32[4036 >> 2] = 4;
  HEAP8[4040 | 0] = 0;
  HEAP32[4128 >> 2] = 5;
  HEAP32[4132 >> 2] = 5;
  HEAP8[4136 | 0] = 1;
  HEAP32[4056 >> 2] = 6;
  HEAP32[4060 >> 2] = 6;
  HEAP8[4064 | 0] = 1;
  HEAP32[4020 >> 2] = 6;
  HEAP32[4024 >> 2] = 6;
  HEAP8[4028 | 0] = 0;
  HEAP32[4080 >> 2] = 7;
  HEAP32[4084 >> 2] = 7;
  HEAP8[4088 | 0] = 1;
  HEAP32[4116 >> 2] = 7;
  HEAP32[4120 >> 2] = 7;
  HEAP8[4124 | 0] = 0;
  HEAP32[4152 >> 2] = 8;
  HEAP32[4156 >> 2] = 8;
  HEAP8[4160 | 0] = 1;
  HEAP32[4044 >> 2] = 8;
  HEAP32[4048 >> 2] = 8;
  HEAP8[4052 | 0] = 0;
  HEAP32[4176 >> 2] = 9;
  HEAP32[4180 >> 2] = 9;
  HEAP8[4184 | 0] = 1;
  HEAP32[4140 >> 2] = 9;
  HEAP32[4144 >> 2] = 9;
  HEAP8[4148 | 0] = 0;
  HEAP8[4200] = 1;
 }
 i7 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 4 >> 2] | 0;
 i8 = HEAP32[(HEAP32[i1 + 12 >> 2] | 0) + 4 >> 2] | 0;
 if (!(i7 >>> 0 < 4)) {
  ___assert_fail(4208, 4256, 80, 4344);
 }
 if (!(i8 >>> 0 < 4)) {
  ___assert_fail(4296, 4256, 81, 4344);
 }
 i9 = HEAP32[4008 + (i7 * 48 | 0) + (i8 * 12 | 0) >> 2] | 0;
 if ((i9 | 0) == 0) {
  i9 = 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 if ((HEAP8[4008 + (i7 * 48 | 0) + (i8 * 12 | 0) + 8 | 0] | 0) == 0) {
  i9 = FUNCTION_TABLE_iiiiii[i9 & 15](i1, i3, i4, i5, i6) | 0;
  STACKTOP = i2;
  return i9 | 0;
 } else {
  i9 = FUNCTION_TABLE_iiiiii[i9 & 15](i4, i5, i1, i3, i6) | 0;
  STACKTOP = i2;
  return i9 | 0;
 }
 return 0;
}
function __ZN13b2DynamicTree9MoveProxyEiRK6b2AABBRK6b2Vec2(i1, i2, i13, i9) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i13 = i13 | 0;
 i9 = i9 | 0;
 var i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0;
 i4 = STACKTOP;
 if (!((i2 | 0) > -1)) {
  ___assert_fail(3072, 2944, 135, 3152);
 }
 if ((HEAP32[i1 + 12 >> 2] | 0) <= (i2 | 0)) {
  ___assert_fail(3072, 2944, 135, 3152);
 }
 i3 = i1 + 4 | 0;
 i12 = HEAP32[i3 >> 2] | 0;
 if (!((HEAP32[i12 + (i2 * 36 | 0) + 24 >> 2] | 0) == -1)) {
  ___assert_fail(3120, 2944, 137, 3152);
 }
 if (((+HEAPF32[i12 + (i2 * 36 | 0) >> 2] <= +HEAPF32[i13 >> 2] ? +HEAPF32[i12 + (i2 * 36 | 0) + 4 >> 2] <= +HEAPF32[i13 + 4 >> 2] : 0) ? +HEAPF32[i13 + 8 >> 2] <= +HEAPF32[i12 + (i2 * 36 | 0) + 8 >> 2] : 0) ? +HEAPF32[i13 + 12 >> 2] <= +HEAPF32[i12 + (i2 * 36 | 0) + 12 >> 2] : 0) {
  i13 = 0;
  STACKTOP = i4;
  return i13 | 0;
 }
 __ZN13b2DynamicTree10RemoveLeafEi(i1, i2);
 i12 = i13;
 d6 = +HEAPF32[i12 >> 2];
 d8 = +HEAPF32[i12 + 4 >> 2];
 i13 = i13 + 8 | 0;
 d10 = +HEAPF32[i13 >> 2];
 d6 = d6 + -.10000000149011612;
 d8 = d8 + -.10000000149011612;
 d10 = d10 + .10000000149011612;
 d5 = +HEAPF32[i13 + 4 >> 2] + .10000000149011612;
 d11 = +HEAPF32[i9 >> 2] * 2.0;
 d7 = +HEAPF32[i9 + 4 >> 2] * 2.0;
 if (d11 < 0.0) {
  d6 = d6 + d11;
 } else {
  d10 = d11 + d10;
 }
 if (d7 < 0.0) {
  d8 = d8 + d7;
 } else {
  d5 = d7 + d5;
 }
 i13 = HEAP32[i3 >> 2] | 0;
 d7 = +d6;
 d11 = +d8;
 i12 = i13 + (i2 * 36 | 0) | 0;
 HEAPF32[i12 >> 2] = d7;
 HEAPF32[i12 + 4 >> 2] = d11;
 d10 = +d10;
 d11 = +d5;
 i13 = i13 + (i2 * 36 | 0) + 8 | 0;
 HEAPF32[i13 >> 2] = d10;
 HEAPF32[i13 + 4 >> 2] = d11;
 __ZN13b2DynamicTree10InsertLeafEi(i1, i2);
 i13 = 1;
 STACKTOP = i4;
 return i13 | 0;
}
function __ZNK9b2Simplex16GetWitnessPointsEP6b2Vec2S1_(i1, i4, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, i9 = 0, i10 = 0, d11 = 0.0;
 i2 = STACKTOP;
 i3 = HEAP32[i1 + 108 >> 2] | 0;
 if ((i3 | 0) == 2) {
  i9 = i1 + 24 | 0;
  d7 = +HEAPF32[i9 >> 2];
  i3 = i1 + 60 | 0;
  d8 = +HEAPF32[i3 >> 2];
  d6 = +(d7 * +HEAPF32[i1 >> 2] + d8 * +HEAPF32[i1 + 36 >> 2]);
  d8 = +(d7 * +HEAPF32[i1 + 4 >> 2] + d8 * +HEAPF32[i1 + 40 >> 2]);
  HEAPF32[i4 >> 2] = d6;
  HEAPF32[i4 + 4 >> 2] = d8;
  d8 = +HEAPF32[i9 >> 2];
  d6 = +HEAPF32[i3 >> 2];
  d7 = +(d8 * +HEAPF32[i1 + 8 >> 2] + d6 * +HEAPF32[i1 + 44 >> 2]);
  d6 = +(d8 * +HEAPF32[i1 + 12 >> 2] + d6 * +HEAPF32[i1 + 48 >> 2]);
  HEAPF32[i5 >> 2] = d7;
  HEAPF32[i5 + 4 >> 2] = d6;
  STACKTOP = i2;
  return;
 } else if ((i3 | 0) == 1) {
  i10 = i1;
  i9 = HEAP32[i10 + 4 >> 2] | 0;
  i3 = i4;
  HEAP32[i3 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i3 + 4 >> 2] = i9;
  i3 = i1 + 8 | 0;
  i4 = HEAP32[i3 + 4 >> 2] | 0;
  i9 = i5;
  HEAP32[i9 >> 2] = HEAP32[i3 >> 2];
  HEAP32[i9 + 4 >> 2] = i4;
  STACKTOP = i2;
  return;
 } else if ((i3 | 0) == 0) {
  ___assert_fail(2712, 2672, 217, 2752);
 } else if ((i3 | 0) == 3) {
  d11 = +HEAPF32[i1 + 24 >> 2];
  d6 = +HEAPF32[i1 + 60 >> 2];
  d8 = +HEAPF32[i1 + 96 >> 2];
  d7 = +(d11 * +HEAPF32[i1 >> 2] + d6 * +HEAPF32[i1 + 36 >> 2] + d8 * +HEAPF32[i1 + 72 >> 2]);
  d8 = +(d11 * +HEAPF32[i1 + 4 >> 2] + d6 * +HEAPF32[i1 + 40 >> 2] + d8 * +HEAPF32[i1 + 76 >> 2]);
  i10 = i4;
  HEAPF32[i10 >> 2] = d7;
  HEAPF32[i10 + 4 >> 2] = d8;
  i10 = i5;
  HEAPF32[i10 >> 2] = d7;
  HEAPF32[i10 + 4 >> 2] = d8;
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(2712, 2672, 236, 2752);
 }
}
function __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i4, i3, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i2 = STACKTOP;
 if (!((i1 | 0) > -1)) {
  ___assert_fail(6832, 6792, 89, 6872);
 }
 i5 = i4 + 16 | 0;
 if (((HEAP32[i5 >> 2] | 0) + -1 | 0) <= (i1 | 0)) {
  ___assert_fail(6832, 6792, 89, 6872);
 }
 HEAP32[i3 + 4 >> 2] = 1;
 HEAPF32[i3 + 8 >> 2] = +HEAPF32[i4 + 8 >> 2];
 i6 = i4 + 12 | 0;
 i7 = (HEAP32[i6 >> 2] | 0) + (i1 << 3) | 0;
 i8 = HEAP32[i7 + 4 >> 2] | 0;
 i9 = i3 + 12 | 0;
 HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i9 + 4 >> 2] = i8;
 i9 = (HEAP32[i6 >> 2] | 0) + (i1 + 1 << 3) | 0;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i3 + 20 | 0;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 i7 = i3 + 28 | 0;
 if ((i1 | 0) > 0) {
  i10 = (HEAP32[i6 >> 2] | 0) + (i1 + -1 << 3) | 0;
  i8 = HEAP32[i10 + 4 >> 2] | 0;
  i9 = i7;
  HEAP32[i9 >> 2] = HEAP32[i10 >> 2];
  HEAP32[i9 + 4 >> 2] = i8;
  HEAP8[i3 + 44 | 0] = 1;
 } else {
  i8 = i4 + 20 | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 44 | 0] = HEAP8[i4 + 36 | 0] | 0;
 }
 i7 = i3 + 36 | 0;
 if (((HEAP32[i5 >> 2] | 0) + -2 | 0) > (i1 | 0)) {
  i8 = (HEAP32[i6 >> 2] | 0) + (i1 + 2 << 3) | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 45 | 0] = 1;
  STACKTOP = i2;
  return;
 } else {
  i8 = i4 + 28 | 0;
  i9 = HEAP32[i8 + 4 >> 2] | 0;
  i10 = i7;
  HEAP32[i10 >> 2] = HEAP32[i8 >> 2];
  HEAP32[i10 + 4 >> 2] = i9;
  HEAP8[i3 + 45 | 0] = HEAP8[i4 + 37 | 0] | 0;
  STACKTOP = i2;
  return;
 }
}
function __ZN15b2DistanceProxy3SetEPK7b2Shapei(i3, i1, i5) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
 i2 = STACKTOP;
 i4 = HEAP32[i1 + 4 >> 2] | 0;
 if ((i4 | 0) == 1) {
  HEAP32[i3 + 16 >> 2] = i1 + 12;
  HEAP32[i3 + 20 >> 2] = 2;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 3) {
  if (!((i5 | 0) > -1)) {
   ___assert_fail(2632, 2672, 53, 2704);
  }
  i4 = i1 + 16 | 0;
  if ((HEAP32[i4 >> 2] | 0) <= (i5 | 0)) {
   ___assert_fail(2632, 2672, 53, 2704);
  }
  i7 = i1 + 12 | 0;
  i9 = (HEAP32[i7 >> 2] | 0) + (i5 << 3) | 0;
  i8 = HEAP32[i9 + 4 >> 2] | 0;
  i6 = i3;
  HEAP32[i6 >> 2] = HEAP32[i9 >> 2];
  HEAP32[i6 + 4 >> 2] = i8;
  i6 = i5 + 1 | 0;
  i5 = i3 + 8 | 0;
  i7 = HEAP32[i7 >> 2] | 0;
  if ((i6 | 0) < (HEAP32[i4 >> 2] | 0)) {
   i7 = i7 + (i6 << 3) | 0;
   i8 = HEAP32[i7 + 4 >> 2] | 0;
   i9 = i5;
   HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i9 + 4 >> 2] = i8;
  } else {
   i8 = HEAP32[i7 + 4 >> 2] | 0;
   i9 = i5;
   HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
   HEAP32[i9 + 4 >> 2] = i8;
  }
  HEAP32[i3 + 16 >> 2] = i3;
  HEAP32[i3 + 20 >> 2] = 2;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 2) {
  HEAP32[i3 + 16 >> 2] = i1 + 20;
  HEAP32[i3 + 20 >> 2] = HEAP32[i1 + 148 >> 2];
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else if ((i4 | 0) == 0) {
  HEAP32[i3 + 16 >> 2] = i1 + 12;
  HEAP32[i3 + 20 >> 2] = 1;
  HEAPF32[i3 + 24 >> 2] = +HEAPF32[i1 + 8 >> 2];
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(2712, 2672, 81, 2704);
 }
}
function __ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_(i2, i7, i4, i5, i6) {
 i2 = i2 | 0;
 i7 = i7 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var d1 = 0.0, d3 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, i12 = 0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, i18 = 0, i19 = 0, i20 = 0;
 i12 = STACKTOP;
 i13 = HEAP32[i5 + 148 >> 2] | 0;
 if (!((i4 | 0) > -1)) {
  ___assert_fail(5640, 5688, 32, 5752);
 }
 if ((HEAP32[i2 + 148 >> 2] | 0) <= (i4 | 0)) {
  ___assert_fail(5640, 5688, 32, 5752);
 }
 d11 = +HEAPF32[i7 + 12 >> 2];
 d9 = +HEAPF32[i2 + (i4 << 3) + 84 >> 2];
 d1 = +HEAPF32[i7 + 8 >> 2];
 d3 = +HEAPF32[i2 + (i4 << 3) + 88 >> 2];
 d8 = d11 * d9 - d1 * d3;
 d3 = d9 * d1 + d11 * d3;
 d9 = +HEAPF32[i6 + 12 >> 2];
 d10 = +HEAPF32[i6 + 8 >> 2];
 d16 = d9 * d8 + d10 * d3;
 d14 = d9 * d3 - d8 * d10;
 if ((i13 | 0) > 0) {
  i19 = 0;
  i20 = 0;
  d15 = 3.4028234663852886e+38;
  while (1) {
   d17 = d16 * +HEAPF32[i5 + (i19 << 3) + 20 >> 2] + d14 * +HEAPF32[i5 + (i19 << 3) + 24 >> 2];
   i18 = d17 < d15;
   i20 = i18 ? i19 : i20;
   i19 = i19 + 1 | 0;
   if ((i19 | 0) == (i13 | 0)) {
    break;
   } else {
    d15 = i18 ? d17 : d15;
   }
  }
 } else {
  i20 = 0;
 }
 d16 = +HEAPF32[i2 + (i4 << 3) + 20 >> 2];
 d17 = +HEAPF32[i2 + (i4 << 3) + 24 >> 2];
 d14 = +HEAPF32[i5 + (i20 << 3) + 20 >> 2];
 d15 = +HEAPF32[i5 + (i20 << 3) + 24 >> 2];
 STACKTOP = i12;
 return +(d8 * (+HEAPF32[i6 >> 2] + (d9 * d14 - d10 * d15) - (+HEAPF32[i7 >> 2] + (d11 * d16 - d1 * d17))) + d3 * (d14 * d10 + d9 * d15 + +HEAPF32[i6 + 4 >> 2] - (d16 * d1 + d11 * d17 + +HEAPF32[i7 + 4 >> 2])));
}
function __Z4iterv() {
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, d7 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i2 = i1;
 i3 = i1 + 32 | 0;
 i4 = HEAP32[16] | 0;
 if ((i4 | 0) >= (HEAP32[4] | 0)) {
  HEAP32[16] = i4 + 1;
  __Z7measurePl(i3, HEAP32[8] | 0);
  d7 = +HEAPF32[i3 + 4 >> 2];
  d6 = +(HEAP32[10] | 0) / 1.0e6 * 1.0e3;
  d5 = +(HEAP32[12] | 0) / 1.0e6 * 1.0e3;
  HEAPF64[tempDoublePtr >> 3] = +HEAPF32[i3 >> 2];
  HEAP32[i2 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i2 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 8 | 0;
  HEAPF64[tempDoublePtr >> 3] = d7;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 16 | 0;
  HEAPF64[tempDoublePtr >> 3] = d6;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  i4 = i2 + 24 | 0;
  HEAPF64[tempDoublePtr >> 3] = d5;
  HEAP32[i4 >> 2] = HEAP32[tempDoublePtr >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2];
  _printf(96, i2 | 0) | 0;
  _emscripten_run_script(152);
  if ((HEAP32[18] | 0) == 0) {
   STACKTOP = i1;
   return;
  }
  _emscripten_cancel_main_loop();
  STACKTOP = i1;
  return;
 }
 i3 = _clock() | 0;
 __ZN7b2World4StepEfii(HEAP32[6] | 0, .01666666753590107, 3, 3);
 i3 = (_clock() | 0) - i3 | 0;
 i2 = HEAP32[16] | 0;
 HEAP32[(HEAP32[8] | 0) + (i2 << 2) >> 2] = i3;
 if ((i3 | 0) < (HEAP32[10] | 0)) {
  HEAP32[10] = i3;
 }
 if ((i3 | 0) > (HEAP32[12] | 0)) {
  HEAP32[12] = i3;
 }
 HEAP32[16] = i2 + 1;
 STACKTOP = i1;
 return;
}
function __ZN13b2DynamicTree12AllocateNodeEv(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i2 = i5 + 16 | 0;
 i3 = HEAP32[i2 >> 2] | 0;
 if ((i3 | 0) == -1) {
  i4 = i5 + 8 | 0;
  i6 = HEAP32[i4 >> 2] | 0;
  i3 = i5 + 12 | 0;
  if ((i6 | 0) != (HEAP32[i3 >> 2] | 0)) {
   ___assert_fail(2912, 2944, 61, 2984);
  }
  i5 = i5 + 4 | 0;
  i7 = HEAP32[i5 >> 2] | 0;
  HEAP32[i3 >> 2] = i6 << 1;
  i6 = __Z7b2Alloci(i6 * 72 | 0) | 0;
  HEAP32[i5 >> 2] = i6;
  _memcpy(i6 | 0, i7 | 0, (HEAP32[i4 >> 2] | 0) * 36 | 0) | 0;
  __Z6b2FreePv(i7);
  i6 = HEAP32[i4 >> 2] | 0;
  i7 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
  i5 = HEAP32[i5 >> 2] | 0;
  if ((i6 | 0) < (i7 | 0)) {
   i7 = i6;
   while (1) {
    i6 = i7 + 1 | 0;
    HEAP32[i5 + (i7 * 36 | 0) + 20 >> 2] = i6;
    HEAP32[i5 + (i7 * 36 | 0) + 32 >> 2] = -1;
    i7 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
    if ((i6 | 0) < (i7 | 0)) {
     i7 = i6;
    } else {
     break;
    }
   }
  }
  HEAP32[i5 + (i7 * 36 | 0) + 20 >> 2] = -1;
  HEAP32[i5 + (((HEAP32[i3 >> 2] | 0) + -1 | 0) * 36 | 0) + 32 >> 2] = -1;
  i3 = HEAP32[i4 >> 2] | 0;
  HEAP32[i2 >> 2] = i3;
 } else {
  i4 = i5 + 8 | 0;
  i5 = HEAP32[i5 + 4 >> 2] | 0;
 }
 i7 = i5 + (i3 * 36 | 0) + 20 | 0;
 HEAP32[i2 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i7 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 24 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 28 >> 2] = -1;
 HEAP32[i5 + (i3 * 36 | 0) + 32 >> 2] = 0;
 HEAP32[i5 + (i3 * 36 | 0) + 16 >> 2] = 0;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i1;
 return i3 | 0;
}
function __ZN9b2Fixture6CreateEP16b2BlockAllocatorP6b2BodyPK12b2FixtureDef(i1, i5, i4, i3) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0, i6 = 0, i7 = 0, d8 = 0.0;
 i2 = STACKTOP;
 HEAP32[i1 + 40 >> 2] = HEAP32[i3 + 4 >> 2];
 HEAPF32[i1 + 16 >> 2] = +HEAPF32[i3 + 8 >> 2];
 HEAPF32[i1 + 20 >> 2] = +HEAPF32[i3 + 12 >> 2];
 HEAP32[i1 + 8 >> 2] = i4;
 HEAP32[i1 + 4 >> 2] = 0;
 i4 = i1 + 32 | 0;
 i6 = i3 + 22 | 0;
 HEAP16[i4 + 0 >> 1] = HEAP16[i6 + 0 >> 1] | 0;
 HEAP16[i4 + 2 >> 1] = HEAP16[i6 + 2 >> 1] | 0;
 HEAP16[i4 + 4 >> 1] = HEAP16[i6 + 4 >> 1] | 0;
 HEAP8[i1 + 38 | 0] = HEAP8[i3 + 20 | 0] | 0;
 i4 = HEAP32[i3 >> 2] | 0;
 i4 = FUNCTION_TABLE_iii[HEAP32[(HEAP32[i4 >> 2] | 0) + 8 >> 2] & 3](i4, i5) | 0;
 HEAP32[i1 + 12 >> 2] = i4;
 i4 = FUNCTION_TABLE_ii[HEAP32[(HEAP32[i4 >> 2] | 0) + 12 >> 2] & 3](i4) | 0;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i5, i4 * 28 | 0) | 0;
 i5 = i1 + 24 | 0;
 HEAP32[i5 >> 2] = i6;
 if ((i4 | 0) > 0) {
  i7 = 0;
 } else {
  i7 = i1 + 28 | 0;
  HEAP32[i7 >> 2] = 0;
  i7 = i3 + 16 | 0;
  d8 = +HEAPF32[i7 >> 2];
  HEAPF32[i1 >> 2] = d8;
  STACKTOP = i2;
  return;
 }
 do {
  HEAP32[i6 + (i7 * 28 | 0) + 16 >> 2] = 0;
  i6 = HEAP32[i5 >> 2] | 0;
  HEAP32[i6 + (i7 * 28 | 0) + 24 >> 2] = -1;
  i7 = i7 + 1 | 0;
 } while ((i7 | 0) != (i4 | 0));
 i7 = i1 + 28 | 0;
 HEAP32[i7 >> 2] = 0;
 i7 = i3 + 16 | 0;
 d8 = +HEAPF32[i7 >> 2];
 HEAPF32[i1 >> 2] = d8;
 STACKTOP = i2;
 return;
}
function __Z19b2ClipSegmentToLineP12b2ClipVertexPKS_RK6b2Vec2fi(i4, i1, i5, d9, i2) {
 i4 = i4 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 d9 = +d9;
 i2 = i2 | 0;
 var i3 = 0, i6 = 0, d7 = 0.0, i8 = 0, i10 = 0, d11 = 0.0, d12 = 0.0, i13 = 0;
 i3 = STACKTOP;
 d12 = +HEAPF32[i5 >> 2];
 d11 = +HEAPF32[i5 + 4 >> 2];
 i5 = i1 + 4 | 0;
 d7 = d12 * +HEAPF32[i1 >> 2] + d11 * +HEAPF32[i5 >> 2] - d9;
 i6 = i1 + 12 | 0;
 i8 = i1 + 16 | 0;
 d9 = d12 * +HEAPF32[i6 >> 2] + d11 * +HEAPF32[i8 >> 2] - d9;
 if (!(d7 <= 0.0)) {
  i10 = 0;
 } else {
  HEAP32[i4 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
  HEAP32[i4 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
  HEAP32[i4 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
  i10 = 1;
 }
 if (d9 <= 0.0) {
  i13 = i10 + 1 | 0;
  i10 = i4 + (i10 * 12 | 0) | 0;
  HEAP32[i10 + 0 >> 2] = HEAP32[i6 + 0 >> 2];
  HEAP32[i10 + 4 >> 2] = HEAP32[i6 + 4 >> 2];
  HEAP32[i10 + 8 >> 2] = HEAP32[i6 + 8 >> 2];
  i10 = i13;
 }
 if (!(d7 * d9 < 0.0)) {
  i13 = i10;
  STACKTOP = i3;
  return i13 | 0;
 }
 d9 = d7 / (d7 - d9);
 d11 = +HEAPF32[i1 >> 2];
 d12 = +HEAPF32[i5 >> 2];
 d11 = +(d11 + d9 * (+HEAPF32[i6 >> 2] - d11));
 d12 = +(d12 + d9 * (+HEAPF32[i8 >> 2] - d12));
 i13 = i4 + (i10 * 12 | 0) | 0;
 HEAPF32[i13 >> 2] = d11;
 HEAPF32[i13 + 4 >> 2] = d12;
 i13 = i4 + (i10 * 12 | 0) + 8 | 0;
 HEAP8[i13] = i2;
 HEAP8[i13 + 1 | 0] = HEAP8[i1 + 9 | 0] | 0;
 HEAP8[i13 + 2 | 0] = 0;
 HEAP8[i13 + 3 | 0] = 1;
 i13 = i10 + 1 | 0;
 STACKTOP = i3;
 return i13 | 0;
}
function __Z16b2CollideCirclesP10b2ManifoldPK13b2CircleShapeRK11b2TransformS3_S6_(i1, i7, i8, i6, i9) {
 i1 = i1 | 0;
 i7 = i7 | 0;
 i8 = i8 | 0;
 i6 = i6 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, d10 = 0.0, d11 = 0.0, d12 = 0.0, d13 = 0.0, d14 = 0.0, d15 = 0.0, d16 = 0.0, d17 = 0.0, d18 = 0.0;
 i2 = STACKTOP;
 i4 = i1 + 60 | 0;
 HEAP32[i4 >> 2] = 0;
 i3 = i7 + 12 | 0;
 d10 = +HEAPF32[i8 + 12 >> 2];
 d14 = +HEAPF32[i3 >> 2];
 d13 = +HEAPF32[i8 + 8 >> 2];
 d11 = +HEAPF32[i7 + 16 >> 2];
 i5 = i6 + 12 | 0;
 d16 = +HEAPF32[i9 + 12 >> 2];
 d18 = +HEAPF32[i5 >> 2];
 d17 = +HEAPF32[i9 + 8 >> 2];
 d15 = +HEAPF32[i6 + 16 >> 2];
 d12 = +HEAPF32[i9 >> 2] + (d16 * d18 - d17 * d15) - (+HEAPF32[i8 >> 2] + (d10 * d14 - d13 * d11));
 d11 = d18 * d17 + d16 * d15 + +HEAPF32[i9 + 4 >> 2] - (d14 * d13 + d10 * d11 + +HEAPF32[i8 + 4 >> 2]);
 d10 = +HEAPF32[i7 + 8 >> 2] + +HEAPF32[i6 + 8 >> 2];
 if (d12 * d12 + d11 * d11 > d10 * d10) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i1 + 56 >> 2] = 0;
 i9 = i3;
 i8 = HEAP32[i9 + 4 >> 2] | 0;
 i7 = i1 + 48 | 0;
 HEAP32[i7 >> 2] = HEAP32[i9 >> 2];
 HEAP32[i7 + 4 >> 2] = i8;
 HEAPF32[i1 + 40 >> 2] = 0.0;
 HEAPF32[i1 + 44 >> 2] = 0.0;
 HEAP32[i4 >> 2] = 1;
 i7 = i5;
 i8 = HEAP32[i7 + 4 >> 2] | 0;
 i9 = i1;
 HEAP32[i9 >> 2] = HEAP32[i7 >> 2];
 HEAP32[i9 + 4 >> 2] = i8;
 HEAP32[i1 + 16 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZNK14b2PolygonShape11ComputeAABBEP6b2AABBRK11b2Transformi(i1, i2, i7, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i7 = i7 | 0;
 i3 = i3 | 0;
 var d4 = 0.0, d5 = 0.0, d6 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0, d11 = 0.0, d12 = 0.0, i13 = 0, d14 = 0.0, d15 = 0.0, d16 = 0.0;
 i3 = STACKTOP;
 d4 = +HEAPF32[i7 + 12 >> 2];
 d15 = +HEAPF32[i1 + 20 >> 2];
 d5 = +HEAPF32[i7 + 8 >> 2];
 d12 = +HEAPF32[i1 + 24 >> 2];
 d6 = +HEAPF32[i7 >> 2];
 d9 = d6 + (d4 * d15 - d5 * d12);
 d8 = +HEAPF32[i7 + 4 >> 2];
 d12 = d15 * d5 + d4 * d12 + d8;
 i7 = HEAP32[i1 + 148 >> 2] | 0;
 if ((i7 | 0) > 1) {
  d10 = d9;
  d11 = d12;
  i13 = 1;
  do {
   d16 = +HEAPF32[i1 + (i13 << 3) + 20 >> 2];
   d14 = +HEAPF32[i1 + (i13 << 3) + 24 >> 2];
   d15 = d6 + (d4 * d16 - d5 * d14);
   d14 = d16 * d5 + d4 * d14 + d8;
   d10 = d10 < d15 ? d10 : d15;
   d11 = d11 < d14 ? d11 : d14;
   d9 = d9 > d15 ? d9 : d15;
   d12 = d12 > d14 ? d12 : d14;
   i13 = i13 + 1 | 0;
  } while ((i13 | 0) < (i7 | 0));
 } else {
  d11 = d12;
  d10 = d9;
 }
 d16 = +HEAPF32[i1 + 8 >> 2];
 d14 = +(d10 - d16);
 d15 = +(d11 - d16);
 i13 = i2;
 HEAPF32[i13 >> 2] = d14;
 HEAPF32[i13 + 4 >> 2] = d15;
 d15 = +(d9 + d16);
 d16 = +(d12 + d16);
 i13 = i2 + 8 | 0;
 HEAPF32[i13 >> 2] = d15;
 HEAPF32[i13 + 4 >> 2] = d16;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib(i5, i1, i4, i6, i3, i7) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i7 = i7 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i5 | 0) != (HEAP32[i1 + 8 >> 2] | 0)) {
  i5 = HEAP32[i5 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[i5 >> 2] | 0) + 20 >> 2] & 3](i5, i1, i4, i6, i3, i7);
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 53 | 0] = 1;
 if ((HEAP32[i1 + 4 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 52 | 0] = 1;
 i5 = i1 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i1 + 24 >> 2] = i3;
  HEAP32[i1 + 36 >> 2] = 1;
  if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i3 | 0) == 1)) {
   STACKTOP = i2;
   return;
  }
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 if ((i6 | 0) != (i4 | 0)) {
  i7 = i1 + 36 | 0;
  HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + 1;
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 i4 = i1 + 24 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 2) {
  HEAP32[i4 >> 2] = i3;
 } else {
  i3 = i5;
 }
 if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i3 | 0) == 1)) {
  STACKTOP = i2;
  return;
 }
 HEAP8[i1 + 54 | 0] = 1;
 STACKTOP = i2;
 return;
}
function __ZN6b2Body13CreateFixtureEPK12b2FixtureDef(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i3 = STACKTOP;
 i2 = i1 + 88 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((HEAP32[i4 + 102868 >> 2] & 2 | 0) != 0) {
  ___assert_fail(1776, 1520, 153, 1808);
 }
 i6 = __ZN16b2BlockAllocator8AllocateEi(i4, 44) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
 } else {
  __ZN9b2FixtureC2Ev(i6);
 }
 __ZN9b2Fixture6CreateEP16b2BlockAllocatorP6b2BodyPK12b2FixtureDef(i6, i4, i1, i5);
 if (!((HEAP16[i1 + 4 >> 1] & 32) == 0)) {
  __ZN9b2Fixture13CreateProxiesEP12b2BroadPhaseRK11b2Transform(i6, (HEAP32[i2 >> 2] | 0) + 102872 | 0, i1 + 12 | 0);
 }
 i5 = i1 + 100 | 0;
 HEAP32[i6 + 4 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i5 >> 2] = i6;
 i5 = i1 + 104 | 0;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
 HEAP32[i6 + 8 >> 2] = i1;
 if (!(+HEAPF32[i6 >> 2] > 0.0)) {
  i5 = HEAP32[i2 >> 2] | 0;
  i5 = i5 + 102868 | 0;
  i4 = HEAP32[i5 >> 2] | 0;
  i4 = i4 | 1;
  HEAP32[i5 >> 2] = i4;
  STACKTOP = i3;
  return i6 | 0;
 }
 __ZN6b2Body13ResetMassDataEv(i1);
 i5 = HEAP32[i2 >> 2] | 0;
 i5 = i5 + 102868 | 0;
 i4 = HEAP32[i5 >> 2] | 0;
 i4 = i4 | 1;
 HEAP32[i5 >> 2] = i4;
 STACKTOP = i3;
 return i6 | 0;
}
function __Z13b2TestOverlapPK7b2ShapeiS1_iRK11b2TransformS4_(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i7 = 0, i8 = 0, i9 = 0, i10 = 0;
 i8 = STACKTOP;
 STACKTOP = STACKTOP + 128 | 0;
 i9 = i8 + 36 | 0;
 i10 = i8 + 24 | 0;
 i7 = i8;
 HEAP32[i9 + 16 >> 2] = 0;
 HEAP32[i9 + 20 >> 2] = 0;
 HEAPF32[i9 + 24 >> 2] = 0.0;
 HEAP32[i9 + 44 >> 2] = 0;
 HEAP32[i9 + 48 >> 2] = 0;
 HEAPF32[i9 + 52 >> 2] = 0.0;
 __ZN15b2DistanceProxy3SetEPK7b2Shapei(i9, i6, i5);
 __ZN15b2DistanceProxy3SetEPK7b2Shapei(i9 + 28 | 0, i4, i3);
 i6 = i9 + 56 | 0;
 HEAP32[i6 + 0 >> 2] = HEAP32[i2 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i2 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i2 + 8 >> 2];
 HEAP32[i6 + 12 >> 2] = HEAP32[i2 + 12 >> 2];
 i6 = i9 + 72 | 0;
 HEAP32[i6 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
 HEAP32[i6 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
 HEAP32[i6 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
 HEAP32[i6 + 12 >> 2] = HEAP32[i1 + 12 >> 2];
 HEAP8[i9 + 88 | 0] = 1;
 HEAP16[i10 + 4 >> 1] = 0;
 __Z10b2DistanceP16b2DistanceOutputP14b2SimplexCachePK15b2DistanceInput(i7, i10, i9);
 STACKTOP = i8;
 return +HEAPF32[i7 + 16 >> 2] < 11920928955078125.0e-22 | 0;
}
function __ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib(i6, i1, i4, i5, i2, i3) {
 i6 = i6 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i3 = STACKTOP;
 if ((HEAP32[i1 + 8 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 53 | 0] = 1;
 if ((HEAP32[i1 + 4 >> 2] | 0) != (i5 | 0)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 52 | 0] = 1;
 i5 = i1 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i4;
  HEAP32[i1 + 24 >> 2] = i2;
  HEAP32[i1 + 36 >> 2] = 1;
  if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i2 | 0) == 1)) {
   STACKTOP = i3;
   return;
  }
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i3;
  return;
 }
 if ((i6 | 0) != (i4 | 0)) {
  i6 = i1 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP8[i1 + 54 | 0] = 1;
  STACKTOP = i3;
  return;
 }
 i4 = i1 + 24 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) == 2) {
  HEAP32[i4 >> 2] = i2;
 } else {
  i2 = i5;
 }
 if (!((HEAP32[i1 + 48 >> 2] | 0) == 1 & (i2 | 0) == 1)) {
  STACKTOP = i3;
  return;
 }
 HEAP8[i1 + 54 | 0] = 1;
 STACKTOP = i3;
 return;
}
function __ZNK11b2EdgeShape5CloneEP16b2BlockAllocator(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 48) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  HEAP32[i3 >> 2] = 240;
  HEAP32[i3 + 4 >> 2] = 1;
  HEAPF32[i3 + 8 >> 2] = .009999999776482582;
  i4 = i3 + 28 | 0;
  HEAP32[i4 + 0 >> 2] = 0;
  HEAP32[i4 + 4 >> 2] = 0;
  HEAP32[i4 + 8 >> 2] = 0;
  HEAP32[i4 + 12 >> 2] = 0;
  HEAP16[i4 + 16 >> 1] = 0;
 }
 i6 = i1 + 4 | 0;
 i5 = HEAP32[i6 + 4 >> 2] | 0;
 i4 = i3 + 4 | 0;
 HEAP32[i4 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i4 + 4 >> 2] = i5;
 i4 = i3 + 12 | 0;
 i1 = i1 + 12 | 0;
 HEAP32[i4 + 0 >> 2] = HEAP32[i1 + 0 >> 2];
 HEAP32[i4 + 4 >> 2] = HEAP32[i1 + 4 >> 2];
 HEAP32[i4 + 8 >> 2] = HEAP32[i1 + 8 >> 2];
 HEAP32[i4 + 12 >> 2] = HEAP32[i1 + 12 >> 2];
 HEAP32[i4 + 16 >> 2] = HEAP32[i1 + 16 >> 2];
 HEAP32[i4 + 20 >> 2] = HEAP32[i1 + 20 >> 2];
 HEAP32[i4 + 24 >> 2] = HEAP32[i1 + 24 >> 2];
 HEAP32[i4 + 28 >> 2] = HEAP32[i1 + 28 >> 2];
 HEAP16[i4 + 32 >> 1] = HEAP16[i1 + 32 >> 1] | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function __ZN7b2WorldC2ERK6b2Vec2(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i3 = STACKTOP;
 __ZN16b2BlockAllocatorC2Ev(i1);
 __ZN16b2StackAllocatorC2Ev(i1 + 68 | 0);
 __ZN16b2ContactManagerC2Ev(i1 + 102872 | 0);
 i6 = i1 + 102968 | 0;
 HEAP32[i1 + 102980 >> 2] = 0;
 HEAP32[i1 + 102984 >> 2] = 0;
 i4 = i1 + 102952 | 0;
 i5 = i1 + 102992 | 0;
 HEAP32[i4 + 0 >> 2] = 0;
 HEAP32[i4 + 4 >> 2] = 0;
 HEAP32[i4 + 8 >> 2] = 0;
 HEAP32[i4 + 12 >> 2] = 0;
 HEAP8[i5] = 1;
 HEAP8[i1 + 102993 | 0] = 1;
 HEAP8[i1 + 102994 | 0] = 0;
 HEAP8[i1 + 102995 | 0] = 1;
 HEAP8[i1 + 102976 | 0] = 1;
 i5 = i2;
 i4 = HEAP32[i5 + 4 >> 2] | 0;
 i2 = i6;
 HEAP32[i2 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i2 + 4 >> 2] = i4;
 HEAP32[i1 + 102868 >> 2] = 4;
 HEAPF32[i1 + 102988 >> 2] = 0.0;
 HEAP32[i1 + 102948 >> 2] = i1;
 i2 = i1 + 102996 | 0;
 HEAP32[i2 + 0 >> 2] = 0;
 HEAP32[i2 + 4 >> 2] = 0;
 HEAP32[i2 + 8 >> 2] = 0;
 HEAP32[i2 + 12 >> 2] = 0;
 HEAP32[i2 + 16 >> 2] = 0;
 HEAP32[i2 + 20 >> 2] = 0;
 HEAP32[i2 + 24 >> 2] = 0;
 HEAP32[i2 + 28 >> 2] = 0;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib(i6, i3, i4, i1, i2) {
 i6 = i6 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i3 + 8 >> 2] | 0) == (i6 | 0)) {
  if ((HEAP32[i3 + 4 >> 2] | 0) != (i4 | 0)) {
   STACKTOP = i2;
   return;
  }
  i3 = i3 + 28 | 0;
  if ((HEAP32[i3 >> 2] | 0) == 1) {
   STACKTOP = i2;
   return;
  }
  HEAP32[i3 >> 2] = i1;
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i3 >> 2] | 0) != (i6 | 0)) {
  STACKTOP = i2;
  return;
 }
 if ((HEAP32[i3 + 16 >> 2] | 0) != (i4 | 0) ? (i5 = i3 + 20 | 0, (HEAP32[i5 >> 2] | 0) != (i4 | 0)) : 0) {
  HEAP32[i3 + 32 >> 2] = i1;
  HEAP32[i5 >> 2] = i4;
  i6 = i3 + 40 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  if ((HEAP32[i3 + 36 >> 2] | 0) == 1 ? (HEAP32[i3 + 24 >> 2] | 0) == 2 : 0) {
   HEAP8[i3 + 54 | 0] = 1;
  }
  HEAP32[i3 + 44 >> 2] = 4;
  STACKTOP = i2;
  return;
 }
 if ((i1 | 0) != 1) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i3 + 32 >> 2] = 1;
 STACKTOP = i2;
 return;
}
function __ZN9b2Contact7DestroyEPS_P16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i3 = STACKTOP;
 if ((HEAP8[4200] | 0) == 0) {
  ___assert_fail(4352, 4256, 103, 4376);
 }
 i4 = HEAP32[i1 + 48 >> 2] | 0;
 if ((HEAP32[i1 + 124 >> 2] | 0) > 0) {
  i7 = HEAP32[i4 + 8 >> 2] | 0;
  i6 = i7 + 4 | 0;
  i5 = HEAPU16[i6 >> 1] | 0;
  if ((i5 & 2 | 0) == 0) {
   HEAP16[i6 >> 1] = i5 | 2;
   HEAPF32[i7 + 144 >> 2] = 0.0;
  }
  i7 = HEAP32[i1 + 52 >> 2] | 0;
  i6 = HEAP32[i7 + 8 >> 2] | 0;
  i5 = i6 + 4 | 0;
  i8 = HEAPU16[i5 >> 1] | 0;
  if ((i8 & 2 | 0) == 0) {
   HEAP16[i5 >> 1] = i8 | 2;
   HEAPF32[i6 + 144 >> 2] = 0.0;
  }
 } else {
  i7 = HEAP32[i1 + 52 >> 2] | 0;
 }
 i4 = HEAP32[(HEAP32[i4 + 12 >> 2] | 0) + 4 >> 2] | 0;
 i5 = HEAP32[(HEAP32[i7 + 12 >> 2] | 0) + 4 >> 2] | 0;
 if ((i4 | 0) > -1 & (i5 | 0) < 4) {
  FUNCTION_TABLE_vii[HEAP32[4008 + (i4 * 48 | 0) + (i5 * 12 | 0) + 4 >> 2] & 15](i1, i2);
  STACKTOP = i3;
  return;
 } else {
  ___assert_fail(4384, 4256, 114, 4376);
 }
}
function __ZN9b2Fixture13CreateProxiesEP12b2BroadPhaseRK11b2Transform(i5, i4, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0;
 i2 = STACKTOP;
 i3 = i5 + 28 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 0) {
  ___assert_fail(2088, 2112, 124, 2144);
 }
 i6 = i5 + 12 | 0;
 i8 = HEAP32[i6 >> 2] | 0;
 i8 = FUNCTION_TABLE_ii[HEAP32[(HEAP32[i8 >> 2] | 0) + 12 >> 2] & 3](i8) | 0;
 HEAP32[i3 >> 2] = i8;
 if ((i8 | 0) <= 0) {
  STACKTOP = i2;
  return;
 }
 i7 = i5 + 24 | 0;
 i8 = 0;
 do {
  i9 = HEAP32[i7 >> 2] | 0;
  i10 = i9 + (i8 * 28 | 0) | 0;
  i11 = HEAP32[i6 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i11 >> 2] | 0) + 24 >> 2] & 15](i11, i10, i1, i8);
  HEAP32[i9 + (i8 * 28 | 0) + 24 >> 2] = __ZN12b2BroadPhase11CreateProxyERK6b2AABBPv(i4, i10, i10) | 0;
  HEAP32[i9 + (i8 * 28 | 0) + 16 >> 2] = i5;
  HEAP32[i9 + (i8 * 28 | 0) + 20 >> 2] = i8;
  i8 = i8 + 1 | 0;
 } while ((i8 | 0) < (HEAP32[i3 >> 2] | 0));
 STACKTOP = i2;
 return;
}
function __ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv(i1, i5, i4) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + 64 | 0;
 i3 = i2;
 if ((i1 | 0) == (i5 | 0)) {
  i7 = 1;
  STACKTOP = i2;
  return i7 | 0;
 }
 if ((i5 | 0) == 0) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 i5 = ___dynamic_cast(i5, 6952, 7008, 0) | 0;
 if ((i5 | 0) == 0) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 i7 = i3 + 0 | 0;
 i6 = i7 + 56 | 0;
 do {
  HEAP32[i7 >> 2] = 0;
  i7 = i7 + 4 | 0;
 } while ((i7 | 0) < (i6 | 0));
 HEAP32[i3 >> 2] = i5;
 HEAP32[i3 + 8 >> 2] = i1;
 HEAP32[i3 + 12 >> 2] = -1;
 HEAP32[i3 + 48 >> 2] = 1;
 FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i5 >> 2] | 0) + 28 >> 2] & 15](i5, i3, HEAP32[i4 >> 2] | 0, 1);
 if ((HEAP32[i3 + 24 >> 2] | 0) != 1) {
  i7 = 0;
  STACKTOP = i2;
  return i7 | 0;
 }
 HEAP32[i4 >> 2] = HEAP32[i3 + 16 >> 2];
 i7 = 1;
 STACKTOP = i2;
 return i7 | 0;
}
function __ZN8b2IslandC2EiiiP16b2StackAllocatorP17b2ContactListener(i1, i4, i3, i2, i5, i6) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i7 = 0, i8 = 0;
 i7 = STACKTOP;
 i8 = i1 + 40 | 0;
 HEAP32[i8 >> 2] = i4;
 HEAP32[i1 + 44 >> 2] = i3;
 HEAP32[i1 + 48 >> 2] = i2;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 36 >> 2] = 0;
 HEAP32[i1 + 32 >> 2] = 0;
 HEAP32[i1 >> 2] = i5;
 HEAP32[i1 + 4 >> 2] = i6;
 HEAP32[i1 + 8 >> 2] = __ZN16b2StackAllocator8AllocateEi(i5, i4 << 2) | 0;
 HEAP32[i1 + 12 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, i3 << 2) | 0;
 HEAP32[i1 + 16 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, i2 << 2) | 0;
 HEAP32[i1 + 24 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, (HEAP32[i8 >> 2] | 0) * 12 | 0) | 0;
 HEAP32[i1 + 20 >> 2] = __ZN16b2StackAllocator8AllocateEi(HEAP32[i1 >> 2] | 0, (HEAP32[i8 >> 2] | 0) * 12 | 0) | 0;
 STACKTOP = i7;
 return;
}
function __ZNK11b2EdgeShape11ComputeAABBEP6b2AABBRK11b2Transformi(i8, i1, i10, i2) {
 i8 = i8 | 0;
 i1 = i1 | 0;
 i10 = i10 | 0;
 i2 = i2 | 0;
 var d3 = 0.0, d4 = 0.0, d5 = 0.0, d6 = 0.0, d7 = 0.0, d9 = 0.0, d11 = 0.0, d12 = 0.0;
 i2 = STACKTOP;
 d7 = +HEAPF32[i10 + 12 >> 2];
 d9 = +HEAPF32[i8 + 12 >> 2];
 d11 = +HEAPF32[i10 + 8 >> 2];
 d3 = +HEAPF32[i8 + 16 >> 2];
 d6 = +HEAPF32[i10 >> 2];
 d5 = d6 + (d7 * d9 - d11 * d3);
 d12 = +HEAPF32[i10 + 4 >> 2];
 d3 = d9 * d11 + d7 * d3 + d12;
 d9 = +HEAPF32[i8 + 20 >> 2];
 d4 = +HEAPF32[i8 + 24 >> 2];
 d6 = d6 + (d7 * d9 - d11 * d4);
 d4 = d12 + (d11 * d9 + d7 * d4);
 d7 = +HEAPF32[i8 + 8 >> 2];
 d9 = +((d5 < d6 ? d5 : d6) - d7);
 d12 = +((d3 < d4 ? d3 : d4) - d7);
 i10 = i1;
 HEAPF32[i10 >> 2] = d9;
 HEAPF32[i10 + 4 >> 2] = d12;
 d5 = +(d7 + (d5 > d6 ? d5 : d6));
 d12 = +(d7 + (d3 > d4 ? d3 : d4));
 i10 = i1 + 8 | 0;
 HEAPF32[i10 >> 2] = d5;
 HEAPF32[i10 + 4 >> 2] = d12;
 STACKTOP = i2;
 return;
}
function __ZNK14b2PolygonShape9TestPointERK11b2TransformRK6b2Vec2(i2, i3, i6) {
 i2 = i2 | 0;
 i3 = i3 | 0;
 i6 = i6 | 0;
 var i1 = 0, d4 = 0.0, d5 = 0.0, i7 = 0, d8 = 0.0, d9 = 0.0, d10 = 0.0;
 i1 = STACKTOP;
 d8 = +HEAPF32[i6 >> 2] - +HEAPF32[i3 >> 2];
 d9 = +HEAPF32[i6 + 4 >> 2] - +HEAPF32[i3 + 4 >> 2];
 d10 = +HEAPF32[i3 + 12 >> 2];
 d5 = +HEAPF32[i3 + 8 >> 2];
 d4 = d8 * d10 + d9 * d5;
 d5 = d10 * d9 - d8 * d5;
 i3 = HEAP32[i2 + 148 >> 2] | 0;
 if ((i3 | 0) > 0) {
  i6 = 0;
 } else {
  i7 = 1;
  STACKTOP = i1;
  return i7 | 0;
 }
 while (1) {
  i7 = i6 + 1 | 0;
  if ((d4 - +HEAPF32[i2 + (i6 << 3) + 20 >> 2]) * +HEAPF32[i2 + (i6 << 3) + 84 >> 2] + (d5 - +HEAPF32[i2 + (i6 << 3) + 24 >> 2]) * +HEAPF32[i2 + (i6 << 3) + 88 >> 2] > 0.0) {
   i3 = 0;
   i2 = 4;
   break;
  }
  if ((i7 | 0) < (i3 | 0)) {
   i6 = i7;
  } else {
   i3 = 1;
   i2 = 4;
   break;
  }
 }
 if ((i2 | 0) == 4) {
  STACKTOP = i1;
  return i3 | 0;
 }
 return 0;
}
function __ZN16b2StackAllocator8AllocateEi(i4, i5) {
 i4 = i4 | 0;
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i3 = i4 + 102796 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 if ((i6 | 0) >= 32) {
  ___assert_fail(3896, 3808, 38, 3936);
 }
 i1 = i4 + (i6 * 12 | 0) + 102412 | 0;
 HEAP32[i4 + (i6 * 12 | 0) + 102416 >> 2] = i5;
 i7 = i4 + 102400 | 0;
 i8 = HEAP32[i7 >> 2] | 0;
 if ((i8 + i5 | 0) > 102400) {
  HEAP32[i1 >> 2] = __Z7b2Alloci(i5) | 0;
  HEAP8[i4 + (i6 * 12 | 0) + 102420 | 0] = 1;
 } else {
  HEAP32[i1 >> 2] = i4 + i8;
  HEAP8[i4 + (i6 * 12 | 0) + 102420 | 0] = 0;
  HEAP32[i7 >> 2] = (HEAP32[i7 >> 2] | 0) + i5;
 }
 i6 = i4 + 102404 | 0;
 i5 = (HEAP32[i6 >> 2] | 0) + i5 | 0;
 HEAP32[i6 >> 2] = i5;
 i4 = i4 + 102408 | 0;
 i6 = HEAP32[i4 >> 2] | 0;
 HEAP32[i4 >> 2] = (i6 | 0) > (i5 | 0) ? i6 : i5;
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 STACKTOP = i2;
 return HEAP32[i1 >> 2] | 0;
}
function __ZN12b2BroadPhase13QueryCallbackEi(i5, i1) {
 i5 = i5 | 0;
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0;
 i2 = STACKTOP;
 i4 = i5 + 56 | 0;
 i7 = HEAP32[i4 >> 2] | 0;
 if ((i7 | 0) == (i1 | 0)) {
  STACKTOP = i2;
  return 1;
 }
 i3 = i5 + 52 | 0;
 i6 = HEAP32[i3 >> 2] | 0;
 i8 = i5 + 48 | 0;
 i5 = i5 + 44 | 0;
 if ((i6 | 0) == (HEAP32[i8 >> 2] | 0)) {
  i7 = HEAP32[i5 >> 2] | 0;
  HEAP32[i8 >> 2] = i6 << 1;
  i6 = __Z7b2Alloci(i6 * 24 | 0) | 0;
  HEAP32[i5 >> 2] = i6;
  _memcpy(i6 | 0, i7 | 0, (HEAP32[i3 >> 2] | 0) * 12 | 0) | 0;
  __Z6b2FreePv(i7);
  i7 = HEAP32[i4 >> 2] | 0;
  i6 = HEAP32[i3 >> 2] | 0;
 }
 i5 = HEAP32[i5 >> 2] | 0;
 HEAP32[i5 + (i6 * 12 | 0) >> 2] = (i7 | 0) > (i1 | 0) ? i1 : i7;
 i4 = HEAP32[i4 >> 2] | 0;
 HEAP32[i5 + ((HEAP32[i3 >> 2] | 0) * 12 | 0) + 4 >> 2] = (i4 | 0) < (i1 | 0) ? i1 : i4;
 HEAP32[i3 >> 2] = (HEAP32[i3 >> 2] | 0) + 1;
 STACKTOP = i2;
 return 1;
}
function __ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi(i5, i4, i3, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i2 = 0, i6 = 0;
 i2 = STACKTOP;
 if ((i5 | 0) != (HEAP32[i4 + 8 >> 2] | 0)) {
  i6 = HEAP32[i5 + 8 >> 2] | 0;
  FUNCTION_TABLE_viiii[HEAP32[(HEAP32[i6 >> 2] | 0) + 28 >> 2] & 15](i6, i4, i3, i1);
  STACKTOP = i2;
  return;
 }
 i5 = i4 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i3;
  HEAP32[i4 + 24 >> 2] = i1;
  HEAP32[i4 + 36 >> 2] = 1;
  STACKTOP = i2;
  return;
 }
 if ((i6 | 0) != (i3 | 0)) {
  i6 = i4 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP32[i4 + 24 >> 2] = 2;
  HEAP8[i4 + 54 | 0] = 1;
  STACKTOP = i2;
  return;
 }
 i3 = i4 + 24 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 2) {
  STACKTOP = i2;
  return;
 }
 HEAP32[i3 >> 2] = i1;
 STACKTOP = i2;
 return;
}
function __ZN6b2Body19SynchronizeFixturesEv(i5) {
 i5 = i5 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i4 = 0, d6 = 0.0, d7 = 0.0, d8 = 0.0, d9 = 0.0, d10 = 0.0;
 i1 = STACKTOP;
 STACKTOP = STACKTOP + 16 | 0;
 i3 = i1;
 d8 = +HEAPF32[i5 + 52 >> 2];
 d9 = +Math_sin(+d8);
 HEAPF32[i3 + 8 >> 2] = d9;
 d8 = +Math_cos(+d8);
 HEAPF32[i3 + 12 >> 2] = d8;
 d10 = +HEAPF32[i5 + 28 >> 2];
 d6 = +HEAPF32[i5 + 32 >> 2];
 d7 = +(+HEAPF32[i5 + 36 >> 2] - (d8 * d10 - d9 * d6));
 d6 = +(+HEAPF32[i5 + 40 >> 2] - (d10 * d9 + d8 * d6));
 i2 = i3;
 HEAPF32[i2 >> 2] = d7;
 HEAPF32[i2 + 4 >> 2] = d6;
 i2 = (HEAP32[i5 + 88 >> 2] | 0) + 102872 | 0;
 i4 = HEAP32[i5 + 100 >> 2] | 0;
 if ((i4 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 i5 = i5 + 12 | 0;
 do {
  __ZN9b2Fixture11SynchronizeEP12b2BroadPhaseRK11b2TransformS4_(i4, i2, i3, i5);
  i4 = HEAP32[i4 + 4 >> 2] | 0;
 } while ((i4 | 0) != 0);
 STACKTOP = i1;
 return;
}
function __ZN13b2DynamicTreeC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;
 i4 = STACKTOP;
 HEAP32[i1 >> 2] = -1;
 i3 = i1 + 12 | 0;
 HEAP32[i3 >> 2] = 16;
 HEAP32[i1 + 8 >> 2] = 0;
 i6 = __Z7b2Alloci(576) | 0;
 i2 = i1 + 4 | 0;
 HEAP32[i2 >> 2] = i6;
 _memset(i6 | 0, 0, (HEAP32[i3 >> 2] | 0) * 36 | 0) | 0;
 i6 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
 i2 = HEAP32[i2 >> 2] | 0;
 if ((i6 | 0) > 0) {
  i6 = 0;
  while (1) {
   i5 = i6 + 1 | 0;
   HEAP32[i2 + (i6 * 36 | 0) + 20 >> 2] = i5;
   HEAP32[i2 + (i6 * 36 | 0) + 32 >> 2] = -1;
   i6 = (HEAP32[i3 >> 2] | 0) + -1 | 0;
   if ((i5 | 0) < (i6 | 0)) {
    i6 = i5;
   } else {
    break;
   }
  }
 }
 HEAP32[i2 + (i6 * 36 | 0) + 20 >> 2] = -1;
 HEAP32[i2 + (((HEAP32[i3 >> 2] | 0) + -1 | 0) * 36 | 0) + 32 >> 2] = -1;
 HEAP32[i1 + 16 >> 2] = 0;
 HEAP32[i1 + 20 >> 2] = 0;
 HEAP32[i1 + 24 >> 2] = 0;
 STACKTOP = i4;
 return;
}
function __Z7measurePl(i1, i9) {
 i1 = i1 | 0;
 i9 = i9 | 0;
 var i2 = 0, i3 = 0, i4 = 0, d5 = 0.0, d6 = 0.0, i7 = 0, d8 = 0.0, i10 = 0, d11 = 0.0;
 i2 = STACKTOP;
 i3 = HEAP32[4] | 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + ((4 * i3 | 0) + 15 & -16) | 0;
 i7 = (i3 | 0) > 0;
 if (i7) {
  i10 = 0;
  d6 = 0.0;
  do {
   d8 = +(HEAP32[i9 + (i10 << 2) >> 2] | 0) / 1.0e6 * 1.0e3;
   HEAPF32[i4 + (i10 << 2) >> 2] = d8;
   d6 = d6 + d8;
   i10 = i10 + 1 | 0;
  } while ((i10 | 0) < (i3 | 0));
  d5 = +(i3 | 0);
  d6 = d6 / d5;
  HEAPF32[i1 >> 2] = d6;
  if (i7) {
   i7 = 0;
   d8 = 0.0;
   do {
    d11 = +HEAPF32[i4 + (i7 << 2) >> 2] - d6;
    d8 = d8 + d11 * d11;
    i7 = i7 + 1 | 0;
   } while ((i7 | 0) < (i3 | 0));
  } else {
   d8 = 0.0;
  }
 } else {
  d5 = +(i3 | 0);
  HEAPF32[i1 >> 2] = 0.0 / d5;
  d8 = 0.0;
 }
 HEAPF32[i1 + 4 >> 2] = +Math_sqrt(+(d8 / d5));
 STACKTOP = i2;
 return;
}
function __ZN13b2DynamicTree11CreateProxyERK6b2AABBPv(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0, i6 = 0, d7 = 0.0, d8 = 0.0, i9 = 0;
 i5 = STACKTOP;
 i4 = __ZN13b2DynamicTree12AllocateNodeEv(i1) | 0;
 i6 = i1 + 4 | 0;
 d7 = +(+HEAPF32[i3 >> 2] + -.10000000149011612);
 d8 = +(+HEAPF32[i3 + 4 >> 2] + -.10000000149011612);
 i9 = (HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) | 0;
 HEAPF32[i9 >> 2] = d7;
 HEAPF32[i9 + 4 >> 2] = d8;
 d8 = +(+HEAPF32[i3 + 8 >> 2] + .10000000149011612);
 d7 = +(+HEAPF32[i3 + 12 >> 2] + .10000000149011612);
 i3 = (HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 8 | 0;
 HEAPF32[i3 >> 2] = d8;
 HEAPF32[i3 + 4 >> 2] = d7;
 HEAP32[(HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 16 >> 2] = i2;
 HEAP32[(HEAP32[i6 >> 2] | 0) + (i4 * 36 | 0) + 32 >> 2] = 0;
 __ZN13b2DynamicTree10InsertLeafEi(i1, i4);
 STACKTOP = i5;
 return i4 | 0;
}
function __ZN16b2BlockAllocatorC2Ev(i3) {
 i3 = i3 | 0;
 var i1 = 0, i2 = 0, i4 = 0, i5 = 0;
 i2 = STACKTOP;
 i4 = i3 + 8 | 0;
 HEAP32[i4 >> 2] = 128;
 HEAP32[i3 + 4 >> 2] = 0;
 i5 = __Z7b2Alloci(1024) | 0;
 HEAP32[i3 >> 2] = i5;
 _memset(i5 | 0, 0, HEAP32[i4 >> 2] << 3 | 0) | 0;
 i4 = i3 + 12 | 0;
 i3 = i4 + 56 | 0;
 do {
  HEAP32[i4 >> 2] = 0;
  i4 = i4 + 4 | 0;
 } while ((i4 | 0) < (i3 | 0));
 if ((HEAP8[1280] | 0) == 0) {
  i3 = 1;
  i4 = 0;
 } else {
  STACKTOP = i2;
  return;
 }
 do {
  if ((i4 | 0) >= 14) {
   i1 = 3;
   break;
  }
  if ((i3 | 0) > (HEAP32[576 + (i4 << 2) >> 2] | 0)) {
   i4 = i4 + 1 | 0;
   HEAP8[632 + i3 | 0] = i4;
  } else {
   HEAP8[632 + i3 | 0] = i4;
  }
  i3 = i3 + 1 | 0;
 } while ((i3 | 0) < 641);
 if ((i1 | 0) == 3) {
  ___assert_fail(1288, 1312, 73, 1352);
 }
 HEAP8[1280] = 1;
 STACKTOP = i2;
 return;
}
function __ZN24b2ChainAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i6 = i5;
 i7 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0;
 HEAP32[i6 >> 2] = 240;
 HEAP32[i6 + 4 >> 2] = 1;
 HEAPF32[i6 + 8 >> 2] = .009999999776482582;
 i8 = i6 + 28 | 0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 HEAP16[i8 + 16 >> 1] = 0;
 __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i7, i6, HEAP32[i2 + 56 >> 2] | 0);
 __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i4, i6, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN23b2ChainAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i5 = STACKTOP;
 STACKTOP = STACKTOP + 48 | 0;
 i6 = i5;
 i7 = HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0;
 HEAP32[i6 >> 2] = 240;
 HEAP32[i6 + 4 >> 2] = 1;
 HEAPF32[i6 + 8 >> 2] = .009999999776482582;
 i8 = i6 + 28 | 0;
 HEAP32[i8 + 0 >> 2] = 0;
 HEAP32[i8 + 4 >> 2] = 0;
 HEAP32[i8 + 8 >> 2] = 0;
 HEAP32[i8 + 12 >> 2] = 0;
 HEAP16[i8 + 16 >> 1] = 0;
 __ZNK12b2ChainShape12GetChildEdgeEP11b2EdgeShapei(i7, i6, HEAP32[i2 + 56 >> 2] | 0);
 __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i4, i6, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN15b2ContactSolver13StoreImpulsesEv(i4) {
 i4 = i4 | 0;
 var i1 = 0, i2 = 0, i3 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0;
 i1 = STACKTOP;
 i2 = HEAP32[i4 + 48 >> 2] | 0;
 if ((i2 | 0) <= 0) {
  STACKTOP = i1;
  return;
 }
 i3 = HEAP32[i4 + 40 >> 2] | 0;
 i4 = HEAP32[i4 + 44 >> 2] | 0;
 i5 = 0;
 do {
  i6 = HEAP32[i4 + (HEAP32[i3 + (i5 * 152 | 0) + 148 >> 2] << 2) >> 2] | 0;
  i7 = HEAP32[i3 + (i5 * 152 | 0) + 144 >> 2] | 0;
  if ((i7 | 0) > 0) {
   i8 = 0;
   do {
    HEAPF32[i6 + (i8 * 20 | 0) + 72 >> 2] = +HEAPF32[i3 + (i5 * 152 | 0) + (i8 * 36 | 0) + 16 >> 2];
    HEAPF32[i6 + (i8 * 20 | 0) + 76 >> 2] = +HEAPF32[i3 + (i5 * 152 | 0) + (i8 * 36 | 0) + 20 >> 2];
    i8 = i8 + 1 | 0;
   } while ((i8 | 0) < (i7 | 0));
  }
  i5 = i5 + 1 | 0;
 } while ((i5 | 0) < (i2 | 0));
 STACKTOP = i1;
 return;
}
function __ZN16b2StackAllocator4FreeEPv(i1, i5) {
 i1 = i1 | 0;
 i5 = i5 | 0;
 var i2 = 0, i3 = 0, i4 = 0, i6 = 0;
 i3 = STACKTOP;
 i2 = i1 + 102796 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((i4 | 0) <= 0) {
  ___assert_fail(3952, 3808, 63, 3976);
 }
 i6 = i4 + -1 | 0;
 if ((HEAP32[i1 + (i6 * 12 | 0) + 102412 >> 2] | 0) != (i5 | 0)) {
  ___assert_fail(3984, 3808, 65, 3976);
 }
 if ((HEAP8[i1 + (i6 * 12 | 0) + 102420 | 0] | 0) == 0) {
  i5 = i1 + (i6 * 12 | 0) + 102416 | 0;
  i6 = i1 + 102400 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) - (HEAP32[i5 >> 2] | 0);
 } else {
  __Z6b2FreePv(i5);
  i5 = i1 + (i6 * 12 | 0) + 102416 | 0;
  i4 = HEAP32[i2 >> 2] | 0;
 }
 i6 = i1 + 102404 | 0;
 HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) - (HEAP32[i5 >> 2] | 0);
 HEAP32[i2 >> 2] = i4 + -1;
 STACKTOP = i3;
 return;
}
function __ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi(i5, i4, i3, i2) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i1 = 0, i6 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i4 + 8 >> 2] | 0) != (i5 | 0)) {
  STACKTOP = i1;
  return;
 }
 i5 = i4 + 16 | 0;
 i6 = HEAP32[i5 >> 2] | 0;
 if ((i6 | 0) == 0) {
  HEAP32[i5 >> 2] = i3;
  HEAP32[i4 + 24 >> 2] = i2;
  HEAP32[i4 + 36 >> 2] = 1;
  STACKTOP = i1;
  return;
 }
 if ((i6 | 0) != (i3 | 0)) {
  i6 = i4 + 36 | 0;
  HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + 1;
  HEAP32[i4 + 24 >> 2] = 2;
  HEAP8[i4 + 54 | 0] = 1;
  STACKTOP = i1;
  return;
 }
 i3 = i4 + 24 | 0;
 if ((HEAP32[i3 >> 2] | 0) != 2) {
  STACKTOP = i1;
  return;
 }
 HEAP32[i3 >> 2] = i2;
 STACKTOP = i1;
 return;
}
function __ZN12b2BroadPhase11CreateProxyERK6b2AABBPv(i2, i4, i3) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i1 = 0, i5 = 0, i6 = 0, i7 = 0;
 i1 = STACKTOP;
 i3 = __ZN13b2DynamicTree11CreateProxyERK6b2AABBPv(i2, i4, i3) | 0;
 i4 = i2 + 28 | 0;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 i4 = i2 + 40 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 i6 = i2 + 36 | 0;
 i2 = i2 + 32 | 0;
 if ((i5 | 0) == (HEAP32[i6 >> 2] | 0)) {
  i7 = HEAP32[i2 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 << 1;
  i5 = __Z7b2Alloci(i5 << 3) | 0;
  HEAP32[i2 >> 2] = i5;
  _memcpy(i5 | 0, i7 | 0, HEAP32[i4 >> 2] << 2 | 0) | 0;
  __Z6b2FreePv(i7);
  i5 = HEAP32[i4 >> 2] | 0;
 }
 HEAP32[(HEAP32[i2 >> 2] | 0) + (i5 << 2) >> 2] = i3;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i1;
 return i3 | 0;
}
function __ZN9b2ContactC2EP9b2FixtureiS1_i(i1, i4, i6, i3, i5) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i6 = i6 | 0;
 i3 = i3 | 0;
 i5 = i5 | 0;
 var i2 = 0, i7 = 0, d8 = 0.0, d9 = 0.0;
 i2 = STACKTOP;
 HEAP32[i1 >> 2] = 4440;
 HEAP32[i1 + 4 >> 2] = 4;
 HEAP32[i1 + 48 >> 2] = i4;
 HEAP32[i1 + 52 >> 2] = i3;
 HEAP32[i1 + 56 >> 2] = i6;
 HEAP32[i1 + 60 >> 2] = i5;
 HEAP32[i1 + 124 >> 2] = 0;
 HEAP32[i1 + 128 >> 2] = 0;
 i5 = i4 + 16 | 0;
 i6 = i1 + 8 | 0;
 i7 = i6 + 40 | 0;
 do {
  HEAP32[i6 >> 2] = 0;
  i6 = i6 + 4 | 0;
 } while ((i6 | 0) < (i7 | 0));
 HEAPF32[i1 + 136 >> 2] = +Math_sqrt(+(+HEAPF32[i5 >> 2] * +HEAPF32[i3 + 16 >> 2]));
 d8 = +HEAPF32[i4 + 20 >> 2];
 d9 = +HEAPF32[i3 + 20 >> 2];
 HEAPF32[i1 + 140 >> 2] = d8 > d9 ? d8 : d9;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhase9MoveProxyEiRK6b2AABBRK6b2Vec2(i3, i1, i5, i4) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 var i2 = 0, i6 = 0, i7 = 0;
 i2 = STACKTOP;
 if (!(__ZN13b2DynamicTree9MoveProxyEiRK6b2AABBRK6b2Vec2(i3, i1, i5, i4) | 0)) {
  STACKTOP = i2;
  return;
 }
 i4 = i3 + 40 | 0;
 i5 = HEAP32[i4 >> 2] | 0;
 i6 = i3 + 36 | 0;
 i3 = i3 + 32 | 0;
 if ((i5 | 0) == (HEAP32[i6 >> 2] | 0)) {
  i7 = HEAP32[i3 >> 2] | 0;
  HEAP32[i6 >> 2] = i5 << 1;
  i5 = __Z7b2Alloci(i5 << 3) | 0;
  HEAP32[i3 >> 2] = i5;
  _memcpy(i5 | 0, i7 | 0, HEAP32[i4 >> 2] << 2 | 0) | 0;
  __Z6b2FreePv(i7);
  i5 = HEAP32[i4 >> 2] | 0;
 }
 HEAP32[(HEAP32[i3 >> 2] | 0) + (i5 << 2) >> 2] = i1;
 HEAP32[i4 >> 2] = (HEAP32[i4 >> 2] | 0) + 1;
 STACKTOP = i2;
 return;
}
function __ZN24b2ChainAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i6, 144) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i6, i1, i3, i4, i5);
 HEAP32[i6 >> 2] = 6032;
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 3) {
  ___assert_fail(6048, 6096, 43, 6152);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  STACKTOP = i2;
  return i6 | 0;
 } else {
  ___assert_fail(6184, 6096, 44, 6152);
 }
 return 0;
}
function __ZN23b2ChainAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i6 = __ZN16b2BlockAllocator8AllocateEi(i6, 144) | 0;
 if ((i6 | 0) == 0) {
  i6 = 0;
  STACKTOP = i2;
  return i6 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i6, i1, i3, i4, i5);
 HEAP32[i6 >> 2] = 5784;
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 3) {
  ___assert_fail(5800, 5848, 43, 5904);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i6 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return i6 | 0;
 } else {
  ___assert_fail(5928, 5848, 44, 5904);
 }
 return 0;
}
function __ZN25b2PolygonAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4984;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 2) {
  ___assert_fail(5e3, 5048, 41, 5104);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(5136, 5048, 42, 5104);
 }
 return 0;
}
function __ZN23b2EdgeAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4736;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 1) {
  ___assert_fail(4752, 4800, 41, 4856);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(4880, 4800, 42, 4856);
 }
 return 0;
}
function __ZN22b2EdgeAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 4488;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 1) {
  ___assert_fail(4504, 4552, 41, 4608);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(4632, 4552, 42, 4608);
 }
 return 0;
}
function __ZN14b2PolygonShape8SetAsBoxEff(i1, d3, d2) {
 i1 = i1 | 0;
 d3 = +d3;
 d2 = +d2;
 var d4 = 0.0, d5 = 0.0;
 HEAP32[i1 + 148 >> 2] = 4;
 d4 = -d3;
 d5 = -d2;
 HEAPF32[i1 + 20 >> 2] = d4;
 HEAPF32[i1 + 24 >> 2] = d5;
 HEAPF32[i1 + 28 >> 2] = d3;
 HEAPF32[i1 + 32 >> 2] = d5;
 HEAPF32[i1 + 36 >> 2] = d3;
 HEAPF32[i1 + 40 >> 2] = d2;
 HEAPF32[i1 + 44 >> 2] = d4;
 HEAPF32[i1 + 48 >> 2] = d2;
 HEAPF32[i1 + 84 >> 2] = 0.0;
 HEAPF32[i1 + 88 >> 2] = -1.0;
 HEAPF32[i1 + 92 >> 2] = 1.0;
 HEAPF32[i1 + 96 >> 2] = 0.0;
 HEAPF32[i1 + 100 >> 2] = 0.0;
 HEAPF32[i1 + 104 >> 2] = 1.0;
 HEAPF32[i1 + 108 >> 2] = -1.0;
 HEAPF32[i1 + 112 >> 2] = 0.0;
 HEAPF32[i1 + 12 >> 2] = 0.0;
 HEAPF32[i1 + 16 >> 2] = 0.0;
 return;
}
function __ZN16b2PolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 5240;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 2) {
  ___assert_fail(5256, 5304, 44, 5352);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 2) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(5376, 5304, 45, 5352);
 }
 return 0;
}
function __ZN15b2CircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator(i1, i4, i2, i5, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i2 = i2 | 0;
 i5 = i5 | 0;
 i3 = i3 | 0;
 i4 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 144) | 0;
 if ((i3 | 0) == 0) {
  i5 = 0;
  STACKTOP = i4;
  return i5 | 0;
 }
 __ZN9b2ContactC2EP9b2FixtureiS1_i(i3, i1, 0, i2, 0);
 HEAP32[i3 >> 2] = 6288;
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 48 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) != 0) {
  ___assert_fail(6304, 6352, 44, 6400);
 }
 if ((HEAP32[(HEAP32[(HEAP32[i3 + 52 >> 2] | 0) + 12 >> 2] | 0) + 4 >> 2] | 0) == 0) {
  i5 = i3;
  STACKTOP = i4;
  return i5 | 0;
 } else {
  ___assert_fail(6416, 6352, 45, 6400);
 }
 return 0;
}
function __ZN7b2World10CreateBodyEPK9b2BodyDef(i1, i4) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0, i3 = 0, i5 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 + 102868 >> 2] & 2 | 0) != 0) {
  ___assert_fail(2160, 2184, 109, 2216);
 }
 i3 = __ZN16b2BlockAllocator8AllocateEi(i1, 152) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  __ZN6b2BodyC2EPK9b2BodyDefP7b2World(i3, i4, i1);
 }
 HEAP32[i3 + 92 >> 2] = 0;
 i4 = i1 + 102952 | 0;
 HEAP32[i3 + 96 >> 2] = HEAP32[i4 >> 2];
 i5 = HEAP32[i4 >> 2] | 0;
 if ((i5 | 0) != 0) {
  HEAP32[i5 + 92 >> 2] = i3;
 }
 HEAP32[i4 >> 2] = i3;
 i5 = i1 + 102960 | 0;
 HEAP32[i5 >> 2] = (HEAP32[i5 >> 2] | 0) + 1;
 STACKTOP = i2;
 return i3 | 0;
}
function __ZNK6b2Body13ShouldCollideEPKS_(i4, i2) {
 i4 = i4 | 0;
 i2 = i2 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 if ((HEAP32[i4 >> 2] | 0) != 2 ? (HEAP32[i2 >> 2] | 0) != 2 : 0) {
  i2 = 0;
 } else {
  i3 = 3;
 }
 L3 : do {
  if ((i3 | 0) == 3) {
   i3 = HEAP32[i4 + 108 >> 2] | 0;
   if ((i3 | 0) == 0) {
    i2 = 1;
   } else {
    while (1) {
     if ((HEAP32[i3 >> 2] | 0) == (i2 | 0) ? (HEAP8[(HEAP32[i3 + 4 >> 2] | 0) + 61 | 0] | 0) == 0 : 0) {
      i2 = 0;
      break L3;
     }
     i3 = HEAP32[i3 + 12 >> 2] | 0;
     if ((i3 | 0) == 0) {
      i2 = 1;
      break;
     }
    }
   }
  }
 } while (0);
 STACKTOP = i1;
 return i2 | 0;
}
function __ZNK14b2PolygonShape5CloneEP16b2BlockAllocator(i1, i3) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 var i2 = 0, i4 = 0, i5 = 0, i6 = 0;
 i2 = STACKTOP;
 i3 = __ZN16b2BlockAllocator8AllocateEi(i3, 152) | 0;
 if ((i3 | 0) == 0) {
  i3 = 0;
 } else {
  HEAP32[i3 >> 2] = 504;
  HEAP32[i3 + 4 >> 2] = 2;
  HEAPF32[i3 + 8 >> 2] = .009999999776482582;
  HEAP32[i3 + 148 >> 2] = 0;
  HEAPF32[i3 + 12 >> 2] = 0.0;
  HEAPF32[i3 + 16 >> 2] = 0.0;
 }
 i6 = i1 + 4 | 0;
 i5 = HEAP32[i6 + 4 >> 2] | 0;
 i4 = i3 + 4 | 0;
 HEAP32[i4 >> 2] = HEAP32[i6 >> 2];
 HEAP32[i4 + 4 >> 2] = i5;
 _memcpy(i3 + 12 | 0, i1 + 12 | 0, 140) | 0;
 STACKTOP = i2;
 return i3 | 0;
}
function _memcpy(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0;
 i4 = i3 | 0;
 if ((i3 & 3) == (i2 & 3)) {
  while (i3 & 3) {
   if ((i1 | 0) == 0) return i4 | 0;
   HEAP8[i3] = HEAP8[i2] | 0;
   i3 = i3 + 1 | 0;
   i2 = i2 + 1 | 0;
   i1 = i1 - 1 | 0;
  }
  while ((i1 | 0) >= 4) {
   HEAP32[i3 >> 2] = HEAP32[i2 >> 2];
   i3 = i3 + 4 | 0;
   i2 = i2 + 4 | 0;
   i1 = i1 - 4 | 0;
  }
 }
 while ((i1 | 0) > 0) {
  HEAP8[i3] = HEAP8[i2] | 0;
  i3 = i3 + 1 | 0;
  i2 = i2 + 1 | 0;
  i1 = i1 - 1 | 0;
 }
 return i4 | 0;
}
function __ZN7b2World16SetAllowSleepingEb(i2, i4) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i3 = i2 + 102976 | 0;
 if ((i4 & 1 | 0) == (HEAPU8[i3] | 0 | 0)) {
  STACKTOP = i1;
  return;
 }
 HEAP8[i3] = i4 & 1;
 if (i4) {
  STACKTOP = i1;
  return;
 }
 i2 = HEAP32[i2 + 102952 >> 2] | 0;
 if ((i2 | 0) == 0) {
  STACKTOP = i1;
  return;
 }
 do {
  i3 = i2 + 4 | 0;
  i4 = HEAPU16[i3 >> 1] | 0;
  if ((i4 & 2 | 0) == 0) {
   HEAP16[i3 >> 1] = i4 | 2;
   HEAPF32[i2 + 144 >> 2] = 0.0;
  }
  i2 = HEAP32[i2 + 96 >> 2] | 0;
 } while ((i2 | 0) != 0);
 STACKTOP = i1;
 return;
}
function __ZN16b2BlockAllocator4FreeEPvi(i3, i1, i4) {
 i3 = i3 | 0;
 i1 = i1 | 0;
 i4 = i4 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i4 | 0) == 0) {
  STACKTOP = i2;
  return;
 }
 if ((i4 | 0) <= 0) {
  ___assert_fail(1376, 1312, 164, 1488);
 }
 if ((i4 | 0) > 640) {
  __Z6b2FreePv(i1);
  STACKTOP = i2;
  return;
 }
 i4 = HEAP8[632 + i4 | 0] | 0;
 if (!((i4 & 255) < 14)) {
  ___assert_fail(1408, 1312, 173, 1488);
 }
 i4 = i3 + ((i4 & 255) << 2) + 12 | 0;
 HEAP32[i1 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i4 >> 2] = i1;
 STACKTOP = i2;
 return;
}
function __ZN15b2ContactFilter13ShouldCollideEP9b2FixtureS1_(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i4 = 0;
 i3 = STACKTOP;
 i4 = HEAP16[i2 + 36 >> 1] | 0;
 if (!(i4 << 16 >> 16 != (HEAP16[i1 + 36 >> 1] | 0) | i4 << 16 >> 16 == 0)) {
  i4 = i4 << 16 >> 16 > 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 if ((HEAP16[i1 + 32 >> 1] & HEAP16[i2 + 34 >> 1]) << 16 >> 16 == 0) {
  i4 = 0;
  STACKTOP = i3;
  return i4 | 0;
 }
 i4 = (HEAP16[i1 + 34 >> 1] & HEAP16[i2 + 32 >> 1]) << 16 >> 16 != 0;
 STACKTOP = i3;
 return i4 | 0;
}
function _memset(i1, i4, i3) {
 i1 = i1 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 var i2 = 0, i5 = 0, i6 = 0, i7 = 0;
 i2 = i1 + i3 | 0;
 if ((i3 | 0) >= 20) {
  i4 = i4 & 255;
  i7 = i1 & 3;
  i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24;
  i5 = i2 & ~3;
  if (i7) {
   i7 = i1 + 4 - i7 | 0;
   while ((i1 | 0) < (i7 | 0)) {
    HEAP8[i1] = i4;
    i1 = i1 + 1 | 0;
   }
  }
  while ((i1 | 0) < (i5 | 0)) {
   HEAP32[i1 >> 2] = i6;
   i1 = i1 + 4 | 0;
  }
 }
 while ((i1 | 0) < (i2 | 0)) {
  HEAP8[i1] = i4;
  i1 = i1 + 1 | 0;
 }
 return i1 - i3 | 0;
}
function __ZN6b2Body13CreateFixtureEPK7b2Shapef(i1, i3, d2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 d2 = +d2;
 var i4 = 0, i5 = 0;
 i4 = STACKTOP;
 STACKTOP = STACKTOP + 32 | 0;
 i5 = i4;
 HEAP16[i5 + 22 >> 1] = 1;
 HEAP16[i5 + 24 >> 1] = -1;
 HEAP16[i5 + 26 >> 1] = 0;
 HEAP32[i5 + 4 >> 2] = 0;
 HEAPF32[i5 + 8 >> 2] = .20000000298023224;
 HEAPF32[i5 + 12 >> 2] = 0.0;
 HEAP8[i5 + 20 | 0] = 0;
 HEAP32[i5 >> 2] = i3;
 HEAPF32[i5 + 16 >> 2] = d2;
 i3 = __ZN6b2Body13CreateFixtureEPK12b2FixtureDef(i1, i5) | 0;
 STACKTOP = i4;
 return i3 | 0;
}
function __Znwj(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0;
 i1 = STACKTOP;
 i2 = (i2 | 0) == 0 ? 1 : i2;
 while (1) {
  i3 = _malloc(i2) | 0;
  if ((i3 | 0) != 0) {
   i2 = 6;
   break;
  }
  i3 = HEAP32[1914] | 0;
  HEAP32[1914] = i3 + 0;
  if ((i3 | 0) == 0) {
   i2 = 5;
   break;
  }
  FUNCTION_TABLE_v[i3 & 3]();
 }
 if ((i2 | 0) == 5) {
  i3 = ___cxa_allocate_exception(4) | 0;
  HEAP32[i3 >> 2] = 7672;
  ___cxa_throw(i3 | 0, 7720, 30);
 } else if ((i2 | 0) == 6) {
  STACKTOP = i1;
  return i3 | 0;
 }
 return 0;
}
function __ZN8b2IslandD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 20 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 24 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 16 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 12 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i1 >> 2] | 0, HEAP32[i1 + 8 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function __ZN16b2BlockAllocatorD2Ev(i2) {
 i2 = i2 | 0;
 var i1 = 0, i3 = 0, i4 = 0, i5 = 0;
 i1 = STACKTOP;
 i3 = i2 + 4 | 0;
 i4 = HEAP32[i2 >> 2] | 0;
 if ((HEAP32[i3 >> 2] | 0) > 0) {
  i5 = 0;
 } else {
  i5 = i4;
  __Z6b2FreePv(i5);
  STACKTOP = i1;
  return;
 }
 do {
  __Z6b2FreePv(HEAP32[i4 + (i5 << 3) + 4 >> 2] | 0);
  i5 = i5 + 1 | 0;
  i4 = HEAP32[i2 >> 2] | 0;
 } while ((i5 | 0) < (HEAP32[i3 >> 2] | 0));
 __Z6b2FreePv(i4);
 STACKTOP = i1;
 return;
}
function copyTempDouble(i1) {
 i1 = i1 | 0;
 HEAP8[tempDoublePtr] = HEAP8[i1];
 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
 HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0];
 HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0];
 HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0];
 HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0];
}
function __ZNK11b2EdgeShape11ComputeMassEP10b2MassDataf(i2, i1, d3) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 d3 = +d3;
 var i4 = 0, d5 = 0.0;
 i4 = STACKTOP;
 HEAPF32[i1 >> 2] = 0.0;
 d5 = +((+HEAPF32[i2 + 12 >> 2] + +HEAPF32[i2 + 20 >> 2]) * .5);
 d3 = +((+HEAPF32[i2 + 16 >> 2] + +HEAPF32[i2 + 24 >> 2]) * .5);
 i2 = i1 + 4 | 0;
 HEAPF32[i2 >> 2] = d5;
 HEAPF32[i2 + 4 >> 2] = d3;
 HEAPF32[i1 + 12 >> 2] = 0.0;
 STACKTOP = i4;
 return;
}
function __ZN11b2EdgeShape3SetERK6b2Vec2S2_(i1, i3, i2) {
 i1 = i1 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 var i4 = 0, i5 = 0;
 i5 = i3;
 i3 = HEAP32[i5 + 4 >> 2] | 0;
 i4 = i1 + 12 | 0;
 HEAP32[i4 >> 2] = HEAP32[i5 >> 2];
 HEAP32[i4 + 4 >> 2] = i3;
 i4 = i2;
 i2 = HEAP32[i4 + 4 >> 2] | 0;
 i3 = i1 + 20 | 0;
 HEAP32[i3 >> 2] = HEAP32[i4 >> 2];
 HEAP32[i3 + 4 >> 2] = i2;
 HEAP8[i1 + 44 | 0] = 0;
 HEAP8[i1 + 45 | 0] = 0;
 return;
}
function __ZN25b2PolygonAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z25b2CollidePolygonAndCircleP10b2ManifoldPK14b2PolygonShapeRK11b2TransformPK13b2CircleShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN22b2EdgeAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z22b2CollideEdgeAndCircleP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK13b2CircleShapeS6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __Z23b2CollideEdgeAndPolygonP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS6_(i5, i4, i3, i2, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 var i6 = 0;
 i6 = STACKTOP;
 STACKTOP = STACKTOP + 256 | 0;
 __ZN12b2EPCollider7CollideEP10b2ManifoldPK11b2EdgeShapeRK11b2TransformPK14b2PolygonShapeS7_(i6, i5, i4, i3, i2, i1);
 STACKTOP = i6;
 return;
}
function __ZN16b2PolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z17b2CollidePolygonsP10b2ManifoldPK14b2PolygonShapeRK11b2TransformS3_S6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __ZN15b2CircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(i2, i4, i3, i1) {
 i2 = i2 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i1 = i1 | 0;
 var i5 = 0;
 i5 = STACKTOP;
 __Z16b2CollideCirclesP10b2ManifoldPK13b2CircleShapeRK11b2TransformS3_S6_(i4, HEAP32[(HEAP32[i2 + 48 >> 2] | 0) + 12 >> 2] | 0, i3, HEAP32[(HEAP32[i2 + 52 >> 2] | 0) + 12 >> 2] | 0, i1);
 STACKTOP = i5;
 return;
}
function __Z14b2PairLessThanRK6b2PairS1_(i2, i5) {
 i2 = i2 | 0;
 i5 = i5 | 0;
 var i1 = 0, i3 = 0, i4 = 0;
 i1 = STACKTOP;
 i4 = HEAP32[i2 >> 2] | 0;
 i3 = HEAP32[i5 >> 2] | 0;
 if ((i4 | 0) >= (i3 | 0)) {
  if ((i4 | 0) == (i3 | 0)) {
   i2 = (HEAP32[i2 + 4 >> 2] | 0) < (HEAP32[i5 + 4 >> 2] | 0);
  } else {
   i2 = 0;
  }
 } else {
  i2 = 1;
 }
 STACKTOP = i1;
 return i2 | 0;
}
function __ZN9b2FixtureC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 HEAP16[i1 + 32 >> 1] = 1;
 HEAP16[i1 + 34 >> 1] = -1;
 HEAP16[i1 + 36 >> 1] = 0;
 HEAP32[i1 + 40 >> 2] = 0;
 HEAP32[i1 + 24 >> 2] = 0;
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 0 >> 2] = 0;
 HEAP32[i1 + 4 >> 2] = 0;
 HEAP32[i1 + 8 >> 2] = 0;
 HEAP32[i1 + 12 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN12b2BroadPhaseC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN13b2DynamicTreeC2Ev(i1);
 HEAP32[i1 + 28 >> 2] = 0;
 HEAP32[i1 + 48 >> 2] = 16;
 HEAP32[i1 + 52 >> 2] = 0;
 HEAP32[i1 + 44 >> 2] = __Z7b2Alloci(192) | 0;
 HEAP32[i1 + 36 >> 2] = 16;
 HEAP32[i1 + 40 >> 2] = 0;
 HEAP32[i1 + 32 >> 2] = __Z7b2Alloci(64) | 0;
 STACKTOP = i2;
 return;
}
function __ZN16b2StackAllocatorD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((HEAP32[i1 + 102400 >> 2] | 0) != 0) {
  ___assert_fail(3792, 3808, 32, 3848);
 }
 if ((HEAP32[i1 + 102796 >> 2] | 0) == 0) {
  STACKTOP = i2;
  return;
 } else {
  ___assert_fail(3872, 3808, 33, 3848);
 }
}
function __ZN15b2ContactSolverD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0, i3 = 0;
 i2 = STACKTOP;
 i3 = i1 + 32 | 0;
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i3 >> 2] | 0, HEAP32[i1 + 40 >> 2] | 0);
 __ZN16b2StackAllocator4FreeEPv(HEAP32[i3 >> 2] | 0, HEAP32[i1 + 36 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function __ZN25b2PolygonAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN24b2ChainAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN23b2EdgeAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN23b2ChainAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN22b2EdgeAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN16b2ContactManagerC2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN12b2BroadPhaseC2Ev(i1);
 HEAP32[i1 + 60 >> 2] = 0;
 HEAP32[i1 + 64 >> 2] = 0;
 HEAP32[i1 + 68 >> 2] = 1888;
 HEAP32[i1 + 72 >> 2] = 1896;
 HEAP32[i1 + 76 >> 2] = 0;
 STACKTOP = i2;
 return;
}
function __ZN16b2PolygonContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function __ZN15b2CircleContact7DestroyEP9b2ContactP16b2BlockAllocator(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 var i3 = 0;
 i3 = STACKTOP;
 FUNCTION_TABLE_vi[HEAP32[(HEAP32[i1 >> 2] | 0) + 4 >> 2] & 31](i1);
 __ZN16b2BlockAllocator4FreeEPvi(i2, i1, 144);
 STACKTOP = i3;
 return;
}
function dynCall_viiiiii(i7, i6, i5, i4, i3, i2, i1) {
 i7 = i7 | 0;
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiiiii[i7 & 3](i6 | 0, i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function copyTempFloat(i1) {
 i1 = i1 | 0;
 HEAP8[tempDoublePtr] = HEAP8[i1];
 HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0];
 HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0];
 HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0];
}
function dynCall_iiiiii(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiiiii[i6 & 15](i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0) | 0;
}
function dynCall_viiiii(i6, i5, i4, i3, i2, i1) {
 i6 = i6 | 0;
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiiii[i6 & 3](i5 | 0, i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function __ZN16b2ContactManager15FindNewContactsEv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZN12b2BroadPhase11UpdatePairsI16b2ContactManagerEEvPT_(i1, i1);
 STACKTOP = i2;
 return;
}
function __ZN16b2StackAllocatorC2Ev(i1) {
 i1 = i1 | 0;
 HEAP32[i1 + 102400 >> 2] = 0;
 HEAP32[i1 + 102404 >> 2] = 0;
 HEAP32[i1 + 102408 >> 2] = 0;
 HEAP32[i1 + 102796 >> 2] = 0;
 return;
}
function dynCall_viiii(i5, i4, i3, i2, i1) {
 i5 = i5 | 0;
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viiii[i5 & 15](i4 | 0, i3 | 0, i2 | 0, i1 | 0);
}
function dynCall_iiii(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iiii[i4 & 7](i3 | 0, i2 | 0, i1 | 0) | 0;
}
function dynCall_viii(i4, i3, i2, i1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_viii[i4 & 3](i3 | 0, i2 | 0, i1 | 0);
}
function __ZNSt9bad_allocD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZNSt9exceptionD2Ev(i1 | 0);
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function stackAlloc(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 STACKTOP = STACKTOP + i1 | 0;
 STACKTOP = STACKTOP + 7 & -8;
 return i2 | 0;
}
function __ZN13b2DynamicTreeD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __Z6b2FreePv(HEAP32[i1 + 4 >> 2] | 0);
 STACKTOP = i2;
 return;
}
function dynCall_viid(i4, i3, i2, d1) {
 i4 = i4 | 0;
 i3 = i3 | 0;
 i2 = i2 | 0;
 d1 = +d1;
 FUNCTION_TABLE_viid[i4 & 3](i3 | 0, i2 | 0, +d1);
}
function __ZN17b2ContactListener9PostSolveEP9b2ContactPK16b2ContactImpulse(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return;
}
function __ZN10__cxxabiv120__si_class_type_infoD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN10__cxxabiv117__class_type_infoD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZNSt9bad_allocD2Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZNSt9exceptionD2Ev(i1 | 0);
 STACKTOP = i2;
 return;
}
function dynCall_iii(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_iii[i3 & 3](i2 | 0, i1 | 0) | 0;
}
function b8(i1, i2, i3, i4, i5, i6) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 i6 = i6 | 0;
 abort(8);
}
function __ZN25b2PolygonAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN17b2ContactListener8PreSolveEP9b2ContactPK10b2Manifold(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return;
}
function __ZN24b2ChainAndPolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN23b2EdgeAndPolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN23b2ChainAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZNK11b2EdgeShape9TestPointERK11b2TransformRK6b2Vec2(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 return 0;
}
function __ZN22b2EdgeAndCircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZdlPv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 if ((i1 | 0) != 0) {
  _free(i1);
 }
 STACKTOP = i2;
 return;
}
function b10(i1, i2, i3, i4, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 abort(10);
 return 0;
}
function _strlen(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = i1;
 while (HEAP8[i2] | 0) {
  i2 = i2 + 1 | 0;
 }
 return i2 - i1 | 0;
}
function __Z7b2Alloci(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = _malloc(i1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function setThrew(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 if ((__THREW__ | 0) == 0) {
  __THREW__ = i1;
  threwValue = i2;
 }
}
function __ZN17b2ContactListenerD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN16b2PolygonContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function dynCall_vii(i3, i2, i1) {
 i3 = i3 | 0;
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_vii[i3 & 15](i2 | 0, i1 | 0);
}
function __ZN15b2ContactFilterD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN15b2CircleContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN14b2PolygonShapeD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __Znaj(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 i1 = __Znwj(i1) | 0;
 STACKTOP = i2;
 return i1 | 0;
}
function __ZN11b2EdgeShapeD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function __ZN9b2ContactD0Ev(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 __ZdlPv(i1);
 STACKTOP = i2;
 return;
}
function b1(i1, i2, i3, i4, i5) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 i5 = i5 | 0;
 abort(1);
}
function __Z6b2FreePv(i1) {
 i1 = i1 | 0;
 var i2 = 0;
 i2 = STACKTOP;
 _free(i1);
 STACKTOP = i2;
 return;
}
function ___clang_call_terminate(i1) {
 i1 = i1 | 0;
 ___cxa_begin_catch(i1 | 0) | 0;
 __ZSt9terminatev();
}
function __ZN17b2ContactListener12BeginContactEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 return;
}
function dynCall_ii(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 return FUNCTION_TABLE_ii[i2 & 3](i1 | 0) | 0;
}
function __ZN17b2ContactListener10EndContactEP9b2Contact(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 return;
}
function b11(i1, i2, i3, i4) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 i4 = i4 | 0;
 abort(11);
}
function dynCall_vi(i2, i1) {
 i2 = i2 | 0;
 i1 = i1 | 0;
 FUNCTION_TABLE_vi[i2 & 31](i1 | 0);
}
function b0(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 abort(0);
 return 0;
}
function __ZNK10__cxxabiv116__shim_type_info5noop2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZNK10__cxxabiv116__shim_type_info5noop1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b5(i1, i2, i3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 i3 = i3 | 0;
 abort(5);
}
function __ZNK14b2PolygonShape13GetChildCountEv(i1) {
 i1 = i1 | 0;
 return 1;
}
function __ZN10__cxxabiv116__shim_type_infoD2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b7(i1, i2, d3) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 d3 = +d3;
 abort(7);
}
function __ZNK11b2EdgeShape13GetChildCountEv(i1) {
 i1 = i1 | 0;
 return 1;
}
function __ZNK7b2Timer15GetMillisecondsEv(i1) {
 i1 = i1 | 0;
 return 0.0;
}
function __ZN25b2PolygonAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN24b2ChainAndPolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b9(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(9);
 return 0;
}
function __ZN23b2EdgeAndPolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN23b2ChainAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN22b2EdgeAndCircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function dynCall_v(i1) {
 i1 = i1 | 0;
 FUNCTION_TABLE_v[i1 & 3]();
}
function __ZNKSt9bad_alloc4whatEv(i1) {
 i1 = i1 | 0;
 return 7688;
}
function ___cxa_pure_virtual__wrapper() {
 ___cxa_pure_virtual();
}
function __ZN17b2ContactListenerD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN16b2PolygonContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN15b2ContactFilterD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN15b2CircleContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN14b2PolygonShapeD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b3(i1, i2) {
 i1 = i1 | 0;
 i2 = i2 | 0;
 abort(3);
}
function runPostSets() {
 HEAP32[1932] = __ZTISt9exception;
}
function __ZN11b2EdgeShapeD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZNSt9type_infoD2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN7b2Timer5ResetEv(i1) {
 i1 = i1 | 0;
 return;
}
function stackRestore(i1) {
 i1 = i1 | 0;
 STACKTOP = i1;
}
function setTempRet9(i1) {
 i1 = i1 | 0;
 tempRet9 = i1;
}
function setTempRet8(i1) {
 i1 = i1 | 0;
 tempRet8 = i1;
}
function setTempRet7(i1) {
 i1 = i1 | 0;
 tempRet7 = i1;
}
function setTempRet6(i1) {
 i1 = i1 | 0;
 tempRet6 = i1;
}
function setTempRet5(i1) {
 i1 = i1 | 0;
 tempRet5 = i1;
}
function setTempRet4(i1) {
 i1 = i1 | 0;
 tempRet4 = i1;
}
function setTempRet3(i1) {
 i1 = i1 | 0;
 tempRet3 = i1;
}
function setTempRet2(i1) {
 i1 = i1 | 0;
 tempRet2 = i1;
}
function setTempRet1(i1) {
 i1 = i1 | 0;
 tempRet1 = i1;
}
function setTempRet0(i1) {
 i1 = i1 | 0;
 tempRet0 = i1;
}
function __ZN9b2ContactD1Ev(i1) {
 i1 = i1 | 0;
 return;
}
function __ZN7b2TimerC2Ev(i1) {
 i1 = i1 | 0;
 return;
}
function b4(i1) {
 i1 = i1 | 0;
 abort(4);
 return 0;
}
function stackSave() {
 return STACKTOP | 0;
}
function b2(i1) {
 i1 = i1 | 0;
 abort(2);
}
function b6() {
 abort(6);
}

// EMSCRIPTEN_END_FUNCS
  var FUNCTION_TABLE_iiii = [b0,__ZNK11b2EdgeShape9TestPointERK11b2TransformRK6b2Vec2,__ZNK14b2PolygonShape9TestPointERK11b2TransformRK6b2Vec2,__ZN15b2ContactFilter13ShouldCollideEP9b2FixtureS1_,__ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv,b0,b0,b0];
  var FUNCTION_TABLE_viiiii = [b1,__ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,__ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,b1];
  var FUNCTION_TABLE_vi = [b2,__ZN11b2EdgeShapeD1Ev,__ZN11b2EdgeShapeD0Ev,__ZN14b2PolygonShapeD1Ev,__ZN14b2PolygonShapeD0Ev,__ZN17b2ContactListenerD1Ev,__ZN17b2ContactListenerD0Ev,__ZN15b2ContactFilterD1Ev,__ZN15b2ContactFilterD0Ev,__ZN9b2ContactD1Ev,__ZN9b2ContactD0Ev,__ZN22b2EdgeAndCircleContactD1Ev,__ZN22b2EdgeAndCircleContactD0Ev,__ZN23b2EdgeAndPolygonContactD1Ev,__ZN23b2EdgeAndPolygonContactD0Ev,__ZN25b2PolygonAndCircleContactD1Ev,__ZN25b2PolygonAndCircleContactD0Ev,__ZN16b2PolygonContactD1Ev,__ZN16b2PolygonContactD0Ev,__ZN23b2ChainAndCircleContactD1Ev,__ZN23b2ChainAndCircleContactD0Ev,__ZN24b2ChainAndPolygonContactD1Ev,__ZN24b2ChainAndPolygonContactD0Ev,__ZN15b2CircleContactD1Ev,__ZN15b2CircleContactD0Ev,__ZN10__cxxabiv116__shim_type_infoD2Ev,__ZN10__cxxabiv117__class_type_infoD0Ev,__ZNK10__cxxabiv116__shim_type_info5noop1Ev,__ZNK10__cxxabiv116__shim_type_info5noop2Ev
  ,__ZN10__cxxabiv120__si_class_type_infoD0Ev,__ZNSt9bad_allocD2Ev,__ZNSt9bad_allocD0Ev];
  var FUNCTION_TABLE_vii = [b3,__ZN17b2ContactListener12BeginContactEP9b2Contact,__ZN17b2ContactListener10EndContactEP9b2Contact,__ZN15b2CircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN25b2PolygonAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN16b2PolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN22b2EdgeAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN23b2EdgeAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN23b2ChainAndCircleContact7DestroyEP9b2ContactP16b2BlockAllocator,__ZN24b2ChainAndPolygonContact7DestroyEP9b2ContactP16b2BlockAllocator,b3,b3,b3,b3,b3,b3];
  var FUNCTION_TABLE_ii = [b4,__ZNK11b2EdgeShape13GetChildCountEv,__ZNK14b2PolygonShape13GetChildCountEv,__ZNKSt9bad_alloc4whatEv];
  var FUNCTION_TABLE_viii = [b5,__ZN17b2ContactListener8PreSolveEP9b2ContactPK10b2Manifold,__ZN17b2ContactListener9PostSolveEP9b2ContactPK16b2ContactImpulse,b5];
  var FUNCTION_TABLE_v = [b6,___cxa_pure_virtual__wrapper,__Z4iterv,b6];
  var FUNCTION_TABLE_viid = [b7,__ZNK11b2EdgeShape11ComputeMassEP10b2MassDataf,__ZNK14b2PolygonShape11ComputeMassEP10b2MassDataf,b7];
  var FUNCTION_TABLE_viiiiii = [b8,__ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,__ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,b8];
  var FUNCTION_TABLE_iii = [b9,__ZNK11b2EdgeShape5CloneEP16b2BlockAllocator,__ZNK14b2PolygonShape5CloneEP16b2BlockAllocator,__Z14b2PairLessThanRK6b2PairS1_];
  var FUNCTION_TABLE_iiiiii = [b10,__ZNK11b2EdgeShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi,__ZNK14b2PolygonShape7RayCastEP15b2RayCastOutputRK14b2RayCastInputRK11b2Transformi,__ZN15b2CircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN25b2PolygonAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN16b2PolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN22b2EdgeAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN23b2EdgeAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN23b2ChainAndCircleContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,__ZN24b2ChainAndPolygonContact6CreateEP9b2FixtureiS1_iP16b2BlockAllocator,b10,b10,b10,b10,b10,b10];
  var FUNCTION_TABLE_viiii = [b11,__ZNK11b2EdgeShape11ComputeAABBEP6b2AABBRK11b2Transformi,__ZNK14b2PolygonShape11ComputeAABBEP6b2AABBRK11b2Transformi,__ZN22b2EdgeAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN25b2PolygonAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN16b2PolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN23b2ChainAndCircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN24b2ChainAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZN15b2CircleContact8EvaluateEP10b2ManifoldRK11b2TransformS4_,__ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,__ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,b11,b11,b11,b11];

  return { _strlen: _strlen, _free: _free, _main: _main, _memset: _memset, _malloc: _malloc, _memcpy: _memcpy, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, setThrew: setThrew, setTempRet0: setTempRet0, setTempRet1: setTempRet1, setTempRet2: setTempRet2, setTempRet3: setTempRet3, setTempRet4: setTempRet4, setTempRet5: setTempRet5, setTempRet6: setTempRet6, setTempRet7: setTempRet7, setTempRet8: setTempRet8, setTempRet9: setTempRet9, dynCall_iiii: dynCall_iiii, dynCall_viiiii: dynCall_viiiii, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_ii: dynCall_ii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_viid: dynCall_viid, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_iiiiii: dynCall_iiiiii, dynCall_viiii: dynCall_viiii };
})
// EMSCRIPTEN_END_ASM
({ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array }, { "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "min": Math_min, "invoke_iiii": invoke_iiii, "invoke_viiiii": invoke_viiiii, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_viid": invoke_viid, "invoke_viiiiii": invoke_viiiiii, "invoke_iii": invoke_iii, "invoke_iiiiii": invoke_iiiiii, "invoke_viiii": invoke_viiii, "___cxa_throw": ___cxa_throw, "_emscripten_run_script": _emscripten_run_script, "_cosf": _cosf, "_send": _send, "__ZSt9terminatev": __ZSt9terminatev, "__reallyNegative": __reallyNegative, "___cxa_is_number_type": ___cxa_is_number_type, "___assert_fail": ___assert_fail, "___cxa_allocate_exception": ___cxa_allocate_exception, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_fflush": _fflush, "_pwrite": _pwrite, "___setErrNo": ___setErrNo, "_sbrk": _sbrk, "___cxa_begin_catch": ___cxa_begin_catch, "_sinf": _sinf, "_fileno": _fileno, "___resumeException": ___resumeException, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_sysconf": _sysconf, "_clock": _clock, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_puts": _puts, "_mkport": _mkport, "_floorf": _floorf, "_sqrtf": _sqrtf, "_write": _write, "_emscripten_set_main_loop": _emscripten_set_main_loop, "___errno_location": ___errno_location, "__ZNSt9exceptionD2Ev": __ZNSt9exceptionD2Ev, "_printf": _printf, "___cxa_does_inherit": ___cxa_does_inherit, "__exit": __exit, "_fputc": _fputc, "_abort": _abort, "_fwrite": _fwrite, "_time": _time, "_fprintf": _fprintf, "_emscripten_cancel_main_loop": _emscripten_cancel_main_loop, "__formatString": __formatString, "_fputs": _fputs, "_exit": _exit, "___cxa_pure_virtual": ___cxa_pure_virtual, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "__ZTISt9exception": __ZTISt9exception }, buffer);
assertTrue(%IsAsmWasmCode(ModuleFunc));
var _strlen = Module["_strlen"] = asm["_strlen"];
var _free = Module["_free"] = asm["_free"];
var _main = Module["_main"] = asm["_main"];
var _memset = Module["_memset"] = asm["_memset"];
var _malloc = Module["_malloc"] = asm["_malloc"];
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
var runPostSets = Module["runPostSets"] = asm["runPostSets"];
var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"];
var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
var dynCall_viid = Module["dynCall_viid"] = asm["dynCall_viid"];
var dynCall_viiiiii = Module["dynCall_viiiiii"] = asm["dynCall_viiiiii"];
var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
var dynCall_iiiiii = Module["dynCall_iiiiii"] = asm["dynCall_iiiiii"];
var dynCall_viiii = Module["dynCall_viiii"] = asm["dynCall_viiii"];

Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) };
Runtime.stackSave = function() { return asm['stackSave']() };
Runtime.stackRestore = function(top) { asm['stackRestore'](top) };


// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included
var i64Math = null;

// === Auto-generated postamble setup entry stuff ===

if (memoryInitializer) {
  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
    var data = Module['readBinary'](memoryInitializer);
    HEAPU8.set(data, STATIC_BASE);
  } else {
    addRunDependency('memory initializer');
    Browser.asyncLoad(memoryInitializer, function(data) {
      HEAPU8.set(data, STATIC_BASE);
      removeRunDependency('memory initializer');
    }, function(data) {
      throw 'could not load memory initializer ' + memoryInitializer;
    });
  }
}

function ExitStatus(status) {
  this.name = "ExitStatus";
  this.message = "Program terminated with exit(" + status + ")";
  this.status = status;
};
ExitStatus.prototype = new Error();
ExitStatus.prototype.constructor = ExitStatus;

var initialStackTop;
var preloadStartTime = null;
var calledMain = false;

dependenciesFulfilled = function runCaller() {
  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
  if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"]));
  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
}

Module['callMain'] = Module.callMain = function callMain(args) {
  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');

  args = args || [];

  ensureInitRuntime();

  var argc = args.length+1;
  function pad() {
    for (var i = 0; i < 4-1; i++) {
      argv.push(0);
    }
  }
  var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ];
  pad();
  for (var i = 0; i < argc-1; i = i + 1) {
    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));
    pad();
  }
  argv.push(0);
  argv = allocate(argv, 'i32', ALLOC_NORMAL);

  initialStackTop = STACKTOP;

  try {

    var ret = Module['_main'](argc, argv, 0);


    // if we're not running an evented main loop, it's time to exit
    if (!Module['noExitRuntime']) {
      exit(ret);
    }
  }
  catch(e) {
    if (e instanceof ExitStatus) {
      // exit() throws this once it's done to make sure execution
      // has been stopped completely
      return;
    } else if (e == 'SimulateInfiniteLoop') {
      // running an evented main loop, don't immediately exit
      Module['noExitRuntime'] = true;
      return;
    } else {
      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);
      throw e;
    }
  } finally {
    calledMain = true;
  }
}




function run(args) {
  args = args || Module['arguments'];

  if (preloadStartTime === null) preloadStartTime = Date.now();

  if (runDependencies > 0) {
    Module.printErr('run() called, but dependencies remain, so not running');
    return;
  }

  preRun();

  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame

  function doRun() {
    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
    Module['calledRun'] = true;

    ensureInitRuntime();

    preMain();

    if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {
      Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms');
    }

    if (Module['_main'] && shouldRunNow) {
      Module['callMain'](args);
    }

    postRun();
  }

  if (Module['setStatus']) {
    Module['setStatus']('Running...');
    setTimeout(function() {
      setTimeout(function() {
        Module['setStatus']('');
      }, 1);
      if (!ABORT) doRun();
    }, 1);
  } else {
    doRun();
  }
}
Module['run'] = Module.run = run;

function exit(status) {
  ABORT = true;
  EXITSTATUS = status;
  STACKTOP = initialStackTop;

  // exit the runtime
  exitRuntime();

  // TODO We should handle this differently based on environment.
  // In the browser, the best we can do is throw an exception
  // to halt execution, but in node we could process.exit and
  // I'd imagine SM shell would have something equivalent.
  // This would let us set a proper exit status (which
  // would be great for checking test exit statuses).
  // https://github.com/kripken/emscripten/issues/1371

  // throw an exception to halt the current execution
  throw new ExitStatus(status);
}
Module['exit'] = Module.exit = exit;

function abort(text) {
  if (text) {
    Module.print(text);
    Module.printErr(text);
  }

  ABORT = true;
  EXITSTATUS = 1;

  var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';

  throw 'abort() at ' + stackTrace() + extra;
}
Module['abort'] = Module.abort = abort;

// {{PRE_RUN_ADDITIONS}}

if (Module['preInit']) {
  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
  while (Module['preInit'].length > 0) {
    Module['preInit'].pop()();
  }
}

// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;
if (Module['noInitialRun']) {
  shouldRunNow = false;
}


run([].concat(Module["arguments"]));
