mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4659 lines
3.4 MiB
4659 lines
3.4 MiB
12 years ago
|
// Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley
|
||
|
//
|
||
|
// Permission to use, copy, and distribute this software and its
|
||
|
// documentation for any purpose with or without fee is hereby granted,
|
||
|
// provided that the above copyright notice appear in all copies and
|
||
|
// that both that copyright notice and this permission notice appear
|
||
|
// in supporting documentation.
|
||
|
//
|
||
|
// Permission to modify the software is granted, but not the right to
|
||
|
// distribute the complete modified source code. Modifications are to
|
||
|
// be distributed as patches to the released version. Permission to
|
||
|
// distribute binaries produced by compiling modified sources is granted,
|
||
|
// provided you
|
||
|
// 1. distribute the corresponding source modifications from the
|
||
|
// released version in the form of a patch file along with the binaries,
|
||
|
// 2. add special version identification to distinguish your version
|
||
|
// in addition to the base release version number,
|
||
|
// 3. provide your name and address as the primary contact for the
|
||
|
// support of your modified version, and
|
||
|
// 4. retain our contact information in regard to use of the base
|
||
|
// software.
|
||
|
// Permission to distribute the released version of the source code along
|
||
|
// with corresponding source modifications in the form of a patch file is
|
||
|
// granted with same provisions 2 through 4 for binary distributions.
|
||
|
//
|
||
|
// This software is provided "as is" without express or implied warranty
|
||
|
// to the extent permitted by applicable law.
|
||
|
|
||
|
// This Javascript port of gnuplot 4.6.3 [1] has been generated using
|
||
|
// Emscripten [2]. This port has been made possible by Christian Huettig [3],
|
||
|
// whose changes to gnuplot's source files can be found below [4] in
|
||
|
// accordance to gnuplot's copyright.
|
||
|
//
|
||
|
// [1] http://www.gnuplot.info/
|
||
|
// [2] https://github.com/kripken/emscripten/
|
||
|
// [3] https://github.com/chhu/gnuplot-JS
|
||
|
// [4] Patch to gnuplot 4.6.3
|
||
|
// --- gnuplot-4.6.3/src/axis.c 2012-11-08 18:13:08.000000000 +0100
|
||
|
// +++ gnuplot-4.6.3_mod/src/axis.c 2013-05-11 11:08:08.791587160 +0200
|
||
|
// @@ -467,8 +467,9 @@ copy_or_invent_formatstring(AXIS_INDEX a
|
||
|
// int precision = (ceil(-log10(fabs(axmax-axmin))));
|
||
|
// if ((axmin*axmax > 0) && precision > 4)
|
||
|
// sprintf(ticfmt[axis],"%%.%df", (precision>14) ? 14 : precision);
|
||
|
// + else
|
||
|
// + strcpy(ticfmt[axis], "%g");
|
||
|
// }
|
||
|
// -
|
||
|
// return ticfmt[axis];
|
||
|
// }
|
||
|
|
||
|
var Module = {
|
||
|
'noInitialRun': true,
|
||
|
print: function(text) {
|
||
|
self.postMessage({'transaction': -1, 'content': text});
|
||
|
},
|
||
|
printErr: function(text) {
|
||
|
self.postMessage({'transaction': -2, 'content': text});
|
||
|
},
|
||
|
};
|
||
|
function gnuplot_create() {
|
||
|
// Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code
|
||
|
// Note: Some Emscripten settings may limit the speed of the generated code.
|
||
|
try {
|
||
|
this['Module'] = Module;
|
||
|
Module.test;
|
||
|
} catch(e) {
|
||
|
this['Module'] = Module = {};
|
||
|
}
|
||
|
// 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 (typeof module === "object") {
|
||
|
module.exports = Module;
|
||
|
}
|
||
|
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
|
||
|
Module['print'] = function(x) {
|
||
|
process['stdout'].write(x + '\n');
|
||
|
};
|
||
|
Module['printErr'] = function(x) {
|
||
|
process['stderr'].write(x + '\n');
|
||
|
};
|
||
|
var nodeFS = require('fs');
|
||
|
var nodePath = require('path');
|
||
|
Module['read'] = function(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(filename) { return Module['read'](filename, true) };
|
||
|
Module['load'] = function(f) {
|
||
|
globalEval(read(f));
|
||
|
};
|
||
|
if (!Module['arguments']) {
|
||
|
Module['arguments'] = process['argv'].slice(2);
|
||
|
}
|
||
|
}
|
||
|
if (ENVIRONMENT_IS_SHELL) {
|
||
|
Module['print'] = print;
|
||
|
if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
|
||
|
Module['read'] = read;
|
||
|
Module['readBinary'] = function(f) {
|
||
|
return read(f, 'binary');
|
||
|
};
|
||
|
if (!Module['arguments']) {
|
||
|
if (typeof scriptArgs != 'undefined') {
|
||
|
Module['arguments'] = scriptArgs;
|
||
|
} else if (typeof arguments != 'undefined') {
|
||
|
Module['arguments'] = arguments;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER) {
|
||
|
if (!Module['print']) {
|
||
|
Module['print'] = function(x) {
|
||
|
console.log(x);
|
||
|
};
|
||
|
}
|
||
|
if (!Module['printErr']) {
|
||
|
Module['printErr'] = function(x) {
|
||
|
console.log(x);
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
|
||
|
Module['read'] = function(url) {
|
||
|
var xhr = new XMLHttpRequest();
|
||
|
xhr.open('GET', url, false);
|
||
|
xhr.send(null);
|
||
|
return xhr.responseText;
|
||
|
};
|
||
|
if (!Module['arguments']) {
|
||
|
if (typeof arguments != 'undefined') {
|
||
|
Module['arguments'] = arguments;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (ENVIRONMENT_IS_WORKER) {
|
||
|
// 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
|
||
|
}));
|
||
|
}
|
||
|
Module['load'] = importScripts;
|
||
|
}
|
||
|
if (!ENVIRONMENT_IS_WORKER && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_SHELL) {
|
||
|
// 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(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
|
||
|
if (!Module['preRun']) Module['preRun'] = [];
|
||
|
if (!Module['postRun']) Module['postRun'] = [];
|
||
|
// === 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)) {
|
||
|
var logg = log2(quantum);
|
||
|
return '((((' +target + ')+' + (quantum-1) + ')>>' + logg + ')<<' + logg + ')';
|
||
|
}
|
||
|
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, quantumSize) {
|
||
|
if (Runtime.QUANTUM_SIZE == 1) return 1;
|
||
|
var size = {
|
||
|
'%i1': 1,
|
||
|
'%i8': 1,
|
||
|
'%i16': 2,
|
||
|
'%i32': 4,
|
||
|
'%i64': 8,
|
||
|
"%float": 4,
|
||
|
"%double": 8
|
||
|
}['%'+type]; // add '%' since float and double confuse Closure compiler as keys, and also spidermonkey as a compiler will remove 's from '_i8' etc
|
||
|
if (!size) {
|
||
|
if (type.charAt(type.length-1) == '*') {
|
||
|
size = Runtime.QUANTUM_SIZE; // A pointer
|
||
|
} else if (type[0] == 'i') {
|
||
|
var bits = parseInt(type.substr(1));
|
||
|
assert(bits % 8 == 0);
|
||
|
size = bits/8;
|
||
|
}
|
||
|
}
|
||
|
return size;
|
||
|
},
|
||
|
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 (type == 'i64' || type == 'double' || vararg) 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;
|
||
|
type.flatIndexes = type.fields.map(function(field) {
|
||
|
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)) {
|
||
|
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 {
|
||
|
throw 'Unclear type in struct: ' + field + ', in ' + type.name_ + ' :: ' + dump(Types.types[type.name_]);
|
||
|
}
|
||
|
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;
|
||
|
});
|
||
|
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 + 2*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;
|
||
|
},
|
||
|
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() {
|
||
|
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 (needed) {
|
||
|
buffer.push(code);
|
||
|
needed--;
|
||
|
}
|
||
|
if (buffer.length == 0) {
|
||
|
if (code < 128) return String.fromCharCode(code);
|
||
|
buffer.push(code);
|
||
|
if (code > 191 && code < 224) {
|
||
|
needed = 1;
|
||
|
} else {
|
||
|
needed = 2;
|
||
|
}
|
||
|
return '';
|
||
|
}
|
||
|
if (needed > 0) return '';
|
||
|
var c1 = buffer[0];
|
||
|
var c2 = buffer[1];
|
||
|
var c3 = buffer[2];
|
||
|
var ret;
|
||
|
if (c1 > 191 && c1 < 224) {
|
||
|
ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
|
||
|
} else {
|
||
|
ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
||
|
}
|
||
|
buffer.length = 0;
|
||
|
return ret;
|
||
|
}
|
||
|
this.processJSString = function(string) {
|
||
|
string = unescape(encodeURIComponent(string));
|
||
|
var ret = [];
|
||
|
for (var i = 0; i < string.length; i++) {
|
||
|
ret.push(string.charCodeAt(i));
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
},
|
||
|
stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = ((((STACKTOP)+7)>>3)<<3); return ret; },
|
||
|
staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = ((((STATICTOP)+7)>>3)<<3); return ret; },
|
||
|
dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = ((((DYNAMICTOP)+7)>>3)<<3); 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
|
||
|
}
|
||
|
//========================================
|
||
|
// 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 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;
|
||
|
var tempI64, tempI64b;
|
||
|
var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
|
||
|
function abort(text) {
|
||
|
Module.print(text + ':\n' + (new Error).stack);
|
||
|
ABORT = true;
|
||
|
throw "Assertion: " + text;
|
||
|
}
|
||
|
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).
|
||
|
// @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 = globalScope['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
|
||
|
if (!stack) stack = Runtime.stackSave();
|
||
|
var ret = Runtime.stackAlloc(value.length+1);
|
||
|
writeStringToMemory(value, ret);
|
||
|
return ret;
|
||
|
} else 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,Math.min(Math.floor((value)/(+(4294967296))), (+(4294967295)))>>>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) {
|
||
|
// 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;
|
||
|
// Memory management
|
||
|
var PAGE_SIZE = 4096;
|
||
|
function alignMemoryPage(x) {
|
||
|
return ((x+4095)>>12)<<12;
|
||
|
}
|
||
|
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 in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value, or (2) set Module.TOTAL_MEMORY before the program runs.');
|
||
|
}
|
||
|
var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
|
||
|
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
|
||
|
var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
|
||
|
// Initialize the runtime's memory
|
||
|
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
|
||
|
assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
|
||
|
'Cannot fallback to non-typed array case: Code is too specialized');
|
||
|
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 __ATINIT__ = []; // functions called during startup
|
||
|
var __ATMAIN__ = []; // functions called when main() is to be run
|
||
|
var __ATEXIT__ = []; // functions called during shutdown
|
||
|
var runtimeInitialized = false;
|
||
|
function ensureInitRuntime() {
|
||
|
if (runtimeInitialized) return;
|
||
|
runtimeInitialized = true;
|
||
|
callRuntimeCallbacks(__ATINIT__);
|
||
|
}
|
||
|
function preMain() {
|
||
|
callRuntimeCallbacks(__ATMAIN__);
|
||
|
}
|
||
|
function exitRuntime() {
|
||
|
callRuntimeCallbacks(__ATEXIT__);
|
||
|
}
|
||
|
// 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 unSign(value, bits, ignore, sig) {
|
||
|
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, sig) {
|
||
|
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;
|
||
|
}
|
||
|
if (!Math['imul']) Math['imul'] = function(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;
|
||
|
};
|
||
|
// 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 runDependencyTracking = {};
|
||
|
var calledInit = false, calledRun = false;
|
||
|
var runDependencyWatcher = null;
|
||
|
function addRunDependency(id) {
|
||
|
runDependencies++;
|
||
|
if (Module['monitorRunDependencies']) {
|
||
|
Module['monitorRunDependencies'](runDependencies);
|
||
|
}
|
||
|
if (id) {
|
||
|
assert(!runDependencyTracking[id]);
|
||
|
runDependencyTracking[id] = 1;
|
||
|
} else {
|
||
|
Module.printErr('warning: run dependency added without ID');
|
||
|
}
|
||
|
}
|
||
|
Module['addRunDependency'] = addRunDependency;
|
||
|
function removeRunDependency(id) {
|
||
|
runDependencies--;
|
||
|
if (Module['monitorRunDependencies']) {
|
||
|
Module['monitorRunDependencies'](runDependencies);
|
||
|
}
|
||
|
if (id) {
|
||
|
assert(runDependencyTracking[id]);
|
||
|
delete runDependencyTracking[id];
|
||
|
} else {
|
||
|
Module.printErr('warning: run dependency removed without ID');
|
||
|
}
|
||
|
if (runDependencies == 0) {
|
||
|
if (runDependencyWatcher !== null) {
|
||
|
clearInterval(runDependencyWatcher);
|
||
|
runDependencyWatcher = null;
|
||
|
}
|
||
|
// If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
|
||
|
if (!calledRun && shouldRunNow) run();
|
||
|
}
|
||
|
}
|
||
|
Module['removeRunDependency'] = removeRunDependency;
|
||
|
Module["preloadedImages"] = {}; // maps url to image data
|
||
|
Module["preloadedAudios"] = {}; // maps url to audio data
|
||
|
function addPreRun(func) {
|
||
|
if (!Module['preRun']) Module['preRun'] = [];
|
||
|
else if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
|
||
|
Module['preRun'].push(func);
|
||
|
}
|
||
|
var awaitingMemoryInitializer = false;
|
||
|
function loadMemoryInitializer(filename) {
|
||
|
function applyData(data) {
|
||
|
HEAPU8.set(data, STATIC_BASE);
|
||
|
runPostSets();
|
||
|
}
|
||
|
// always do this asynchronously, to keep shell and web as similar as possible
|
||
|
addPreRun(function() {
|
||
|
if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
|
||
|
applyData(Module['readBinary'](filename));
|
||
|
} else {
|
||
|
Browser.asyncLoad(filename, function(data) {
|
||
|
applyData(data);
|
||
|
}, function(data) {
|
||
|
throw 'could not load memory initializer ' + filename;
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
awaitingMemoryInitializer = false;
|
||
|
}
|
||
|
// === Body ===
|
||
|
STATIC_BASE = 8;
|
||
|
STATICTOP = STATIC_BASE + 243440;
|
||
|
var _stdout;
|
||
|
var _stdin;
|
||
|
var _stderr;
|
||
|
var _stdout = _stdout=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
|
||
|
var _stdin = _stdin=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
|
||
|
var _stderr = _stderr=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC);
|
||
|
/* memory initializer */ allocate([0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,80,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,68,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,0,0,0,0,0,0,0,0,58,140,48,226,142,121,69,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,144,139,1,0,240,84,3,0,80,126,1,0,0,0,0,0,80,131,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,134,1,0,248,132,1,0,232,123,1,0,0,0,0,0,224,128,1,0,0,0,0,0,0,85,1,0,8,0,0,0,208,80,1,0,9,0,0,0,192,76,1,0,10,0,0,0,64,73,1,0,13,0,0,0,240,70,1,0,27,0,0,0,40,67,1,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,244,1,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,3,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,184,30,133,235,81,184,158,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0
|
||
|
.concat([240,230,1,0,40,226,1,0,224,220,1,0,48,214,1,0,40,209,1,0,160,197,1,0,56,194,1,0,128,190,1,0,192,177,1,0,216,165,1,0,16,162,1,0,184,158,1,0,48,154,1,0,224,151,1,0,240,149,1,0,128,148,1,0,224,139,1,0,240,137,1,0,8,135,1,0,88,133,1,0,144,131,1,0,152,129,1,0,8,127,1,0,96,124,1,0,32,122,1,0,72,120,1,0,200,118,1,0,192,116,1,0,8,115,1,0,56,112,1,0,216,109,1,0,160,107,1,0,184,103,1,0,8,101,1,0,136,98,1,0,232,96,1,0,88,94,1,0,104,92,1,0,80,89,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,199,1,0,1,0,0,0,88,199,1,0,2,0,0,0,224,198,1,0,3,0,0,0,40,43,1,0,4,0,0,0,136,198,1,0,4,0,0,0,176,111,1,0,5,0,0,0,88,198,1,0,9,0,0,0,232,197,1,0,10,0,0,0,152,197,1,0,6,0,0,0,8,197,1,0,7,0,0,0,112,196,1,0,8,0,0,0,248,195,1,0,11,0,0,0,0,0,0,0,0,0,0,0,248,60,1,0,56,55,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,104,249,1,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,115,99,97,108,101,32,109,117,115,116,32,98,101,32,62,32,48,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,114,111,116,95,37,99,32,109,117,115,116,32,98,101,32,105,110,32,91,48,58,37,100,93,32,100,101,103,114,101,101,115,32,114,97,110,103,101,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,232,119,1,0,2,0,0,0,16,118,1,0,1,0,0,0,48,116,1,0,1,0,0,0,96,114,1,0,3,0,0,0,176,111,1,0,4,0,0,0,56,109,1,0,5,0,0,0,248,105,1,0,6,0,0,0,8,199,1,0,7,0,0,0,40,100,1,0,8,0,0,0,232,97,1,0,9,0,0,0,248,95,1,0,10,0,0,0,32,93,1,0,11,0,0,0,56,91,1,0,12,0,0,0,0,89,1,0,13,0,0,0,0,84,1,0,14,0,0,0,224,79,1,0,15,0,0,0,16,75,1,0,17,0,0,0,232,72,1,0,18,0,0,0,160,69,1,0,19,0,0,0,16,66,1,0,20,0,0,0,80,60,1,0,21,0,0,0,248,54,1,0,22,0,0,0,24,52,1,0,23,0,0,0,248,49,1,0,16,0,0,0,96,48,1,0,16,0,0,0,0,46,1,0,24,0,0,0,184,43,1,0,25,0,0,0,96,41,1,0,26,0,0,0,24,39,1,0,27,0,0,0,104,37,1,0,28,0,0,0,104,35,1,0,29,0,0,0,200,33,1,0,30,0,0,0,96,32,1,0,31,0,0,0,208,30,1,0,32,0,0,0,112,28,1,0,31,0,0,0,32,111,3,0,32,0,0,0,80,109,3,0,33,0,0,0,80,105,3,0,34,0,0,0,240,102,3,0,35,0,0,0,64,101,3,0,36,0,0,0,32,98,3,
|
||
|
.concat([40,194,1,0,39,1,0,0,88,193,1,0,23,1,0,0,240,192,1,0,55,1,0,0,168,192,1,0,102,0,0,0,104,192,1,0,102,0,0,0,16,192,1,0,86,0,0,0,224,191,1,0,118,0,0,0,168,191,1,0,153,0,0,0,112,191,1,0,136,1,0,0,32,191,1,0,89,1,0,0,112,190,1,0,169,0,0,0,88,189,1,0,137,0,0,0,192,188,1,0,177,0,0,0,96,188,1,0,184,0,0,0,40,188,1,0,193,0,0,0,120,187,1,0,209,0,0,0,216,186,1,0,225,0,0,0,104,186,1,0,1,1,0,0,88,185,1,0,252,0,0,0,248,195,1,0,218,1,0,0,0,38,3,0,96,1,0,0,80,184,1,0,112,1,0,0,184,177,1,0,144,1,0,0,248,175,1,0,160,1,0,0,128,172,1,0,176,1,0,0,216,170,1,0,201,1,0,0,176,168,1,0,233,1,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,128,196,1,0,1,0,0,0,0,193,1,0,2,0,0,0,200,188,1,0,3,0,0,0,144,172,1,0,4,0,0,0,216,164,1,0,5,0,0,0,8,161,1,0,6,0,0,0,48,157,1,0,7,0,0,0,16,153,1,0,8,0,0,0,200,150,1,0,9,0,0,0,0,0,0,0,0,0,0,0,67,97,110,32,115,112,101,99,105,102,121,32,96,111,114,105,103,105,110,96,32,111,114,32,96,99,101,110,116,101,114,96,44,32,98,117,116,32,110,111,116,32,98,111,116,104,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,224,1,0,0,0,0,0,216,219,1,0,1,0,0,0,64,212,1,0,2,0,0,0,232,199,1,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
|
.concat([77,111,110,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,117,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,78,3,0,116,1,0,0,72,75,2,0,32,1,0,0,112,5,2,0,64,1,0,0,64,210,1,0,62,1,0,0,96,150,1,0,36,1,0,0,152,76,3,0,10,1,0,0,248,109,3,0,188,0,0,0,72,68,1,0,128,0,0,0,216,150,1,0,100,0,0,0,104,102,3,0,170,0,0,0,136,75,3,0,210,0,0,0,88,54,3,0,80,1,0,0,224,30,3,0,72,1,0,0,120,15,3,0,222,0,0,0,136,250,2,0,78,1,0,0,176,208,2,0,28,1,0,0,120,188,2,0,232,0,0,0,168,42,2,0,56,1,0,0,24,36,2,0,252,0,0,0,184,140,2,0,172,0,0,0,32,111,3,0,68,0,0,0,168,88,2,0,74,0,0,0,40,77,2,0,124,0,0,0,184,69,2,0,206,0,0,0,0,62,2,0,192,0,0,0,136,53,2,0,166,0,0,0,224,46,2,0,72,0,0,0,80,41,2,0,246,0,0,0,88,34,2,0,96,1,0,0,152,26,2,0,216,0,0,0,192,19,2,0,214,0,0,0,112,13,2,0,74,1,0,0,160,6,2,0,2,0,0,0,208,1,2,0,84,0,0,0,64,253,1,0,208,0,0,0,16,248,1,0,114,1,0,0,184,243,1,0,82,1,0,0,184,238,1,0,104,0,0,0,112,234,1,0,234,0,0,0,176,229,1,0,6,1,0,0,208,223,1,0,30,0,0,0,152,190,2,0,0,0,0,0,72,158,1,0,240,0,0,0,144,199,1,0,104,1,0,0,0,196,1,0,104,1,0,0,144,42,2,0,116,0,0,0,112,188,1,0,176,0,0,0,240,170,1,0,2,1,0,0,120,164,1,0,98,1,0,0,184,160,1,0,12,0,0,0,248,156,1,0,152,0,0,0,216,152,1,0,112,1,0,0,168,150,1,0,110,0,0,0,72,149,1,0,250,0,0,0,120,145,1,0,184,0,0,0,0,139,1,0,130,1,0,0,96,136,1,0,126,0,0,0,80,134,1,0,134,0,0,0,144,132,1,0,20,1,0,0,240,130,1,0,60,0,0,0,64,128,1,0,66,0,0,0,208,125,1,0,70,0,0,0,112,123,1,0,90,1,0,0,88,121,1,0,76,1,0,0,184,119,1,0,76,0,0,0,216,117,1,0,110,1,0,0,0,116,1,0,68,1,0,0,224,113,1,0,36,0,0,0,96,182,2,0,196,0,0,0,0,137,1,0,122,0,0,0,208,105,1,0,106,0,0,0,136,102,1,0,6,0,0,0,224,99,1,0,224,0,0,0,192,97,1,0,226,0,0,0,208,95,1,0,46,1,0,0,0,93,1,0,44,1,0,0,120,90,1,0,82,0,0,0,160,87,1,0,202,0,0,0,168,83,1,0,154,0,0,0,168,79,1,0,164,0,0,0,144,74,1,0,186,0,0,0,184,72,1,0,218,0,0,0,104,69,1,0,44,0,0,0,136,65,1,0,12,1,0,0,184,59,1,0,112,0,0,0,208,54,1,0,8,1,0,0,248,51,1,0,58,1,0,0,208,49,1,0,122,1,0,0,0,48,1,0,78,0,0,0,216,45,1,0,66,1,0,0,120,43,1,0,118,0,0,0,48,41,1,0,52,1,0,0,208,38,1,0,126,1,0,0,48,37,1,0,244,0,0,0,72,35,1,0,64,0,0,0,152,33,1,0,14,1,0,0,72,32,1,0,88,1,0,0,144,30,1,0,254,0,0,0,72,28,1,0,124,1,0,0,240,110,3,0,190,0,0,0,192,108,3,0,50,1,0,0,56,105,3,0,50,0,0,0,208,102,3,0,86,1,0,0,192,165,1,0,60,1,0,0,200,97,3,0,42,0,0,0,32,96,3,0,40,1,0,0,48,93,3,0,198,0,0,0,144,86,3,0,114,1,0,0,240,84,3,0,238,0,0,0,240,161,1,0,238,0,0,0,24,80,3,0,248,0,0,0,192,77,3,0,22,1,0,0,32,42,2,0,10,0,0,0,8,74,3,0,92,1,0,0,0,72,3,0,162,0,0,0,208,69,3,0,162,0,0,0,56,67,3,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,25,2,0,232,18,2,0,200,12,2,0,48,6,2,0,128,1,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,168,121,1,0,0,0,0,0,8,120,1,0,0,0,0,0,192,172,1,0,240,164,1,0,102,105,116,46,108,111,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
|
.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,161,1,0,120,157,1,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
|
.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
|
.concat([0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,32,77,2,0,176,69,2,0,240,61,2,0,128,53,2,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,77,97,121,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,97,120,0,0,71,80,86,65,76,95,88,95,77,65,88,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,103,59,10,0,0,0,87,105,108,108,32,110,111,116,32,99,104,101,99,107,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,40,109,97,121,32,99,97,117,115,101,32,99,114,97,115,104,101,115,41,46,10,0,0,0,117,110,100,101,102,105,110,101,100,32,118,97,114,105,97,98,108,101,58,32,37,115,0,0,101,120,101,99,117,116,105,110,103,58,32,37,115,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,105,110,0,0,65,109,98,105,103,117,111,117,115,32,114,101,113,117,101,115,116,32,39,37,46,42,115,39,59,32,112,111,115,115,105,98,108,101,32,109,97,116,99,104,101,115,58,10,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,100,59,10,0,0,0,116,109,95,109,100,97,121,0,97,108,108,95,116,101,114,109,95,110,97,109,101,115,50,0,71,80,86,65,76,95,88,95,77,73,78,0,0,0,0,0,108,115,0,0,0,0,0,0,105,110,100,101,120,95,109,105,110,0,0,0,0,0,0,0,110,111,32,99,111,108,117,109,110,32,119,105,116,104,32,104,101,97,100,101,114,32,34,37,115,34,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,104,101,105,103,104,116,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,0,0,10,9,85,115,101,114,32,97,110,100,32,100,101,102,97,117,108,116,32,118,97,114,105,97,98,108,101,115,58,10,0,0,114,101,108,36,97,116,105,118,101,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,119,105,100,116,104,32,61,32,37,46,49,102,59,10,0,99,104,97,110,103,101,32,118,105,101,119,32,40,115,99,97,108,105,110,103,41,46,32,85,115,101,32,60,99,116,114,108,62,32,116,111,32,115,99,97,108,101,32,116,104,101,32,97,120,101,115,32,111,110,108,121,46,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,116,111,112,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,98,111,116,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,97,120,32,61,32,37,46,49,102,59,10,0,0,101,108,108,105,112,115,101,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,105,1
|
||
|
.concat([44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,111,110,32,101,114,114,111,114,58,32,110,111,110,45,112,111,115,105,116,105,118,101,32,100,105,97,103,111,110,97,108,32,101,108,101,109,101,110,116,32,105,110,32,99,111,118,97,114,46,32,109,97,116,114,105,120,0,0,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,76,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,108,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,54,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,37,42,100,0,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,114,97,110,100,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,66,111,108,100,0,0,0,0,0,100,101,99,36,105,109,97,108,115,105,103,110,0,0,0,0,105,110,118,97,108,105,100,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,9,32,32,102,111,110,116,32,34,37,115,34,10,0,0,0,101,113,117,97,108,36,95,97,120,101,115,0,0,0,0,0,102,114,111,109,32,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,84,111,111,32,109,97,110,121,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,68,101,108,101,116,101,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,115,97,118,101,32,102,105,108,101,0,0,0,99,112,57,53,48,0,0,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,32,111,112,101,110,32,121,108,111,119,32,121,104,105,103,104,32,121,99,108,111,115,101,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,99,97,108,108,110,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,70,73,84,95,87,83,83,82,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,10,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,
|
||
|
.concat([92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,116,114,105,97,110,103,108,101,36,125,0,115,101,116,32,37,115,114,97,110,103,101,32,91,32,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,117,108,108,101,116,36,125,0,0,0,0,0,0,0,0,98,108,45,105,110,116,101,114,112,32,97,108,111,110,103,32,115,99,97,110,0,0,0,0,112,114,101,118,105,111,117,115,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,110,111,116,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,0,0,0,0,0,50,32,109,117,108,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,99,105,114,99,36,125,0,0,116,101,120,116,95,108,97,98,101,108,32,108,105,115,116,32,119,97,115,32,110,111,116,32,105,110,105,116,105,97,108,105,122,101,100,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,115,113,117,97,114,101,36,125,0,0,0,45,45,112,101,114,115,105,115,116,0,0,0,0,0,0,0,97,98,115,46,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,108,97,115,116,32,105,116,101,114,97,116,105,111,110,32,58,32,37,103,10,10,0,0,0,0,0,0,0,0,92,114,97,105,115,101,98,111,120,123,45,46,56,112,116,125,123,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,66,111,120,36,125,125,0,87,97,114,110,105,110,103,32,58,32,117,100,102,32,115,104,97,100,111,119,101,100,32,98,121,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,97,115,116,36,125,0,0,0,108,111,103,49,48,0,0,0,92,114,117,108,101,123,49,112,116,125,123,49,112,116,125,0,67,111,117,114,105,101,114,32,79,98,108,105,113,117,101,0,98,36,97,114,115,0,0,0,32,32,77,101,97,110,58,32,32,32,32,32,37,115,10,0,77,79,85,83,69,95,82,85,76,69,82,95,89,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,114,117,108,101,123,37,103,112,116,125,123,37,103,112,116,125,125,10,0,37,35,103,0,0,0,0,0,105,110,99,114,101,109,101,110,116,32,109,117,115,116,32,98,101,32,110,101,103,97,116,105,118,101,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,101,109,116,101,120,32,115,112,101,99,105,97,108,115,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,92,105,102,120,92,112,108,111,116,112,111,105,110,116,92,117,110,100,101,102,105,110,101,100,92,110,101,119,115,97,118,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,92,102,105,10,0,32,108,105,110,101,119,105,100,116,104,32,37,46,51,102,0,98,111,120,112,108,111,116,32,112,101,114,109,117,116,97,116,105,111,110,115,32,97,114,114,97,121,0,0,0,0,0,0,115,116,114,111,107,101,32,103,115,97,118,101,9,37,37,32,100,114,97,119,32,103,114,97,121,32,115,99,97,108,101,32,115,109,111,111,116,104,32,98,111,120,10,109,97,120,99,111,108,111,114,115,32,48,32,103,116,32,123,47,105,109,97,120,32,109,97,120,99,111,108,111,114,115,32,100,101,102,125,32,123,47,105,109,97,120,32,49,48,50,52,32,100,101,102,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,115,111,108,117,116,105,111,110,32,118,101,99,116,111,114,0,0,70,56,0,0,0,0,0,0,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,99,111,117,108,100,32,110,111,116,32,97,99,99,101,115,115,32,105,116,101,114,97,116,105,111,110,32,118,97,114,105,97,98,108,101,46,0,0,0,0,0,0,92,101,110,100,123,112,105,99,116,117,114,101,125,37,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,0,0,0,0,92,101,110,100,123,100,111,99,117,109,101,110,116,125,10,0,124,50,42,120,32,45,32,48,46,53,124,0,0,0,0,0,32,32,32,32,92,103,112,108,98,97,99,107,116,101,120,116,10,32,32,32,32,92,112,117,116,40,48,44,48,41,123,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,123,37,115,125,125,37,37,10,32,32,32,32,92,103,112,108,102,114,111,110,116,116,101,120,116,10,32,32,92,101,110,10
|
||
|
.concat([84,64,70,105,108,108,112,101,110,116,97,103,111,110,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,112,101,110,116,97,103,111,110,42,125,10,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,100,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,42,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,67,114,111,115,115,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,43,44,100,111,116,97,110,103,108,101,61,52,53,125,10,0,0,0,0,0,0,0,0,116,97,110,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,66,111,114,100,101,114,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,65,120,101,115,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,52,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,83,111,108,105,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,97,115,104,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,49,32,46,48,49,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,111,116,116,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,50,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,56,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,76,111,110,103,68,97,115,104,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,50,32,46,48,49,125,10,0,0,0,0,0,0,0,115,112,108,105,110,101,36,115,0,0,0,0,0,0,0,0,109,105,110,0,0,0,0,0,37,32,68,101,102,105,110,101,32,110,101,119,32,80,83,84,32,111,98,106,101,99,116,115,44,32,105,102,32,110,111,116,32,97,108,114,101,97,100,121,32,100,101,102,105,110,101,100,10,92,105,102,120,92,80,83,84,108,111,97,100,101,100,92,117,110,100,101,102,105,110,101,100,10,92,100,101,102,92,80,83,84,108,111,97,100,101,100,123,116,125,10,92,112,115,115,101,116,123,97,114,114,111,119,115,105,122,101,61,46,48,49,32,51,46,50,32,49,46,52,32,46,51,125,10,92,112,115,115,101,116,123,100,111,116,115,105,122,101,61,46,48,49,125,10,92,99,97,116,99,111,100,101,96,64,61,49,49,10,10,0,0,0,0,0,0,0,0,108,101,102,116,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,0,0,117,98,121,116,101,0,0,0,92,80,83,84,64,76,111,110,103,68,97,115,104,0,0,0,104,105,115,116,101,112,115,10,0,0,0,0,0,0,0,0,105,110,100,101,120,101,115,32,108,117,0,0,0,0,0,0,120,50,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,39,58,39,32,101,120,112,101,99,116,101,100,0,0,0,0,75
|
||
|
.concat([121,110,101,120,116,43,119,100,91,100,101,99,95,110,117,109,93,42,115,105,110,100,32,114,111,116,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,101,110,100,102,111,114,10,32,32,101,110,100,103,114,111,117,112,32,10,101,110,100,100,101,102,59,10,0,0,0,0,108,97,98,101,108,115,0,0,44,32,107,100,101,110,115,105,116,121,50,100,32,109,111,100,101,0,0,0,0,0,0,0,99,111,108,111,114,32,97,120,105,115,0,0,0,0,0,0,10,37,73,110,99,108,117,100,101,32,110,101,120,116,32,101,105,103,104,116,32,108,105,110,101,115,32,105,102,32,121,111,117,32,104,97,118,101,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,116,104,101,32,109,111,100,101,32,111,110,32,121,111,117,114,32,115,121,115,116,101,109,46,46,10,37,112,114,111,111,102,105,110,103,58,61,48,59,10,37,102,111,110,116,109,97,107,105,110,103,58,61,49,59,10,37,116,114,97,99,105,110,103,116,105,116,108,101,115,58,61,48,59,10,37,112,105,120,101,108,115,95,112,101,114,95,105,110,99,104,58,61,51,48,48,59,10,37,98,108,97,99,107,101,114,58,61,48,59,10,37,102,105,108,108,105,110,58,61,46,50,59,10,37,111,95,99,111,114,114,101,99,116,105,111,110,58,61,46,54,59,10,37,102,105,120,95,117,110,105,116,115,59,10,0,0,0,0,0,0,0,0,99,97,110,36,100,108,101,115,116,105,99,107,115,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,107,101,114,110,101,108,61,37,115,44,10,9,115,99,97,108,101,32,102,97,99,116,111,114,115,32,120,61,37,102,44,32,121,61,37,102,37,115,10,0,105,102,32,117,110,107,110,111,119,110,32,99,109,98,97,115,101,58,32,105,110,112,117,116,32,99,109,98,97,115,101,32,102,105,10,10,116,114,97,99,105,110,103,115,116,97,116,115,58,61,49,59,10,112,105,99,116,117,114,101,32,114,91,93,59,10,10,100,101,102,32,111,112,101,110,105,116,32,61,32,111,112,101,110,119,105,110,100,111,119,32,99,117,114,114,101,110,116,119,105,110,100,111,119,10,32,32,102,114,111,109,32,40,48,44,48,41,32,116,111,32,40,52,48,48,44,56,48,48,41,32,97,116,32,40,45,53,48,44,53,48,48,41,32,101,110,100,100,101,102,59,10,10,109,111,100,101,95,115,101,116,117,112,59,10,0,0,0,102,105,110,36,97,110,99,101,98,97,114,115,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,115,112,108,105,110,101,115,10,0,0,0,0,0,0,0,0,51,32,109,117,108,32,49,32,115,117,98,0,0,0,0,0,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,118,101,99,36,116,111,114,115,0,0,0,0,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,110,111,114,109,61,37,100,10,0,0,0,0,0,0,0,0,68,97,109,97,103,101,100,32,69,68,70,32,104,101,97,100,101,114,32,111,102,32,37,115,58,32,110,111,116,32,109,117,108,116,105,112,108,101,32,111,102,32,53,49,50,32,66,46,10,0,0,0,0,0,0,0,97,58,61,119,47,37,100,59,98,58,61,104,47,37,100,59,10,0,0,0,0,0,0,0,104,105,115,36,116,101,112,115,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,114,101,115,105,100,117,97,108,115,32,97,114,101,32,119,101,105,103,104,116,101,100,32,101,113,117,97,108,108,121,32,40,117,110,105,116,32,119,101,105,103,104,116,41,10,10,0,0,9,99,111,109,109,97,110,100,32,108,105,110,101,32,109,97,99,114,111,115,32,119,105,108,108,32,37,115,98,101,32,101,120,112,97,110,100,101,100,10,0,0,0,0,0,0,0,0,65,115,115,101,114,116,105,111,110,32,102,97,105,108,101,100,58,32,37,115,0,0,0,0,10,10,98,101,103,105,110,99,104,97,114,40,37,100,44,37,103,105,110,35,44,37,103,105,110,35,44,48,41,59,10,0,102,115,36,116,101,112,115,0,99,121,108,105,110,100,114,105,99,97,108,10,0,0,0,0,100,114,97,119,32,40,37,100,97,44,37,100,98,41,45,45,40,37,100,97,44,37,100,98,41,59,10,0,0,0,0,0,102,105,108,108,115,116,36,101,112,115,0,0,0,0,0,0,118,97,108,105,100,0,0,0,115,112,104,101,114,105,99,97,108,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,44,32,60,110,117,109,95,99,111,108,115,62,39,0,0,0,0,0,0,0,0,100,114,97,119,100,111,116,32,40,37,100,97,44,37,100,98,41,59,10,0,0,0,
|
||
|
.concat([100,0,0,0,0,0,0,0,115,99,97,108,101,112,101,110,32,49,59,32,112,116,115,105,122,101,32,37,46,51,102,59,108,105,110,101,116,121,112,101,32,45,50,59,10,0,0,0,115,108,97,116,101,98,108,117,101,49,0,0,0,0,0,0,120,49,121,49,0,0,0,0,68,97,116,97,0,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,32,32,32,37,115,32,91,37,42,108,100,93,10,0,0,0,0,0,0,37,115,58,37,100,32,112,114,111,116,111,99,111,108,32,101,114,114,111,114,10,0,0,0,100,36,101,103,114,101,101,115,0,0,0,0,0,0,0,0,109,117,108,116,105,112,108,111,116,62,32,0,0,0,0,0,37,48,51,111,0,0,0,0,100,0,0,0,0,0,0,0,97,58,61,119,47,37,46,49,102,59,98,58,61,104,47,37,46,49,102,59,10,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,0,0,9,37,115,32,105,115,32,117,110,100,101,102,105,110,101,100,10,0,0,0,0,0,0,0,115,116,121,108,101,32,108,105,110,101,0,0,0,0,0,0,114,36,97,100,105,97,110,115,0,0,0,0,0,0,0,0,120,101,114,114,111,114,108,105,110,101,115,10,0,0,0,0,78,101,101,100,32,49,32,111,114,32,51,32,99,111,108,117,109,110,115,32,102,111,114,32,99,97,114,116,101,115,105,97,110,32,100,97,116,97,0,0,67,97,110,39,116,32,99,104,97,110,103,101,32,116,111,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,0,0,126,0,0,0,0,0,0,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,71,105,118,101,110,115,40,41,0,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,44,32,97,108,108,32,119,101,105,103,104,116,115,32,104,97,118,101,32,116,111,32,98,101,32,62,32,48,0,0,0,0,0,0,0,10,98,101,103,105,110,102,105,103,40,37,100,41,59,10,119,58,61,37,46,51,102,105,110,59,104,58,61,37,46,51,102,105,110,59,10,0,0,0,0,99,98,116,105,99,115,0,0,111,114,99,104,105,100,52,0,75,80,95,66,101,103,105,110,0,0,0,0,0,0,0,0,9,37,115,10,0,0,0,0,114,103,98,36,99,111,108,111,114,0,0,0,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,116,114,105,110,103,32,110,111,116,32,97,108,108,111,99,97,116,101,100,0,0,0,0,100,117,112,108,105,99,97,116,101,32,111,114,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,97,114,103,117,109,101,110,116,115,0,0,0,0,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,0,115,105,101,110,110,97,52,0,10,9,85,115,101,114,45,68,101,102,105,110,101,100,32,70,117,110,99,116,105,111,110,115,58,10,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,37,115,32,114,101,113,117,105,114,101,115,32,37,100,32,118,97,114,105,97,98,108,101,37,99,0,0,0,0,0,0,119,114,111,110,103,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,97,114,114,111,119,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,114,97,105,110,116,32,40,117,115,101,32,39,60,39,32,111,110,108,121,41,0,0,100,114,97,119,32,40,37,46,49,102,97,44,37,46,49,102,98,41,0,0,0,0,0,0,98,114,111,119,110,52,0,0,100,101,102,97,117,108,116,32,108,97,121,101,114,0,0,0,101,110,100,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,108,105,110,101,116,121,112,101,32,37,100,59,10,0,0,0,111,114,97,110,103,101,114,101,100,52,0,0,0,0,0,0,9,71,114,105,100,32,100,114,97,119,110,32,97,116,32,37,115,10,0,0,0,0,0,0,115,116,97,114,116,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,124,99,111,115,40,51,54,48,120,41,124,0,0,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,100,97,114,107,45,111,108,105,118,101,103,114,101,101,110,0,100,101,103,114,101,101,115,0,97,114,114,111,119,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,92,115,101,116,102,111,110,116,123,37,115,125,123,37,53,46,50,102,125,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,0,0,0,100,97,114,107,45,112,108,117,109,0,0,0,0,0,0,0,114,97,100,105,97,110,115,0,32,32,32,32,32,32,32,32,32,83,107,105,112,112,101,100,32,37,100,32,112,111,105,110,116,115,32,111,117,116,115,105,100,101,32,114,9
|
||
|
.concat([79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,115,116,97,116,115,58,32,116,111,111,32,109,97,110,121,32,100,97,116,97,112,111,105,110,116,115,32,40,37,100,41,63,0,0,0,0,0,0,0,32,114,103,98,32,34,37,115,34,32,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,120,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,34,119,105,116,104,34,32,97,108,108,111,119,101,100,32,111,110,108,121,32,97,102,116,101,114,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,97,108,108,36,119,105,110,100,111,119,115,0,0,0,0,0,62,61,0,0,0,0,0,0,110,111,116,105,109,101,115,116,97,109,112,0,0,0,0,0,110,111,101,36,120,112,108,105,99,105,116,0,0,0,0,0,75,80,95,70,50,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,99,108,111,115,101,100,0,0,70,108,111,97,116,86,97,108,117,101,0,0,0,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,115,116,114,102,116,105,109,101,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,114,103,98,102,111,114,109,117,108,97,101,32,37,100,44,32,37,100,44,32,37,100,10,0,114,97,36,105,115,101,0,0,100,111,109,97,105,110,0,0,116,105,109,101,115,116,97,109,112,0,0,0,0,0,0,0,105,36,109,112,108,105,99,105,116,0,0,0,0,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,78,97,78,0,0,0,0,0,10,115,101,116,32,112,97,108,101,116,116,101,32,0,0,0,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,73,78,32,124,124,32,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,65,88,0,0,0,0,105,110,112,117,116,0,0,0,116,114,36,97,110,115,112,97,114,101,110,116,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,108,97,121,101,114,100,36,101,102,97,117,108,116,0,0,0,87,97,114,110,105,110,103,32,45,32,100,105,102,102,105,99,117,108,116,121,32,102,105,116,116,105,110,103,32,112,108,111,116,32,116,105,116,108,101,115,32,105,110,116,111,32,107,101,121,0,0,0,0,0,0,0,115,97,118,101,46,99,0,0,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,110,111,115,111,36,108,105,100,0,0,0,0,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,112,111,36,108,97,114,0,0,0,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,46,10,0,124,99,111,115,40,49,56,48,120,41,124,0,0,0,0,0,115,105,122,101,32,37,103,37,115,44,37,103,37,115,32,37,115,32,37,115,32,37,115,0,110,111,116,114,36,97,110,115,112,97,114,101,110,116,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,112,111,36,108,97,114,0,0,88,89,90,32,0,0,0,0,107,101,121,119,111,114,100,32,39,100,97,116,97,39,32,100,101,112,114,101,99,97,116,101,100,44,32,117,115,101,32,39,115,104,111,119,32,115,116,121,108,101,32,100,97,116,97,39,0,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,0,0,9,108,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,110,111,114,36,116,105,99,115,0,0,0,0,0,0,0,0,89,73,81,32,0,0,0,0,122,10,0,0,0,0,0,0,71,110,117,112,108,111,116,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,115,117,112,112,111,114,116,32,102,111,114,32,80,78,71,32,105,109,97,103,101,115,46,32,89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,114,101,98,117,105,108,100,32,103,110,117,112,108,111,116,46,0,0,0,0,0,0,0,0,110,111,104,105,36,100,100,101,110,51,100,0,0,0,0,0,9,108,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,109,99,98,36,116,105,99,115,0,0,0,0,0,0,67,77,89,32,0,0,0,0,47,117,11
|
||
|
.concat([0,0,0,0,0,0,0,0,9,67,111,108,111,114,45,77,111,100,101,108,58,32,0,0,119,114,111,110,103,32,111,112,116,105,111,110,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,37,102,10,0,37,103,32,37,103,0,0,0,32,108,116,32,37,100,0,0,121,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,0,33,61,0,0,0,0,0,0,37,37,32,108,105,110,101,119,105,100,116,104,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,108,105,110,101,115,10,0,0,0,0,0,0,0,80,97,103,101,68,111,119,110,0,0,0,0,0,0,0,0,32,99,111,108,111,114,32,112,111,115,105,116,105,111,110,115,32,102,111,114,32,100,105,115,99,114,101,116,101,32,112,97,108,101,116,116,101,32,116,101,114,109,105,110,97,108,115,10,0,0,0,0,0,0,0,0,114,117,108,101,114,32,97,116,0,0,0,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,100,101,102,97,117,108,116,10,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,112,108,111,116,32,116,121,112,101,0,0,37,37,0,0,0,0,0,0,85,110,115,105,103,110,101,100,83,104,111,114,116,0,0,0,103,112,95,115,101,116,95,112,111,105,110,116,115,105,122,101,40,37,103,41,59,10,0,0,110,111,97,36,117,116,111,116,105,116,108,101,115,0,0,0,65,76,76,32,114,101,109,97,105,110,105,110,103,0,0,0,101,120,112,101,99,116,105,110,103,32,114,117,108,101,114,32,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,10,0,0,0,0,37,100,47,37,109,0,0,0,83,105,103,110,101,100,66,121,116,101,0,0,0,0,0,0,112,118,101,114,116,32,62,61,32,48,0,0,0,0,0,0,37,37,32,112,111,105,110,116,115,105,122,101,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,10,0,0,0,0,97,36,117,116,111,116,105,116,108,101,115,0,0,0,0,0,77,65,88,32,37,105,0,0,114,117,36,108,101,114,0,0,115,101,116,32,110,111,109,37,115,116,105,99,115,10,0,0,103,112,95,115,99,97,108,101,95,116,101,120,116,32,58,61,32,37,103,59,10,0,0,0,104,36,101,105,103,104,116,0,9,97,108,108,111,99,97,116,105,110,103,32,0,0,0,0,110,111,114,117,36,108,101,114,0,0,0,0,0,0,0,0,115,101,116,32,116,105,99,115,108,101,118,101,108,32,37,103,10,0,0,0,0,0,0,0,124,120,45,48,46,53,124,0,37,37,32,116,101,120,116,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,116,104,101,32,119,104,111,108,101,32,102,105,103,117,114,101,10,0,0,0,0,119,36,105,100,116,104,0,0,32,78,79,84,0,0,0,0,115,104,111,117,108,100,32,98,101,58,32,37,100,32,60,61,32,109,111,117,115,101,102,111,114,109,97,116,32,60,61,32,37,100,10,0,0,0,0,0,115,101,116,32,120,121,112,108,97,110,101,32,97,116,32,37,103,10,0,0,0,0,0,0,37,37,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,117,115,101,114,45,100,101,102,105,110,101,100,32,115,101,116,116,105,110,103,115,10,103,112,95,115,101,116,117,112,95,98,101,102,111,114,101,59,10,0,0,0,0,0,0,0,115,112,36,97,99,105,110,103,0,0,0,0,0,0,0,0,9,97,108,108,32,99,111,108,111,114,32,102,111,114,109,117,108,97,101,32,65,82,69,37,115,32,119,114,105,116,116,101,110,32,105,110,116,111,32,111,117,116,112,117,116,32,112,111,115,116,115,99,114,105,112,116,32,102,105,108,101,10,0,0,112,108,101,97,115,101,32,39,115,101,116,32,109,111,117,115,101,32,109,111,117,115,101,102,111,114,109,97,116,32,60,102,109,116,62,39,32,102,105,114,115,116,46,10,0,0,0,0,102,117,110,99,116,105,111,110,0,0,0,0,0,0,0,0,44,32,116,97,110,103,101,110,116,61,37,115,41,0,0,0,99,111,117,108,100,32,110,111,116,32,111,112,101,110,32,108,111,103,45,102,105,108,101,32,37,115,0,0,0,0,0,0,37,37,32,68,105,102,102,101,114,101,110,116,32,105,110,105,116,105,97,108,105,115,97,116,105,111,110,115,10,0,0,0,115,97,36,109,112,108,101,110,0,0,0,0,0,0,0,0,78,69,71,65,84,73,86,69,0,0,0,0,0,0,0,0,109,111,36,117,115,101,102,111,114,109,97,116,0,0,0,0,115,101,116,32,115,116,121,108,101,32,102,117,110,99,116,105,111,110,32,0,0,0,0,0,44,32,37,32,35,46,52,103,100,101,103,41,0,0,0,0,80,115,101,117,100,111,100,97,116,97,32,110,111,116,32,121,101,116,32,105,109,112,108,101,109,101,110,116,101,100,32,102,111,114,32,112,111,108,97,114,32,111,114,32,112,97,114,97,109,101,116,114,105,99,32,103,114,97,112,104,115,0,0,0,9,103,110,117,112,108,111,116,32,101,110,99,111
|
||
|
.concat([103,58,32,0,0,0,0,0,78,97,109,101,100,32,99,111,108,111,114,115,32,119,105,108,108,32,112,114,111,100,117,99,101,32,115,116,114,97,110,103,101,32,114,101,115,117,108,116,115,32,105,102,32,110,111,116,32,105,110,32,99,111,108,111,114,32,109,111,100,101,32,82,71,66,46,0,0,0,0,0,115,101,116,32,111,102,102,115,101,116,115,0,0,0,0,0,27,76,86,49,27,37,37,33,49,0,0,0,0,0,0,0,27,37,37,33,48,27,12,27,76,86,48,0,0,0,0,0,27,76,70,0,0,0,0,0,121,89,0,0,0,0,0,0,115,106,36,105,115,0,0,0,27,76,71,0,0,0,0,0,103,101,0,0,0,0,0,0,37,52,100,32,0,0,0,0,27,77,86,0,0,0,0,0,27,77,76,0,0,0,0,0,27,77,76,63,0,0,0,0,37,108,102,32,44,32,37,108,102,32,37,99,0,0,0,0,27,77,76,53,0,0,0,0,32,32,99,108,105,112,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,116,111,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,41,59,10,0,0,0,0,27,76,84,0,0,0,0,0,100,101,102,36,97,117,108,116,115,0,0,0,0,0,0,0,114,101,112,36,108,111,116,0,27,77,82,69,58,48,0,0,9,102,108,117,115,104,105,110,103,32,116,114,105,97,110,103,108,101,115,32,97,114,101,32,37,115,100,114,97,119,110,10,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,112,97,108,101,116,116,101,32,111,112,116,105,111,110,0,0,69,120,112,101,99,116,105,110,103,32,91,110,111,93,111,117,116,112,117,116,32,111,114,32,112,114,101,102,105,120,0,0,115,101,116,32,108,111,103,115,99,97,108,101,32,37,115,32,37,103,10,0,0,0,0,0,27,77,82,48,48,0,0,0,27,76,72,0,0,0,0,0,27,77,77,0,0,0,0,0,120,88,0,0,0,0,0,0,31,37,115,10,0,0,0,0,27,91,63,51,56,108,0,0,35,33,37,115,47,103,110,117,112,108,111,116,10,35,10,0,96,97,96,97,98,99,100,104,105,106,107,108,0,0,0,0,31,27,3,0,0,0,0,0,67,111,109,109,97,110,100,32,39,115,101,116,32,104,105,115,116,111,114,121,115,105,122,101,39,32,114,101,113,117,105,114,101,115,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,0,0,100,114,97,119,32,98,105,116,109,97,112,105,109,97,103,101,32,40,37,117,44,37,117,44,105,109,103,41,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,0,0,0,27,12,0,0,0,0,0,0,110,111,32,109,97,116,99,104,105,110,103,32,39,125,39,0,122,36,101,114,111,0,0,0,121,122,120,0,0,0,0,0,56,57,58,59,0,0,0,0,69,78,68,0,0,0,0,0,112,97,114,97,36,108,108,101,108,0,0,0,0,0,0,0,110,111,110,45,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,114,101,113,117,105,114,101,100,0,0,0,0,117,110,115,101,116,32,108,111,103,115,99,97,108,101,10,0,27,37,99,0,0,0,0,0,27,91,63,51,56,104,0,0,116,105,116,108,101,0,0,0,67,97,110,32,111,110,108,121,32,102,108,105,112,32,120,44,32,121,44,32,97,110,100,47,111,114,32,122,0,0,0,0,32,101,109,112,116,121,32,0,106,115,36,100,105,114,0,0,102,115,105,122,101,0,0,0,97,120,36,101,115,0,0,0,32,106,115,100,105,114,32,34,37,115,34,0,0,0,0,0,47,98,105,110,47,115,104,0,38,38,0,0,0,0,0,0,32,116,105,116,108,101,32,34,37,115,34,0,0,0,0,0,118,97,114,110,97,109,101,0,32,109,111,117,115,105,110,103,0,0,0,0,0,0,0,0,100,114,97,119,32,105,109,97,103,101,40,10,32,32,0,0,32,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,114,97,120,36,105,115,0,0,32,110,97,109,101,32,34,37,115,34,0,0,0,0,0,0,115,119,97,112,112,101,100,32,112,100,112,32,40,100,105,109,109,108,101,41,0,0,0,0,66,69,71,73,78,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,46,0,0,0,0,37,115,10,0,0,0,0,0,116,105,116,108,101,32,0,0,32,102,111,110,116,115,99,97,108,101,32,37,103,0,0,0,9,99,117,114,114,101,110,116,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,10,0,0,0,0,0,0,77,79,85,83,69,95,67,84,82,76,0,0,0,0,0,0,32,101,110,104,97,110,99,101,100,0,0,0,0,0,0,0,115,112,114,105,110,116,102,32,97,114,103,115,0,0,0,0,37,115,32,102,115,105,122,101,32,37,103,32,108,119,32,37,103,0,0,0,0,0,0,0,120,88,121,89,122,90,0,0,32,115,105,122,101,32,37,100,44,37,100,0,0,0,0,0,32,98,117,116,116,0,0,0,32,114,111,117,110,100,101,100,0,0,0,0,0,0,0,0,32,100,97,115,104,108,10
|
||
|
.concat([114,103,98,40,48,48,48,44,48,48,48,44,48,48,48,41,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,109,97,116,114,105,120,0,0,0,109,112,0,0,0,0,0,0,114,103,98,40,50,53,53,44,50,53,53,44,50,53,53,41,0,0,0,0,0,0,0,0,114,114,36,97,110,103,101,0,117,115,105,110,103,32,100,101,102,97,117,108,116,32,98,105,110,97,114,121,32,114,101,99,111,114,100,47,97,114,114,97,121,32,115,116,114,117,99,116,117,114,101,0,0,0,0,0,72,111,109,101,0,0,0,0,34,41,59,10,0,0,0,0,83,85,82,70,65,67,69,0,105,110,118,97,108,105,100,32,112,109,51,100,32,111,112,116,105,111,110,0,0,0,0,0,84,40,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,0,0,0,0,117,110,115,101,116,32,115,116,121,108,101,32,108,105,110,101,10,0,0,0,0,0,0,0,102,105,108,108,101,100,95,112,111,108,121,103,111,110,51,100,32,99,111,114,110,101,114,115,0,0,0,0,0,0,0,0,32,32,32,112,117,115,104,101,100,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,0,0,0,0,77,79,85,83,69,95,66,85,84,84,79,78,0,0,0,0,84,82,40,37,100,44,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,0,0,0,0,82,105,103,104,116,0,0,0,108,105,116,116,108,101,0,0,80,116,40,37,100,44,37,100,44,37,100,44,37,46,49,102,41,59,10,0,0,0,0,0,68,111,116,40,37,100,44,37,100,41,59,10,0,0,0,0,82,40,37,100,44,37,100,44,37,100,44,37,100,41,59,10,0,0,0,0,0,0,0,0,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,37,103,59,10,0,0,0,0,99,116,120,46,115,116,114,111,107,101,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,0,77,101,116,97,102,111,110,116,32,112,108,111,116,116,105,110,103,32,115,116,97,110,100,97,114,100,0,0,0,0,0,0,114,103,98,40,37,48,51,100,44,37,48,51,100,44,37,48,51,100,41,0,0,0,0,0,99,98,114,36,97,110,103,101,0,0,0,0,0,0,0,0,37,115,37,99,0,0,0,0,66,79,84,84,79,77,0,0,101,120,112,101,99,116,105,110,103,32,39,109,101,97,110,39,44,32,39,103,101,111,109,101,97,110,39,44,32,39,109,101,100,105,97,110,39,44,32,39,109,105,110,39,44,32,39,109,97,120,39,44,32,39,99,49,39,44,32,39,99,50,39,44,32,39,99,51,39,32,111,114,32,39,99,52,39,0,0,0,117,115,101,114,115,116,121,108,101,115,0,0,0,0,0,0,114,103,98,40,37,51,100,44,37,51,100,44,37,51,100,41,37,99,0,0,0,0,0,0,114,103,98,97,40,50,53,53,44,50,53,53,44,50,53,53,44,48,46,48,48,41,0,0,114,103,98,97,40,37,49,49,46,49,49,115,44,37,52,46,50,102,41,37,99,0,0,0,68,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,100,97,116,97,102,105,108,101,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,37,77,0,0,0,0,0,0,99,102,115,112,40,41,59,10,0,0,0,0,0,0,0,0,80,108,111,116,32,116,121,112,101,32,105,115,32,110,101,105,116,104,101,114,32,102,117,110,99,116,105,111,110,32,110,111,114,32,100,97,116,97,0,0,99,102,112,40,41,59,10,0,76,40,37,100,44,32,37,100,41,59,10,0,0,0,0,0,98,112,40,37,100,44,32,37,100,41,59,10,0,0,0,0,99,116,120,46,102,105,108,108,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,109,102,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,115,111,108,105,100,41,59,10,0,0,0,0,0,122,114,36,97,110,103,101,0,109,0,0,0,0,0,0,0,84,104,105,115,32,99,111,112,121,32,111,102,32,103,110,117,112,108,111,116,32,99,97,110,110,111,116,32,114,101,97,100,32,112,110,103,47,103,105,102,47,106,112,101,103,32,105,109,97,103,101,115,0,0,0,0,44,32,116,104,101,110,32,0,99,52,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,105,110,99,114,101,109,101,110,116,32,37,115,10,0,77,126,60,62,37,87,61,38,64,0,0,0,0,0,0,0,97,120,105,115,32,114,97,110,103,101,115,32,109,117,115,116,32,98,101,32,97,98,111,118,101,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,33,0,0,0,0,0,0,65,99,101,70,86,63,97,98,100,69,103,104,110,111,112,113,117,0,0,0,0,0,0,0,32,74,84,118,94,95,34,42,121,107,76,115,120,122,0,0,109,105,115,115,105,110,103,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,40,41,91,93,123,125,92,0,102,116,114,0,0,0,0,0,106,96,39,44,59,58,33,46,0,0,0,0,0,0,0,0,105,73,108,124,0,0,0,0,99,116,120,46,115,116,114,111,107,101,40,41,59,1
|
||
|
.concat([111,102,32,99,111,108,111,114,10,0,0,0,0,0,0,0,102,105,103,58,32,80,97,108,101,116,116,101,32,117,115,101,100,32,98,101,102,111,114,101,32,115,101,116,10,0,0,0,32,37,100,32,37,100,0,0,87,51,67,32,83,99,97,108,97,98,108,101,32,86,101,99,116,111,114,32,71,114,97,112,104,105,99,115,32,100,114,105,118,101,114,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,57,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,108,100,10,9,0,0,0,110,111,121,100,116,105,36,99,115,0,0,0,0,0,0,0,45,54,10,0,0,0,0,0,9,65,110,103,108,101,115,32,97,114,101,32,105,110,32,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,102,111,114,32,115,105,122,101,0,0,117,110,115,101,116,32,107,101,121,10,0,0,0,0,0,0,35,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,96,98,117,105,108,116,105,110,45,110,101,97,114,101,115,116,45,108,111,103,96,32,116,111,103,103,108,101,32,108,111,103,115,99,97,108,101,32,111,102,32,97,120,105,115,32,110,101,97,114,101,115,116,32,99,117,114,115,111,114,0,0,0,0,35,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,102,108,105,112,121,0,0,0,54,0,0,0,0,0,0,0,78,101,101,100,32,50,32,116,111,32,55,32,117,115,105,110,103,32,115,112,101,99,115,0,27,42,109,112,49,109,50,97,50,81,0,0,0,0,0,0,27,42,100,101,84,0,0,0,27,42,100,97,102,108,115,67,0,0,0,0,0,0,0,0,27,42,112,0,0,0,0,0,81,77,83,47,81,85,73,67,32,76,97,115,101,114,32,112,114,105,110,116,101,114,32,40,97,108,115,111,32,84,97,108,97,114,105,115,32,49,50,48,48,32,97,110,100,32,111,116,104,101,114,115,41,0,0,0,27,42,109,37,100,66,0,0,121,100,116,105,36,99,115,0,27,42,100,84,0,0,0,0,9,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,0,0,0,0,110,111,115,113,36,117,97,114,101,0,0,0,0,0,0,0,115,101,116,32,107,101,121,32,37,115,111,112,97,113,117,101,10,0,0,0,0,0,0,0,72,80,50,54,0,0,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,102,102,46,10,0,0,0,0,0,37,100,44,37,100,79,0,0,37,100,44,37,100,80,0,0,102,108,105,112,120,0,0,0,27,42,100,0,0,0,0,0,27,42,109,37,100,78,0,0,9,102,111,110,116,112,97,116,104,32,105,115,32,101,109,112,116,121,10,0,0,0,0,0,27,42,109,49,109,49,110,49,51,54,44,49,99,90,0,0,120,50,94,123,37,100,125,0,27,42,100,97,99,90,0,0,105,110,118,97,108,105,100,32,97,120,105,115,0,0,0,0,27,42,112,97,102,37,100,44,37,100,90,0,0,0,0,0,113,109,115,0,0,0,0,0,27,42,112,98,102,37,100,44,37,100,90,0,0,0,0,0,110,111,120,50,100,116,105,36,99,115,0,0,0,0,0,0,27,42,109,37,100,98,90,0,9,105,115,111,32,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,110,111,114,97,36,116,105,111,0,0,0,0,0,0,0,0,10,115,101,116,32,107,101,121,32,109,97,120,99,111,108,117,109,110,115,32,37,100,32,109,97,120,114,111,119,115,32,37,100,0,0,0,0,0,0,0,27,42,108,37,115,10,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,110,46,10,0,0,0,0,0,0,27,42,109,37,100,110,90,10,0,0,0,0,0,0,0,0,110,111,101,106,101,99,116,0,120,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,120,95,109,97,120,51,100,33,0,0,0,0,0,0,0,67,117,114,114,101,110,116,108,121,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,116,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,0,0,0,0,0,105,115,111,36,95,56,56,53,57,95,49,0,0,0,0,0,101,106,101,99,116,0,0,0,32,116,121,112,101,10,0,0,37,100,32,112,101,110,115,32,37,115,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,101,106,101,99,116,34,32,111,114,32,110,117,109,98,101,114,32,111,102,32,112,101,110,115,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,101,110,115,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,101,106,101,36,99,116,0,0,80,111,115,116,83,99,114,105,112,116,32,103,114,97,112,104,105,99,115,44,32,105,110,99,108,117,100,105,110,103,32,69,80,83,70,32,101,109,98,101,100,100,101,100,32,102,105,108,101,115,32,40,42,46,101,112,115,41,0,0,0,0,0,0,80,85,83,80,48,59,80,71,59,27,46,90,10,0,0,0,120,50,100,116,105,36,99,11
|
||
|
.concat([97,114,99,0,0,0,0,0,98,109,97,114,103,105,110,0,99,111,108,111,117,114,116,36,101,120,116,0,0,0,0,0,112,114,101,118,105,111,117,115,32,122,111,111,109,46,10,0,99,111,108,111,114,116,36,101,120,116,0,0,0,0,0,0,98,36,108,97,99,107,116,101,120,116,0,0,0,0,0,0,67,111,117,108,100,110,39,116,32,115,108,117,114,112,32,37,108,100,32,98,121,116,101,115,32,40,114,101,116,117,114,110,32,119,97,115,32,37,122,100,41,10,0,0,0,0,0,0,100,101,102,36,97,117,108,116,0,0,0,0,0,0,0,0,109,36,111,110,111,99,104,114,111,109,101,0,0,0,0,0,116,104,105,115,0,0,0,0,120,111,114,0,0,0,0,0,101,112,36,115,102,0,0,0,32,102,111,110,116,115,99,97,108,101,32,37,51,46,49,102,32,0,0,0,0,0,0,0,37,103,32,0,0,0,0,0,71,80,86,65,76,0,0,0,34,37,115,34,32,37,103,32,0,0,0,0,0,0,0,0,97,115,99,105,105,32,97,114,116,32,102,111,114,32,97,110,121,116,104,105,110,103,32,116,104,97,116,32,112,114,105,110,116,115,32,116,101,120,116,0,34,37,115,34,32,37,103,37,115,32,0,0,0,0,0,0,121,108,36,97,98,101,108,0,100,102,95,114,101,97,100,98,105,110,97,114,121,32,115,108,117,114,112,101,114,0,0,0,112,97,36,117,115,101,0,0,32,37,115,97,100,111,98,101,103,108,121,112,104,110,97,109,101,115,32,92,10,32,32,32,0,0,0,0,0,0,0,0,114,97,100,105,117,115,0,0,111,117,116,36,112,117,116,0,116,109,97,114,103,105,110,0,110,111,104,101,97,100,101,114,32,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,122,111,111,109,45,112,114,101,118,105,111,117,115,96,32,103,111,32,116,111,32,112,114,101,118,105,111,117,115,32,122,111,111,109,32,105,110,32,116,104,101,32,122,111,111,109,32,115,116,97,99,107,0,0,0,104,101,97,100,101,114,32,34,37,115,34,32,0,0,0,0,110,111,97,117,120,102,105,108,101,0,0,0,0,0,0,0,97,117,120,102,105,108,101,0,37,115,32,37,115,32,0,0,32,32,32,112,97,108,102,117,110,99,112,97,114,97,109,32,37,100,44,37,103,32,92,10,32,32,32,0,0,0,0,0,45,66,65,67,75,87,65,82,68,83,95,67,79,77,80,65,84,73,66,73,76,73,84,89,32,32,0,0,0,0,0,0,32,32,32,110,111,98,97,99,107,103,114,111,117,110,100,32,92,10,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,83,73,90,69,0,0,0,0,0,0,0,0,32,32,32,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,32,92,10,0,0,0,0,0,0,0,0,100,117,109,98,0,0,0,0,110,111,99,108,105,112,0,0,120,50,108,36,97,98,101,108,0,0,0,0,0,0,0,0,99,108,105,112,0,0,0,0,116,105,99,115,32,97,114,101,32,105,110,32,37,115,32,111,102,32,112,108,111,116,10,0,99,101,110,36,116,101,114,0,111,117,116,115,105,100,101,0,99,111,108,111,114,116,101,120,116,0,0,0,0,0,0,0,98,108,97,99,107,116,101,120,116,0,0,0,0,0,0,0,108,101,118,101,108,100,101,102,97,117,108,116,0,0,0,0,83,99,97,110,32,115,105,122,101,32,111,102,32,109,97,116,114,105,120,32,105,115,32,122,101,114,111,0,0,0,0,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,37,115,102,105,120,109,105,110,10,0,108,101,118,101,108,49,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,111,110,108,121,32,102,111,114,32,100,97,116,97,102,105,108,101,115,32,44,32,114,101,118,101,114,116,105,110,103,32,116,111,32,34,112,111,105,110,116,115,34,0,0,0,32,32,32,37,115,32,37,115,32,37,115,32,92,10,32,32,32,37,115,32,100,97,115,104,108,101,110,103,116,104,32,37,46,49,102,32,108,105,110,101,119,105,100,116,104,32,37,46,49,102,32,37,115,32,37,115,32,92,10,0,0,0,0,0,32,97,117,120,102,105,108,101,0,0,0,0,0,0,0,0,115,121,110,116,97,120,58,32,32,103,110,117,112,108,111,116,32,45,101,32,34,99,111,109,109,97,110,100,115,34,10,0,110,111,114,111,116,97,116,101,0,0,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,88,83,73,90,69,0,0,0,0,0,0,0,0,114,111,116,97,116,101,0,0,114,101,102,114,101,115,104,32,110,111,116,32,112,111,115,115,105,98,108,101,32,97,110,100,32,114,101,112,108,111,116,32,105,115,32,100,105,115,97,98,108,101,100,0,0,0,0,0,69,80,83,32,102,111,114,109,97,116,32,102,111,114,32,67,111,114,101,108,68,82,65,87,0,0,0,0,0,0,0,0,100,101,102,97,117,108,116,112,108,101,120,0,0,0,0,0,120,108,36,97,98,101,108,0,67,108,101,97,114,0,0,0,115,105,109,112,108,101,120,0,9,120,121,112,108,97,110,101,32,116,105,99,115,108,101,118,101,108,32,105,115,32,37,103,10,0,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,116,111,3
|
||
|
.concat([110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,32,32,92,100,101,102,92,108,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,115,116,97,99,107,35,35,49,123,92,108,101,116,92,92,61,92,99,114,92,116,97,98,115,107,105,112,61,48,112,116,92,104,97,108,105,103,110,123,92,104,102,105,108,32,35,35,35,35,92,104,102,105,108,92,99,114,32,35,35,49,92,99,114,99,114,125,125,37,37,10,32,32,32,32,92,100,101,102,92,108,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,115,116,97,99,107,123,35,35,49,125,92,118,115,115,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,118,115,115,92,104,98,111,120,32,116,111,35,49,92,71,78,85,80,76,79,84,117,110,105,116,92,98,103,114,111,117,112,92,105,103,110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,92,103,100,101,102,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,123,92,104,115,115,92,101,103,114,111,117,112,92,101,103,114,111,117,112,125,37,37,10,92,102,105,10,92,71,78,85,80,76,79,84,117,110,105,116,61,37,46,52,102,98,112,10,0,104,105,115,116,111,103,114,97,109,115,0,0,0,0,0,0,98,111,114,0,0,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,48,44,48,41,37,37,10,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,92,98,101,103,105,110,103,114,111,117,112,37,37,10,92,109,97,107,101,97,116,108,101,116,116,101,114,37,37,10,92,110,101,119,99,111,109,109,97,110,100,123,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,125,123,37,37,10,32,32,92,64,115,97,110,105,116,105,122,101,92,99,97,116,99,111,100,101,96,92,37,37,61,49,52,92,114,101,108,97,120,92,115,112,101,99,105,97,108,125,37,37,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,46,52,102,98,112,125,37,37,10,0,80,108,111,116,32,102,97,105,108,101,100,33,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,108,111,97,100,112,97,116,104,32,97,112,112,114,111,112,114,105,97,116,101,108,121,10,0,0,0,0,0,0,86,84,45,108,105,107,101,32,116,101,107,52,48,120,120,32,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,0,0,0,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,97,108,32,118,97,114,105,97,98,108,101,32,71,78,85,80,76,79,84,95,80,83,95,68,73,82,10,0,0,0,0,0,0,0,118,105,36,101,119,0,0,0,108,36,111,97,100,0,0,0,80,108,101,97,115,101,32,99,111,112,121,32,37,115,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,97,98,111,118,101,32,100,105,114,101,99,116,111,114,105,101,115,10,0,9,114,111,116,97,116,101,100,32,105,102,32,116,104,101,32,116,101,114,109,105,110,97,108,32,97,108,108,111,119,115,32,105,116,10,9,0,0,0,0,103,97,112,0,0,0,0,0,32,92,10,0,0,0,0,0,67,97,110,39,116,32,102,105,110,100,32,80,111,115,116,83,99,114,105,112,116,32,112,114,111,108,111,103,117,101,32,102,105,108,10
|
||
|
.concat([80,108,115,0,0,0,0,0,98,97,100,32,115,121,110,116,97,120,32,105,110,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,115,116,114,105,110,103,0,0,0,0,0,0,80,110,116,0,0,0,0,0,99,111,108,111,114,98,36,111,120,0,0,0,0,0,0,0,103,115,97,118,101,32,91,93,32,48,32,115,101,116,100,97,115,104,10,0,0,0,0,0,9,78,111,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,100,117,114,105,110,103,32,100,97,116,97,32,105,110,112,117,116,10,0,114,97,119,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,32,83,101,101,32,39,104,101,108,112,32,115,101,116,39,46,0,0,0,114,97,110,103,101,0,0,0,115,101,116,32,115,116,121,108,101,32,101,108,108,105,112,115,101,32,115,105,122,101,32,0,47,118,115,104,105,102,116,32,37,100,32,100,101,102,10,0,97,0,0,0,0,0,0,0,47,37,115,32,102,105,110,100,102,111,110,116,32,37,103,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,37,102,0,0,0,0,0,0,109,105,115,115,105,110,103,32,102,105,108,101,110,97,109,101,0,0,0,0,0,0,0,0,37,46,51,102,32,85,80,10,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,116,105,116,108,101,34,32,102,111,114,32,112,108,111,116,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,48,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,110,101,119,104,105,115,116,36,111,103,114,97,109,0,0,0,49,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,0,0,0,87,65,82,78,73,78,71,58,32,69,114,114,111,114,32,100,117,114,105,110,103,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,10,10,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,50,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,49,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,82,95,77,73,78,0,0,0,0,0,39,59,39,32,101,120,112,101,99,116,101,100,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,112,97,114,115,101,114,32,45,32,115,112,117,114,105,111,117,115,32,125,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,70,105,108,108,10,0,0,0,0,112,97,108,36,101,116,116,101,0,0,0,0,0,0,0,0,98,105,110,100,58,32,99,97,110,110,111,116,32,112,97,114,115,101,32,37,115,10,0,0,10,32,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,116,114,117,101,32,100,101,102,10,0,0,0,0,0,0,0,0,9,68,97,116,97,102,105,108,101,32,112,97,114,115,105,110,103,32,119,105,108,108,32,97,99,99,101,112,116,32,70,111,114,116,114,97,110,32,68,32,111,114,32,81,32,99,111,110,115,116,97,110,116,115,10,0,112,116,0,0,0,0,0,0,121,48,32,48,32,78,32,48,32,49,32,86,32,121,115,116,101,112,32,48,32,86,32,48,32,45,49,32,102,10,0,0,32,10,0,0,0,0,0,0,37,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,67,97,110,110,111,116,32,115,109,111,111,116,104,58,32,110,111,32,100,97,116,97,32,119,105,116,104,105,110,32,102,105,120,101,100,32,120,114,97,110,103,101,33,0,0,0,0,0,37,115,65,108,116,45,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,97,114,103,117,109,101,110,116,32,110,101,105,116,104,101,114,32,73,78,84,32,111,114,32,67,77,80,76,88,0,0,37,100,32,37,100,32,37,100,32,37,100,32,82,101,99,32,102,105,108,108,10,0,0,0,37,46,51,102,32,85,76,10,0,0,0,0,0,0,0,0,37,115,102,108,105,112,32,121,0,0,0,0,0,0,0,0,32,32,105,102,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,88,89,90,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,67,77,89,41,32,101,113,32,123,67,77,89,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,89,73,81,41,32,101,113,32,123,89,73,81,50,82,71,66,125,10,0,105,110,118,101,114,115,101,95,110,111,114,109,97,108,95,102,117,110,99,0,0,0,0,0,47,83,101,108,101,99,116,83,112,97,99,101,32,123,67,111,108,111,114,83,112,97,99,101,32,40,72,83,86,41,32,101,113,32,123,72,83,86,50,82,71,66,125,123,67,111,108,111
|
||
|
.concat([115,101,116,32,116,101,114,109,111,112,116,32,110,111,101,110,104,0,0,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,57,32,100,101,102,10,0,0,0,0,0,0,0,110,111,109,120,116,36,105,99,115,0,0,0,0,0,0,0,100,97,116,97,102,105,108,101,32,99,111,108,117,109,110,115,32,98,105,110,97,114,121,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,50,32,100,101,102,10,0,0,0,0,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,50,32,105,115,32,37,100,10,0,0,0,0,0,35,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,114,101,101,110,99,111,100,101,73,83,79,32,100,101,102,10,0,0,0,0,0,0,0,0,122,111,111,109,32,105,110,32,111,110,108,121,32,116,104,101,32,88,32,97,120,105,115,46,0,0,0,0,0,0,0,0,80,111,115,116,83,99,114,105,112,116,32,70,111,110,116,32,114,101,99,111,114,100,0,0,123,125,91,93,40,41,32,0,99,97,110,110,111,116,32,119,114,105,116,101,32,116,101,109,112,111,114,97,114,121,32,102,105,108,101,0,0,0,0,0,83,121,109,98,111,108,45,79,98,108,105,113,117,101,0,0,37,115,40,0,0,0,0,0,71,78,85,80,76,79,84,95,70,79,78,84,80,65,84,72,0,0,0,0,0,0,0,0,91,40,37,115,41,32,37,46,49,102,32,37,46,49,102,32,37,115,32,37,115,32,37,100,32,0,0,0,0,0,0,0,70,73,84,95,77,65,88,73,84,69,82,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,83,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,115,0,0,0,69,78,72,80,83,95,111,112,101,110,115,101,113,117,101,110,99,101,0,0,0,0,0,0,71,78,85,84,69,82,77,0,97,109,0,0,0,0,0,0,88,89,114,101,115,116,111,114,101,10,0,0,0,0,0,0,115,121,115,116,101,109,0,0,69,110,104,97,110,99,101,100,32,116,101,120,116,58,32,32,32,123,120,64,95,123,48,125,94,123,110,43,49,125,125,0,88,89,115,97,118,101,10,0,109,120,116,36,105,99,115,0,99,111,108,32,62,32,48,0,41,93,10,0,0,0,0,0,9,97,108,116,101,114,110,97,116,105,118,101,32,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,39,37,115,39,10,0,0,0,0,0,0,0,79,112,116,105,111,110,115,32,97,114,101,32,39,37,115,39,10,0,0,0,0,0,0,0,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,0,0,0,0,0,0,0,0,117,110,105,37,48,52,108,88,0,0,0,0,0,0,0,0,60,115,104,105,102,116,45,99,111,110,116,114,111,108,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,0,0,117,37,108,88,0,0,0,0,37,115,47,0,0,0,0,0,99,111,109,98,105,110,97,116,105,111,110,32,114,103,98,32,111,114,32,103,98,114,32,111,114,32,98,114,103,32,101,116,99,46,32,101,120,112,101,99,116,101,100,0,0,0,0,0,37,37,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,0,99,112,49,50,53,52,0,0,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,97,98,108,101,0,0,0,0,0,32,100,101,108,116,97,95,120,32,100,101,108,116,97,95,121,0,0,0,0,0,0,0,0,37,37,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,98,110,111,116,0,0,0,0,115,116,114,111,107,101,10,0,70,73,84,95,83,84,65,82,84,95,76,65,77,66,68,65,0,0,0,0,0,0,0,0,94,80,89,94,45,10,94,73,79,76,10,94,73,83,89,78,84,65,88,48,48,48,48,48,94,70,94,73,66,49,49,48,48,48,94,73,74,48,48,48,48,48,94,73,84,48,48,48,48,48,10,0,0,0,0,0,94,80,78,94,45,10,0,0,116,101,115,116,32,111,102,32,99,104,97,114,97,99,116,101,114,32,119,105,100,116,104,58,0,0,0,0,0,0,0,0,94,73,71,69,10,94,45,94,44,0,0,0,0,0,0,0,109,117,108,116,105,36,112,108,111,116,0,0,0,0,0,0,69,114,114,111,114,32,97,115,115,105,103,110,105,110,103,32,109,101,109,111,114,121,32,102,111,114,32,98,105,110,97,114,121,32,102,105,108,101,32,100,97,116,97,32,114,101,99,111,114,100,115,0,0,0,0,0,63,0,0,0,0,0,0,0,94,73,71,86,10,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,37,100,10,0,0,0,0,0,112,111,112,0,0,0,0,0,98,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,102,105,108,101,32,37,115,0,0,32,111,102,102,115,101,116,32,0,0,0,0,0,0,0,0,94,85,37,48,53,100,58,37,48,53,100,10,0,0,0,0,32,122,111,111,109,32,111,117,116,46,0,0,0,0,0,0,94,68,37,48,53,100,58,37,48,53,100,10,0,0,0,0,73,108,108,101,103,97,108,32,115,101,101,100,32,118,9
|
||
|
.concat([118,0,0,0,0,0,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,32,102,111,114,32,37,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,116,112,105,99,32,92,115,112,101,99,105,97,108,115,10,37,37,32,32,32,32,32,32,32,32,32,32,119,105,116,104,32,37,100,32,112,111,105,110,116,32,116,121,112,101,115,32,97,110,100,32,37,100,32,108,105,110,101,32,116,121,112,101,115,10,37,37,32,79,112,116,105,111,110,115,58,32,112,111,105,110,116,115,105,122,101,32,61,32,37,100,44,32,108,105,110,101,119,105,100,116,104,32,61,32,37,100,44,32,105,110,116,101,114,118,97,108,32,61,32,37,102,10,37,37,32,84,111,32,99,104,97,110,103,101,32,97,98,111,118,101,32,111,112,116,105,111,110,115,44,32,115,97,121,58,10,37,37,32,115,101,116,32,116,101,114,109,105,110,97,108,32,116,112,105,99,32,112,111,105,110,116,115,105,122,101,95,118,97,108,117,101,32,108,105,110,101,119,105,100,116,104,95,118,97,108,117,101,32,105,110,116,101,114,118,97,108,95,118,97,108,117,101,10,37,37,32,40,112,111,105,110,116,115,105,122,101,32,97,110,100,32,108,105,110,101,119,105,100,116,104,32,45,32,105,110,116,101,103,101,114,115,32,105,110,32,109,105,108,108,105,45,105,110,99,104,101,115,46,10,37,37,32,32,105,110,116,101,114,118,97,108,32,45,32,97,32,102,108,111,97,116,32,105,110,32,105,110,99,104,101,115,46,32,32,73,102,32,122,101,114,111,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,10,37,37,32,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,99,104,111,115,101,110,46,41,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,105,110,125,37,37,10,0,0,0,0,37,115,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,37,100,44,37,100,41,37,37,32,37,115,10,0,0,0,64,74,1,0,0,0,0,0,184,73,1,0,1,0,0,0,0,0,0,0,2,0,0,0,232,195,1,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,144,245,1,0,2,0,0,0,40,245,1,0,2,0,0,0,32,50,1,0,3,0,0,0,232,49,1,0,4,0,0,0,200,49,1,0,5,0,0,0,40,195,1,0,6,0,0,0,192,49,1,0,7,0,0,0,192,229,1,0,8,0,0,0,72,236,1,0,10,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,166,1,0,200,165,1,0,248,164,1,0,184,164,1,0,88,164,1,0,8,164,1,0,176,163,1,0,120,163,1,0,64,163,1,0,232,162,1,0,152,162,1,0,248,161,1,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,98,101,103,105,110,123,116,101,120,100,114,97,119,125,10,92,110,111,114,109,97,108,115,105,122,101,10,92,105,102,120,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,92,101,108,115,101,92,108,101,116,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,10,32,92,100,101,102,92,81,116,71,102,114,123,92,105,102,120,32,40,92,84,71,114,101,32,92,108,101,116,92,89,104,101,116,84,92,99,112,97,116,104,92,101,108,115,101,92,108,101,116,92,89,104,101,116,84,92,114,101,108,97,120,92,102,105,92,89,104,101,116,84,125,10,32,92,100,101,102,92,112,97,116,104,32,40,35,49,32,35,50,41,123,92,109,111,118,101,32,40,35,49,32,35,50,41,92,102,117,116,
|
||
|
.concat([136,193,2,0,128,193,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,52,16,0,0,0,0,0,0,120,193,2,0,40,193,2,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,34,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,208,192,2,0,144,192,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,16,0,0,0,0,0,0,40,192,2,0,8,192,2,0,108,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,45,16,0,0,0,0,0,0,216,191,2,0,200,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,72,16,0,0,0,0,0,0,128,191,2,0,120,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,218,64,0,0,0,0,0,0,104,191,2,0,176,98,1,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,3,16,0,0,0,0,0,0,40,191,2,0,16,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,101,16,0,0,0,0,0,0,200,190,2,0,136,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,6,16,0,0,0,0,0,0,104,190,2,0,80,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,17,16,0,0,0,0,0,0,64,190,2,0,32,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,1,0,0,0,10,17,0,0,0,0,0,0,8,190,2,0,248,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,66,0,0,0,0,0,0,216,189,2,0,200,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,4,0,0,0,3,0,0,0,44,16,0,0,0,0,0,0,144,189,2,0,24,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,20,16,0,0,0,0,0,0,248,188,2,0,208,188,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,201,16,0,0,0,0,0,0,168,188,2,0,144,188,2,0,109,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,46,65,0,0,0,0,0,0,128,188,2,0,96,188,2,0,108,72,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,170,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,152,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,1,0,0,0,7,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,32,32,114,117,108,101,114,58,32,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,84,2,0,152,190,2,0,152,190,2,0,24,84,2,0,8,84,2,0,248,83,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,73,84,95,76,79,71,0,176,4,0,0,0,0,0,0,176,4,0,0,0,0,0,0,51,46,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,160,2,0,3,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,80,248,1,0,15,0,0,0,24,160,2,0,12,0,0,0,192,229,1,0,9,0,0,0,240,159,2,0,10,0,0,0,96,255,1,0,4,0,0,0,232,49,1,0,7,0,0,0,200,159,2,0,5,0,0,0,232,195,1,0,0,0,0,0,184,159,2,0,13,0,0,0,152,159,2,0,6,0,0,0,120,97,1,0,8,0,0,0,144,159,2,0,2,0,0,0,232,247,1,0,14,0,0,0,144,245,1,0,11,0,0,0,112,159,2,0,11,0,0,0,24,159,2,0,18,0,0,0,240,158,2,0,16,0,0,0,192,158,2,0,19,0,0,0,176,158,2,0,17,0,0,0,144,158,2,0,20,0,0,0,0,0,0,0,21,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,6,0,0,0,
|
||
|
, "i8", ALLOC_NONE, Runtime.GLOBAL_BASE)
|
||
|
function runPostSets() {
|
||
|
}
|
||
|
if (!awaitingMemoryInitializer) runPostSets();
|
||
|
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];
|
||
|
}
|
||
|
var _log=Math.log;
|
||
|
var _fabs=Math.abs;
|
||
|
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:35,EIDRM:36,ECHRNG:37,EL2NSYNC:38,EL3HLT:39,EL3RST:40,ELNRNG:41,EUNATCH:42,ENOCSI:43,EL2HLT:44,EDEADLK:45,ENOLCK:46,EBADE:50,EBADR:51,EXFULL:52,ENOANO:53,EBADRQC:54,EBADSLT:55,EDEADLOCK:56,EBFONT:57,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:74,ELBIN:75,EDOTDOT:76,EBADMSG:77,EFTYPE:79,ENOTUNIQ:80,EBADFD:81,EREMCHG:82,ELIBACC:83,ELIBBAD:84,ELIBSCN:85,ELIBMAX:86,ELIBEXEC:87,ENOSYS:88,ENMFILE:89,ENOTEMPTY:90,ENAMETOOLONG:91,ELOOP:92,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:106,EPROTOTYPE:107,ENOTSOCK:108,ENOPROTOOPT:109,ESHUTDOWN:110,ECONNREFUSED:111,EADDRINUSE:112,ECONNABORTED:113,ENETUNREACH:114,ENETDOWN:115,ETIMEDOUT:116,EHOSTDOWN:117,EHOSTUNREACH:118,EINPROGRESS:119,EALREADY:120,EDESTADDRREQ:121,EMSGSIZE:122,EPROTONOSUPPORT:123,ESOCKTNOSUPPORT:124,EADDRNOTAVAIL:125,ENETRESET:126,EISCONN:127,ENOTCONN:128,ETOOMANYREFS:129,EPROCLIM:130,EUSERS:131,EDQUOT:132,ESTALE:133,ENOTSUP:134,ENOMEDIUM:135,ENOSHARE:136,ECASECLASH:137,EILSEQ:138,EOVERFLOW:139,ECANCELED:140,ENOTRECOVERABLE:141,EOWNERDEAD:142,ESTRPIPE:143};
|
||
|
var ___errno_state=0;function ___setErrNo(value) {
|
||
|
// For convenient setting and returning of errno.
|
||
|
HEAP32[((___errno_state)>>2)]=value
|
||
|
return value;
|
||
|
}
|
||
|
var _stdin=allocate(1, "i32*", ALLOC_STATIC);
|
||
|
var _stdout=allocate(1, "i32*", ALLOC_STATIC);
|
||
|
var _stderr=allocate(1, "i32*", ALLOC_STATIC);
|
||
|
var __impure_ptr=allocate(1, "i32*", ALLOC_STATIC);var FS={currentPath:"/",nextInode:2,streams:[null],ignorePermissions:true,createFileHandle:function (stream, fd) {
|
||
|
if (typeof stream === 'undefined') {
|
||
|
stream = null;
|
||
|
}
|
||
|
if (!fd) {
|
||
|
if (stream && stream.socket) {
|
||
|
for (var i = 1; i < 64; i++) {
|
||
|
if (!FS.streams[i]) {
|
||
|
fd = i;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
assert(fd, 'ran out of low fds for sockets');
|
||
|
} else {
|
||
|
fd = Math.max(FS.streams.length, 64);
|
||
|
for (var i = FS.streams.length; i < fd; i++) {
|
||
|
FS.streams[i] = null; // Keep dense
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Close WebSocket first if we are about to replace the fd (i.e. dup2)
|
||
|
if (FS.streams[fd] && FS.streams[fd].socket && FS.streams[fd].socket.close) {
|
||
|
FS.streams[fd].socket.close();
|
||
|
}
|
||
|
FS.streams[fd] = stream;
|
||
|
return fd;
|
||
|
},removeFileHandle:function (fd) {
|
||
|
FS.streams[fd] = null;
|
||
|
},joinPath:function (parts, forceRelative) {
|
||
|
var ret = parts[0];
|
||
|
for (var i = 1; i < parts.length; i++) {
|
||
|
if (ret[ret.length-1] != '/') ret += '/';
|
||
|
ret += parts[i];
|
||
|
}
|
||
|
if (forceRelative && ret[0] == '/') ret = ret.substr(1);
|
||
|
return ret;
|
||
|
},absolutePath:function (relative, base) {
|
||
|
if (typeof relative !== 'string') return null;
|
||
|
if (base === undefined) base = FS.currentPath;
|
||
|
if (relative && relative[0] == '/') base = '';
|
||
|
var full = base + '/' + relative;
|
||
|
var parts = full.split('/').reverse();
|
||
|
var absolute = [''];
|
||
|
while (parts.length) {
|
||
|
var part = parts.pop();
|
||
|
if (part == '' || part == '.') {
|
||
|
// Nothing.
|
||
|
} else if (part == '..') {
|
||
|
if (absolute.length > 1) absolute.pop();
|
||
|
} else {
|
||
|
absolute.push(part);
|
||
|
}
|
||
|
}
|
||
|
return absolute.length == 1 ? '/' : absolute.join('/');
|
||
|
},analyzePath:function (path, dontResolveLastLink, linksVisited) {
|
||
|
var ret = {
|
||
|
isRoot: false,
|
||
|
exists: false,
|
||
|
error: 0,
|
||
|
name: null,
|
||
|
path: null,
|
||
|
object: null,
|
||
|
parentExists: false,
|
||
|
parentPath: null,
|
||
|
parentObject: null
|
||
|
};
|
||
|
path = FS.absolutePath(path);
|
||
|
if (path == '/') {
|
||
|
ret.isRoot = true;
|
||
|
ret.exists = ret.parentExists = true;
|
||
|
ret.name = '/';
|
||
|
ret.path = ret.parentPath = '/';
|
||
|
ret.object = ret.parentObject = FS.root;
|
||
|
} else if (path !== null) {
|
||
|
linksVisited = linksVisited || 0;
|
||
|
path = path.slice(1).split('/');
|
||
|
var current = FS.root;
|
||
|
var traversed = [''];
|
||
|
while (path.length) {
|
||
|
if (path.length == 1 && current.isFolder) {
|
||
|
ret.parentExists = true;
|
||
|
ret.parentPath = traversed.length == 1 ? '/' : traversed.join('/');
|
||
|
ret.parentObject = current;
|
||
|
ret.name = path[0];
|
||
|
}
|
||
|
var target = path.shift();
|
||
|
if (!current.isFolder) {
|
||
|
ret.error = ERRNO_CODES.ENOTDIR;
|
||
|
break;
|
||
|
} else if (!current.read) {
|
||
|
ret.error = ERRNO_CODES.EACCES;
|
||
|
break;
|
||
|
} else if (!current.contents.hasOwnProperty(target)) {
|
||
|
ret.error = ERRNO_CODES.ENOENT;
|
||
|
break;
|
||
|
}
|
||
|
current = current.contents[target];
|
||
|
if (current.link && !(dontResolveLastLink && path.length == 0)) {
|
||
|
if (linksVisited > 40) { // Usual Linux SYMLOOP_MAX.
|
||
|
ret.error = ERRNO_CODES.ELOOP;
|
||
|
break;
|
||
|
}
|
||
|
var link = FS.absolutePath(current.link, traversed.join('/'));
|
||
|
ret = FS.analyzePath([link].concat(path).join('/'),
|
||
|
dontResolveLastLink, linksVisited + 1);
|
||
|
return ret;
|
||
|
}
|
||
|
traversed.push(target);
|
||
|
if (path.length == 0) {
|
||
|
ret.exists = true;
|
||
|
ret.path = traversed.join('/');
|
||
|
ret.object = current;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
},findObject:function (path, dontResolveLastLink) {
|
||
|
FS.ensureRoot();
|
||
|
var ret = FS.analyzePath(path, dontResolveLastLink);
|
||
|
if (ret.exists) {
|
||
|
return ret.object;
|
||
|
} else {
|
||
|
___setErrNo(ret.error);
|
||
|
return null;
|
||
|
}
|
||
|
},createObject:function (parent, name, properties, canRead, canWrite) {
|
||
|
if (!parent) parent = '/';
|
||
|
if (typeof parent === 'string') parent = FS.findObject(parent);
|
||
|
if (!parent) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
throw new Error('Parent path must exist.');
|
||
|
}
|
||
|
if (!parent.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.ENOTDIR);
|
||
|
throw new Error('Parent must be a folder.');
|
||
|
}
|
||
|
if (!parent.write && !FS.ignorePermissions) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
throw new Error('Parent folder must be writeable.');
|
||
|
}
|
||
|
if (!name || name == '.' || name == '..') {
|
||
|
___setErrNo(ERRNO_CODES.ENOENT);
|
||
|
throw new Error('Name must not be empty.');
|
||
|
}
|
||
|
if (parent.contents.hasOwnProperty(name)) {
|
||
|
___setErrNo(ERRNO_CODES.EEXIST);
|
||
|
throw new Error("Can't overwrite object.");
|
||
|
}
|
||
|
parent.contents[name] = {
|
||
|
read: canRead === undefined ? true : canRead,
|
||
|
write: canWrite === undefined ? false : canWrite,
|
||
|
timestamp: Date.now(),
|
||
|
inodeNumber: FS.nextInode++
|
||
|
};
|
||
|
for (var key in properties) {
|
||
|
if (properties.hasOwnProperty(key)) {
|
||
|
parent.contents[name][key] = properties[key];
|
||
|
}
|
||
|
}
|
||
|
return parent.contents[name];
|
||
|
},createFolder:function (parent, name, canRead, canWrite) {
|
||
|
var properties = {isFolder: true, isDevice: false, contents: {}};
|
||
|
return FS.createObject(parent, name, properties, canRead, canWrite);
|
||
|
},createPath:function (parent, path, canRead, canWrite) {
|
||
|
var current = FS.findObject(parent);
|
||
|
if (current === null) throw new Error('Invalid parent.');
|
||
|
path = path.split('/').reverse();
|
||
|
while (path.length) {
|
||
|
var part = path.pop();
|
||
|
if (!part) continue;
|
||
|
if (!current.contents.hasOwnProperty(part)) {
|
||
|
FS.createFolder(current, part, canRead, canWrite);
|
||
|
}
|
||
|
current = current.contents[part];
|
||
|
}
|
||
|
return current;
|
||
|
},createFile:function (parent, name, properties, canRead, canWrite) {
|
||
|
properties.isFolder = false;
|
||
|
return FS.createObject(parent, name, properties, canRead, canWrite);
|
||
|
},createDataFile:function (parent, name, data, canRead, canWrite) {
|
||
|
if (typeof data === 'string') {
|
||
|
var dataArray = new Array(data.length);
|
||
|
for (var i = 0, len = data.length; i < len; ++i) dataArray[i] = data.charCodeAt(i);
|
||
|
data = dataArray;
|
||
|
}
|
||
|
var properties = {
|
||
|
isDevice: false,
|
||
|
contents: data.subarray ? data.subarray(0) : data // as an optimization, create a new array wrapper (not buffer) here, to help JS engines understand this object
|
||
|
};
|
||
|
return FS.createFile(parent, name, properties, canRead, canWrite);
|
||
|
},createLazyFile:function (parent, name, url, canRead, canWrite) {
|
||
|
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';
|
||
|
// Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
|
||
|
var LazyUint8Array = function() {
|
||
|
this.lengthKnown = false;
|
||
|
this.chunks = []; // Loaded chunks. Index is the chunk number
|
||
|
}
|
||
|
LazyUint8Array.prototype.get = function(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(getter) {
|
||
|
this.getter = getter;
|
||
|
}
|
||
|
LazyUint8Array.prototype.cacheLength = function() {
|
||
|
// 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;
|
||
|
}
|
||
|
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 };
|
||
|
}
|
||
|
return FS.createFile(parent, name, properties, canRead, canWrite);
|
||
|
},createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile) {
|
||
|
Browser.init();
|
||
|
var fullname = FS.joinPath([parent, name], true);
|
||
|
function processData(byteArray) {
|
||
|
function finish(byteArray) {
|
||
|
if (!dontCreateFile) {
|
||
|
FS.createDataFile(parent, name, byteArray, canRead, canWrite);
|
||
|
}
|
||
|
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);
|
||
|
}
|
||
|
},createLink:function (parent, name, target, canRead, canWrite) {
|
||
|
var properties = {isDevice: false, link: target};
|
||
|
return FS.createFile(parent, name, properties, canRead, canWrite);
|
||
|
},createDevice:function (parent, name, input, output) {
|
||
|
if (!(input || output)) {
|
||
|
throw new Error('A device must have at least one callback defined.');
|
||
|
}
|
||
|
var ops = {isDevice: true, input: input, output: output};
|
||
|
return FS.createFile(parent, name, ops, Boolean(input), Boolean(output));
|
||
|
},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;
|
||
|
},ensureRoot:function () {
|
||
|
if (FS.root) return;
|
||
|
// The main file system tree. All the contents are inside this.
|
||
|
FS.root = {
|
||
|
read: true,
|
||
|
write: true,
|
||
|
isFolder: true,
|
||
|
isDevice: false,
|
||
|
timestamp: Date.now(),
|
||
|
inodeNumber: 1,
|
||
|
contents: {}
|
||
|
};
|
||
|
},init:function (input, output, error) {
|
||
|
// Make sure we initialize only once.
|
||
|
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.ensureRoot();
|
||
|
// Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
|
||
|
input = input || Module['stdin'];
|
||
|
output = output || Module['stdout'];
|
||
|
error = error || Module['stderr'];
|
||
|
// Default handlers.
|
||
|
var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true;
|
||
|
if (!input) {
|
||
|
stdinOverridden = false;
|
||
|
input = function() {
|
||
|
if (!input.cache || !input.cache.length) {
|
||
|
var result;
|
||
|
if (typeof window != 'undefined' &&
|
||
|
typeof window.prompt == 'function') {
|
||
|
// Browser.
|
||
|
result = window.prompt('Input: ');
|
||
|
if (result === null) result = String.fromCharCode(0); // cancel ==> EOF
|
||
|
} else if (typeof readline == 'function') {
|
||
|
// Command line.
|
||
|
result = readline();
|
||
|
}
|
||
|
if (!result) result = '';
|
||
|
input.cache = intArrayFromString(result + '\n', true);
|
||
|
}
|
||
|
return input.cache.shift();
|
||
|
};
|
||
|
}
|
||
|
var utf8 = new Runtime.UTF8Processor();
|
||
|
function simpleOutput(val) {
|
||
|
if (val === null || val === 10) {
|
||
|
output.printer(output.buffer.join(''));
|
||
|
output.buffer = [];
|
||
|
} else {
|
||
|
output.buffer.push(utf8.processCChar(val));
|
||
|
}
|
||
|
}
|
||
|
if (!output) {
|
||
|
stdoutOverridden = false;
|
||
|
output = simpleOutput;
|
||
|
}
|
||
|
if (!output.printer) output.printer = Module['print'];
|
||
|
if (!output.buffer) output.buffer = [];
|
||
|
if (!error) {
|
||
|
stderrOverridden = false;
|
||
|
error = simpleOutput;
|
||
|
}
|
||
|
if (!error.printer) error.printer = Module['print'];
|
||
|
if (!error.buffer) error.buffer = [];
|
||
|
// Create the temporary folder, if not already created
|
||
|
try {
|
||
|
FS.createFolder('/', 'tmp', true, true);
|
||
|
} catch(e) {}
|
||
|
// Create the I/O devices.
|
||
|
var devFolder = FS.createFolder('/', 'dev', true, true);
|
||
|
var stdin = FS.createDevice(devFolder, 'stdin', input);
|
||
|
var stdout = FS.createDevice(devFolder, 'stdout', null, output);
|
||
|
var stderr = FS.createDevice(devFolder, 'stderr', null, error);
|
||
|
FS.createDevice(devFolder, 'tty', input, output);
|
||
|
FS.createDevice(devFolder, 'null', function(){}, function(){});
|
||
|
// Create default streams.
|
||
|
FS.streams[1] = {
|
||
|
path: '/dev/stdin',
|
||
|
object: stdin,
|
||
|
position: 0,
|
||
|
isRead: true,
|
||
|
isWrite: false,
|
||
|
isAppend: false,
|
||
|
isTerminal: !stdinOverridden,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: []
|
||
|
};
|
||
|
FS.streams[2] = {
|
||
|
path: '/dev/stdout',
|
||
|
object: stdout,
|
||
|
position: 0,
|
||
|
isRead: false,
|
||
|
isWrite: true,
|
||
|
isAppend: false,
|
||
|
isTerminal: !stdoutOverridden,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: []
|
||
|
};
|
||
|
FS.streams[3] = {
|
||
|
path: '/dev/stderr',
|
||
|
object: stderr,
|
||
|
position: 0,
|
||
|
isRead: false,
|
||
|
isWrite: true,
|
||
|
isAppend: false,
|
||
|
isTerminal: !stderrOverridden,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: []
|
||
|
};
|
||
|
// TODO: put these low in memory like we used to assert on: assert(Math.max(_stdin, _stdout, _stderr) < 15000); // make sure these are low, we flatten arrays with these
|
||
|
HEAP32[((_stdin)>>2)]=1;
|
||
|
HEAP32[((_stdout)>>2)]=2;
|
||
|
HEAP32[((_stderr)>>2)]=3;
|
||
|
// Other system paths
|
||
|
FS.createPath('/', 'dev/shm/tmp', true, true); // temp files
|
||
|
// Newlib initialization
|
||
|
for (var i = FS.streams.length; i < Math.max(_stdin, _stdout, _stderr) + 4; i++) {
|
||
|
FS.streams[i] = null; // Make sure to keep FS.streams dense
|
||
|
}
|
||
|
FS.streams[_stdin] = FS.streams[1];
|
||
|
FS.streams[_stdout] = FS.streams[2];
|
||
|
FS.streams[_stderr] = FS.streams[3];
|
||
|
allocate([ allocate(
|
||
|
[0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0],
|
||
|
'void*', ALLOC_NORMAL) ], 'void*', ALLOC_NONE, __impure_ptr);
|
||
|
},quit:function () {
|
||
|
if (!FS.init.initialized) return;
|
||
|
// Flush any partially-printed lines in stdout and stderr. Careful, they may have been closed
|
||
|
if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output(10);
|
||
|
if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output(10);
|
||
|
},standardizePath:function (path) {
|
||
|
if (path.substr(0, 2) == './') path = path.substr(2);
|
||
|
return path;
|
||
|
},deleteFile:function (path) {
|
||
|
path = FS.analyzePath(path);
|
||
|
if (!path.parentExists || !path.exists) {
|
||
|
throw 'Invalid path ' + path;
|
||
|
}
|
||
|
delete path.parentObject.contents[path.name];
|
||
|
}};
|
||
|
function _send(fd, buf, len, flags) {
|
||
|
var info = FS.streams[fd];
|
||
|
if (!info) return -1;
|
||
|
info.sender(HEAPU8.subarray(buf, buf+len));
|
||
|
return 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.streams[fildes];
|
||
|
if (!stream || stream.object.isDevice) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
} else if (!stream.isWrite) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
} else if (stream.object.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.EISDIR);
|
||
|
return -1;
|
||
|
} else if (nbyte < 0 || offset < 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else {
|
||
|
var contents = stream.object.contents;
|
||
|
while (contents.length < offset) contents.push(0);
|
||
|
for (var i = 0; i < nbyte; i++) {
|
||
|
contents[offset + i] = HEAPU8[(((buf)+(i))|0)];
|
||
|
}
|
||
|
stream.object.timestamp = Date.now();
|
||
|
return i;
|
||
|
}
|
||
|
}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.streams[fildes];
|
||
|
if (stream && ('socket' in stream)) {
|
||
|
return _send(fildes, buf, nbyte, 0);
|
||
|
} else if (!stream) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
} else if (!stream.isWrite) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
} else if (nbyte < 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else {
|
||
|
if (stream.object.isDevice) {
|
||
|
if (stream.object.output) {
|
||
|
for (var i = 0; i < nbyte; i++) {
|
||
|
try {
|
||
|
stream.object.output(HEAP8[(((buf)+(i))|0)]);
|
||
|
} catch (e) {
|
||
|
___setErrNo(ERRNO_CODES.EIO);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
stream.object.timestamp = Date.now();
|
||
|
return i;
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.ENXIO);
|
||
|
return -1;
|
||
|
}
|
||
|
} else {
|
||
|
var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position);
|
||
|
if (bytesWritten != -1) stream.position += bytesWritten;
|
||
|
return bytesWritten;
|
||
|
}
|
||
|
}
|
||
|
}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 bytesWritten = _write(stream, ptr, bytesToWrite);
|
||
|
if (bytesWritten == -1) {
|
||
|
if (FS.streams[stream]) FS.streams[stream].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+8))>>2)]];
|
||
|
argIndex += 8; // each 32-bit chunk is in a 64-bit block
|
||
|
} else {
|
||
|
type = 'i32'; // varargs are always i32, i64, or double
|
||
|
ret = HEAP32[(((varargs)+(argIndex))>>2)];
|
||
|
}
|
||
|
argIndex += Math.max(Runtime.getNativeFieldSize(type), Runtime.getAlignSize(type, null, true));
|
||
|
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;
|
||
|
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;
|
||
|
}
|
||
|
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;
|
||
|
if (next == 46) {
|
||
|
var 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)];
|
||
|
} else {
|
||
|
var precision = 6; // Standard default.
|
||
|
}
|
||
|
// 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 origArg = currArg;
|
||
|
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) {
|
||
|
if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else
|
||
|
argText = reSign(currArg, 8 * argSize, 1).toString(10);
|
||
|
} else if (next == 117) {
|
||
|
if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else
|
||
|
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 (argSize == 8 && i64Math) {
|
||
|
if (origArg[1]) {
|
||
|
argText = (origArg[1]>>>0).toString(16);
|
||
|
var lower = (origArg[0]>>>0).toString(16);
|
||
|
while (lower.length < 8) lower = '0' + lower;
|
||
|
argText += lower;
|
||
|
} else {
|
||
|
argText = (origArg[0]>>>0).toString(16);
|
||
|
}
|
||
|
} else
|
||
|
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 (flagAlwaysSigned) {
|
||
|
if (currArg < 0) {
|
||
|
prefix = '-' + prefix;
|
||
|
} else {
|
||
|
prefix = '+' + prefix;
|
||
|
}
|
||
|
}
|
||
|
// 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 (flagAlwaysSigned && currArg >= 0) {
|
||
|
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;
|
||
|
}
|
||
|
Module["_strcpy"] = _strcpy;
|
||
|
function _strncmp(px, py, n) {
|
||
|
var i = 0;
|
||
|
while (i < n) {
|
||
|
var x = HEAPU8[(((px)+(i))|0)];
|
||
|
var y = HEAPU8[(((py)+(i))|0)];
|
||
|
if (x == y && x == 0) return 0;
|
||
|
if (x == 0) return -1;
|
||
|
if (y == 0) return 1;
|
||
|
if (x == y) {
|
||
|
i ++;
|
||
|
continue;
|
||
|
} else {
|
||
|
return x > y ? 1 : -1;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}function _strcmp(px, py) {
|
||
|
return _strncmp(px, py, TOTAL_MEMORY);
|
||
|
}
|
||
|
var _exp=Math.exp;
|
||
|
var _ceil=Math.ceil;
|
||
|
function _log10(x) {
|
||
|
return Math.log(x) / Math.LN10;
|
||
|
}
|
||
|
function _snprintf(s, n, format, varargs) {
|
||
|
// int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
|
||
|
var result = __formatString(format, varargs);
|
||
|
var limit = (n === undefined) ? result.length
|
||
|
: Math.min(result.length, Math.max(n - 1, 0));
|
||
|
if (s < 0) {
|
||
|
s = -s;
|
||
|
var buf = _malloc(limit+1);
|
||
|
HEAP32[((s)>>2)]=buf;
|
||
|
s = buf;
|
||
|
}
|
||
|
for (var i = 0; i < limit; i++) {
|
||
|
HEAP8[(((s)+(i))|0)]=result[i];
|
||
|
}
|
||
|
if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;
|
||
|
return result.length;
|
||
|
}function _sprintf(s, format, varargs) {
|
||
|
// int sprintf(char *restrict s, const char *restrict format, ...);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
|
||
|
return _snprintf(s, undefined, format, varargs);
|
||
|
}
|
||
|
Module["_strcat"] = _strcat;
|
||
|
function _strchr(ptr, chr) {
|
||
|
ptr--;
|
||
|
do {
|
||
|
ptr++;
|
||
|
var val = HEAP8[(ptr)];
|
||
|
if (val == chr) return ptr;
|
||
|
} while (val);
|
||
|
return 0;
|
||
|
}
|
||
|
var _floor=Math.floor;
|
||
|
var _llvm_pow_f64=Math.pow;
|
||
|
Module["_memcpy"] = _memcpy;var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;
|
||
|
Module["_memset"] = _memset;var _llvm_memset_p0i8_i32=_memset;
|
||
|
function _ftell(stream) {
|
||
|
// long ftell(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/ftell.html
|
||
|
if (FS.streams[stream]) {
|
||
|
stream = FS.streams[stream];
|
||
|
if (stream.object.isDevice) {
|
||
|
___setErrNo(ERRNO_CODES.ESPIPE);
|
||
|
return -1;
|
||
|
} else {
|
||
|
return stream.position;
|
||
|
}
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
function _lseek(fildes, offset, whence) {
|
||
|
// off_t lseek(int fildes, off_t offset, int whence);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/lseek.html
|
||
|
if (FS.streams[fildes] && !FS.streams[fildes].object.isDevice) {
|
||
|
var stream = FS.streams[fildes];
|
||
|
var position = offset;
|
||
|
if (whence === 1) { // SEEK_CUR.
|
||
|
position += stream.position;
|
||
|
} else if (whence === 2) { // SEEK_END.
|
||
|
position += stream.object.contents.length;
|
||
|
}
|
||
|
if (position < 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else {
|
||
|
stream.ungotten = [];
|
||
|
stream.position = position;
|
||
|
return position;
|
||
|
}
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
}
|
||
|
}function _fseek(stream, offset, whence) {
|
||
|
// int fseek(FILE *stream, long offset, int whence);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fseek.html
|
||
|
var ret = _lseek(stream, offset, whence);
|
||
|
if (ret == -1) {
|
||
|
return -1;
|
||
|
} else {
|
||
|
FS.streams[stream].eof = false;
|
||
|
return 0;
|
||
|
}
|
||
|
}function _rewind(stream) {
|
||
|
// void rewind(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/rewind.html
|
||
|
_fseek(stream, 0, 0); // SEEK_SET.
|
||
|
if (FS.streams[stream]) FS.streams[stream].error = false;
|
||
|
}
|
||
|
function _recv(fd, buf, len, flags) {
|
||
|
var info = FS.streams[fd];
|
||
|
if (!info) return -1;
|
||
|
if (!info.hasData()) {
|
||
|
___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior
|
||
|
return -1;
|
||
|
}
|
||
|
var buffer = info.inQueue.shift();
|
||
|
if (len < buffer.length) {
|
||
|
if (info.stream) {
|
||
|
// This is tcp (reliable), so if not all was read, keep it
|
||
|
info.inQueue.unshift(buffer.subarray(len));
|
||
|
}
|
||
|
buffer = buffer.subarray(0, len);
|
||
|
}
|
||
|
HEAPU8.set(buffer, buf);
|
||
|
return buffer.length;
|
||
|
}
|
||
|
function _pread(fildes, buf, nbyte, offset) {
|
||
|
// ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html
|
||
|
var stream = FS.streams[fildes];
|
||
|
if (!stream || stream.object.isDevice) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
} else if (!stream.isRead) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
} else if (stream.object.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.EISDIR);
|
||
|
return -1;
|
||
|
} else if (nbyte < 0 || offset < 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else {
|
||
|
var bytesRead = 0;
|
||
|
while (stream.ungotten.length && nbyte > 0) {
|
||
|
HEAP8[((buf++)|0)]=stream.ungotten.pop()
|
||
|
nbyte--;
|
||
|
bytesRead++;
|
||
|
}
|
||
|
var contents = stream.object.contents;
|
||
|
var size = Math.min(contents.length - offset, nbyte);
|
||
|
if (contents.subarray) { // typed array
|
||
|
HEAPU8.set(contents.subarray(offset, offset+size), buf);
|
||
|
} else
|
||
|
if (contents.slice) { // normal array
|
||
|
for (var i = 0; i < size; i++) {
|
||
|
HEAP8[(((buf)+(i))|0)]=contents[offset + i]
|
||
|
}
|
||
|
} else {
|
||
|
for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR
|
||
|
HEAP8[(((buf)+(i))|0)]=contents.get(offset + i)
|
||
|
}
|
||
|
}
|
||
|
bytesRead += size;
|
||
|
return bytesRead;
|
||
|
}
|
||
|
}function _read(fildes, buf, nbyte) {
|
||
|
// ssize_t read(int fildes, void *buf, size_t nbyte);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html
|
||
|
var stream = FS.streams[fildes];
|
||
|
if (stream && ('socket' in stream)) {
|
||
|
return _recv(fildes, buf, nbyte, 0);
|
||
|
} else if (!stream) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
} else if (!stream.isRead) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
} else if (nbyte < 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else {
|
||
|
var bytesRead;
|
||
|
if (stream.object.isDevice) {
|
||
|
if (stream.object.input) {
|
||
|
bytesRead = 0;
|
||
|
while (stream.ungotten.length && nbyte > 0) {
|
||
|
HEAP8[((buf++)|0)]=stream.ungotten.pop()
|
||
|
nbyte--;
|
||
|
bytesRead++;
|
||
|
}
|
||
|
for (var i = 0; i < nbyte; i++) {
|
||
|
try {
|
||
|
var result = stream.object.input();
|
||
|
} catch (e) {
|
||
|
___setErrNo(ERRNO_CODES.EIO);
|
||
|
return -1;
|
||
|
}
|
||
|
if (result === undefined && bytesRead === 0) {
|
||
|
___setErrNo(ERRNO_CODES.EAGAIN);
|
||
|
return -1;
|
||
|
}
|
||
|
if (result === null || result === undefined) break;
|
||
|
bytesRead++;
|
||
|
HEAP8[(((buf)+(i))|0)]=result
|
||
|
}
|
||
|
return bytesRead;
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.ENXIO);
|
||
|
return -1;
|
||
|
}
|
||
|
} else {
|
||
|
var ungotSize = stream.ungotten.length;
|
||
|
bytesRead = _pread(fildes, buf, nbyte, stream.position);
|
||
|
if (bytesRead != -1) {
|
||
|
stream.position += (stream.ungotten.length - ungotSize) + bytesRead;
|
||
|
}
|
||
|
return bytesRead;
|
||
|
}
|
||
|
}
|
||
|
}function _fread(ptr, size, nitems, stream) {
|
||
|
// size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html
|
||
|
var bytesToRead = nitems * size;
|
||
|
if (bytesToRead == 0) return 0;
|
||
|
var bytesRead = _read(stream, ptr, bytesToRead);
|
||
|
var streamObj = FS.streams[stream];
|
||
|
if (bytesRead == -1) {
|
||
|
if (streamObj) streamObj.error = true;
|
||
|
return 0;
|
||
|
} else {
|
||
|
if (bytesRead < bytesToRead) streamObj.eof = true;
|
||
|
return Math.floor(bytesRead / size);
|
||
|
}
|
||
|
}
|
||
|
function _close(fildes) {
|
||
|
// int close(int fildes);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/close.html
|
||
|
if (FS.streams[fildes]) {
|
||
|
if (FS.streams[fildes].currentEntry) {
|
||
|
_free(FS.streams[fildes].currentEntry);
|
||
|
}
|
||
|
FS.streams[fildes] = null;
|
||
|
return 0;
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
function _fsync(fildes) {
|
||
|
// int fsync(int fildes);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fsync.html
|
||
|
if (FS.streams[fildes]) {
|
||
|
// We write directly to the file system, so there's nothing to do here.
|
||
|
return 0;
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return -1;
|
||
|
}
|
||
|
}function _fclose(stream) {
|
||
|
// int fclose(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fclose.html
|
||
|
_fsync(stream);
|
||
|
return _close(stream);
|
||
|
}
|
||
|
function _strcspn(pstr, pset) {
|
||
|
var str = pstr, set, strcurr, setcurr;
|
||
|
while (1) {
|
||
|
strcurr = HEAP8[(str)];
|
||
|
if (!strcurr) return str - pstr;
|
||
|
set = pset;
|
||
|
while (1) {
|
||
|
setcurr = HEAP8[(set)];
|
||
|
if (!setcurr || setcurr == strcurr) break;
|
||
|
set++;
|
||
|
}
|
||
|
if (setcurr) return str - pstr;
|
||
|
str++;
|
||
|
}
|
||
|
}
|
||
|
Module["_strncpy"] = _strncpy;
|
||
|
function _isspace(chr) {
|
||
|
return chr in { 32: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0 };
|
||
|
}function __parseInt(str, endptr, base, min, max, bits, unsign) {
|
||
|
// Skip space.
|
||
|
while (_isspace(HEAP8[(str)])) str++;
|
||
|
// Check for a plus/minus sign.
|
||
|
var multiplier = 1;
|
||
|
if (HEAP8[(str)] == 45) {
|
||
|
multiplier = -1;
|
||
|
str++;
|
||
|
} else if (HEAP8[(str)] == 43) {
|
||
|
str++;
|
||
|
}
|
||
|
// Find base.
|
||
|
var finalBase = base;
|
||
|
if (!finalBase) {
|
||
|
if (HEAP8[(str)] == 48) {
|
||
|
if (HEAP8[((str+1)|0)] == 120 ||
|
||
|
HEAP8[((str+1)|0)] == 88) {
|
||
|
finalBase = 16;
|
||
|
str += 2;
|
||
|
} else {
|
||
|
finalBase = 8;
|
||
|
str++;
|
||
|
}
|
||
|
}
|
||
|
} else if (finalBase==16) {
|
||
|
if (HEAP8[(str)] == 48) {
|
||
|
if (HEAP8[((str+1)|0)] == 120 ||
|
||
|
HEAP8[((str+1)|0)] == 88) {
|
||
|
str += 2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (!finalBase) finalBase = 10;
|
||
|
// Get digits.
|
||
|
var chr;
|
||
|
var ret = 0;
|
||
|
while ((chr = HEAP8[(str)]) != 0) {
|
||
|
var digit = parseInt(String.fromCharCode(chr), finalBase);
|
||
|
if (isNaN(digit)) {
|
||
|
break;
|
||
|
} else {
|
||
|
ret = ret * finalBase + digit;
|
||
|
str++;
|
||
|
}
|
||
|
}
|
||
|
// Apply sign.
|
||
|
ret *= multiplier;
|
||
|
// Set end pointer.
|
||
|
if (endptr) {
|
||
|
HEAP32[((endptr)>>2)]=str
|
||
|
}
|
||
|
// Unsign if needed.
|
||
|
if (unsign) {
|
||
|
if (Math.abs(ret) > max) {
|
||
|
ret = max;
|
||
|
___setErrNo(ERRNO_CODES.ERANGE);
|
||
|
} else {
|
||
|
ret = unSign(ret, bits);
|
||
|
}
|
||
|
}
|
||
|
// Validate range.
|
||
|
if (ret > max || ret < min) {
|
||
|
ret = ret > max ? max : min;
|
||
|
___setErrNo(ERRNO_CODES.ERANGE);
|
||
|
}
|
||
|
if (bits == 64) {
|
||
|
return ((asm["setTempRet0"](Math.min(Math.floor((ret)/(+(4294967296))), (+(4294967295)))>>>0),ret>>>0)|0);
|
||
|
}
|
||
|
return ret;
|
||
|
}function _strtol(str, endptr, base) {
|
||
|
return __parseInt(str, endptr, base, -2147483648, 2147483647, 32); // LONG_MIN, LONG_MAX.
|
||
|
}function _atoi(ptr) {
|
||
|
return _strtol(ptr, null, 10);
|
||
|
}
|
||
|
function _strstr(ptr1, ptr2) {
|
||
|
var check = 0, start;
|
||
|
do {
|
||
|
if (!check) {
|
||
|
start = ptr1;
|
||
|
check = ptr2;
|
||
|
}
|
||
|
var curr1 = HEAP8[((ptr1++)|0)];
|
||
|
var curr2 = HEAP8[((check++)|0)];
|
||
|
if (curr2 == 0) return start;
|
||
|
if (curr2 != curr1) {
|
||
|
// rewind to one character after start, to find ez in eeez
|
||
|
ptr1 = start + 1;
|
||
|
check = 0;
|
||
|
}
|
||
|
} while (curr1);
|
||
|
return 0;
|
||
|
}
|
||
|
Module["_memcmp"] = _memcmp;
|
||
|
function _fputs(s, stream) {
|
||
|
// int fputs(const char *restrict s, FILE *restrict stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html
|
||
|
return _write(stream, s, _strlen(s));
|
||
|
}
|
||
|
Module["_memmove"] = _memmove;var _llvm_memmove_p0i8_p0i8_i32=_memmove;
|
||
|
function _fflush(stream) {
|
||
|
// int fflush(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html
|
||
|
var flush = function(filedes) {
|
||
|
// Right now we write all data directly, except for output devices.
|
||
|
if (FS.streams[filedes] && FS.streams[filedes].object.output) {
|
||
|
if (!FS.streams[filedes].isTerminal) { // don't flush terminals, it would cause a \n to also appear
|
||
|
FS.streams[filedes].object.output(null);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
try {
|
||
|
if (stream === 0) {
|
||
|
for (var i = 0; i < FS.streams.length; i++) if (FS.streams[i]) flush(i);
|
||
|
} else {
|
||
|
flush(stream);
|
||
|
}
|
||
|
return 0;
|
||
|
} catch (e) {
|
||
|
___setErrNo(ERRNO_CODES.EIO);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
function __exit(status) {
|
||
|
// void _exit(int status);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html
|
||
|
function ExitStatus() {
|
||
|
this.name = "ExitStatus";
|
||
|
this.message = "Program terminated with exit(" + status + ")";
|
||
|
this.status = status;
|
||
|
Module.print('Exit Status: ' + status);
|
||
|
};
|
||
|
ExitStatus.prototype = new Error();
|
||
|
ExitStatus.prototype.constructor = ExitStatus;
|
||
|
exitRuntime();
|
||
|
ABORT = true;
|
||
|
throw new ExitStatus();
|
||
|
}function _exit(status) {
|
||
|
__exit(status);
|
||
|
}
|
||
|
function _fgetc(stream) {
|
||
|
// int fgetc(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html
|
||
|
if (!FS.streams[stream]) return -1;
|
||
|
var streamObj = FS.streams[stream];
|
||
|
if (streamObj.eof || streamObj.error) return -1;
|
||
|
var ret = _read(stream, _fgetc.ret, 1);
|
||
|
if (ret == 0) {
|
||
|
streamObj.eof = true;
|
||
|
return -1;
|
||
|
} else if (ret == -1) {
|
||
|
streamObj.error = true;
|
||
|
return -1;
|
||
|
} else {
|
||
|
return HEAPU8[((_fgetc.ret)|0)];
|
||
|
}
|
||
|
}function _fgets(s, n, stream) {
|
||
|
// char *fgets(char *restrict s, int n, FILE *restrict stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fgets.html
|
||
|
if (!FS.streams[stream]) return 0;
|
||
|
var streamObj = FS.streams[stream];
|
||
|
if (streamObj.error || streamObj.eof) return 0;
|
||
|
var byte_;
|
||
|
for (var i = 0; i < n - 1 && byte_ != 10; i++) {
|
||
|
byte_ = _fgetc(stream);
|
||
|
if (byte_ == -1) {
|
||
|
if (streamObj.error || (streamObj.eof && i == 0)) return 0;
|
||
|
else if (streamObj.eof) break;
|
||
|
}
|
||
|
HEAP8[(((s)+(i))|0)]=byte_
|
||
|
}
|
||
|
HEAP8[(((s)+(i))|0)]=0
|
||
|
return s;
|
||
|
}
|
||
|
function _usleep(useconds) {
|
||
|
// int usleep(useconds_t useconds);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html
|
||
|
// We're single-threaded, so use a busy loop. Super-ugly.
|
||
|
var msec = useconds / 1000;
|
||
|
var start = Date.now();
|
||
|
while (Date.now() - start < msec) {
|
||
|
// Do nothing.
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
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 ret = _write(stream, _fputc.ret, 1);
|
||
|
if (ret == -1) {
|
||
|
if (FS.streams[stream]) FS.streams[stream].error = true;
|
||
|
return -1;
|
||
|
} else {
|
||
|
return chr;
|
||
|
}
|
||
|
}
|
||
|
function _pclose(stream) {
|
||
|
// int pclose(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/pclose.html
|
||
|
// We allow only one process, so no pipes.
|
||
|
___setErrNo(ERRNO_CODES.ECHILD);
|
||
|
return -1;
|
||
|
}
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
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:"No message of desired type",36:"Identifier removed",37:"Channel number out of range",38:"Level 2 not synchronized",39:"Level 3 halted",40:"Level 3 reset",41:"Link number out of range",42:"Protocol driver not attached",43:"No CSI structure available",44:"Level 2 halted",45:"Deadlock condition",46:"No record locks available",50:"Invalid exchange",51:"Invalid request descriptor",52:"Exchange full",53:"No anode",54:"Invalid request code",55:"Invalid slot",56:"File locking deadlock error",57:"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",74:"Multihop attempted",75:"Inode is remote (not really error)",76:"Cross mount point (not really error)",77:"Trying to read unreadable message",79:"Inappropriate file type or format",80:"Given log. name not unique",81:"f.d. invalid for this operation",82:"Remote address changed",83:"Can\t access a needed shared lib",84:"Accessing a corrupted shared lib",85:".lib section in a.out corrupted",86:"Attempting to link in too many libs",87:"Attempting to exec a shared library",88:"Function not implemented",89:"No more files",90:"Directory not empty",91:"File or path name too long",92:"Too many symbolic links",95:"Operation not supported on transport endpoint",96:"Protocol family not supported",104:"Connection reset by peer",105:"No buffer space available",106:"Address family not supported by protocol family",107:"Protocol wrong type for socket",108:"Socket operation on non-socket",109:"Protocol not available",110:"Can't send after socket shutdown",111:"Connection refused",112:"Address already in use",113:"Connection aborted",114:"Network is unreachable",115:"Network interface is not configured",116:"Connection timed out",117:"Host is down",118:"Host is unreachable",119:"Connection already in progress",120:"Socket already connected",121:"Destination address required",122:"Message too long",123:"Unknown protocol",124:"Socket type not supported",125:"Address not available",126:"ENETRESET",127:"Socket is already connected",128:"Socket is not connected",129:"TOOMANYREFS",130:"EPROCLIM",131:"EUSERS",132:"EDQUOT",133:"ESTALE",134:"Not supported",135:"No medium (in tape drive)",136:"No such host or network path",137:"Filename exists with different case",138:"EILSEQ",139:"Value too large for defined data type",140:"Operation canceled",141:"State not recoverable",142:"Previous owner died",143:"Streams pipe error"};function _strerror_r(errnum, strerrbuf, buflen) {
|
||
|
if (errnum in ERRNO_MESSAGES) {
|
||
|
if (ERRNO_MESSAGES[errnum].length > buflen - 1) {
|
||
|
return ___setErrNo(ERRNO_CODES.ERANGE);
|
||
|
} else {
|
||
|
var msg = ERRNO_MESSAGES[errnum];
|
||
|
for (var i = 0; i < msg.length; i++) {
|
||
|
HEAP8[(((strerrbuf)+(i))|0)]=msg.charCodeAt(i)
|
||
|
}
|
||
|
HEAP8[(((strerrbuf)+(i))|0)]=0
|
||
|
return 0;
|
||
|
}
|
||
|
} else {
|
||
|
return ___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
}
|
||
|
}function _strerror(errnum) {
|
||
|
if (!_strerror.buffer) _strerror.buffer = _malloc(256);
|
||
|
_strerror_r(errnum, _strerror.buffer, 256);
|
||
|
return _strerror.buffer;
|
||
|
}
|
||
|
function ___errno_location() {
|
||
|
return ___errno_state;
|
||
|
}function _perror(s) {
|
||
|
// void perror(const char *s);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/perror.html
|
||
|
var stdout = HEAP32[((_stdout)>>2)];
|
||
|
if (s) {
|
||
|
_fputs(s, stdout);
|
||
|
_fputc(58, stdout);
|
||
|
_fputc(32, stdout);
|
||
|
}
|
||
|
var errnum = HEAP32[((___errno_location())>>2)];
|
||
|
_puts(_strerror(errnum));
|
||
|
}
|
||
|
function _popen(command, mode) {
|
||
|
// FILE *popen(const char *command, const char *mode);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/popen.html
|
||
|
// We allow only one process, so no pipes.
|
||
|
___setErrNo(ERRNO_CODES.EMFILE);
|
||
|
return 0;
|
||
|
}
|
||
|
var ___dirent_struct_layout={__size__:1040,d_ino:0,d_name:4,d_off:1028,d_reclen:1032,d_type:1036};function _open(path, oflag, varargs) {
|
||
|
// int open(const char *path, int oflag, ...);
|
||
|
// http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
|
||
|
// NOTE: This implementation tries to mimic glibc rather than strictly
|
||
|
// following the POSIX standard.
|
||
|
var mode = HEAP32[((varargs)>>2)];
|
||
|
// Simplify flags.
|
||
|
var accessMode = oflag & 3;
|
||
|
var isWrite = accessMode != 0;
|
||
|
var isRead = accessMode != 1;
|
||
|
var isCreate = Boolean(oflag & 512);
|
||
|
var isExistCheck = Boolean(oflag & 2048);
|
||
|
var isTruncate = Boolean(oflag & 1024);
|
||
|
var isAppend = Boolean(oflag & 8);
|
||
|
// Verify path.
|
||
|
var origPath = path;
|
||
|
path = FS.analyzePath(Pointer_stringify(path));
|
||
|
if (!path.parentExists) {
|
||
|
___setErrNo(path.error);
|
||
|
return -1;
|
||
|
}
|
||
|
var target = path.object || null;
|
||
|
var finalPath;
|
||
|
// Verify the file exists, create if needed and allowed.
|
||
|
if (target) {
|
||
|
if (isCreate && isExistCheck) {
|
||
|
___setErrNo(ERRNO_CODES.EEXIST);
|
||
|
return -1;
|
||
|
}
|
||
|
if ((isWrite || isCreate || isTruncate) && target.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.EISDIR);
|
||
|
return -1;
|
||
|
}
|
||
|
if (isRead && !target.read || isWrite && !target.write) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
}
|
||
|
if (isTruncate && !target.isDevice) {
|
||
|
target.contents = [];
|
||
|
} else {
|
||
|
if (!FS.forceLoadFile(target)) {
|
||
|
___setErrNo(ERRNO_CODES.EIO);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
finalPath = path.path;
|
||
|
} else {
|
||
|
if (!isCreate) {
|
||
|
___setErrNo(ERRNO_CODES.ENOENT);
|
||
|
return -1;
|
||
|
}
|
||
|
if (!path.parentObject.write) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return -1;
|
||
|
}
|
||
|
target = FS.createDataFile(path.parentObject, path.name, [],
|
||
|
mode & 0x100, mode & 0x80); // S_IRUSR, S_IWUSR.
|
||
|
finalPath = path.parentPath + '/' + path.name;
|
||
|
}
|
||
|
// Actually create an open stream.
|
||
|
var id;
|
||
|
if (target.isFolder) {
|
||
|
var entryBuffer = 0;
|
||
|
if (___dirent_struct_layout) {
|
||
|
entryBuffer = _malloc(___dirent_struct_layout.__size__);
|
||
|
}
|
||
|
var contents = [];
|
||
|
for (var key in target.contents) contents.push(key);
|
||
|
id = FS.createFileHandle({
|
||
|
path: finalPath,
|
||
|
object: target,
|
||
|
// An index into contents. Special values: -2 is ".", -1 is "..".
|
||
|
position: -2,
|
||
|
isRead: true,
|
||
|
isWrite: false,
|
||
|
isAppend: false,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: [],
|
||
|
// Folder-specific properties:
|
||
|
// Remember the contents at the time of opening in an array, so we can
|
||
|
// seek between them relying on a single order.
|
||
|
contents: contents,
|
||
|
// Each stream has its own area for readdir() returns.
|
||
|
currentEntry: entryBuffer
|
||
|
});
|
||
|
} else {
|
||
|
id = FS.createFileHandle({
|
||
|
path: finalPath,
|
||
|
object: target,
|
||
|
position: 0,
|
||
|
isRead: isRead,
|
||
|
isWrite: isWrite,
|
||
|
isAppend: isAppend,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: []
|
||
|
});
|
||
|
}
|
||
|
return id;
|
||
|
}function _fopen(filename, mode) {
|
||
|
// FILE *fopen(const char *restrict filename, const char *restrict mode);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fopen.html
|
||
|
var flags;
|
||
|
mode = Pointer_stringify(mode);
|
||
|
if (mode[0] == 'r') {
|
||
|
if (mode.indexOf('+') != -1) {
|
||
|
flags = 2;
|
||
|
} else {
|
||
|
flags = 0;
|
||
|
}
|
||
|
} else if (mode[0] == 'w') {
|
||
|
if (mode.indexOf('+') != -1) {
|
||
|
flags = 2;
|
||
|
} else {
|
||
|
flags = 1;
|
||
|
}
|
||
|
flags |= 512;
|
||
|
flags |= 1024;
|
||
|
} else if (mode[0] == 'a') {
|
||
|
if (mode.indexOf('+') != -1) {
|
||
|
flags = 2;
|
||
|
} else {
|
||
|
flags = 1;
|
||
|
}
|
||
|
flags |= 512;
|
||
|
flags |= 8;
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return 0;
|
||
|
}
|
||
|
var ret = _open(filename, flags, allocate([0x1FF, 0, 0, 0], 'i32', ALLOC_STACK)); // All creation permissions.
|
||
|
return (ret == -1) ? 0 : ret;
|
||
|
}
|
||
|
var _putc=_fputc;
|
||
|
function _getcwd(buf, size) {
|
||
|
// char *getcwd(char *buf, size_t size);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/getcwd.html
|
||
|
if (size == 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return 0;
|
||
|
} else if (size < FS.currentPath.length + 1) {
|
||
|
___setErrNo(ERRNO_CODES.ERANGE);
|
||
|
return 0;
|
||
|
} else {
|
||
|
for (var i = 0; i < FS.currentPath.length; i++) {
|
||
|
HEAP8[(((buf)+(i))|0)]=FS.currentPath.charCodeAt(i)
|
||
|
}
|
||
|
HEAP8[(((buf)+(i))|0)]=0
|
||
|
return buf;
|
||
|
}
|
||
|
}
|
||
|
var _environ=allocate(1, "i32*", ALLOC_STATIC);var ___environ=_environ;function ___buildEnvironment(env) {
|
||
|
// WARNING: Arbitrary limit!
|
||
|
var MAX_ENV_VALUES = 64;
|
||
|
var TOTAL_ENV_SIZE = 1024;
|
||
|
// Statically allocate memory for the environment.
|
||
|
var poolPtr;
|
||
|
var envPtr;
|
||
|
if (!___buildEnvironment.called) {
|
||
|
___buildEnvironment.called = true;
|
||
|
// Set default values. Use string keys for Closure Compiler compatibility.
|
||
|
ENV['USER'] = 'root';
|
||
|
ENV['PATH'] = '/';
|
||
|
ENV['PWD'] = '/';
|
||
|
ENV['HOME'] = '/home/emscripten';
|
||
|
ENV['LANG'] = 'en_US.UTF-8';
|
||
|
ENV['_'] = './this.program';
|
||
|
// Allocate memory.
|
||
|
poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC);
|
||
|
envPtr = allocate(MAX_ENV_VALUES * 4,
|
||
|
'i8*', ALLOC_STATIC);
|
||
|
HEAP32[((envPtr)>>2)]=poolPtr
|
||
|
HEAP32[((_environ)>>2)]=envPtr;
|
||
|
} else {
|
||
|
envPtr = HEAP32[((_environ)>>2)];
|
||
|
poolPtr = HEAP32[((envPtr)>>2)];
|
||
|
}
|
||
|
// Collect key=value lines.
|
||
|
var strings = [];
|
||
|
var totalSize = 0;
|
||
|
for (var key in env) {
|
||
|
if (typeof env[key] === 'string') {
|
||
|
var line = key + '=' + env[key];
|
||
|
strings.push(line);
|
||
|
totalSize += line.length;
|
||
|
}
|
||
|
}
|
||
|
if (totalSize > TOTAL_ENV_SIZE) {
|
||
|
throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');
|
||
|
}
|
||
|
// Make new.
|
||
|
var ptrSize = 4;
|
||
|
for (var i = 0; i < strings.length; i++) {
|
||
|
var line = strings[i];
|
||
|
for (var j = 0; j < line.length; j++) {
|
||
|
HEAP8[(((poolPtr)+(j))|0)]=line.charCodeAt(j);
|
||
|
}
|
||
|
HEAP8[(((poolPtr)+(j))|0)]=0;
|
||
|
HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr;
|
||
|
poolPtr += line.length + 1;
|
||
|
}
|
||
|
HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0;
|
||
|
}var ENV={};function _getenv(name) {
|
||
|
// char *getenv(const char *name);
|
||
|
// http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
|
||
|
if (name === 0) return 0;
|
||
|
name = Pointer_stringify(name);
|
||
|
if (!ENV.hasOwnProperty(name)) return 0;
|
||
|
if (_getenv.ret) _free(_getenv.ret);
|
||
|
_getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL);
|
||
|
return _getenv.ret;
|
||
|
}
|
||
|
function _strncat(pdest, psrc, num) {
|
||
|
var len = _strlen(pdest);
|
||
|
var i = 0;
|
||
|
while(1) {
|
||
|
HEAP8[((pdest+len+i)|0)]=HEAP8[((psrc+i)|0)];
|
||
|
if (HEAP8[(((pdest)+(len+i))|0)] == 0) break;
|
||
|
i ++;
|
||
|
if (i == num) {
|
||
|
HEAP8[(((pdest)+(len+i))|0)]=0
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return pdest;
|
||
|
}
|
||
|
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);
|
||
|
}
|
||
|
function _system(command) {
|
||
|
// int system(const char *command);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html
|
||
|
// Can't call external programs.
|
||
|
___setErrNo(ERRNO_CODES.EAGAIN);
|
||
|
return -1;
|
||
|
}
|
||
|
function _isalpha(chr) {
|
||
|
return (chr >= 97 && chr <= 122) ||
|
||
|
(chr >= 65 && chr <= 90);
|
||
|
}
|
||
|
function _isalnum(chr) {
|
||
|
return (chr >= 48 && chr <= 57) ||
|
||
|
(chr >= 97 && chr <= 122) ||
|
||
|
(chr >= 65 && chr <= 90);
|
||
|
}
|
||
|
var _getc=_fgetc;
|
||
|
function _chdir(path) {
|
||
|
// int chdir(const char *path);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/chdir.html
|
||
|
// NOTE: The path argument may be a string, to simplify fchdir().
|
||
|
if (typeof path !== 'string') path = Pointer_stringify(path);
|
||
|
path = FS.analyzePath(path);
|
||
|
if (!path.exists) {
|
||
|
___setErrNo(path.error);
|
||
|
return -1;
|
||
|
} else if (!path.object.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.ENOTDIR);
|
||
|
return -1;
|
||
|
} else {
|
||
|
FS.currentPath = path.path;
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
function _tmpnam(s, dir, prefix) {
|
||
|
// char *tmpnam(char *s);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpnam.html
|
||
|
// NOTE: The dir and prefix arguments are for internal use only.
|
||
|
var folder = FS.findObject(dir || '/tmp');
|
||
|
if (!folder || !folder.isFolder) {
|
||
|
dir = '/tmp';
|
||
|
folder = FS.findObject(dir);
|
||
|
if (!folder || !folder.isFolder) return 0;
|
||
|
}
|
||
|
var name = prefix || 'file';
|
||
|
do {
|
||
|
name += String.fromCharCode(65 + Math.floor(Math.random() * 25));
|
||
|
} while (name in folder.contents);
|
||
|
var result = dir + '/' + name;
|
||
|
if (!_tmpnam.buffer) _tmpnam.buffer = _malloc(256);
|
||
|
if (!s) s = _tmpnam.buffer;
|
||
|
for (var i = 0; i < result.length; i++) {
|
||
|
HEAP8[(((s)+(i))|0)]=result.charCodeAt(i);
|
||
|
}
|
||
|
HEAP8[(((s)+(i))|0)]=0;
|
||
|
return s;
|
||
|
}function _tmpfile() {
|
||
|
// FILE *tmpfile(void);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpfile.html
|
||
|
// TODO: Delete the created file on closing.
|
||
|
if (_tmpfile.mode) {
|
||
|
_tmpfile.mode = allocate(intArrayFromString('w+'), 'i8', ALLOC_NORMAL);
|
||
|
}
|
||
|
return _fopen(_tmpnam(0), _tmpfile.mode);
|
||
|
}
|
||
|
function _memchr(ptr, chr, num) {
|
||
|
chr = unSign(chr);
|
||
|
for (var i = 0; i < num; i++) {
|
||
|
if (HEAP8[(ptr)] == chr) return ptr;
|
||
|
ptr++;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
var _sqrt=Math.sqrt;
|
||
|
function _fileno(stream) {
|
||
|
// int fileno(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
|
||
|
// We use file descriptor numbers and FILE* streams interchangeably.
|
||
|
return stream;
|
||
|
}
|
||
|
function _fdopen(fildes, mode) {
|
||
|
// FILE *fdopen(int fildes, const char *mode);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fdopen.html
|
||
|
if (FS.streams[fildes]) {
|
||
|
var stream = FS.streams[fildes];
|
||
|
mode = Pointer_stringify(mode);
|
||
|
if ((mode.indexOf('w') != -1 && !stream.isWrite) ||
|
||
|
(mode.indexOf('r') != -1 && !stream.isRead) ||
|
||
|
(mode.indexOf('a') != -1 && !stream.isAppend) ||
|
||
|
(mode.indexOf('+') != -1 && (!stream.isRead || !stream.isWrite))) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return 0;
|
||
|
} else {
|
||
|
stream.error = false;
|
||
|
stream.eof = false;
|
||
|
return fildes;
|
||
|
}
|
||
|
} else {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
var ___stat_struct_layout={__size__:68,st_dev:0,st_ino:4,st_mode:8,st_nlink:12,st_uid:16,st_gid:20,st_rdev:24,st_size:28,st_atime:32,st_spare1:36,st_mtime:40,st_spare2:44,st_ctime:48,st_spare3:52,st_blksize:56,st_blocks:60,st_spare4:64};function _stat(path, buf, dontResolveLastLink) {
|
||
|
// http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
|
||
|
// int stat(const char *path, struct stat *buf);
|
||
|
// NOTE: dontResolveLastLink is a shortcut for lstat(). It should never be
|
||
|
// used in client code.
|
||
|
var obj = FS.findObject(Pointer_stringify(path), dontResolveLastLink);
|
||
|
if (obj === null || !FS.forceLoadFile(obj)) return -1;
|
||
|
var offsets = ___stat_struct_layout;
|
||
|
// Constants.
|
||
|
HEAP32[(((buf)+(offsets.st_nlink))>>2)]=1
|
||
|
HEAP32[(((buf)+(offsets.st_uid))>>2)]=0
|
||
|
HEAP32[(((buf)+(offsets.st_gid))>>2)]=0
|
||
|
HEAP32[(((buf)+(offsets.st_blksize))>>2)]=4096
|
||
|
// Variables.
|
||
|
HEAP32[(((buf)+(offsets.st_ino))>>2)]=obj.inodeNumber
|
||
|
var time = Math.floor(obj.timestamp / 1000);
|
||
|
if (offsets.st_atime === undefined) {
|
||
|
offsets.st_atime = offsets.st_atim.tv_sec;
|
||
|
offsets.st_mtime = offsets.st_mtim.tv_sec;
|
||
|
offsets.st_ctime = offsets.st_ctim.tv_sec;
|
||
|
var nanosec = (obj.timestamp % 1000) * 1000;
|
||
|
HEAP32[(((buf)+(offsets.st_atim.tv_nsec))>>2)]=nanosec
|
||
|
HEAP32[(((buf)+(offsets.st_mtim.tv_nsec))>>2)]=nanosec
|
||
|
HEAP32[(((buf)+(offsets.st_ctim.tv_nsec))>>2)]=nanosec
|
||
|
}
|
||
|
HEAP32[(((buf)+(offsets.st_atime))>>2)]=time
|
||
|
HEAP32[(((buf)+(offsets.st_mtime))>>2)]=time
|
||
|
HEAP32[(((buf)+(offsets.st_ctime))>>2)]=time
|
||
|
var mode = 0;
|
||
|
var size = 0;
|
||
|
var blocks = 0;
|
||
|
var dev = 0;
|
||
|
var rdev = 0;
|
||
|
if (obj.isDevice) {
|
||
|
// Device numbers reuse inode numbers.
|
||
|
dev = rdev = obj.inodeNumber;
|
||
|
size = blocks = 0;
|
||
|
mode = 0x2000; // S_IFCHR.
|
||
|
} else {
|
||
|
dev = 1;
|
||
|
rdev = 0;
|
||
|
// NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
|
||
|
// but this is not required by the standard.
|
||
|
if (obj.isFolder) {
|
||
|
size = 4096;
|
||
|
blocks = 1;
|
||
|
mode = 0x4000; // S_IFDIR.
|
||
|
} else {
|
||
|
var data = obj.contents || obj.link;
|
||
|
size = data.length;
|
||
|
blocks = Math.ceil(data.length / 4096);
|
||
|
mode = obj.link === undefined ? 0x8000 : 0xA000; // S_IFREG, S_IFLNK.
|
||
|
}
|
||
|
}
|
||
|
HEAP32[(((buf)+(offsets.st_dev))>>2)]=dev;
|
||
|
HEAP32[(((buf)+(offsets.st_rdev))>>2)]=rdev;
|
||
|
HEAP32[(((buf)+(offsets.st_size))>>2)]=size
|
||
|
HEAP32[(((buf)+(offsets.st_blocks))>>2)]=blocks
|
||
|
if (obj.read) mode |= 0x16D; // S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH.
|
||
|
if (obj.write) mode |= 0x92; // S_IWUSR | S_IWGRP | S_IWOTH.
|
||
|
HEAP32[(((buf)+(offsets.st_mode))>>2)]=mode
|
||
|
return 0;
|
||
|
}
|
||
|
function _feof(stream) {
|
||
|
// int feof(FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/feof.html
|
||
|
return Number(FS.streams[stream] && FS.streams[stream].eof);
|
||
|
}
|
||
|
function _setlocale(category, locale) {
|
||
|
if (!_setlocale.ret) _setlocale.ret = allocate([0], 'i8', ALLOC_NORMAL);
|
||
|
return _setlocale.ret;
|
||
|
}
|
||
|
function ___fpclassifyf(x) {
|
||
|
if (isNaN(x)) return 0;
|
||
|
if (!isFinite(x)) return 1;
|
||
|
if (x == 0) return 2;
|
||
|
// FP_SUBNORMAL..?
|
||
|
return 4;
|
||
|
}var ___fpclassifyd=___fpclassifyf;
|
||
|
var _cos=Math.cos;
|
||
|
var _sin=Math.sin;
|
||
|
Module["_tolower"] = _tolower;
|
||
|
Module["_strncasecmp"] = _strncasecmp;
|
||
|
Module["_strcasecmp"] = _strcasecmp;
|
||
|
function _strrchr(ptr, chr) {
|
||
|
var ptr2 = ptr + _strlen(ptr);
|
||
|
do {
|
||
|
if (HEAP8[(ptr2)] == chr) return ptr2;
|
||
|
ptr2--;
|
||
|
} while (ptr2 >= ptr);
|
||
|
return 0;
|
||
|
}
|
||
|
function _strspn(pstr, pset) {
|
||
|
var str = pstr, set, strcurr, setcurr;
|
||
|
while (1) {
|
||
|
strcurr = HEAP8[(str)];
|
||
|
if (!strcurr) return str - pstr;
|
||
|
set = pset;
|
||
|
while (1) {
|
||
|
setcurr = HEAP8[(set)];
|
||
|
if (!setcurr || setcurr == strcurr) break;
|
||
|
set++;
|
||
|
}
|
||
|
if (!setcurr) return str - pstr;
|
||
|
str++;
|
||
|
}
|
||
|
}
|
||
|
function _strpbrk(ptr1, ptr2) {
|
||
|
var curr;
|
||
|
var searchSet = {};
|
||
|
while (1) {
|
||
|
var curr = HEAP8[((ptr2++)|0)];
|
||
|
if (!curr) break;
|
||
|
searchSet[curr] = 1;
|
||
|
}
|
||
|
while (1) {
|
||
|
curr = HEAP8[(ptr1)];
|
||
|
if (!curr) break;
|
||
|
if (curr in searchSet) return ptr1;
|
||
|
ptr1++;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
function __isFloat(text) {
|
||
|
return !!(/^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?$/.exec(text));
|
||
|
}function __scanString(format, get, unget, varargs) {
|
||
|
if (!__scanString.whiteSpace) {
|
||
|
__scanString.whiteSpace = {};
|
||
|
__scanString.whiteSpace[32] = 1;
|
||
|
__scanString.whiteSpace[9] = 1;
|
||
|
__scanString.whiteSpace[10] = 1;
|
||
|
__scanString.whiteSpace[11] = 1;
|
||
|
__scanString.whiteSpace[12] = 1;
|
||
|
__scanString.whiteSpace[13] = 1;
|
||
|
__scanString.whiteSpace[' '] = 1;
|
||
|
__scanString.whiteSpace['\t'] = 1;
|
||
|
__scanString.whiteSpace['\n'] = 1;
|
||
|
__scanString.whiteSpace['\v'] = 1;
|
||
|
__scanString.whiteSpace['\f'] = 1;
|
||
|
__scanString.whiteSpace['\r'] = 1;
|
||
|
}
|
||
|
// Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.
|
||
|
// TODO: Support all format specifiers.
|
||
|
format = Pointer_stringify(format);
|
||
|
var soFar = 0;
|
||
|
if (format.indexOf('%n') >= 0) {
|
||
|
// need to track soFar
|
||
|
var _get = get;
|
||
|
get = function() {
|
||
|
soFar++;
|
||
|
return _get();
|
||
|
}
|
||
|
var _unget = unget;
|
||
|
unget = function() {
|
||
|
soFar--;
|
||
|
return _unget();
|
||
|
}
|
||
|
}
|
||
|
var formatIndex = 0;
|
||
|
var argsi = 0;
|
||
|
var fields = 0;
|
||
|
var argIndex = 0;
|
||
|
var next;
|
||
|
mainLoop:
|
||
|
for (var formatIndex = 0; formatIndex < format.length;) {
|
||
|
if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {
|
||
|
var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
|
||
|
argIndex += Runtime.getAlignSize('void*', null, true);
|
||
|
HEAP32[((argPtr)>>2)]=soFar;
|
||
|
formatIndex += 2;
|
||
|
continue;
|
||
|
}
|
||
|
// TODO: Support strings like "%5c" etc.
|
||
|
if (format[formatIndex] === '%' && format[formatIndex+1] == 'c') {
|
||
|
var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
|
||
|
argIndex += Runtime.getAlignSize('void*', null, true);
|
||
|
fields++;
|
||
|
next = get();
|
||
|
HEAP8[(argPtr)]=next
|
||
|
formatIndex += 2;
|
||
|
continue;
|
||
|
}
|
||
|
// remove whitespace
|
||
|
while (1) {
|
||
|
next = get();
|
||
|
if (next == 0) return fields;
|
||
|
if (!(next in __scanString.whiteSpace)) break;
|
||
|
}
|
||
|
unget();
|
||
|
if (format[formatIndex] === '%') {
|
||
|
formatIndex++;
|
||
|
var suppressAssignment = false;
|
||
|
if (format[formatIndex] == '*') {
|
||
|
suppressAssignment = true;
|
||
|
formatIndex++;
|
||
|
}
|
||
|
var maxSpecifierStart = formatIndex;
|
||
|
while (format[formatIndex].charCodeAt(0) >= 48 &&
|
||
|
format[formatIndex].charCodeAt(0) <= 57) {
|
||
|
formatIndex++;
|
||
|
}
|
||
|
var max_;
|
||
|
if (formatIndex != maxSpecifierStart) {
|
||
|
max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);
|
||
|
}
|
||
|
var long_ = false;
|
||
|
var half = false;
|
||
|
var longLong = false;
|
||
|
if (format[formatIndex] == 'l') {
|
||
|
long_ = true;
|
||
|
formatIndex++;
|
||
|
if (format[formatIndex] == 'l') {
|
||
|
longLong = true;
|
||
|
formatIndex++;
|
||
|
}
|
||
|
} else if (format[formatIndex] == 'h') {
|
||
|
half = true;
|
||
|
formatIndex++;
|
||
|
}
|
||
|
var type = format[formatIndex];
|
||
|
formatIndex++;
|
||
|
var curr = 0;
|
||
|
var buffer = [];
|
||
|
// Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later
|
||
|
if (type == 'f' || type == 'e' || type == 'g' ||
|
||
|
type == 'F' || type == 'E' || type == 'G') {
|
||
|
var last = 0;
|
||
|
next = get();
|
||
|
while (next > 0) {
|
||
|
buffer.push(String.fromCharCode(next));
|
||
|
if (__isFloat(buffer.join(''))) {
|
||
|
last = buffer.length;
|
||
|
}
|
||
|
next = get();
|
||
|
}
|
||
|
for (var i = 0; i < buffer.length - last + 1; i++) {
|
||
|
unget();
|
||
|
}
|
||
|
buffer.length = last;
|
||
|
} else {
|
||
|
next = get();
|
||
|
var first = true;
|
||
|
while ((curr < max_ || isNaN(max_)) && next > 0) {
|
||
|
if (!(next in __scanString.whiteSpace) && // stop on whitespace
|
||
|
(type == 's' ||
|
||
|
((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||
|
||
|
(first && next == 45))) ||
|
||
|
((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||
|
||
|
next >= 97 && next <= 102 ||
|
||
|
next >= 65 && next <= 70))) &&
|
||
|
(formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up
|
||
|
buffer.push(String.fromCharCode(next));
|
||
|
next = get();
|
||
|
curr++;
|
||
|
first = false;
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
unget();
|
||
|
}
|
||
|
if (buffer.length === 0) return 0; // Failure.
|
||
|
if (suppressAssignment) continue;
|
||
|
var text = buffer.join('');
|
||
|
var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];
|
||
|
argIndex += Runtime.getAlignSize('void*', null, true);
|
||
|
switch (type) {
|
||
|
case 'd': case 'u': case 'i':
|
||
|
if (half) {
|
||
|
HEAP16[((argPtr)>>1)]=parseInt(text, 10);
|
||
|
} else if (longLong) {
|
||
|
(tempI64 = [parseInt(text, 10)>>>0,Math.min(Math.floor((parseInt(text, 10))/(+(4294967296))), (+(4294967295)))>>>0],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);
|
||
|
} else {
|
||
|
HEAP32[((argPtr)>>2)]=parseInt(text, 10);
|
||
|
}
|
||
|
break;
|
||
|
case 'X':
|
||
|
case 'x':
|
||
|
HEAP32[((argPtr)>>2)]=parseInt(text, 16)
|
||
|
break;
|
||
|
case 'F':
|
||
|
case 'f':
|
||
|
case 'E':
|
||
|
case 'e':
|
||
|
case 'G':
|
||
|
case 'g':
|
||
|
case 'E':
|
||
|
// fallthrough intended
|
||
|
if (long_) {
|
||
|
HEAPF64[((argPtr)>>3)]=parseFloat(text)
|
||
|
} else {
|
||
|
HEAPF32[((argPtr)>>2)]=parseFloat(text)
|
||
|
}
|
||
|
break;
|
||
|
case 's':
|
||
|
var array = intArrayFromString(text);
|
||
|
for (var j = 0; j < array.length; j++) {
|
||
|
HEAP8[(((argPtr)+(j))|0)]=array[j]
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
fields++;
|
||
|
} else if (format[formatIndex] in __scanString.whiteSpace) {
|
||
|
next = get();
|
||
|
while (next in __scanString.whiteSpace) {
|
||
|
if (next <= 0) break mainLoop; // End of input.
|
||
|
next = get();
|
||
|
}
|
||
|
unget(next);
|
||
|
formatIndex++;
|
||
|
} else {
|
||
|
// Not a specifier.
|
||
|
next = get();
|
||
|
if (format[formatIndex].charCodeAt(0) !== next) {
|
||
|
unget(next);
|
||
|
break mainLoop;
|
||
|
}
|
||
|
formatIndex++;
|
||
|
}
|
||
|
}
|
||
|
return fields;
|
||
|
}function _sscanf(s, format, varargs) {
|
||
|
// int sscanf(const char *restrict s, const char *restrict format, ... );
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html
|
||
|
var index = 0;
|
||
|
var get = function() { return HEAP8[(((s)+(index++))|0)]; };
|
||
|
var unget = function() { index--; };
|
||
|
return __scanString(format, get, unget, varargs);
|
||
|
}
|
||
|
var _atan2=Math.atan2;
|
||
|
var ___errno=___errno_location;
|
||
|
function _putchar(c) {
|
||
|
// int putchar(int c);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html
|
||
|
return _fputc(c, HEAP32[((_stdout)>>2)]);
|
||
|
}
|
||
|
Module["_saveSetjmp"] = _saveSetjmp;
|
||
|
Module["_testSetjmp"] = _testSetjmp;var _setjmp=undefined;
|
||
|
function _signal(sig, func) {
|
||
|
// TODO
|
||
|
return 0;
|
||
|
}
|
||
|
function _toupper(chr) {
|
||
|
if (chr >= 97 && chr <= 122) {
|
||
|
return chr - 97 + 65;
|
||
|
} else {
|
||
|
return chr;
|
||
|
}
|
||
|
}
|
||
|
function _longjmp(env, value) {
|
||
|
asm['setThrew'](env, value || 1);
|
||
|
throw 'longjmp';
|
||
|
}
|
||
|
function _time(ptr) {
|
||
|
var ret = Math.floor(Date.now()/1000);
|
||
|
if (ptr) {
|
||
|
HEAP32[((ptr)>>2)]=ret
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
var ___tm_struct_layout={__size__:44,tm_sec:0,tm_min:4,tm_hour:8,tm_mday:12,tm_mon:16,tm_year:20,tm_wday:24,tm_yday:28,tm_isdst:32,tm_gmtoff:36,tm_zone:40};
|
||
|
var ___tm_current=allocate(4*26, "i8", ALLOC_STATIC);
|
||
|
var ___tm_timezones={};
|
||
|
var __tzname=allocate(8, "i32*", ALLOC_STATIC);
|
||
|
var __daylight=allocate(1, "i32*", ALLOC_STATIC);
|
||
|
var __timezone=allocate(1, "i32*", ALLOC_STATIC);function _tzset() {
|
||
|
// TODO: Use (malleable) environment variables instead of system settings.
|
||
|
if (_tzset.called) return;
|
||
|
_tzset.called = true;
|
||
|
HEAP32[((__timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60
|
||
|
var winter = new Date(2000, 0, 1);
|
||
|
var summer = new Date(2000, 6, 1);
|
||
|
HEAP32[((__daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset())
|
||
|
var winterName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | winter.toString().match(/\(([A-Z]+)\)/)[1];
|
||
|
var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1];
|
||
|
var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL);
|
||
|
var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL);
|
||
|
HEAP32[((__tzname)>>2)]=winterNamePtr
|
||
|
HEAP32[(((__tzname)+(4))>>2)]=summerNamePtr
|
||
|
}function _localtime_r(time, tmPtr) {
|
||
|
_tzset();
|
||
|
var offsets = ___tm_struct_layout;
|
||
|
var date = new Date(HEAP32[((time)>>2)]*1000);
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getSeconds()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getMinutes()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getHours()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getDate()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getMonth()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getFullYear()-1900
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getDay()
|
||
|
var start = new Date(date.getFullYear(), 0, 1);
|
||
|
var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=start.getTimezoneOffset() * 60
|
||
|
var dst = Number(start.getTimezoneOffset() != date.getTimezoneOffset());
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=dst
|
||
|
var timezone = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | date.toString().match(/\(([A-Z]+)\)/)[1];
|
||
|
if (!(timezone in ___tm_timezones)) {
|
||
|
___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
|
||
|
}
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone]
|
||
|
return tmPtr;
|
||
|
}function _localtime(time) {
|
||
|
return _localtime_r(time, ___tm_current);
|
||
|
}
|
||
|
var ___tm_formatted=allocate(4*26, "i8", ALLOC_STATIC);
|
||
|
function _mktime(tmPtr) {
|
||
|
_tzset();
|
||
|
var offsets = ___tm_struct_layout;
|
||
|
var year = HEAP32[(((tmPtr)+(offsets.tm_year))>>2)];
|
||
|
var timestamp = new Date(year >= 1900 ? year : year + 1900,
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)],
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)],
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)],
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_min))>>2)],
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)],
|
||
|
0).getTime() / 1000;
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=new Date(timestamp).getDay()
|
||
|
var yday = Math.round((timestamp - (new Date(year, 0, 1)).getTime()) / (1000 * 60 * 60 * 24));
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
|
||
|
return timestamp;
|
||
|
}function _asctime_r(tmPtr, buf) {
|
||
|
var date = new Date(_mktime(tmPtr)*1000);
|
||
|
var formatted = date.toString();
|
||
|
var datePart = formatted.replace(/\d{4}.*/, '').replace(/ 0/, ' ');
|
||
|
var timePart = formatted.match(/\d{2}:\d{2}:\d{2}/)[0];
|
||
|
formatted = datePart + timePart + ' ' + date.getFullYear() + '\n';
|
||
|
formatted.split('').forEach(function(chr, index) {
|
||
|
HEAP8[(((buf)+(index))|0)]=chr.charCodeAt(0)
|
||
|
});
|
||
|
HEAP8[(((buf)+(25))|0)]=0
|
||
|
return buf;
|
||
|
}function _asctime(tmPtr) {
|
||
|
return _asctime_r(tmPtr, ___tm_formatted);
|
||
|
}function _ctime(timer) {
|
||
|
return _asctime(_localtime(timer));
|
||
|
}
|
||
|
var _llvm_va_start=undefined;
|
||
|
function _vfprintf(s, f, va_arg) {
|
||
|
return _fprintf(s, f, HEAP32[((va_arg)>>2)]);
|
||
|
}
|
||
|
function _llvm_va_end() {}
|
||
|
function _rename(old, new_) {
|
||
|
// int rename(const char *old, const char *new);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/rename.html
|
||
|
var oldObj = FS.analyzePath(Pointer_stringify(old));
|
||
|
var newObj = FS.analyzePath(Pointer_stringify(new_));
|
||
|
if (newObj.path == oldObj.path) {
|
||
|
return 0;
|
||
|
} else if (!oldObj.exists) {
|
||
|
___setErrNo(oldObj.error);
|
||
|
return -1;
|
||
|
} else if (oldObj.isRoot || oldObj.path == FS.currentPath) {
|
||
|
___setErrNo(ERRNO_CODES.EBUSY);
|
||
|
return -1;
|
||
|
} else if (newObj.parentPath &&
|
||
|
newObj.parentPath.indexOf(oldObj.path) == 0) {
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
} else if (newObj.exists && newObj.object.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.EISDIR);
|
||
|
return -1;
|
||
|
} else {
|
||
|
delete oldObj.parentObject.contents[oldObj.name];
|
||
|
newObj.parentObject.contents[newObj.name] = oldObj.object;
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
function _strftime(s, maxsize, format, timeptr) {
|
||
|
// size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);
|
||
|
// http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html
|
||
|
// TODO: Implement.
|
||
|
return 0;
|
||
|
}
|
||
|
function _qsort(base, num, size, cmp) {
|
||
|
if (num == 0 || size == 0) return;
|
||
|
// forward calls to the JavaScript sort method
|
||
|
// first, sort the items logically
|
||
|
var comparator = function(x, y) {
|
||
|
return Runtime.dynCall('iii', cmp, [x, y]);
|
||
|
}
|
||
|
var keys = [];
|
||
|
for (var i = 0; i < num; i++) keys.push(i);
|
||
|
keys.sort(function(a, b) {
|
||
|
return comparator(base+a*size, base+b*size);
|
||
|
});
|
||
|
// apply the sort
|
||
|
var temp = _malloc(num*size);
|
||
|
_memcpy(temp, base, num*size);
|
||
|
for (var i = 0; i < num; i++) {
|
||
|
if (keys[i] == i) continue; // already in place
|
||
|
_memcpy(base+i*size, temp+keys[i]*size, size);
|
||
|
}
|
||
|
_free(temp);
|
||
|
}
|
||
|
function _gettimeofday(ptr) {
|
||
|
// %struct.timeval = type { i32, i32 }
|
||
|
var now = Date.now();
|
||
|
HEAP32[((ptr)>>2)]=Math.floor(now/1000); // seconds
|
||
|
HEAP32[(((ptr)+(4))>>2)]=Math.floor((now-1000*Math.floor(now/1000))*1000); // microseconds
|
||
|
return 0;
|
||
|
}
|
||
|
function _opendir(dirname) {
|
||
|
// DIR *opendir(const char *dirname);
|
||
|
// http://pubs.opengroup.org/onlinepubs/007908799/xsh/opendir.html
|
||
|
// NOTE: Calculating absolute path redundantly since we need to associate it
|
||
|
// with the opened stream.
|
||
|
var path = FS.absolutePath(Pointer_stringify(dirname));
|
||
|
if (path === null) {
|
||
|
___setErrNo(ERRNO_CODES.ENOENT);
|
||
|
return 0;
|
||
|
}
|
||
|
var target = FS.findObject(path);
|
||
|
if (target === null) return 0;
|
||
|
if (!target.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.ENOTDIR);
|
||
|
return 0;
|
||
|
} else if (!target.read) {
|
||
|
___setErrNo(ERRNO_CODES.EACCES);
|
||
|
return 0;
|
||
|
}
|
||
|
var contents = [];
|
||
|
for (var key in target.contents) contents.push(key);
|
||
|
var id = FS.createFileHandle({
|
||
|
path: path,
|
||
|
object: target,
|
||
|
// An index into contents. Special values: -2 is ".", -1 is "..".
|
||
|
position: -2,
|
||
|
isRead: true,
|
||
|
isWrite: false,
|
||
|
isAppend: false,
|
||
|
error: false,
|
||
|
eof: false,
|
||
|
ungotten: [],
|
||
|
// Folder-specific properties:
|
||
|
// Remember the contents at the time of opening in an array, so we can
|
||
|
// seek between them relying on a single order.
|
||
|
contents: contents,
|
||
|
// Each stream has its own area for readdir() returns.
|
||
|
currentEntry: _malloc(___dirent_struct_layout.__size__)
|
||
|
});
|
||
|
return id;
|
||
|
}
|
||
|
function _readdir_r(dirp, entry, result) {
|
||
|
// int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
|
||
|
// http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html
|
||
|
if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
|
||
|
return ___setErrNo(ERRNO_CODES.EBADF);
|
||
|
}
|
||
|
var stream = FS.streams[dirp];
|
||
|
var loc = stream.position;
|
||
|
var entries = 0;
|
||
|
for (var key in stream.contents) entries++;
|
||
|
if (loc < -2 || loc >= entries) {
|
||
|
HEAP32[((result)>>2)]=0
|
||
|
} else {
|
||
|
var name, inode, type;
|
||
|
if (loc === -2) {
|
||
|
name = '.';
|
||
|
inode = 1; // Really undefined.
|
||
|
type = 4; //DT_DIR
|
||
|
} else if (loc === -1) {
|
||
|
name = '..';
|
||
|
inode = 1; // Really undefined.
|
||
|
type = 4; //DT_DIR
|
||
|
} else {
|
||
|
var object;
|
||
|
name = stream.contents[loc];
|
||
|
object = stream.object.contents[name];
|
||
|
inode = object.inodeNumber;
|
||
|
type = object.isDevice ? 2 // DT_CHR, character device.
|
||
|
: object.isFolder ? 4 // DT_DIR, directory.
|
||
|
: object.link !== undefined ? 10 // DT_LNK, symbolic link.
|
||
|
: 8; // DT_REG, regular file.
|
||
|
}
|
||
|
stream.position++;
|
||
|
var offsets = ___dirent_struct_layout;
|
||
|
HEAP32[(((entry)+(offsets.d_ino))>>2)]=inode
|
||
|
HEAP32[(((entry)+(offsets.d_off))>>2)]=stream.position
|
||
|
HEAP32[(((entry)+(offsets.d_reclen))>>2)]=name.length + 1
|
||
|
for (var i = 0; i < name.length; i++) {
|
||
|
HEAP8[(((entry + offsets.d_name)+(i))|0)]=name.charCodeAt(i)
|
||
|
}
|
||
|
HEAP8[(((entry + offsets.d_name)+(i))|0)]=0
|
||
|
HEAP8[(((entry)+(offsets.d_type))|0)]=type
|
||
|
HEAP32[((result)>>2)]=entry
|
||
|
}
|
||
|
return 0;
|
||
|
}function _readdir(dirp) {
|
||
|
// struct dirent *readdir(DIR *dirp);
|
||
|
// http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html
|
||
|
if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return 0;
|
||
|
} else {
|
||
|
if (!_readdir.result) _readdir.result = _malloc(4);
|
||
|
_readdir_r(dirp, FS.streams[dirp].currentEntry, _readdir.result);
|
||
|
if (HEAP32[((_readdir.result)>>2)] === 0) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return FS.streams[dirp].currentEntry;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
function _closedir(dirp) {
|
||
|
// int closedir(DIR *dirp);
|
||
|
// http://pubs.opengroup.org/onlinepubs/007908799/xsh/closedir.html
|
||
|
if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) {
|
||
|
return ___setErrNo(ERRNO_CODES.EBADF);
|
||
|
} else {
|
||
|
_free(FS.streams[dirp].currentEntry);
|
||
|
FS.streams[dirp] = null;
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
function _ungetc(c, stream) {
|
||
|
// int ungetc(int c, FILE *stream);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html
|
||
|
if (FS.streams[stream]) {
|
||
|
c = unSign(c & 0xFF);
|
||
|
FS.streams[stream].ungotten.push(c);
|
||
|
return c;
|
||
|
} else {
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
function _fmod(x, y) {
|
||
|
return x % y;
|
||
|
}
|
||
|
function _gmtime_r(time, tmPtr) {
|
||
|
var date = new Date(HEAP32[((time)>>2)]*1000);
|
||
|
var offsets = ___tm_struct_layout;
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getUTCSeconds()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getUTCMinutes()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getUTCHours()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getUTCDate()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getUTCMonth()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getUTCFullYear()-1900
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getUTCDay()
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=0
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=0
|
||
|
var start = new Date(date.getFullYear(), 0, 1);
|
||
|
var yday = Math.round((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday
|
||
|
var timezone = "GMT";
|
||
|
if (!(timezone in ___tm_timezones)) {
|
||
|
___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
|
||
|
}
|
||
|
HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone]
|
||
|
return tmPtr;
|
||
|
}function _gmtime(time) {
|
||
|
return _gmtime_r(time, ___tm_current);
|
||
|
}
|
||
|
function _setvbuf(stream, buf, type, size) {
|
||
|
// int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/setvbuf.html
|
||
|
// TODO: Implement custom buffering.
|
||
|
return 0;
|
||
|
}function _setbuf(stream, buf) {
|
||
|
// void setbuf(FILE *restrict stream, char *restrict buf);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/setbuf.html
|
||
|
if (buf) _setvbuf(stream, buf, 0, 8192); // _IOFBF, BUFSIZ.
|
||
|
else _setvbuf(stream, buf, 2, 8192); // _IONBF, BUFSIZ.
|
||
|
}
|
||
|
function _atexit(func, arg) {
|
||
|
__ATEXIT__.unshift({ func: func, arg: arg });
|
||
|
}
|
||
|
function _isatty(fildes) {
|
||
|
// int isatty(int fildes);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/isatty.html
|
||
|
if (!FS.streams[fildes]) {
|
||
|
___setErrNo(ERRNO_CODES.EBADF);
|
||
|
return 0;
|
||
|
}
|
||
|
if (FS.streams[fildes].isTerminal) return 1;
|
||
|
___setErrNo(ERRNO_CODES.ENOTTY);
|
||
|
return 0;
|
||
|
}
|
||
|
var ___utsname_struct_layout={__size__:160,sysname:0,nodename:32,release:64,version:96,machine:128};function _uname(name) {
|
||
|
// int uname(struct utsname *name);
|
||
|
// http://pubs.opengroup.org/onlinepubs/009695399/functions/uname.html
|
||
|
function copyString(element, value) {
|
||
|
var offset = ___utsname_struct_layout[element];
|
||
|
for (var i = 0; i < value.length; i++) {
|
||
|
HEAP8[(((name)+(offset + i))|0)]=value.charCodeAt(i)
|
||
|
}
|
||
|
HEAP8[(((name)+(offset + i))|0)]=0
|
||
|
}
|
||
|
if (name === 0) {
|
||
|
return -1;
|
||
|
} else {
|
||
|
copyString('sysname', 'Emscripten');
|
||
|
copyString('nodename', 'emscripten');
|
||
|
copyString('release', '1.0');
|
||
|
copyString('version', '#1');
|
||
|
copyString('machine', 'x86-JS');
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
function _nl_langinfo(item) {
|
||
|
// char *nl_langinfo(nl_item item);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/nl_langinfo.html
|
||
|
var result;
|
||
|
switch (item) {
|
||
|
case 0:
|
||
|
result = 'ANSI_X3.4-1968';
|
||
|
break;
|
||
|
case 1:
|
||
|
result = '%a %b %e %H:%M:%S %Y';
|
||
|
break;
|
||
|
case 2:
|
||
|
result = '%m/%d/%y';
|
||
|
break;
|
||
|
case 3:
|
||
|
result = '%H:%M:%S';
|
||
|
break;
|
||
|
case 4:
|
||
|
result = '%I:%M:%S %p';
|
||
|
break;
|
||
|
case 5:
|
||
|
result = 'AM';
|
||
|
break;
|
||
|
case 6:
|
||
|
result = 'PM';
|
||
|
break;
|
||
|
case 7:
|
||
|
result = 'Sunday';
|
||
|
break;
|
||
|
case 8:
|
||
|
result = 'Monday';
|
||
|
break;
|
||
|
case 9:
|
||
|
result = 'Tuesday';
|
||
|
break;
|
||
|
case 10:
|
||
|
result = 'Wednesday';
|
||
|
break;
|
||
|
case 11:
|
||
|
result = 'Thursday';
|
||
|
break;
|
||
|
case 12:
|
||
|
result = 'Friday';
|
||
|
break;
|
||
|
case 13:
|
||
|
result = 'Saturday';
|
||
|
break;
|
||
|
case 14:
|
||
|
result = 'Sun';
|
||
|
break;
|
||
|
case 15:
|
||
|
result = 'Mon';
|
||
|
break;
|
||
|
case 16:
|
||
|
result = 'Tue';
|
||
|
break;
|
||
|
case 17:
|
||
|
result = 'Wed';
|
||
|
break;
|
||
|
case 18:
|
||
|
result = 'Thu';
|
||
|
break;
|
||
|
case 19:
|
||
|
result = 'Fri';
|
||
|
break;
|
||
|
case 20:
|
||
|
result = 'Sat';
|
||
|
break;
|
||
|
case 21:
|
||
|
result = 'January';
|
||
|
break;
|
||
|
case 22:
|
||
|
result = 'February';
|
||
|
break;
|
||
|
case 23:
|
||
|
result = 'March';
|
||
|
break;
|
||
|
case 24:
|
||
|
result = 'April';
|
||
|
break;
|
||
|
case 25:
|
||
|
result = 'May';
|
||
|
break;
|
||
|
case 26:
|
||
|
result = 'June';
|
||
|
break;
|
||
|
case 27:
|
||
|
result = 'July';
|
||
|
break;
|
||
|
case 28:
|
||
|
result = 'August';
|
||
|
break;
|
||
|
case 29:
|
||
|
result = 'September';
|
||
|
break;
|
||
|
case 30:
|
||
|
result = 'October';
|
||
|
break;
|
||
|
case 31:
|
||
|
result = 'November';
|
||
|
break;
|
||
|
case 32:
|
||
|
result = 'December';
|
||
|
break;
|
||
|
case 33:
|
||
|
result = 'Jan';
|
||
|
break;
|
||
|
case 34:
|
||
|
result = 'Feb';
|
||
|
break;
|
||
|
case 35:
|
||
|
result = 'Mar';
|
||
|
break;
|
||
|
case 36:
|
||
|
result = 'Apr';
|
||
|
break;
|
||
|
case 37:
|
||
|
result = 'May';
|
||
|
break;
|
||
|
case 38:
|
||
|
result = 'Jun';
|
||
|
break;
|
||
|
case 39:
|
||
|
result = 'Jul';
|
||
|
break;
|
||
|
case 40:
|
||
|
result = 'Aug';
|
||
|
break;
|
||
|
case 41:
|
||
|
result = 'Sep';
|
||
|
break;
|
||
|
case 42:
|
||
|
result = 'Oct';
|
||
|
break;
|
||
|
case 43:
|
||
|
result = 'Nov';
|
||
|
break;
|
||
|
case 44:
|
||
|
result = 'Dec';
|
||
|
break;
|
||
|
case 49:
|
||
|
result = '';
|
||
|
break;
|
||
|
case 50:
|
||
|
result = '.';
|
||
|
break;
|
||
|
case 51:
|
||
|
result = '';
|
||
|
break;
|
||
|
case 52:
|
||
|
result = '^[yY]';
|
||
|
break;
|
||
|
case 53:
|
||
|
result = '^[nN]';
|
||
|
break;
|
||
|
case 56:
|
||
|
result = '-';
|
||
|
break;
|
||
|
case 45:
|
||
|
case 46:
|
||
|
case 47:
|
||
|
case 48:
|
||
|
default:
|
||
|
result = '';
|
||
|
break;
|
||
|
}
|
||
|
var me = _nl_langinfo;
|
||
|
if (!me.ret) me.ret = _malloc(32);
|
||
|
for (var i = 0; i < result.length; i++) {
|
||
|
HEAP8[(((me.ret)+(i))|0)]=result.charCodeAt(i)
|
||
|
}
|
||
|
HEAP8[(((me.ret)+(i))|0)]=0
|
||
|
return me.ret;
|
||
|
}
|
||
|
function _iconv_open() {
|
||
|
Module['printErr']('missing function: iconv_open'); abort(-1);
|
||
|
}
|
||
|
function _iconv() {
|
||
|
Module['printErr']('missing function: iconv'); abort(-1);
|
||
|
}
|
||
|
function _iconv_close() {
|
||
|
Module['printErr']('missing function: iconv_close'); abort(-1);
|
||
|
}
|
||
|
function _localeconv() {
|
||
|
// %struct.timeval = type { char* decimal point, other stuff... }
|
||
|
// var indexes = Runtime.calculateStructAlignment({ fields: ['i32', 'i32'] });
|
||
|
var me = _localeconv;
|
||
|
if (!me.ret) {
|
||
|
me.ret = allocate([allocate(intArrayFromString('.'), 'i8', ALLOC_NORMAL)], 'i8*', ALLOC_NORMAL); // just decimal point, for now
|
||
|
}
|
||
|
return me.ret;
|
||
|
}
|
||
|
function _isprint(chr) {
|
||
|
return 0x1F < chr && chr < 0x7F;
|
||
|
}
|
||
|
function _erfc(x) {
|
||
|
var MATH_TOLERANCE = 1E-12;
|
||
|
var ONE_SQRTPI = 0.564189583547756287;
|
||
|
var a = 1;
|
||
|
var b = x;
|
||
|
var c = x;
|
||
|
var d = x * x + 0.5;
|
||
|
var n = 1.0;
|
||
|
var q2 = b / d;
|
||
|
var q1, t;
|
||
|
if (Math.abs(x) < 2.2) {
|
||
|
return 1.0 - _erf(x);
|
||
|
}
|
||
|
if (x < 0) {
|
||
|
return 2.0 - _erfc(-x);
|
||
|
}
|
||
|
do {
|
||
|
t = a * n + b * x;
|
||
|
a = b;
|
||
|
b = t;
|
||
|
t = c * n + d * x;
|
||
|
c = d;
|
||
|
d = t;
|
||
|
n += 0.5;
|
||
|
q1 = q2;
|
||
|
q2 = b / d;
|
||
|
} while (Math.abs(q1 - q2) / q2 > MATH_TOLERANCE);
|
||
|
return (ONE_SQRTPI * Math.exp(- x * x) * q2);
|
||
|
}function _erf(x) {
|
||
|
var MATH_TOLERANCE = 1E-12;
|
||
|
var TWO_SQRTPI = 1.128379167095512574;
|
||
|
var sum = x;
|
||
|
var term = x;
|
||
|
var xsqr = x*x;
|
||
|
var j = 1;
|
||
|
if (Math.abs(x) > 2.2) {
|
||
|
return 1.0 - _erfc(x);
|
||
|
}
|
||
|
do {
|
||
|
term *= xsqr / j;
|
||
|
sum -= term / (2 * j + 1);
|
||
|
++j;
|
||
|
term *= xsqr / j;
|
||
|
sum += term / (2 * j + 1);
|
||
|
++j;
|
||
|
} while (Math.abs(term / sum) > MATH_TOLERANCE);
|
||
|
return (TWO_SQRTPI * sum);
|
||
|
}
|
||
|
function _lgamma() {
|
||
|
Module['printErr']('missing function: lgamma'); abort(-1);
|
||
|
}
|
||
|
function ___signgam() {
|
||
|
Module['printErr']('missing function: __signgam'); abort(-1);
|
||
|
}
|
||
|
function _modf(x, intpart) {
|
||
|
HEAPF64[((intpart)>>3)]=Math.floor(x)
|
||
|
return x - HEAPF64[((intpart)>>3)];
|
||
|
}
|
||
|
function _cosh(x) {
|
||
|
var p = Math.pow(Math.E, x);
|
||
|
return (p + (1 / p)) / 2;
|
||
|
}
|
||
|
function _sinh(x) {
|
||
|
var p = Math.pow(Math.E, x);
|
||
|
return (p - (1 / p)) / 2;
|
||
|
}
|
||
|
var _tan=Math.tan;
|
||
|
var _asin=Math.asin;
|
||
|
var _acos=Math.acos;
|
||
|
var _atan=Math.atan;
|
||
|
function _sleep(seconds) {
|
||
|
// unsigned sleep(unsigned seconds);
|
||
|
// http://pubs.opengroup.org/onlinepubs/000095399/functions/sleep.html
|
||
|
return _usleep(seconds * 1e6);
|
||
|
}
|
||
|
function _strdup(ptr) {
|
||
|
var len = _strlen(ptr);
|
||
|
var newStr = _malloc(len + 1);
|
||
|
_memcpy(newStr, ptr, len);
|
||
|
HEAP8[(((newStr)+(len))|0)]=0;
|
||
|
return newStr;
|
||
|
}
|
||
|
function _vsnprintf(s, n, format, va_arg) {
|
||
|
return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]);
|
||
|
}
|
||
|
function _abort() {
|
||
|
ABORT = true;
|
||
|
throw 'abort() at ' + (new Error().stack);
|
||
|
}
|
||
|
function _sysconf(name) {
|
||
|
// long sysconf(int name);
|
||
|
// http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html
|
||
|
switch(name) {
|
||
|
case 8: return PAGE_SIZE;
|
||
|
case 54:
|
||
|
case 56:
|
||
|
case 21:
|
||
|
case 61:
|
||
|
case 63:
|
||
|
case 22:
|
||
|
case 67:
|
||
|
case 23:
|
||
|
case 24:
|
||
|
case 25:
|
||
|
case 26:
|
||
|
case 27:
|
||
|
case 69:
|
||
|
case 28:
|
||
|
case 101:
|
||
|
case 70:
|
||
|
case 71:
|
||
|
case 29:
|
||
|
case 30:
|
||
|
case 199:
|
||
|
case 75:
|
||
|
case 76:
|
||
|
case 32:
|
||
|
case 43:
|
||
|
case 44:
|
||
|
case 80:
|
||
|
case 46:
|
||
|
case 47:
|
||
|
case 45:
|
||
|
case 48:
|
||
|
case 49:
|
||
|
case 42:
|
||
|
case 82:
|
||
|
case 33:
|
||
|
case 7:
|
||
|
case 108:
|
||
|
case 109:
|
||
|
case 107:
|
||
|
case 112:
|
||
|
case 119:
|
||
|
case 121:
|
||
|
return 200809;
|
||
|
case 13:
|
||
|
case 104:
|
||
|
case 94:
|
||
|
case 95:
|
||
|
case 34:
|
||
|
case 35:
|
||
|
case 77:
|
||
|
case 81:
|
||
|
case 83:
|
||
|
case 84:
|
||
|
case 85:
|
||
|
case 86:
|
||
|
case 87:
|
||
|
case 88:
|
||
|
case 89:
|
||
|
case 90:
|
||
|
case 91:
|
||
|
case 94:
|
||
|
case 95:
|
||
|
case 110:
|
||
|
case 111:
|
||
|
case 113:
|
||
|
case 114:
|
||
|
case 115:
|
||
|
case 116:
|
||
|
case 117:
|
||
|
case 118:
|
||
|
case 120:
|
||
|
case 40:
|
||
|
case 16:
|
||
|
case 79:
|
||
|
case 19:
|
||
|
return -1;
|
||
|
case 92:
|
||
|
case 93:
|
||
|
case 5:
|
||
|
case 72:
|
||
|
case 6:
|
||
|
case 74:
|
||
|
case 92:
|
||
|
case 93:
|
||
|
case 96:
|
||
|
case 97:
|
||
|
case 98:
|
||
|
case 99:
|
||
|
case 102:
|
||
|
case 103:
|
||
|
case 105:
|
||
|
return 1;
|
||
|
case 38:
|
||
|
case 66:
|
||
|
case 50:
|
||
|
case 51:
|
||
|
case 4:
|
||
|
return 1024;
|
||
|
case 15:
|
||
|
case 64:
|
||
|
case 41:
|
||
|
return 32;
|
||
|
case 55:
|
||
|
case 37:
|
||
|
case 17:
|
||
|
return 2147483647;
|
||
|
case 18:
|
||
|
case 1:
|
||
|
return 47839;
|
||
|
case 59:
|
||
|
case 57:
|
||
|
return 99;
|
||
|
case 68:
|
||
|
case 58:
|
||
|
return 2048;
|
||
|
case 0: return 2097152;
|
||
|
case 3: return 65536;
|
||
|
case 14: return 32768;
|
||
|
case 73: return 32767;
|
||
|
case 39: return 16384;
|
||
|
case 60: return 1000;
|
||
|
case 106: return 700;
|
||
|
case 52: return 256;
|
||
|
case 62: return 255;
|
||
|
case 2: return 100;
|
||
|
case 65: return 64;
|
||
|
case 36: return 20;
|
||
|
case 100: return 16;
|
||
|
case 20: return 6;
|
||
|
case 53: return 4;
|
||
|
case 10: return 1;
|
||
|
}
|
||
|
___setErrNo(ERRNO_CODES.EINVAL);
|
||
|
return -1;
|
||
|
}
|
||
|
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 _llvm_lifetime_start() {}
|
||
|
function _llvm_lifetime_end() {}
|
||
|
var _llvm_memset_p0i8_i64=_memset;
|
||
|
var _llvm_memcpy_p0i8_p0i8_i64=_memcpy;
|
||
|
function _llvm_trap() {
|
||
|
throw 'trap! ' + new Error().stack;
|
||
|
}
|
||
|
var Browser={mainLoop:{scheduler:null,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 (Browser.initted) 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) : console.log("warning: cannot create object URLs");
|
||
|
// 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.).
|
||
|
function getMimetype(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)];
|
||
|
}
|
||
|
if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
|
||
|
var imagePlugin = {};
|
||
|
imagePlugin['canHandle'] = function(name) {
|
||
|
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/.exec(name);
|
||
|
};
|
||
|
imagePlugin['handle'] = function(byteArray, name, onload, onerror) {
|
||
|
var b = null;
|
||
|
if (Browser.hasBlobConstructor) {
|
||
|
try {
|
||
|
b = new Blob([byteArray], { type: 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() {
|
||
|
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(event) {
|
||
|
console.log('Image ' + url + ' could not be decoded');
|
||
|
if (onerror) onerror();
|
||
|
};
|
||
|
img.src = url;
|
||
|
};
|
||
|
Module['preloadPlugins'].push(imagePlugin);
|
||
|
var audioPlugin = {};
|
||
|
audioPlugin['canHandle'] = function(name) {
|
||
|
return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
|
||
|
};
|
||
|
audioPlugin['handle'] = function(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: 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(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'];
|
||
|
canvas.requestPointerLock = canvas['requestPointerLock'] ||
|
||
|
canvas['mozRequestPointerLock'] ||
|
||
|
canvas['webkitRequestPointerLock'];
|
||
|
canvas.exitPointerLock = document['exitPointerLock'] ||
|
||
|
document['mozExitPointerLock'] ||
|
||
|
document['webkitExitPointerLock'] ||
|
||
|
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.addEventListener('pointerlockchange', pointerLockChange, false);
|
||
|
document.addEventListener('mozpointerlockchange', pointerLockChange, false);
|
||
|
document.addEventListener('webkitpointerlockchange', 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) {
|
||
|
var ctx;
|
||
|
try {
|
||
|
if (useWebGL) {
|
||
|
ctx = canvas.getContext('experimental-webgl', {
|
||
|
alpha: false
|
||
|
});
|
||
|
} else {
|
||
|
ctx = canvas.getContext('2d');
|
||
|
}
|
||
|
if (!ctx) throw ':(';
|
||
|
} catch (e) {
|
||
|
Module.print('Could not create canvas - ' + 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) {
|
||
|
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;
|
||
|
if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
|
||
|
document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
|
||
|
document['fullScreenElement'] || document['fullscreenElement']) === canvas) {
|
||
|
canvas.cancelFullScreen = document['cancelFullScreen'] ||
|
||
|
document['mozCancelFullScreen'] ||
|
||
|
document['webkitCancelFullScreen'];
|
||
|
canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);
|
||
|
if (Browser.lockPointer) canvas.requestPointerLock();
|
||
|
Browser.isFullScreen = true;
|
||
|
if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();
|
||
|
} else if (Browser.resizeCanvas){
|
||
|
Browser.setWindowedCanvasSize();
|
||
|
}
|
||
|
if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);
|
||
|
}
|
||
|
if (!Browser.fullScreenHandlersInstalled) {
|
||
|
Browser.fullScreenHandlersInstalled = true;
|
||
|
document.addEventListener('fullscreenchange', fullScreenChange, false);
|
||
|
document.addEventListener('mozfullscreenchange', fullScreenChange, false);
|
||
|
document.addEventListener('webkitfullscreenchange', fullScreenChange, false);
|
||
|
}
|
||
|
canvas.requestFullScreen = canvas['requestFullScreen'] ||
|
||
|
canvas['mozRequestFullScreen'] ||
|
||
|
(canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);
|
||
|
canvas.requestFullScreen();
|
||
|
},requestAnimationFrame:function (func) {
|
||
|
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);
|
||
|
},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;
|
||
|
},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);
|
||
|
}
|
||
|
Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
|
||
|
Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
|
||
|
} else {
|
||
|
// Otherwise, calculate the movement based on the changes
|
||
|
// in the coordinates.
|
||
|
var rect = Module["canvas"].getBoundingClientRect();
|
||
|
var x = event.pageX - (window.scrollX + rect.left);
|
||
|
var y = event.pageY - (window.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() {
|
||
|
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'];
|
||
|
canvas.width = width;
|
||
|
canvas.height = height;
|
||
|
if (!noUpdates) Browser.updateResizeListeners();
|
||
|
},windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {
|
||
|
var canvas = Module['canvas'];
|
||
|
this.windowedWidth = canvas.width;
|
||
|
this.windowedHeight = canvas.height;
|
||
|
canvas.width = screen.width;
|
||
|
canvas.height = screen.height;
|
||
|
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 () {
|
||
|
var canvas = Module['canvas'];
|
||
|
canvas.width = this.windowedWidth;
|
||
|
canvas.height = this.windowedHeight;
|
||
|
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();
|
||
|
}};
|
||
|
__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;
|
||
|
_fgetc.ret = allocate([0], "i8", ALLOC_STATIC);
|
||
|
_fputc.ret = allocate([0], "i8", ALLOC_STATIC);
|
||
|
___buildEnvironment(ENV);
|
||
|
Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };
|
||
|
Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };
|
||
|
Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };
|
||
|
Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };
|
||
|
Module["getUserMedia"] = function() { 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); // Stack must fit in TOTAL_MEMORY; allocations from here on may enlarge TOTAL_MEMORY
|
||
|
var Math_min = Math.min;
|
||
|
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_viffiii(index,a1,a2,a3,a4,a5,a6) {
|
||
|
try {
|
||
|
Module["dynCall_viffiii"](index,a1,a2,a3,a4,a5,a6);
|
||
|
} catch(e) {
|
||
|
if (typeof e !== 'number' && e !== 'longjmp') throw e;
|
||
|
asm["setThrew"](1, 0);
|
||
|
}
|
||
|
}
|
||
|
function invoke_vf(index,a1) {
|
||
|
try {
|
||
|
Module["dynCall_vf"](index,a1);
|
||
|
} catch(e) {
|
||
|
if (typeof e !== 'number' && e !== 'longjmp') throw e;
|
||
|
asm["setThrew"](1, 0);
|
||
|
}
|
||
|
}
|
||
|
function invoke_i(index) {
|
||
|
try {
|
||
|
return Module["dynCall_i"](index);
|
||
|
} 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_iff(index,a1,a2) {
|
||
|
try {
|
||
|
return Module["dynCall_iff"](index,a1,a2);
|
||
|
} catch(e) {
|
||
|
if (typeof e !== 'number' && e !== 'longjmp') throw e;
|
||
|
asm["setThrew"](1, 0);
|
||
|
}
|
||
|
}
|
||
|
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_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_vifiii(index,a1,a2,a3,a4,a5) {
|
||
|
try {
|
||
|
Module["dynCall_vifiii"](index,a1,a2,a3,a4,a5);
|
||
|
} catch(e) {
|
||
|
if (typeof e !== 'number' && e !== 'longjmp') throw e;
|
||
|
asm["setThrew"](1, 0);
|
||
|
}
|
||
|
}
|
||
|
function invoke_iiiii(index,a1,a2,a3,a4) {
|
||
|
try {
|
||
|
return Module["dynCall_iiiii"](index,a1,a2,a3,a4);
|
||
|
} catch(e) {
|
||
|
if (typeof e !== 'number' && e !== 'longjmp') throw e;
|
||
|
asm["setThrew"](1, 0);
|
||
|
}
|
||
|
}
|
||
|
function invoke_fii(index,a1,a2) {
|
||
|
try {
|
||
|
return Module["dynCall_fii"](index,a1,a2);
|
||
|
} 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 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 asm=(function(global,env,buffer){"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env._stderr|0;var n=env._stdout|0;var o=env._stdin|0;var p=+env.NaN;var q=+env.Infinity;var r=0;var s=0;var t=0;var u=0;var v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=global.Math.floor;var P=global.Math.abs;var Q=global.Math.sqrt;var R=global.Math.pow;var S=global.Math.cos;var T=global.Math.sin;var U=global.Math.tan;var V=global.Math.acos;var W=global.Math.asin;var X=global.Math.atan;var Y=global.Math.atan2;var Z=global.Math.exp;var _=global.Math.log;var $=global.Math.ceil;var aa=global.Math.imul;var ab=env.abort;var ac=env.assert;var ad=env.asmPrintInt;var ae=env.asmPrintFloat;var af=env.copyTempDouble;var ag=env.copyTempFloat;var ah=env.min;var ai=env.invoke_viiiii;var aj=env.invoke_viffiii;var ak=env.invoke_vf;var al=env.invoke_i;var am=env.invoke_vi;var an=env.invoke_vii;var ao=env.invoke_ii;var ap=env.invoke_iff;var aq=env.invoke_iiii;var ar=env.invoke_viii;var as=env.invoke_v;var at=env.invoke_vifiii;var au=env.invoke_iiiii;var av=env.invoke_fii;var aw=env.invoke_iii;var ax=env._lseek;var ay=env.__scanString;var az=env._fclose;var aA=env._uname;var aB=env._sleep;var aC=env.__isFloat;var aD=env._fflush;var aE=env._strtol;var aF=env._fputc;var aG=env._iconv;var aH=env.___signgam;var aI=env._fwrite;var aJ=env._send;var aK=env._fputs;var aL=env._tmpnam;var aM=env._isspace;var aN=env._localtime;var aO=env._read;var aP=env._ceil;var aQ=env._strstr;var aR=env._fileno;var aS=env._perror;var aT=env._ctime;var aU=env._fsync;var aV=env._signal;var aW=env._opendir;var aX=env._fmod;var aY=env._strcmp;var aZ=env._memchr;var a_=env._strncmp;var a$=env._tmpfile;var a0=env._snprintf;var a1=env._fgetc;var a2=env._pclose;var a3=env._readdir;var a4=env._cosh;var a5=env._atexit;var a6=env._fgets;var a7=env._close;var a8=env._strchr;var a9=env._asin;var ba=env._llvm_lifetime_start;var bb=env.___setErrNo;var bc=env._ftell;var bd=env._exit;var be=env._sprintf;var bf=env._llvm_lifetime_end;var bg=env._asctime;var bh=env._strrchr;var bi=env._iconv_open;var bj=env._modf;var bk=env._strcspn;var bl=env._getcwd;var bm=env._gmtime;var bn=env._localtime_r;var bo=env._asctime_r;var bp=env._recv;var bq=env._cos;var br=env._putchar;var bs=env._isalnum;var bt=env._popen;var bu=env._erfc;var bv=env.__exit;var bw=env._strftime;var bx=env._llvm_va_end;var by=env._tzset;var bz=env._sinh;var bA=env._setlocale;var bB=env._isprint;var bC=env._toupper;var bD=env._printf;var bE=env._pread;var bF=env._fopen;var bG=env._open;var bH=env._usleep;var bI=env._log;var bJ=env._puts;var bK=env._mktime;var bL=env._fdopen;var bM=env._qsort;var bN=env._system;var bO=env._isalpha;var bP=env._strdup;var bQ=env._log10;var bR=env._closedir;var bS=env._isatty;var bT=env.__formatString;var bU=env._getenv;var bV=env._gettimeofday;var bW=env._atoi;var bX=env._vfprintf;var bY=env._chdir;var bZ=env._llvm_pow_f64;var b_=env._sbrk;var b$=env._localeconv;var b0=env.___errno_location;var b1=env._strerror;var b2=env._lgamma;var b3=env._erf;var b4=env._strspn;var b5=env.__parseInt;var b6=env._ungetc;var b7=env._llvm_trap;var b8=env._rename;var b9=env._vsnprintf;var ca=env._sscanf;var cb=env._sysconf;var cc=env._acos;var cd=env._fread;var ce=env._abort;var cf=env._fprintf;var cg=env.___fpclassifyf;var ch=env._tan;var ci=env.___buildEnvironment;var cj=env._feof;var ck=env._strncat;var cl=env._gmtime_r;var cm=env._fabs;var cn=env._floor;var co=env.__reallyNegative;var cp=env._fseek;var cq=env._sqrt;var cr=env._write;var cs=env._rewind;var ct=env._sin;var cu=env._stat;var cv=env._longjmp;var cw=env._atan;var cx=env._readdir_r;var cy=env._strpbrk;var cz=env._iconv_close;var cA=env._se
|
||
|
// EMSCRIPTEN_START_FUNCS
|
||
|
function cX(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7>>3<<3;return b|0}function cY(){return i|0}function cZ(a){a=a|0;i=a}function c_(a,b){a=a|0;b=b|0;if((r|0)==0){r=a;s=b}}function c$(a){a=a|0;E=a}function c0(a){a=a|0;F=a}function c1(a){a=a|0;G=a}function c2(a){a=a|0;H=a}function c3(a){a=a|0;I=a}function c4(a){a=a|0;J=a}function c5(a){a=a|0;K=a}function c6(a){a=a|0;L=a}function c7(a){a=a|0;M=a}function c8(a){a=a|0;N=a}function c9(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,x=0.0;d=i;i=i+96|0;e=d|0;f=d+48|0;do{if((c[64808+(b*688&-1)>>2]|0)==1){if((a[64812+(b*688&-1)|0]&1)==0){break}g=4968+(b*51&-1)|0;a[g]=0;j=4608+(b<<2)|0;k=+da(c[j>>2]|0,+h[64664+(b*688&-1)>>3]);t3(e,k);k=+da(c[j>>2]|0,+h[64672+(b*688&-1)>>3]);t3(f,k);l=c[f+20>>2]|0;m=c[e+20>>2]|0;n=(l|0)==(m|0);do{if(n){if((c[f+28>>2]|0)!=(c[e+28>>2]|0)){break}if((c[f+8>>2]|0)!=(c[e+8>>2]|0)){a[g]=a[172544]|0;a[g+1|0]=a[172545|0]|0;a[g+2|0]=a[172546|0]|0}o=c[j>>2]|0;if(o>>>0>=4){p=g;i=d;return p|0}if((a[g]|0)!=0){q=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=58;a[q]=w&255;w=w>>8;a[q+1|0]=w&255}q=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[q]=a[164672]|0;a[q+1|0]=a[164673|0]|0;a[q+2|0]=a[164674|0]|0;if(o>>>0>=3){p=g;i=d;return p|0}o=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=5449018;a[o]=w&255;w=w>>8;a[o+1|0]=w&255;w=w>>8;a[o+2|0]=w&255;w=w>>8;a[o+3|0]=w&255;p=g;i=d;return p|0}}while(0);o=64813+(b*688&-1)|0;q=a8(o|0,109)|0;r=q>>>0<(a8(o|0,100)|0)>>>0;do{if(n){if(r){a[g]=a[145768]|0;a[g+1|0]=a[145769|0]|0;a[g+2|0]=a[145770|0]|0;a[g+3|0]=a[145771|0]|0;a[g+4|0]=a[145772|0]|0;a[g+5|0]=a[145773|0]|0;break}else{a[g]=a[143792]|0;a[g+1|0]=a[143793|0]|0;a[g+2|0]=a[143794|0]|0;a[g+3|0]=a[143795|0]|0;a[g+4|0]=a[143796|0]|0;a[g+5|0]=a[143797|0]|0;break}}else{o=g;q=o|0;w=r?623865125:623862821;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=o+4|0;w=r?2436964:2436973;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=(uA(g|0)|0)+(4968+(b*51&-1))|0;if(((l|0)/100&-1|0)==((m|0)/100&-1|0)){w=121;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}else{w=89;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}}}while(0);if((c[j>>2]|0)>>>0>=5){p=g;i=d;return p|0}m=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[m]=a[142240]|0;a[m+1|0]=a[142241|0]|0;a[m+2|0]=a[142242|0]|0;a[m+3|0]=a[142243|0]|0;a[m+4|0]=a[142244|0]|0;a[m+5|0]=a[142245|0]|0;a[m+6|0]=a[142246|0]|0;p=g;i=d;return p|0}}while(0);e=4968+(b*51&-1)|0;uB(e|0,64864+(b*688&-1)|0);if((aY(e|0,186288)|0)!=0){p=e;i=d;return p|0}k=+h[64664+(b*688&-1)>>3];if((a[64788+(b*688&-1)|0]&1)==0){s=+h[64672+(b*688&-1)>>3];t=k}else{u=+h[64800+(b*688&-1)>>3];x=+Z(+(k*u));s=+Z(+(+h[64672+(b*688&-1)>>3]*u));t=x}b=~~+$(+(-0.0- +bQ(+(+P(+(s-t))))));if(t*s>0.0&(b|0)>4){f=(b|0)>14?14:b;be(e|0,180872,(v=i,i=i+8|0,c[v>>2]=f,v)|0);p=e;i=d;return p|0}else{a[e]=a[170912]|0;a[e+1|0]=a[170913|0]|0;a[e+2|0]=a[170914|0]|0;p=e;i=d;return p|0}return 0}function da(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,h=0,j=0;d=i;i=i+48|0;e=d|0;if(a>>>0<2){f=b;i=d;return+f}t3(e,b);g=e|0;if((c[g>>2]|0)>55){h=e+4|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;do{if(a>>>0>2){g=e+4|0;if((c[g>>2]|0)>55){h=e+8|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;if(a>>>0<=3){break}g=e+8|0;if((c[g>>2]|0)>22){c[g>>2]=0;c[e+12>>2]=0;g=e+28|0;c[g>>2]=(c[g>>2]|0)+1;b=+t2(e);t3(e,b)}if(a>>>0<=5){break}g=e+12|0;do{if((c[g>>2]|0)>25){h=e+16|0;j=(c[h>>2]|0)+1|0;c[h>>2]=j;if((j|0)<=11){break}j=e+20|0;c[j>>2]=(c[j>>2]|0)+1;c[h>>2]=0}}while(0);c[g>>2]=1}}while(0);f=+t2(e);i=d;return+f}function db(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;do{if((a|0)==0){f=ut(b)|0;if((f|0)!=0){g=f;break}gk();f=ut(b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}else{f=uv(a,b)|0;if((f|0)!=0){g=f;break}gk();f=uv(a,b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}}while(0);i=e;return g|0}function dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0,n=0.0,o=0,p=0,q=0;d=i;e=64664+(a*688&-1)|0;f=+h[e>>3];g=64672+(a*688&-1)|0;j=+h[g>>3];k=(b|0)!=0;do{if(k){if(!(f==8.988465674311579e+307|j==-8.988465674311579e+307)){break}uf(c[13898]|0,b,(v=i,i=i+1|0,i=i+7>>3<
|
||
|
function hH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0.0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0.0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0.0,bp=0.0,bq=0.0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0.0,bz=0.0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0;f=i;i=i+272|0;g=f|0;j=f+24|0;k=f+48|0;l=f+72|0;m=f+96|0;n=f+120|0;o=f+144|0;p=f+168|0;q=f+192|0;r=f+216|0;s=r;t=b;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[s+16>>2]=c[t+16>>2];c[s+20>>2]=c[t+20>>2];c[s+24>>2]=c[t+24>>2];c[s+28>>2]=c[t+28>>2];c[s+32>>2]=c[t+32>>2];c[s+36>>2]=c[t+36>>2];c[s+40>>2]=c[t+40>>2];c[s+44>>2]=c[t+44>>2];c[s+48>>2]=c[t+48>>2];c[s+52>>2]=c[t+52>>2];L2163:do{if(d){s=c[13898]|0;u=c[1054]|0;w=c[u+(s*40&-1)+36>>2]|0;x=c[u+(s*40&-1)+32>>2]|0;y=(a[u+(s*40&-1)|0]&1)==0;L2165:do{if((w|0)>0&(y^1)){u=c[10036]|0;z=0;A=0;B=x;while(1){if((a[z+73824|0]|0)==(a[u+(z+B|0)|0]|0)){C=B;D=A}else{if((z|0)!=5){E=1558;break L2165}C=B-1|0;D=1}F=z+1|0;if((F|0)<(D+w|0)){z=F;A=D;B=C}else{break}}if((D|0)!=0){break}if(!((z|0)==4|(z|0)==9)){E=1558}}else{E=1558}}while(0);if((E|0)==1558){if((c[8272]|0)<=(s|0)|y){break}B=c[10036]|0;A=0;while(1){if((A|0)>=(w|0)){break}if((a[B+(x+A|0)|0]|0)==(a[A+72816|0]|0)){A=A+1|0}else{break L2163}}if((A|0)!=2){break}}c[13898]=s+1;x=is(p)|0;B=c[x>>2]|0;if((B|0)==3){G=+uz(c[x+8>>2]|0,0)}else if((B|0)==1){G=+(c[x+8>>2]|0)}else if((B|0)==2){G=+h[x+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}x=p|0;if((c[x>>2]|0)==3){uu(c[p+8>>2]|0);c[x>>2]=1}lK(b,~~G)}}while(0);p=c[13898]|0;D=c[8272]|0;L2193:do{if((p|0)<(D|0)){C=n|0;x=n+8|0;B=r+12|0;w=q|0;y=q+8|0;u=m|0;F=m+8|0;H=r+24|0;I=g|0;J=g+8|0;K=r+8|0;L=j|0;M=j+8|0;N=r+16|0;O=r+32|0;P=r+40|0;Q=r+44|0;R=l|0;S=l+8|0;T=r+48|0;U=k|0;V=k+8|0;W=r+4|0;X=r+40|0;Y=o|0;Z=o+8|0;_=b+4|0;$=d^1;aa=b|0;ab=b+40|0;ac=b+44|0;ad=b+8|0;ae=b+32|0;G=0.0;af=0;ag=0;ah=0;ai=0;aj=0;ak=0;al=0;am=p;an=D;L2195:while(1){ao=c[1054]|0;ap=(a[ao+(am*40&-1)|0]&1)==0;aq=c[ao+(am*40&-1)+36>>2]|0;ar=ao+(am*40&-1)+32|0;L2197:do{if(ap){as=c[ar>>2]|0;E=1587}else{at=c[10036]|0;au=0;while(1){if((au|0)>=(aq|0)){E=1578;break}if((a[at+((c[ar>>2]|0)+au|0)|0]|0)==(a[au+103664|0]|0)){au=au+1|0}else{break}}if((E|0)==1578){E=0;if((au|0)==1){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=af;aB=ak;aC=am;break L2193}}at=c[ar>>2]|0;if(!((aq|0)>0&(ap^1))){as=at;E=1587;break}aD=c[10036]|0;aE=0;aF=0;aG=at;while(1){if((a[aE+139232|0]|0)==(a[aD+(aE+aG|0)|0]|0)){aH=aG;aI=aF}else{if((aE|0)!=5){as=at;E=1587;break L2197}aH=aG-1|0;aI=1}aJ=aE+1|0;if((aJ|0)<(aI+aq|0)){aE=aJ;aF=aI;aG=aH}else{break}}if((aI|0)!=0){E=1592;break}if((aE|0)==4|(aE|0)==8){E=1592}else{as=at;E=1587}}}while(0);L2215:do{if((E|0)==1587){E=0;if((an|0)<=(am|0)|ap){aK=al;aL=ag;aM=af;break}ar=c[10036]|0;z=0;while(1){if((z|0)>=(aq|0)){break}if((a[ar+(as+z|0)|0]|0)==(a[z+225056|0]|0)){z=z+1|0}else{aK=al;aL=ag;aM=af;break L2215}}if((z|0)==2){E=1592}else{aK=al;aL=ag;aM=af}}}while(0);L2222:do{if((E|0)==1592){E=0;aq=af+1|0;if((af|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=aq;aB=ak;aC=am;break L2193}ap=am+1|0;c[13898]=ap;ar=c[ao+(ap*40&-1)+36>>2]|0;at=c[ao+(ap*40&-1)+32>>2]|0;aE=(a[ao+(ap*40&-1)|0]&1)==0;L2225:do{if((ar|0)>0&(aE^1)){aG=c[10036]|0;aF=0;aD=0;au=at;while(1){if((a[aF+123456|0]|0)==(a[aG+(aF+au|0)|0]|0)){aN=au;aO=aD}else{if((aF|0)!=3){break}aN=au-1|0;aO=1}aJ=aF+1|0;if((aJ|0)<(aO+ar|0)){aF=aJ;aD=aO;au=aN}else{E=1599;break}}do{if((E|0)==1599){E=0;if((aO|0)==0){if(!((aF|0)==2|(aF|0)==8)){break}}au=ag+1|0;if((ag|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=au;aA=aq;aB=ak;aC=ap;break L2193}c[13898]=am;hI(X,3);a[O]=1;aK=al;aL=au;aM=aq;break L2222}}while(0);if(!((ar|0)>0&(aE^1))){break}aF=c[10036]|0;au=0;aD=0;
|
||
|
function jx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0.0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0.0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0.0,a7=0.0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0.0,bu=0,bv=0,bw=0.0,bx=0,by=0,bz=0;e=i;i=i+96|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;c[13898]=l+1;do{if((b|0)<-1){c[13898]=l;if((d|0)==1){n=b;o=49264;p=0;q=0;r=49160;s=0;t=0;u=l;break}uf(l,191504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=c[10818]|0;L9036:do{if((w|0)==0){x=0;y=0;z=6591}else{A=(b|0)>0;B=0;C=w;while(1){if(A){D=c[C+4>>2]|0;if((D|0)>=(b|0)){break}}E=c[C>>2]|0;if((E|0)==0){x=C;y=0;z=6591;break L9036}else{B=C;C=E}}if((C|0)==0){F=b;G=B;H=0;z=6594;break}if((D|0)!=(b|0)){x=B;y=C;z=6591;break}A=c[C+12>>2]|0;if((A|0)==(d|0)){I=b;J=0;K=C;break}E=C|0;L=c[E>>2]|0;if((A|0)==4){uu(c[(C+104|0)+4>>2]|0)}if((d|0)==4){uD(C|0,33240,272)}else if((d|0)==1){uD(C|0,1144,272);c[C+52>>2]=-7;c[C+16>>2]=3}else if((d|0)==3){uD(C|0,1416,272)}else if((d|0)==2){uD(C|0,1688,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[C+4>>2]=b;c[C+12>>2]=d;c[E>>2]=L;I=b;J=C;K=C}}while(0);do{if((z|0)==6591){if((b|0)!=-1){F=b;G=x;H=y;z=6594;break}if((x|0)==0){F=1;G=0;H=y;z=6594;break}F=(c[x+4>>2]|0)+1|0;G=x;H=y;z=6594}}while(0);if((z|0)==6594){w=ut(272)|0;do{if((w|0)==0){gk();L=ut(272)|0;if((L|0)!=0){M=L;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=177576,v)|0)}else{M=w}}while(0);w=M;if((d|0)==1){uD(M|0,1144,272);c[M+52>>2]=-7;c[M+16>>2]=3}else if((d|0)==3){uD(M|0,1416,272)}else if((d|0)==2){uD(M|0,1688,272)}else if((d|0)==4){uD(M|0,33240,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[M+4>>2]=F;c[M+12>>2]=d;if((G|0)==0){c[10818]=w}else{c[G>>2]=w}c[M>>2]=H;I=F;J=w;K=w}w=K+104|0;n=I;o=w|0;p=w;q=J;r=K;s=w;t=w;u=c[13898]|0}}while(0);K=c[8272]|0;if((u|0)>=(K|0)){i=e;return}J=o+88|0;I=o+128|0;F=J|0;H=I|0;M=o+92|0;G=o+132|0;y=o+104|0;x=o+144|0;b=o+112|0;D=o+152|0;l=o|0;w=o+48|0;L=o+8|0;o=r+8|0;E=k|0;A=k+8|0;N=r+80|0;O=r+52|0;Q=r+88|0;R=Q|0;S=r+12|0;T=(q|0)==0;q=r+16|0;U=q|0;V=r+20|0;W=r+24|0;X=r+32|0;Y=(n|0)<0;n=r+16|0;Z=j|0;_=j+8|0;$=t+88|0;aa=g|0;ab=g+8|0;ac=t+96|0;ad=t+48|0;ae=t+8|0;t=p+48|0;af=p|0;ag=f|0;ah=f+8|0;ai=p+88|0;aj=p+8|0;p=s+4|0;ak=s|0;s=0;al=0;am=0;an=0;ao=0;ap=0;aq=1.0;ar=u;u=K;L9085:while(1){K=c[1054]|0;as=(a[K+(ar*40&-1)|0]&1)==0;L9087:do{if(!as){at=c[K+(ar*40&-1)+36>>2]|0;au=K+(ar*40&-1)+32|0;av=c[10036]|0;aw=0;while(1){if((aw|0)>=(at|0)){break}if((a[av+((c[au>>2]|0)+aw|0)|0]|0)==(a[aw+103664|0]|0)){aw=aw+1|0}else{break L9087}}if((aw|0)==1){ax=am;ay=an;az=ao;aA=aq;z=6939;break L9085}}}while(0);L9094:do{if((d|0)==3){au=(u|0)>(ar|0);L9096:do{if(au){av=c[K+(ar*40&-1)+36>>2]|0;at=K+(ar*40&-1)+32|0;if(as){aB=c[at>>2]|0;aC=av;z=6764;break}C=c[10036]|0;B=0;while(1){if((B|0)>=(av|0)){break}if((a[C+((c[at>>2]|0)+B|0)|0]|0)==(a[B+95280|0]|0)){B=B+1|0}else{z=6754;break L9096}}if((B|0)==2){z=6762}else{z=6754}}else{z=6754}}while(0);L9105:do{if((z|0)==6754){z=0;aw=c[K+(ar*40&-1)+36>>2]|0;at=c[K+(ar*40&-1)+32>>2]|0;L9107:do{if((aw|0)>0&(as^1)){C=c[10036]|0;av=0;aD=0;aE=at;while(1){if((a[av+185064|0]|0)==(a[C+(av+aE|0)|0]|0)){aF=aE;aG=aD}else{if((av|0)!=3){break L9107}aF=aE-1|0;aG=1}aH=av+1|0;if((aH|0)<(aG+aw|0)){av=aH;aD=aG;aE=aF}else{break}}if((aG|0)!=0){z=6762;break L9105}if((av|0)==2|(av|0)==6){z=6762;break L9105}}}while(0);if(au){aB=at;aC=aw;z=6764}else{aJ=aw;aK=at}}}while(0);if((z|0)==6762){z=0;c[13898]=ar+1;dl(aj,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break}L9120:do{if((z|0)==6764){z=0;if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}au=c[10036]|0;B=0;while(1){if((B|0)>=(aC|0)){break}if((a[au+(aB+B|0)|0]|0)==(a[B+130496|0]|0)){B=B+1|0}else{aJ=aC;aK=aB;break L9120}}if((B|
|
||
|
function ut(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0;do{if(a>>>0<245){if(a>>>0<11){b=16}else{b=a+11&-8}d=b>>>3;e=c[56330]|0;f=e>>>(d>>>0);if((f&3|0)!=0){g=(f&1^1)+d|0;h=g<<1;i=225360+(h<<2)|0;j=225360+(h+2<<2)|0;h=c[j>>2]|0;k=h+8|0;l=c[k>>2]|0;do{if((i|0)==(l|0)){c[56330]=e&(1<<g^-1)}else{if(l>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}m=l+12|0;if((c[m>>2]|0)==(h|0)){c[m>>2]=i;c[j>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=g<<3;c[h+4>>2]=l|3;j=h+(l|4)|0;c[j>>2]=c[j>>2]|1;n=k;return n|0}if(b>>>0<=(c[56332]|0)>>>0){o=b;break}if((f|0)!=0){j=2<<d;l=f<<d&(j|-j);j=(l&-l)-1|0;l=j>>>12&16;i=j>>>(l>>>0);j=i>>>5&8;m=i>>>(j>>>0);i=m>>>2&4;p=m>>>(i>>>0);m=p>>>1&2;q=p>>>(m>>>0);p=q>>>1&1;r=(j|l|i|m|p)+(q>>>(p>>>0))|0;p=r<<1;q=225360+(p<<2)|0;m=225360+(p+2<<2)|0;p=c[m>>2]|0;i=p+8|0;l=c[i>>2]|0;do{if((q|0)==(l|0)){c[56330]=e&(1<<r^-1)}else{if(l>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}j=l+12|0;if((c[j>>2]|0)==(p|0)){c[j>>2]=q;c[m>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=r<<3;m=l-b|0;c[p+4>>2]=b|3;q=p;e=q+b|0;c[q+(b|4)>>2]=m|1;c[q+l>>2]=m;l=c[56332]|0;if((l|0)!=0){q=c[56335]|0;d=l>>>3;l=d<<1;f=225360+(l<<2)|0;k=c[56330]|0;h=1<<d;do{if((k&h|0)==0){c[56330]=k|h;s=f;t=225360+(l+2<<2)|0}else{d=225360+(l+2<<2)|0;g=c[d>>2]|0;if(g>>>0>=(c[56334]|0)>>>0){s=g;t=d;break}ce();return 0;return 0}}while(0);c[t>>2]=q;c[s+12>>2]=q;c[q+8>>2]=s;c[q+12>>2]=f}c[56332]=m;c[56335]=e;n=i;return n|0}l=c[56331]|0;if((l|0)==0){o=b;break}h=(l&-l)-1|0;l=h>>>12&16;k=h>>>(l>>>0);h=k>>>5&8;p=k>>>(h>>>0);k=p>>>2&4;r=p>>>(k>>>0);p=r>>>1&2;d=r>>>(p>>>0);r=d>>>1&1;g=c[225624+((h|l|k|p|r)+(d>>>(r>>>0))<<2)>>2]|0;r=g;d=g;p=(c[g+4>>2]&-8)-b|0;while(1){g=c[r+16>>2]|0;if((g|0)==0){k=c[r+20>>2]|0;if((k|0)==0){break}else{u=k}}else{u=g}g=(c[u+4>>2]&-8)-b|0;k=g>>>0<p>>>0;r=u;d=k?u:d;p=k?g:p}r=d;i=c[56334]|0;if(r>>>0<i>>>0){ce();return 0;return 0}e=r+b|0;m=e;if(r>>>0>=e>>>0){ce();return 0;return 0}e=c[d+24>>2]|0;f=c[d+12>>2]|0;do{if((f|0)==(d|0)){q=d+20|0;g=c[q>>2]|0;if((g|0)==0){k=d+16|0;l=c[k>>2]|0;if((l|0)==0){v=0;break}else{w=l;x=k}}else{w=g;x=q}while(1){q=w+20|0;g=c[q>>2]|0;if((g|0)!=0){w=g;x=q;continue}q=w+16|0;g=c[q>>2]|0;if((g|0)==0){break}else{w=g;x=q}}if(x>>>0<i>>>0){ce();return 0;return 0}else{c[x>>2]=0;v=w;break}}else{q=c[d+8>>2]|0;if(q>>>0<i>>>0){ce();return 0;return 0}g=q+12|0;if((c[g>>2]|0)!=(d|0)){ce();return 0;return 0}k=f+8|0;if((c[k>>2]|0)==(d|0)){c[g>>2]=f;c[k>>2]=q;v=f;break}else{ce();return 0;return 0}}}while(0);L1026:do{if((e|0)!=0){f=d+28|0;i=225624+(c[f>>2]<<2)|0;do{if((d|0)==(c[i>>2]|0)){c[i>>2]=v;if((v|0)!=0){break}c[56331]=c[56331]&(1<<c[f>>2]^-1);break L1026}else{if(e>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}q=e+16|0;if((c[q>>2]|0)==(d|0)){c[q>>2]=v}else{c[e+20>>2]=v}if((v|0)==0){break L1026}}}while(0);if(v>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[v+24>>2]=e;f=c[d+16>>2]|0;do{if((f|0)!=0){if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+16>>2]=f;c[f+24>>2]=v;break}}}while(0);f=c[d+20>>2]|0;if((f|0)==0){break}if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+20>>2]=f;c[f+24>>2]=v;break}}}while(0);if(p>>>0<16){e=p+b|0;c[d+4>>2]=e|3;f=r+(e+4|0)|0;c[f>>2]=c[f>>2]|1}else{c[d+4>>2]=b|3;c[r+(b|4)>>2]=p|1;c[r+(p+b|0)>>2]=p;f=c[56332]|0;if((f|0)!=0){e=c[56335]|0;i=f>>>3;f=i<<1;q=225360+(f<<2)|0;k=c[56330]|0;g=1<<i;do{if((k&g|0)==0){c[56330]=k|g;y=q;z=225360+(f+2<<2)|0}else{i=225360+(f+2<<2)|0;l=c[i>>2]|0;if(l>>>0>=(c[56334]|0)>>>0){y=l;z=i;break}ce();return 0;return 0}}while(0);c[z>>2]=e;c[y+12>>2]=e;c[e+8>>2]=y;c[e+12>>2]=q}c[56332]=p;c[56335]=m}f=d+8|0;if((f|0)==0){o=b;break}else{n=f}return n|0}else{if(a>>>0>4294967231){o=-1;break}f=a+11|0;g=f&-8;k=c[56331]|0;if((k|0)==0){o=g;break}r=-g|0;i=f>>>8;do{if((i|0)==0){A=0}else{if(g>>>0>16777215){A=31;break}f=(i+1048320|
|
||
|
// EMSCRIPTEN_END_FUNCS
|
||
|
var cI=[vg,vg,sZ,vg,rC,vg,pN,vg,rM,vg,qN,vg,s1,vg,l2,vg,rd,vg,sn,vg,rc,vg,sC,vg,qP,vg,sF,vg,qk,vg,sW,vg,n6,vg,pV,vg,sd,vg,oq,vg,r0,vg,nK,vg,pw,vg,on,vg,lD,vg,nd,vg,mV,vg,pK,vg,vg,vg,vg,vg,vg,vg,vg,vg];var cJ=[vh,vh,nD,vh,mS,vh,qq,vh,n3,vh,pW,vh,lH,vh,vh,vh];var cK=[vi,vi,qG,vi,s_,vi,pM,vi,n7,vi,lC,vi,sE,vi,ql,vi,o8,vi,sG,vi,n5,vi,qX,vi,of,vi,nf,vi,sY,vi,mR,vi,mW,vi,lA,vi,op,vi,pP,vi,nb,vi,qL,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi];var cL=[vj,vj,hy,vj,uN,vj,dI,vj];var cM=[vk,vk,g5,vk,iP,vk,kT,vk,th,vk,hg,vk,ku,vk,tm,vk,tn,vk,p4,vk,qf,vk,rk,vk,m_,vk,tb,vk,nu,vk,e0,vk,rj,vk,rZ,vk,kP,vk,mi,vk,mz,vk,hd,vk,kh,vk,sT,vk,rJ,vk,k7,vk,ff,vk,n8,vk,mX,vk,tc,vk,kE,vk,rs,vk,ks,vk,kF,vk,gX,vk,kG,vk,g1,vk,gY,vk,kM,vk,kn,vk,ou,vk,ke,vk,g6,vk,pZ,vk,ta,vk,lP,vk,iN,vk,tk,vk,te,vk,uu,vk,gL,vk,lF,vk,eW,vk,kS,vk,tr,vk,kx,vk,kU,vk,hj,vk,eI,vk,kI,vk,o3,vk,kR,vk,gZ,vk,kB,vk,gK,vk,m$,vk,tp,vk,kC,vk,e5,vk,qQ,vk,mN,vk,sa,vk,lB,vk,nH,vk,r2,vk,dL,vk,kv,vk,ki,vk,oN,vk,l9,vk,q9,vk,kY,vk,kj,vk,g0,vk,ph,vk,gM,vk,gW,vk,lU,vk,eJ,vk,s$,vk,qD,vk,tl,vk,kz,vk,kg,vk,gJ,vk,k5,vk,g$,vk,qi,vk,kQ,vk,g9,vk,e7,vk,kf,vk,sz,vk,g_,vk,g7,vk,gN,vk,sH,vk,eZ,vk,g4,vk,kl,vk,nY,vk,gP,vk,kZ,vk,k_,vk,qs,vk,m7,vk,gS,vk,e_,vk,qV,vk,hb,vk,eG,vk,pI,vk,kq,vk,g2,vk,he,vk,ky,vk,gV,vk,k3,vk,pY,vk,eK,vk,qo,vk,e$,vk,kX,vk,gG,vk,kk,vk,k1,vk,jI,vk,ps,vk,kD,vk,hf,vk,to,vk,s8,vk,gR,vk,pS,vk,gE,vk,rh,vk,gI,vk,ti,vk,g8,vk,nh,vk,k0,vk,k$,vk,td,vk,k6,vk,kJ,vk,tj,vk,gU,vk,km,vk,hc,vk,gH,vk,gF,vk,kH,vk,kO,vk,nE,vk,gO,vk,eF,vk,kL,vk,gQ,vk,gT,vk,hi,vk,oU,vk,k8,vk,k2,vk,kK,vk,hh,vk,s9,vk,g3,vk,kt,vk,uO,vk,qt,vk,eH,vk,mo,vk,os,vk,kN,vk,kw,vk,ha,vk,gD,vk,tq,vk,sl,vk,ko,vk,k4,vk,kp,vk,ol,vk,kA,vk,ow,vk,tf,vk,pX,vk,lT,vk,tg,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk];var cN=[vl,vl,sS,vl,oT,vl,rH,vl,pT,vl,ok,vl,pr,vl,qp,vl,oB,vl,nG,vl,pG,vl,oA,vl,px,vl,oS,vl,nW,vl,p2,vl,qM,vl,l_,vl,r3,vl,oL,vl,m5,vl,my,vl,rr,vl,oM,vl,nX,vl,l7,vl,pf,vl,nn,vl,p3,vl,sy,vl,mt,vl,qe,vl,n9,vl,rY,vl,pg,vl,sR,vl,rI,vl,qd,vl,qR,vl,tM,vl,tU,vl,lZ,vl,py,vl,mh,vl,uP,vl,rX,vl,o2,vl,qB,vl,l8,vl,mY,vl,mL,vl,mg,vl,nO,vl,m6,vl,ns,vl,r9,vl,sx,vl,s0,vl,rq,vl,pH,vl,sI,vl,oj,vl,nP,vl,lO,vl,ms,vl,mM,vl,q3,vl,q2,vl,mx,vl,rT,vl,sk,vl,qC,vl,nm,vl,r8,vl,ot,vl,no,vl,o1,vl,qW,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl];var cO=[vm,vm,o5,vm,e6,vm,qZ,vm,nF,vm,pQ,vm,lv,vm,h2,vm,pm,vm,uQ,vm,mP,vm,oW,vm,im,vm,pB,vm,oP,vm,q7,vm,ia,vm,mI,vm,nZ,vm,sX,vm,h4,vm,qm,vm,id,vm,ij,vm,r1,vm,m8,vm,q_,vm,n1,vm,ut,vm,uR,vm,mU,vm,l0,vm,rx,vm,h8,vm,sD,vm,sj,vm,sp,vm,hP,vm,pi,vm,ie,vm,pu,vm,oe,vm,o6,vm,h5,vm,ry,vm,pL,vm,ic,vm,od,vm,m9,vm,or,vm,h9,vm,uS,vm,h6,vm,nc,vm,uT,vm,qa,vm,sL,vm,q6,vm,rS,vm,oD,vm,h3,vm,hX,vm,lw,vm,tC,vm,rv,vm,rQ,vm,p9,vm,ik,vm,mQ,vm,nq,vm,sM,vm,o9,vm,qj,vm,nr,vm,qz,vm,ii,vm,mD,vm,pC,vm,h7,vm,lR,vm,lS,vm,uU,vm,mb,vm,qH,vm,pj,vm,rR,vm,h1,vm,il,vm,qy,vm,sr,vm,n4,vm,h0,vm,n_,vm,rP,vm,sK,vm,rw,vm,ng,vm,nC,vm,ig,vm,si,vm,sq,vm,ib,vm,qO,vm,ih,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm];var cP=[vn,vn,lu,vn];var cQ=[vo,vo,uY,vo,uZ,vo,vo,vo];var cR=[vp,vp,tw,vp,pt,vp,uf,vp,lL,vp,sA,vp,rt,vp,r$,vp,ri,vp,o4,vp,rA,vp,pl,vp,p5,vp,qF,vp,na,vp,qE,vp,o7,vp,sB,vp,rB,vp,nv,vp,l$,vp,ma,vp,oE,vp,tX,vp,sU,vp,n0,vp,oO,vp,l1,vp,rb,vp,ne,vp,ly,vp,mA,vp,nQ,vp,r_,vp,qg,vp,mT,vp,mp,vp,tR,vp,hw,vp,mu,vp,mj,vp,rL,vp,sc,vp,tB,vp,lQ,vp,ra,vp,sV,vp,oo,vp,q4,vp,oC,vp,rK,vp,n$,vp,nJ,vp,sm,vp,oV,vp,nI,vp,om,vp,pJ,vp,pO,vp,mO,vp,pv,vp,qh,vp,tQ,vp,sb,vp];var cS=[vq,vq,m3,vq,p7,vq,mC,vq,mc,vq,dR,vq,pb,vq,rl,vq,p
|
||
|
// 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, "copyTempDouble": copyTempDouble, "copyTempFloat": copyTempFloat, "min": Math_min, "invoke_viiiii": invoke_viiiii, "invoke_viffiii": invoke_viffiii, "invoke_vf": invoke_vf, "invoke_i": invoke_i, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_iff": invoke_iff, "invoke_iiii": invoke_iiii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_vifiii": invoke_vifiii, "invoke_iiiii": invoke_iiiii, "invoke_fii": invoke_fii, "invoke_iii": invoke_iii, "_lseek": _lseek, "__scanString": __scanString, "_fclose": _fclose, "_uname": _uname, "_sleep": _sleep, "__isFloat": __isFloat, "_fflush": _fflush, "_strtol": _strtol, "_fputc": _fputc, "_iconv": _iconv, "___signgam": ___signgam, "_fwrite": _fwrite, "_send": _send, "_fputs": _fputs, "_tmpnam": _tmpnam, "_isspace": _isspace, "_localtime": _localtime, "_read": _read, "_ceil": _ceil, "_strstr": _strstr, "_fileno": _fileno, "_perror": _perror, "_ctime": _ctime, "_fsync": _fsync, "_signal": _signal, "_opendir": _opendir, "_fmod": _fmod, "_strcmp": _strcmp, "_memchr": _memchr, "_strncmp": _strncmp, "_tmpfile": _tmpfile, "_snprintf": _snprintf, "_fgetc": _fgetc, "_pclose": _pclose, "_readdir": _readdir, "_cosh": _cosh, "_atexit": _atexit, "_fgets": _fgets, "_close": _close, "_strchr": _strchr, "_asin": _asin, "_llvm_lifetime_start": _llvm_lifetime_start, "___setErrNo": ___setErrNo, "_ftell": _ftell, "_exit": _exit, "_sprintf": _sprintf, "_llvm_lifetime_end": _llvm_lifetime_end, "_asctime": _asctime, "_strrchr": _strrchr, "_iconv_open": _iconv_open, "_modf": _modf, "_strcspn": _strcspn, "_getcwd": _getcwd, "_gmtime": _gmtime, "_localtime_r": _localtime_r, "_asctime_r": _asctime_r, "_recv": _recv, "_cos": _cos, "_putchar": _putchar, "_isalnum": _isalnum, "_popen": _popen, "_erfc": _erfc, "__exit": __exit, "_strftime": _strftime, "_llvm_va_end": _llvm_va_end, "_tzset": _tzset, "_sinh": _sinh, "_setlocale": _setlocale, "_isprint": _isprint, "_toupper": _toupper, "_printf": _printf, "_pread": _pread, "_fopen": _fopen, "_open": _open, "_usleep": _usleep, "_log": _log, "_puts": _puts, "_mktime": _mktime, "_fdopen": _fdopen, "_qsort": _qsort, "_system": _system, "_isalpha": _isalpha, "_strdup": _strdup, "_log10": _log10, "_closedir": _closedir, "_isatty": _isatty, "__formatString": __formatString, "_getenv": _getenv, "_gettimeofday": _gettimeofday, "_atoi": _atoi, "_vfprintf": _vfprintf, "_chdir": _chdir, "_llvm_pow_f64": _llvm_pow_f64, "_sbrk": _sbrk, "_localeconv": _localeconv, "___errno_location": ___errno_location, "_strerror": _strerror, "_lgamma": _lgamma, "_erf": _erf, "_strspn": _strspn, "__parseInt": __parseInt, "_ungetc": _ungetc, "_llvm_trap": _llvm_trap, "_rename": _rename, "_vsnprintf": _vsnprintf, "_sscanf": _sscanf, "_sysconf": _sysconf, "_acos": _acos, "_fread": _fread, "_abort": _abort, "_fprintf": _fprintf, "___fpclassifyf": ___fpclassifyf, "_tan": _tan, "___buildEnvironment": ___buildEnvironment, "_feof": _feof, "_strncat": _strncat, "_gmtime_r": _gmtime_r, "_fabs": _fabs, "_floor": _floor, "__reallyNegative": __reallyNegative, "_fseek": _fseek, "_sqrt": _sqrt, "_write": _write, "_rewind": _rewind, "_sin": _sin, "_stat": _stat, "_longjmp": _longjmp, "_atan": _atan, "_readdir_r": _readdir_r, "_strpbrk": _strpbrk, "_iconv_close": _iconv_close, "_setbuf": _setbuf, "_nl_langinfo": _nl_langinfo, "_pwrite": _pwrite, "_strerror_r": _strerror_r, "_atan2": _atan2, "_exp": _exp, "_time": _time, "_setvbuf": _setvbuf, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "_stderr": _stderr, "_stdout": _stdout, "_stdin": _stdin }, buffer);
|
||
|
var _memcmp = Module["_memcmp"] = asm["_memcmp"];
|
||
|
var _saveSetjmp = Module["_saveSetjmp"] = asm["_saveSetjmp"];
|
||
|
var _strcat = Module["_strcat"] = asm["_strcat"];
|
||
|
var _free = Module["_free"] = asm["_free"];
|
||
|
var _main = Module["_main"] = asm["_main"];
|
||
|
var _testSetjmp = Module["_testSetjmp"] = asm["_testSetjmp"];
|
||
|
var _strncpy = Module["_strncpy"] = asm["_strncpy"];
|
||
|
var _memmove = Module["_memmove"] = asm["_memmove"];
|
||
|
var _tolower = Module["_tolower"] = asm["_tolower"];
|
||
|
var _memset = Module["_memset"] = asm["_memset"];
|
||
|
var _malloc = Module["_malloc"] = asm["_malloc"];
|
||
|
var _memcpy = Module["_memcpy"] = asm["_memcpy"];
|
||
|
var _strcasecmp = Module["_strcasecmp"] = asm["_strcasecmp"];
|
||
|
var _strlen = Module["_strlen"] = asm["_strlen"];
|
||
|
var _realloc = Module["_realloc"] = asm["_realloc"];
|
||
|
var _strncasecmp = Module["_strncasecmp"] = asm["_strncasecmp"];
|
||
|
var _strcpy = Module["_strcpy"] = asm["_strcpy"];
|
||
|
var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
|
||
|
var dynCall_viffiii = Module["dynCall_viffiii"] = asm["dynCall_viffiii"];
|
||
|
var dynCall_vf = Module["dynCall_vf"] = asm["dynCall_vf"];
|
||
|
var dynCall_i = Module["dynCall_i"] = asm["dynCall_i"];
|
||
|
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_iff = Module["dynCall_iff"] = asm["dynCall_iff"];
|
||
|
var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
|
||
|
var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
|
||
|
var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
|
||
|
var dynCall_vifiii = Module["dynCall_vifiii"] = asm["dynCall_vifiii"];
|
||
|
var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"];
|
||
|
var dynCall_fii = Module["dynCall_fii"] = asm["dynCall_fii"];
|
||
|
var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
|
||
|
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 ===
|
||
|
Module['callMain'] = function callMain(args) {
|
||
|
assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');
|
||
|
assert(!Module['preRun'] || Module['preRun'].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);
|
||
|
var ret;
|
||
|
var initialStackTop = STACKTOP;
|
||
|
try {
|
||
|
ret = Module['_main'](argc, argv, 0);
|
||
|
}
|
||
|
catch(e) {
|
||
|
if (e.name == 'ExitStatus') {
|
||
|
return e.status;
|
||
|
} else if (e == 'SimulateInfiniteLoop') {
|
||
|
Module['noExitRuntime'] = true;
|
||
|
} else {
|
||
|
throw e;
|
||
|
}
|
||
|
} finally {
|
||
|
STACKTOP = initialStackTop;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
function run(args) {
|
||
|
args = args || Module['arguments'];
|
||
|
if (runDependencies > 0) {
|
||
|
Module.printErr('run() called, but dependencies remain, so not running');
|
||
|
return 0;
|
||
|
}
|
||
|
if (Module['preRun']) {
|
||
|
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
|
||
|
var toRun = Module['preRun'];
|
||
|
Module['preRun'] = [];
|
||
|
for (var i = toRun.length-1; i >= 0; i--) {
|
||
|
toRun[i]();
|
||
|
}
|
||
|
if (runDependencies > 0) {
|
||
|
// a preRun added a dependency, run will be called later
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
function doRun() {
|
||
|
ensureInitRuntime();
|
||
|
preMain();
|
||
|
var ret = 0;
|
||
|
calledRun = true;
|
||
|
if (Module['_main'] && shouldRunNow) {
|
||
|
ret = Module['callMain'](args);
|
||
|
if (!Module['noExitRuntime']) {
|
||
|
exitRuntime();
|
||
|
}
|
||
|
}
|
||
|
if (Module['postRun']) {
|
||
|
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
|
||
|
while (Module['postRun'].length > 0) {
|
||
|
Module['postRun'].pop()();
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
if (Module['setStatus']) {
|
||
|
Module['setStatus']('Running...');
|
||
|
setTimeout(function() {
|
||
|
setTimeout(function() {
|
||
|
Module['setStatus']('');
|
||
|
}, 1);
|
||
|
if (!ABORT) doRun();
|
||
|
}, 1);
|
||
|
return 0;
|
||
|
} else {
|
||
|
return doRun();
|
||
|
}
|
||
|
}
|
||
|
Module['run'] = Module.run = run;
|
||
|
// {{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 = false;
|
||
|
if (Module['noInitialRun']) {
|
||
|
shouldRunNow = false;
|
||
|
}
|
||
|
run();
|
||
|
// {{POST_RUN_ADDITIONS}}
|
||
|
// {{MODULE_ADDITIONS}}
|
||
|
shouldRunNow = true;
|
||
|
self['Runtime'] = Runtime;
|
||
|
self['FS'] = FS;
|
||
|
};
|
||
|
gnuplot_create();
|
||
|
// This is to avoid name mangling from closure compilers.
|
||
|
self['FS'] = FS;
|
||
|
self['FS']['root'] = FS.root;
|
||
|
self['FS']['deleteFile'] = FS.deleteFile;
|
||
|
self['FS']['findObject'] = FS.findObject;
|
||
|
self['FS']['createDataFile'] = FS.createDataFile;
|
||
|
self['FS']['getFileContents'] = function(name) {
|
||
|
var file = FS.findObject(name);
|
||
|
if (!file) return null;
|
||
|
return file.contents;
|
||
|
};
|