From 7d46b1ef7c9b7992f345cec34e74c9ccfc8fbda2 Mon Sep 17 00:00:00 2001 From: 423A35C7 <609514299@qq.com> Date: Sat, 16 Dec 2023 16:19:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E2=80=94?= =?UTF-8?q?=E2=80=94=E7=AC=AC=E4=B8=83=E7=AB=A0=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10213903403第七章作业.pdf | Bin 0 -> 227099 bytes .../C++/第七章作业/CMakeLists.txt | 10 + .../第七章作业/public/第七章作业1.html | 1296 +++++ .../C++/第七章作业/public/第七章作业1.js | 5571 ++++++++++++++++++++ .../第七章作业/public/第七章作业1.wasm | Bin 0 -> 190720 bytes .../第七章作业/public/第七章作业2.html | 1296 +++++ .../C++/第七章作业/public/第七章作业2.js | 5442 +++++++++++++++++++ .../第七章作业/public/第七章作业2.wasm | Bin 0 -> 212569 bytes .../C++/第七章作业/temp_in.txt | 1 + .../C++/第七章作业/第七章作业1.cpp | 128 + .../C++/第七章作业/第七章作业2.cpp | 167 + 11 files changed, 13911 insertions(+) create mode 100644 作业/数据结构-金健/10213903403第七章作业.pdf create mode 100644 作业/数据结构-金健/C++/第七章作业/CMakeLists.txt create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业1.html create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业1.js create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业1.wasm create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业2.html create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业2.js create mode 100644 作业/数据结构-金健/C++/第七章作业/public/第七章作业2.wasm create mode 100644 作业/数据结构-金健/C++/第七章作业/temp_in.txt create mode 100644 作业/数据结构-金健/C++/第七章作业/第七章作业1.cpp create mode 100644 作业/数据结构-金健/C++/第七章作业/第七章作业2.cpp diff --git a/作业/数据结构-金健/10213903403第七章作业.pdf b/作业/数据结构-金健/10213903403第七章作业.pdf new file mode 100644 index 0000000000000000000000000000000000000000..841b891055330e5cf390c8ba9b82420cbb3bfd4f GIT binary patch literal 227099 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

Ic|Zex2mwUZf{G9V+7lAPMmmYOiznq5lVY; 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 z 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

  • 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 I1##&A0!y-;4FCWD literal 0 HcmV?d00001 diff --git a/作业/数据结构-金健/C++/第七章作业/CMakeLists.txt b/作业/数据结构-金健/C++/第七章作业/CMakeLists.txt new file mode 100644 index 0000000..08a481b --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.26) +project(chapter7) + +set(CMAKE_CXX_STANDARD 23) + +add_executable(binsort1 第七章作业1.cpp) +add_executable(binsort2 第七章作业2.cpp) +#set(EXECUTABLE_OUTPUT_PATH R:/) # 在WSL里不能这样 + +#set(CMAKE_CXX_FLAGS_RELEASE -fexec-charset=GBK) # 在WSL里不需要这样了,Linux的命令行默认编码就是UTF-8 \ No newline at end of file diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.html b/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.html new file mode 100644 index 0000000..417e004 --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.html @@ -0,0 +1,1296 @@ + + + + + + Emscripten-Generated Code + + + + + image/svg+xml + + +
    +
    Downloading...
    + + + Resize canvas + Lock/hide mouse pointer     + + + + +
    + +
    + + +
    + +
    + + + + + + + + diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.js b/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.js new file mode 100644 index 0000000..7814a09 --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.js @@ -0,0 +1,5571 @@ + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// See https://caniuse.com/mdn-javascript_builtins_object_assign + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +// Normally we don't log exceptions but instead let them bubble out the top +// level where the embedding environment (e.g. the browser) can handle +// them. +// However under v8 and node we sometimes exit the process direcly in which case +// its up to use us to log the exception before exiting. +// If we fix https://github.com/emscripten-core/emscripten/issues/15080 +// this may no longer be needed under node. +function logExceptionOnExit(e) { + if (e instanceof ExitStatus) return; + let toLog = e; + if (e && typeof e == 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exiting due to exception: ' + toLog); +} + +var fs; +var nodePath; +var requireNodeFS; + +if (ENVIRONMENT_IS_NODE) { + if (!(typeof process == 'object' && typeof require == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +requireNodeFS = () => { + // Use nodePath as the indicator for these not being initialized, + // since in some environments a global fs may have already been + // created. + if (!nodePath) { + fs = require('fs'); + nodePath = require('path'); + } +}; + +read_ = function shell_read(filename, binary) { + requireNodeFS(); + filename = nodePath['normalize'](filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror) => { + requireNodeFS(); + filename = nodePath['normalize'](filename); + fs.readFile(filename, function(err, data) { + if (err) onerror(err); + else onload(data.buffer); + }); +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + // Without this older versions of node (< v15) will log unhandled rejections + // but return 0, which is not normally the desired behaviour. This is + // not be needed with node v15 and about because it is now the default + // behaviour: + // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode + process['on']('unhandledRejection', function(reason) { throw reason; }); + + quit_ = (status, toThrow) => { + if (keepRuntimeAlive()) { + process['exitCode'] = status; + throw toThrow; + } + logExceptionOnExit(toThrow); + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + let data; + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = function readAsync(f, onload, onerror) { + setTimeout(() => onload(readBinary(f)), 0); + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason we must call `quit` - the only way to + // set the exit code - but quit also halts immediately, so we need to be + // careful of whether the runtime is alive or not, which is why this code + // path looks different than node. It also has the downside that it will + // halt the entire program when no code remains to run, which means this + // is not friendly for bundling this code into a larger codebase, and for + // that reason the "shell" environment is mainly useful for testing whole + // programs by themselves, basically. + if (runtimeKeepaliveCounter) { + throw toThrow; + } + logExceptionOnExit(toThrow); + quit(status); + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js + + + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); + + + + +var STACK_ALIGN = 16; +var POINTER_SIZE = 4; + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length - 1] === '*') { + return POINTER_SIZE; + } else if (type[0] === 'i') { + const bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function == "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +function updateTableMap(offset, count) { + for (var i = offset; i < offset + count; i++) { + var item = getWasmTableEntry(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } +} + +/** + * Add a function to the table. + * 'sig' parameter is required if the function being added is a JS function. + * @param {string=} sig + */ +function addFunction(func, sig) { + assert(typeof func != 'undefined'); + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + updateTableMap(0, wasmTable.length); + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + setWasmTableEntry(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig != 'undefined', 'Missing signature argument to addFunction: ' + func); + var wrapped = convertJsFunctionToWasm(func, sig); + setWasmTableEntry(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(getWasmTableEntry(index)); + freeTableIndexes.push(index); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +function legacyModuleProp(prop, newName) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get: function() { + abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); + } +} + +function unexportedMessage(sym, isFSSybol) { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; + if (isFSSybol) { + msg += '. Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you'; + } + return msg; +} + +function unexportedRuntimeSymbol(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get: function() { + abort(unexportedMessage(sym, isFSSybol)); + } + }); + } +} + +function unexportedRuntimeFunction(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Module[sym] = () => abort(unexportedMessage(sym, isFSSybol)); + } +} + +// end include: runtime_debug.js +var tempRet0 = 0; +var setTempRet0 = (value) => { tempRet0 = value; }; +var getTempRet0 = () => tempRet0; + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + 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 Number(HEAPF64[((ptr)>>3)]); + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. +function _free() { + // Show a helpful error since we used to include free by default in the past. + abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); +} + +// include: runtime_legacy.js + + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +/** + * allocate(): This function is no longer used by emscripten but is kept around to avoid + * breaking external users. + * You should normally not use allocate(), and instead allocate + * memory using _malloc()/stackAlloc(), initialize it with + * setValue(), and so forth. + * @param {(Uint8Array|Array)} slab: An array of data. + * @param {number=} allocator : How to allocate memory, see ALLOC_* + */ +function allocate(slab, allocator) { + var ret; + assert(typeof allocator == 'number', 'allocate no longer takes a type argument') + assert(typeof slab != 'number', 'allocate no longer takes a number as arg0') + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (!slab.subarray && !slab.slice) { + slab = new Uint8Array(slab); + } + HEAPU8.set(slab, ret); + return ret; +} + +// end include: runtime_legacy.js +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + ; + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition + // will always evaluate to true. The loop is then terminated on the first null char. + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) break; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; +} + +// end include: runtime_strings_extra.js +// Memory management + +var HEAP, +/** @type {!ArrayBuffer} */ + buffer, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY'); + +assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it. +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); +assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // The stack grows downwards + HEAP32[((max + 4)>>2)] = 0x2135467; + HEAP32[((max + 8)>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + var cookie1 = HEAPU32[((max + 4)>>2)]; + var cookie2 = HEAPU32[((max + 8)>>2)]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + + +if (!Module["noFSInit"] && !FS.init.initialized) + FS.init(); +FS.ignorePermissions = false; + +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// 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 +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + { + if (Module['onAbort']) { + Module['onAbort'](what); + } + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// include: URIUtils.js + + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} + +// end include: URIUtils.js +/** @param {boolean=} fixedasm */ +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +var wasmBinaryFile; + wasmBinaryFile = '第七章作业1.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, try to to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(wasmBinaryFile); + }); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateGlobalBufferAndViews(wasmMemory.buffer); + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(function (instance) { + return instance; + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); + } + abort(reason); + }); + } + + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch == 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, info); + + return result.then( + receiveInstantiationResult, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiationResult); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiationResult); + } + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func == 'number') { + if (callback.arg === undefined) { + getWasmTableEntry(func)(); + } else { + getWasmTableEntry(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + + function withStackSave(f) { + var stack = stackSave(); + var ret = f(); + stackRestore(stack); + return ret; + } + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + var wasmTableMirror = []; + function getWasmTableEntry(funcPtr) { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); + return func; + } + + function handleException(e) { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + quit_(1, e); + } + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + + function setWasmTableEntry(idx, func) { + wasmTable.set(idx, func); + wasmTableMirror[idx] = func; + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + function ___cxa_allocate_exception(size) { + // Thrown object is prepended by exception metadata block + return _malloc(size + 16) + 16; + } + + /** @constructor */ + function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 16; + + this.set_type = function(type) { + HEAP32[(((this.ptr)+(4))>>2)] = type; + }; + + this.get_type = function() { + return HEAP32[(((this.ptr)+(4))>>2)]; + }; + + this.set_destructor = function(destructor) { + HEAP32[(((this.ptr)+(8))>>2)] = destructor; + }; + + this.get_destructor = function() { + return HEAP32[(((this.ptr)+(8))>>2)]; + }; + + this.set_refcount = function(refcount) { + HEAP32[((this.ptr)>>2)] = refcount; + }; + + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + HEAP8[(((this.ptr)+(12))>>0)] = caught; + }; + + this.get_caught = function () { + return HEAP8[(((this.ptr)+(12))>>0)] != 0; + }; + + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(((this.ptr)+(13))>>0)] = rethrown; + }; + + this.get_rethrown = function () { + return HEAP8[(((this.ptr)+(13))>>0)] != 0; + }; + + // Initialize native structure fields. Should be called once after allocated. + this.init = function(type, destructor) { + this.set_type(type); + this.set_destructor(destructor); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + } + + this.add_ref = function() { + var value = HEAP32[((this.ptr)>>2)]; + HEAP32[((this.ptr)>>2)] = value + 1; + }; + + // Returns true if last reference released. + this.release_ref = function() { + var prev = HEAP32[((this.ptr)>>2)]; + HEAP32[((this.ptr)>>2)] = prev - 1; + assert(prev > 0); + return prev === 1; + }; + } + + var exceptionLast = 0; + + var uncaughtExceptionCount = 0; + function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s NO_DISABLE_EXCEPTION_CATCHING or -s EXCEPTION_CATCHING_ALLOWED=[..] to catch."; + } + + function setErrNo(value) { + HEAP32[((___errno_location())>>2)] = value; + return value; + } + + var PATH = {splitPath:function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function(path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function(path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function(path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function(path) { + return PATH.splitPath(path)[3]; + },join:function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function(l, r) { + return PATH.normalize(l + '/' + r); + }}; + + function getRandomDevice() { + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + return function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + return function() { abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; + } + + var PATH_FS = {resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function(from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY = {ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function(stream) { + stream.tty.ops.flush(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + function zeroMemory(address, size) { + HEAPU8.fill(0, address, address + size); + } + + function alignMemory(size, alignment) { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + } + function mmapAlloc(size) { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + } + var MEMFS = {ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, address, length, position, prot, flags) { + if (address !== 0) { + // We don't currently support location hints for the address of the mapping + throw new FS.ErrnoError(28); + } + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + /** @param {boolean=} noRunDep */ + function asyncLoad(url, onload, onerror, noRunDep) { + var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; + readAsync(url, function(arrayBuffer) { + assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, function(event) { + if (onerror) { + onerror(); + } else { + throw 'Loading data file "' + url + '" failed.'; + } + }); + if (dep) addRunDependency(dep); + } + + var ERRNO_MESSAGES = {0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; + + var ERRNO_CODES = {}; + var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path, opts = {}) => { + path = PATH_FS.resolve(FS.cwd(), path); + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter((p) => !!p), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:(node) => { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:(parentid, name) => { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:(parent, name) => { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:(parent, name, mode, rdev) => { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:(node) => { + FS.hashRemoveNode(node); + },isRoot:(node) => { + return node === node.parent; + },isMountpoint:(node) => { + return !!node.mounted; + },isFile:(mode) => { + return (mode & 61440) === 32768; + },isDir:(mode) => { + return (mode & 61440) === 16384; + },isLink:(mode) => { + return (mode & 61440) === 40960; + },isChrdev:(mode) => { + return (mode & 61440) === 8192; + },isBlkdev:(mode) => { + return (mode & 61440) === 24576; + },isFIFO:(mode) => { + return (mode & 61440) === 4096; + },isSocket:(mode) => { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:(str) => { + var flags = FS.flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:(flag) => { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:(node, perms) => { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:(dir) => { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:(dir, name) => { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:(dir, name, isdir) => { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:(node, flags) => { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:(fd_start = 0, fd_end = FS.MAX_OPEN_FDS) => { + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:(fd) => FS.streams[fd],createStream:(stream, fd_start, fd_end) => { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function(){}; + FS.FSStream.prototype = { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }; + } + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:(fd) => { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:(stream) => { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:() => { + throw new FS.ErrnoError(70); + }},major:(dev) => ((dev) >> 8),minor:(dev) => ((dev) & 0xff),makedev:(ma, mi) => ((ma) << 8 | (mi)),registerDevice:(dev, ops) => { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:(dev) => FS.devices[dev],getMounts:(mount) => { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:(populate, callback) => { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:(type, opts, mountpoint) => { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:(mountpoint) => { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:(parent, name) => { + return parent.node_ops.lookup(parent, name); + },mknod:(path, mode, dev) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:(path, mode) => { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:(path, mode) => { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:(path, mode) => { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:(path, mode, dev) => { + if (typeof dev == 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:(oldpath, newpath) => { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:(old_path, new_path) => { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existant directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + },rmdir:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + },readdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + },readlink:(path) => { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:(path, dontFollow) => { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:(path) => { + return FS.stat(path, true); + },chmod:(path, mode, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:(path, mode) => { + FS.chmod(path, mode, true); + },fchmod:(fd, mode) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:(path, uid, gid, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:(path, uid, gid) => { + FS.chown(path, uid, gid, true); + },fchown:(fd, uid, gid) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:(path, len) => { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:(fd, len) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:(path, atime, mtime) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:(path, flags, mode, fd_start, fd_end) => { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + },close:(stream) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:(stream) => { + return stream.fd === null; + },llseek:(stream, offset, whence) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:(stream, buffer, offset, length, position) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:(stream, buffer, offset, length, position, canOwn) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + },allocate:(stream, offset, length) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:(stream, address, length, position, prot, flags) => { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, address, length, position, prot, flags); + },msync:(stream, buffer, offset, length, mmapFlags) => { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:(stream) => 0,ioctl:(stream, cmd, arg) => { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:(path, opts = {}) => { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:(path, data, opts = {}) => { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:() => FS.currentPath,chdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:() => { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:() => { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device = getRandomDevice(); + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:() => { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: () => { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: (parent, name) => { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:() => { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:() => { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + + // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack + // now ensures it shows what we want. + if (this.stack) { + // Define the stack property for Node.js 4, which otherwise errors on the next line. + Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + this.stack = demangleAll(this.stack); + } + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:() => { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:(input, output, error) => { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:() => { + FS.init.initialized = false; + // Call musl-internal function to close all stdio streams, so nothing is + // left in internal buffers. + ___stdio_exit(); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:(canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },findObject:(path, dontResolveLastLink) => { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + return null; + } + },analyzePath:(path, dontResolveLastLink) => { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createPath:(parent, path, canRead, canWrite) => { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:(parent, name, properties, canRead, canWrite) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:(parent, name, data, canRead, canWrite, canOwn) => { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:(parent, name, input, output) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: (stream) => { + stream.seekable = false; + }, + close: (stream) => { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: (stream, buffer, offset, length, pos /* ignored */) => { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: (stream, buffer, offset, length, pos) => { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },forceLoadFile:(obj) => { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return 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 (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(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + },createLazyFile:(parent, name, url, canRead, canWrite) => { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (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. + 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(/** @type{Array} */(xhr.response || [])); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }; + var lazyArray = this; + lazyArray.setDataGetter((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]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + if (Browser.handledByPreloadPlugin(byteArray, fullname, finish, () => { + if (onerror) onerror(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, (byteArray) => processData(byteArray), onerror); + } else { + processData(url); + } + },indexedDB:() => { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:() => { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths, onload, onerror) => { + onload = onload || (() => {}); + onerror = onerror || (() => {}); + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = () => { + out('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = () => { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach((path) => { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = () => { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:(paths, onload, onerror) => { + onload = onload || (() => {}); + onerror = onerror || (() => {}); + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = () => { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach((path) => { + var getRequest = files.get(path); + getRequest.onsuccess = () => { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },absolutePath:() => { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + },createFolder:() => { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + },createLink:() => { + abort('FS.createLink has been removed; use FS.symlink instead'); + },joinPath:() => { + abort('FS.joinPath has been removed; use PATH.join instead'); + },mmapAlloc:() => { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + },standardizePath:() => { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }}; + var SYSCALLS = {DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { + if (path[0] === '/') { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(8); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(4))>>2)] = 0; + HEAP32[(((buf)+(8))>>2)] = stat.ino; + HEAP32[(((buf)+(12))>>2)] = stat.mode; + HEAP32[(((buf)+(16))>>2)] = stat.nlink; + HEAP32[(((buf)+(20))>>2)] = stat.uid; + HEAP32[(((buf)+(24))>>2)] = stat.gid; + HEAP32[(((buf)+(28))>>2)] = stat.rdev; + HEAP32[(((buf)+(32))>>2)] = 0; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); + HEAP32[(((buf)+(48))>>2)] = 4096; + HEAP32[(((buf)+(52))>>2)] = stat.blocks; + HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)] = 0; + HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)] = 0; + HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(76))>>2)] = 0; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },doMkdir:function(path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function(path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -28; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function(path, buf, bufsize) { + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function(path, amode) { + if (amode & ~7) { + // need a valid mode + return -28; + } + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + },doDup:function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:undefined,get:function() { + assert(SYSCALLS.varargs != undefined); + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + },get64:function(low, high) { + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + }}; + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 5: + /* case 5: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 6: + case 7: + /* case 6: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 7: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -28; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return -e.errno; + } + } + + function ___syscall_open(path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + + var pathname = SYSCALLS.getStr(path); + var mode = varargs ? SYSCALLS.get() : 0; + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return -e.errno; + } + } + + function _abort() { + abort('native code called abort()'); + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + function _emscripten_get_heap_max() { + return HEAPU8.length; + } + + function abortOnCannotGrowMemory(requestedSize) { + abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + abortOnCannotGrowMemory(requestedSize); + } + + var ENV = {}; + + function getExecutableName() { + return thisProgram || './this.program'; + } + function getEnvStrings() { + if (!getEnvStrings.strings) { + // Default values. + // Browser language detection #8751 + var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; + var env = { + 'USER': 'web_user', + 'LOGNAME': 'web_user', + 'PATH': '/', + 'PWD': '/', + 'HOME': '/home/web_user', + 'LANG': lang, + '_': getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + // x is a key in ENV; if ENV[x] is undefined, that means it was + // explicitly set to be so. We allow user code to do that to + // force variables with default values to remain unset. + if (ENV[x] === undefined) delete env[x]; + else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(x + '=' + env[x]); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + } + function _environ_get(__environ, environ_buf) { + var bufSize = 0; + getEnvStrings().forEach(function(string, i) { + var ptr = environ_buf + bufSize; + HEAP32[(((__environ)+(i * 4))>>2)] = ptr; + writeAsciiToMemory(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } + + function _environ_sizes_get(penviron_count, penviron_buf_size) { + var strings = getEnvStrings(); + HEAP32[((penviron_count)>>2)] = strings.length; + var bufSize = 0; + strings.forEach(function(string) { + bufSize += string.length + 1; + }); + HEAP32[((penviron_buf_size)>>2)] = bufSize; + return 0; + } + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + try { + + + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 0x100000000; // 2^32 + // use an unsigned operator on low and shift high by 32-bits + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + + var DOUBLE_LIMIT = 0x20000000000000; // 2^53 + // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + ; + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _setTempRet0(val) { + setTempRet0(val); + } + + function __isLeapYear(year) { + return year%4 === 0 && (year%100 !== 0 || year%400 === 0); + } + + function __arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { + // no-op + } + return sum; + } + + var __MONTH_DAYS_LEAP = [31,29,31,30,31,30,31,31,30,31,30,31]; + + var __MONTH_DAYS_REGULAR = [31,28,31,30,31,30,31,31,30,31,30,31]; + function __addDays(date, days) { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = __isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; + + if (days > daysInCurrentMonth-newDate.getDate()) { + // we spill over to next month + days -= (daysInCurrentMonth-newDate.getDate()+1); + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth+1) + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear()+1); + } + } else { + // we stay in current month + newDate.setDate(newDate.getDate()+days); + return newDate; + } + } + + return newDate; + } + function _strftime(s, maxsize, format, tm) { + // 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 + + var tm_zone = HEAP32[(((tm)+(40))>>2)]; + + var date = { + tm_sec: HEAP32[((tm)>>2)], + tm_min: HEAP32[(((tm)+(4))>>2)], + tm_hour: HEAP32[(((tm)+(8))>>2)], + tm_mday: HEAP32[(((tm)+(12))>>2)], + tm_mon: HEAP32[(((tm)+(16))>>2)], + tm_year: HEAP32[(((tm)+(20))>>2)], + tm_wday: HEAP32[(((tm)+(24))>>2)], + tm_yday: HEAP32[(((tm)+(28))>>2)], + tm_isdst: HEAP32[(((tm)+(32))>>2)], + tm_gmtoff: HEAP32[(((tm)+(36))>>2)], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' + }; + + var pattern = UTF8ToString(format); + + // expand format + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 + '%D': '%m/%d/%y', // Equivalent to %m / %d / %y + '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d + '%h': '%b', // Equivalent to %b + '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation + '%R': '%H:%M', // Replaced by the time in 24-hour notation + '%T': '%H:%M:%S', // Replaced by the time + '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation + '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation + // Modified Conversion Specifiers + '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. + '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. + '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. + '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. + '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. + '%EY': '%Y', // Replaced by the full alternative year representation. + '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. + '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. + '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. + '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. + '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. + '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. + '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. + '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). + '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. + '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. + '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. + '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. + '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); + } + + var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : (value || ''); + while (str.length < digits) { + str = character[0]+str; + } + return str; + } + + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : (value > 0 ? 1 : 0); + } + + var compare; + if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { + compare = sgn(date1.getDate()-date2.getDate()); + } + } + return compare; + } + + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: // Sunday + return new Date(janFourth.getFullYear()-1, 11, 29); + case 1: // Monday + return janFourth; + case 2: // Tuesday + return new Date(janFourth.getFullYear(), 0, 3); + case 3: // Wednesday + return new Date(janFourth.getFullYear(), 0, 2); + case 4: // Thursday + return new Date(janFourth.getFullYear(), 0, 1); + case 5: // Friday + return new Date(janFourth.getFullYear()-1, 11, 31); + case 6: // Saturday + return new Date(janFourth.getFullYear()-1, 11, 30); + } + } + + function getWeekBasedYear(date) { + var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + // this date is after the start of the first week of this year + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear()+1; + } else { + return thisDate.getFullYear(); + } + } else { + return thisDate.getFullYear()-1; + } + } + + var EXPANSION_RULES_2 = { + '%a': function(date) { + return WEEKDAYS[date.tm_wday].substring(0,3); + }, + '%A': function(date) { + return WEEKDAYS[date.tm_wday]; + }, + '%b': function(date) { + return MONTHS[date.tm_mon].substring(0,3); + }, + '%B': function(date) { + return MONTHS[date.tm_mon]; + }, + '%C': function(date) { + var year = date.tm_year+1900; + return leadingNulls((year/100)|0,2); + }, + '%d': function(date) { + return leadingNulls(date.tm_mday, 2); + }, + '%e': function(date) { + return leadingSomething(date.tm_mday, 2, ' '); + }, + '%g': function(date) { + // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. + // In this system, weeks begin on a Monday and week 1 of the year is the week that includes + // January 4th, which is also the week that includes the first Thursday of the year, and + // is also the first week that contains at least four days in the year. + // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of + // the last week of the preceding year; thus, for Saturday 2nd January 1999, + // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, + // or 31st is a Monday, it and any following days are part of week 1 of the following year. + // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. + + return getWeekBasedYear(date).toString().substring(2); + }, + '%G': function(date) { + return getWeekBasedYear(date); + }, + '%H': function(date) { + return leadingNulls(date.tm_hour, 2); + }, + '%I': function(date) { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': function(date) { + // Day of the year (001-366) + return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); + }, + '%m': function(date) { + return leadingNulls(date.tm_mon+1, 2); + }, + '%M': function(date) { + return leadingNulls(date.tm_min, 2); + }, + '%n': function() { + return '\n'; + }, + '%p': function(date) { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + '%S': function(date) { + return leadingNulls(date.tm_sec, 2); + }, + '%t': function() { + return '\t'; + }, + '%u': function(date) { + return date.tm_wday || 7; + }, + '%U': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Sunday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year+1900, 0, 1); + var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Sunday? + if (compareByDay(firstSunday, endDate) < 0) { + // calculate difference in days between first Sunday and endDate + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); + var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + + return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; + }, + '%V': function(date) { + // Replaced by the week number of the year (Monday as the first day of the week) + // as a decimal number [01,53]. If the week containing 1 January has four + // or more days in the new year, then it is considered week 1. + // Otherwise, it is the last week of the previous year, and the next week is week 1. + // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] + var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); + var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + if (compareByDay(endDate, firstWeekStartThisYear) < 0) { + // if given date is before this years first week, then it belongs to the 53rd week of last year + return '53'; + } + + if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { + // if given date is after next years first week, then it belongs to the 01th week of next year + return '01'; + } + + // given date is in between CW 01..53 of this calendar year + var daysDifference; + if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { + // first CW of this year starts last year + daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() + } else { + // first CW of this year starts this year + daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); + } + return leadingNulls(Math.ceil(daysDifference/7), 2); + }, + '%w': function(date) { + return date.tm_wday; + }, + '%W': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Monday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year, 0, 1); + var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Monday? + if (compareByDay(firstMonday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); + var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; + }, + '%y': function(date) { + // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] + return (date.tm_year+1900).toString().substring(2); + }, + '%Y': function(date) { + // Replaced by the year as a decimal number (for example, 1997). [ tm_year] + return date.tm_year+1900; + }, + '%z': function(date) { + // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). + // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + // convert from minutes into hhmm format (which means 60 minutes = 100 units) + off = (off / 60)*100 + (off % 60); + return (ahead ? '+' : '-') + String("0000" + off).slice(-4); + }, + '%Z': function(date) { + return date.tm_zone; + }, + '%%': function() { + return '%'; + } + }; + + // Replace %% with a pair of NULLs (which cannot occur in a C string), then + // re-inject them after processing. + pattern = pattern.replace(/%%/g, '\0\0') + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); + } + } + pattern = pattern.replace(/\0\0/g, '%') + + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + + writeArrayToMemory(bytes, s); + return bytes.length-1; + } + function _strftime_l(s, maxsize, format, tm) { + return _strftime(s, maxsize, format, tm); // no locale support yet + } + + var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.staticInit();; +ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + };; +var ASSERTIONS = true; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var asmLibraryArg = { + "__cxa_allocate_exception": ___cxa_allocate_exception, + "__cxa_throw": ___cxa_throw, + "__syscall_fcntl64": ___syscall_fcntl64, + "__syscall_ioctl": ___syscall_ioctl, + "__syscall_open": ___syscall_open, + "abort": _abort, + "emscripten_memcpy_big": _emscripten_memcpy_big, + "emscripten_resize_heap": _emscripten_resize_heap, + "environ_get": _environ_get, + "environ_sizes_get": _environ_sizes_get, + "fd_close": _fd_close, + "fd_read": _fd_read, + "fd_seek": _fd_seek, + "fd_write": _fd_write, + "setTempRet0": _setTempRet0, + "strftime_l": _strftime_l +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); + +/** @type {function(...*):?} */ +var _main = Module["_main"] = createExportWrapper("main"); + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); + +/** @type {function(...*):?} */ +var ___stdio_exit = Module["___stdio_exit"] = createExportWrapper("__stdio_exit"); + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = createExportWrapper("malloc"); + +/** @type {function(...*):?} */ +var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { + return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { + return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function() { + return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { + return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); + +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); + +/** @type {function(...*):?} */ +var dynCall_viijii = Module["dynCall_viijii"] = createExportWrapper("dynCall_viijii"); + +/** @type {function(...*):?} */ +var dynCall_iiiiij = Module["dynCall_iiiiij"] = createExportWrapper("dynCall_iiiiij"); + +/** @type {function(...*):?} */ +var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = createExportWrapper("dynCall_iiiiijj"); + +/** @type {function(...*):?} */ +var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = createExportWrapper("dynCall_iiiiiijj"); + + + + + +// === Auto-generated postamble setup entry stuff === + +unexportedRuntimeFunction('intArrayFromString', false); +unexportedRuntimeFunction('intArrayToString', false); +unexportedRuntimeFunction('ccall', false); +unexportedRuntimeFunction('cwrap', false); +unexportedRuntimeFunction('setValue', false); +unexportedRuntimeFunction('getValue', false); +unexportedRuntimeFunction('allocate', false); +unexportedRuntimeFunction('UTF8ArrayToString', false); +unexportedRuntimeFunction('UTF8ToString', false); +unexportedRuntimeFunction('stringToUTF8Array', false); +unexportedRuntimeFunction('stringToUTF8', false); +unexportedRuntimeFunction('lengthBytesUTF8', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('addOnPreRun', false); +unexportedRuntimeFunction('addOnInit', false); +unexportedRuntimeFunction('addOnPreMain', false); +unexportedRuntimeFunction('addOnExit', false); +unexportedRuntimeFunction('addOnPostRun', false); +unexportedRuntimeFunction('writeStringToMemory', false); +unexportedRuntimeFunction('writeArrayToMemory', false); +unexportedRuntimeFunction('writeAsciiToMemory', false); +unexportedRuntimeFunction('addRunDependency', true); +unexportedRuntimeFunction('removeRunDependency', true); +unexportedRuntimeFunction('FS_createFolder', false); +unexportedRuntimeFunction('FS_createPath', true); +unexportedRuntimeFunction('FS_createDataFile', true); +unexportedRuntimeFunction('FS_createPreloadedFile', true); +unexportedRuntimeFunction('FS_createLazyFile', true); +unexportedRuntimeFunction('FS_createLink', false); +unexportedRuntimeFunction('FS_createDevice', true); +unexportedRuntimeFunction('FS_unlink', true); +unexportedRuntimeFunction('getLEB', false); +unexportedRuntimeFunction('getFunctionTables', false); +unexportedRuntimeFunction('alignFunctionTables', false); +unexportedRuntimeFunction('registerFunctions', false); +unexportedRuntimeFunction('addFunction', false); +unexportedRuntimeFunction('removeFunction', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('prettyPrint', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('getCompilerSetting', false); +unexportedRuntimeFunction('print', false); +unexportedRuntimeFunction('printErr', false); +unexportedRuntimeFunction('getTempRet0', false); +unexportedRuntimeFunction('setTempRet0', false); +unexportedRuntimeFunction('callMain', false); +unexportedRuntimeFunction('abort', false); +unexportedRuntimeFunction('keepRuntimeAlive', false); +unexportedRuntimeFunction('zeroMemory', false); +unexportedRuntimeFunction('stringToNewUTF8', false); +unexportedRuntimeFunction('abortOnCannotGrowMemory', false); +unexportedRuntimeFunction('emscripten_realloc_buffer', false); +unexportedRuntimeFunction('ENV', false); +unexportedRuntimeFunction('withStackSave', false); +unexportedRuntimeFunction('ERRNO_CODES', false); +unexportedRuntimeFunction('ERRNO_MESSAGES', false); +unexportedRuntimeFunction('setErrNo', false); +unexportedRuntimeFunction('inetPton4', false); +unexportedRuntimeFunction('inetNtop4', false); +unexportedRuntimeFunction('inetPton6', false); +unexportedRuntimeFunction('inetNtop6', false); +unexportedRuntimeFunction('readSockaddr', false); +unexportedRuntimeFunction('writeSockaddr', false); +unexportedRuntimeFunction('DNS', false); +unexportedRuntimeFunction('getHostByName', false); +unexportedRuntimeFunction('Protocols', false); +unexportedRuntimeFunction('Sockets', false); +unexportedRuntimeFunction('getRandomDevice', false); +unexportedRuntimeFunction('traverseStack', false); +unexportedRuntimeFunction('convertFrameToPC', false); +unexportedRuntimeFunction('UNWIND_CACHE', false); +unexportedRuntimeFunction('saveInUnwindCache', false); +unexportedRuntimeFunction('convertPCtoSourceLocation', false); +unexportedRuntimeFunction('readAsmConstArgsArray', false); +unexportedRuntimeFunction('readAsmConstArgs', false); +unexportedRuntimeFunction('mainThreadEM_ASM', false); +unexportedRuntimeFunction('jstoi_q', false); +unexportedRuntimeFunction('jstoi_s', false); +unexportedRuntimeFunction('getExecutableName', false); +unexportedRuntimeFunction('listenOnce', false); +unexportedRuntimeFunction('autoResumeAudioContext', false); +unexportedRuntimeFunction('dynCallLegacy', false); +unexportedRuntimeFunction('getDynCaller', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('callRuntimeCallbacks', false); +unexportedRuntimeFunction('wasmTableMirror', false); +unexportedRuntimeFunction('setWasmTableEntry', false); +unexportedRuntimeFunction('getWasmTableEntry', false); +unexportedRuntimeFunction('handleException', false); +unexportedRuntimeFunction('runtimeKeepalivePush', false); +unexportedRuntimeFunction('runtimeKeepalivePop', false); +unexportedRuntimeFunction('callUserCallback', false); +unexportedRuntimeFunction('maybeExit', false); +unexportedRuntimeFunction('safeSetTimeout', false); +unexportedRuntimeFunction('asmjsMangle', false); +unexportedRuntimeFunction('asyncLoad', false); +unexportedRuntimeFunction('alignMemory', false); +unexportedRuntimeFunction('mmapAlloc', false); +unexportedRuntimeFunction('reallyNegative', false); +unexportedRuntimeFunction('unSign', false); +unexportedRuntimeFunction('reSign', false); +unexportedRuntimeFunction('formatString', false); +unexportedRuntimeFunction('PATH', false); +unexportedRuntimeFunction('PATH_FS', false); +unexportedRuntimeFunction('SYSCALLS', false); +unexportedRuntimeFunction('getSocketFromFD', false); +unexportedRuntimeFunction('getSocketAddress', false); +unexportedRuntimeFunction('JSEvents', false); +unexportedRuntimeFunction('registerKeyEventCallback', false); +unexportedRuntimeFunction('specialHTMLTargets', false); +unexportedRuntimeFunction('maybeCStringToJsString', false); +unexportedRuntimeFunction('findEventTarget', false); +unexportedRuntimeFunction('findCanvasEventTarget', false); +unexportedRuntimeFunction('getBoundingClientRect', false); +unexportedRuntimeFunction('fillMouseEventData', false); +unexportedRuntimeFunction('registerMouseEventCallback', false); +unexportedRuntimeFunction('registerWheelEventCallback', false); +unexportedRuntimeFunction('registerUiEventCallback', false); +unexportedRuntimeFunction('registerFocusEventCallback', false); +unexportedRuntimeFunction('fillDeviceOrientationEventData', false); +unexportedRuntimeFunction('registerDeviceOrientationEventCallback', false); +unexportedRuntimeFunction('fillDeviceMotionEventData', false); +unexportedRuntimeFunction('registerDeviceMotionEventCallback', false); +unexportedRuntimeFunction('screenOrientation', false); +unexportedRuntimeFunction('fillOrientationChangeEventData', false); +unexportedRuntimeFunction('registerOrientationChangeEventCallback', false); +unexportedRuntimeFunction('fillFullscreenChangeEventData', false); +unexportedRuntimeFunction('registerFullscreenChangeEventCallback', false); +unexportedRuntimeFunction('registerRestoreOldStyle', false); +unexportedRuntimeFunction('hideEverythingExceptGivenElement', false); +unexportedRuntimeFunction('restoreHiddenElements', false); +unexportedRuntimeFunction('setLetterbox', false); +unexportedRuntimeFunction('currentFullscreenStrategy', false); +unexportedRuntimeFunction('restoreOldWindowedStyle', false); +unexportedRuntimeFunction('softFullscreenResizeWebGLRenderTarget', false); +unexportedRuntimeFunction('doRequestFullscreen', false); +unexportedRuntimeFunction('fillPointerlockChangeEventData', false); +unexportedRuntimeFunction('registerPointerlockChangeEventCallback', false); +unexportedRuntimeFunction('registerPointerlockErrorEventCallback', false); +unexportedRuntimeFunction('requestPointerLock', false); +unexportedRuntimeFunction('fillVisibilityChangeEventData', false); +unexportedRuntimeFunction('registerVisibilityChangeEventCallback', false); +unexportedRuntimeFunction('registerTouchEventCallback', false); +unexportedRuntimeFunction('fillGamepadEventData', false); +unexportedRuntimeFunction('registerGamepadEventCallback', false); +unexportedRuntimeFunction('registerBeforeUnloadEventCallback', false); +unexportedRuntimeFunction('fillBatteryEventData', false); +unexportedRuntimeFunction('battery', false); +unexportedRuntimeFunction('registerBatteryEventCallback', false); +unexportedRuntimeFunction('setCanvasElementSize', false); +unexportedRuntimeFunction('getCanvasElementSize', false); +unexportedRuntimeFunction('demangle', false); +unexportedRuntimeFunction('demangleAll', false); +unexportedRuntimeFunction('jsStackTrace', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('getEnvStrings', false); +unexportedRuntimeFunction('checkWasiClock', false); +unexportedRuntimeFunction('writeI53ToI64', false); +unexportedRuntimeFunction('writeI53ToI64Clamped', false); +unexportedRuntimeFunction('writeI53ToI64Signaling', false); +unexportedRuntimeFunction('writeI53ToU64Clamped', false); +unexportedRuntimeFunction('writeI53ToU64Signaling', false); +unexportedRuntimeFunction('readI53FromI64', false); +unexportedRuntimeFunction('readI53FromU64', false); +unexportedRuntimeFunction('convertI32PairToI53', false); +unexportedRuntimeFunction('convertU32PairToI53', false); +unexportedRuntimeFunction('setImmediateWrapped', false); +unexportedRuntimeFunction('clearImmediateWrapped', false); +unexportedRuntimeFunction('polyfillSetImmediate', false); +unexportedRuntimeFunction('uncaughtExceptionCount', false); +unexportedRuntimeFunction('exceptionLast', false); +unexportedRuntimeFunction('exceptionCaught', false); +unexportedRuntimeFunction('ExceptionInfo', false); +unexportedRuntimeFunction('CatchInfo', false); +unexportedRuntimeFunction('exception_addRef', false); +unexportedRuntimeFunction('exception_decRef', false); +unexportedRuntimeFunction('Browser', false); +unexportedRuntimeFunction('funcWrappers', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('setMainLoop', false); +unexportedRuntimeFunction('wget', false); +unexportedRuntimeFunction('FS', false); +unexportedRuntimeFunction('MEMFS', false); +unexportedRuntimeFunction('TTY', false); +unexportedRuntimeFunction('PIPEFS', false); +unexportedRuntimeFunction('SOCKFS', false); +unexportedRuntimeFunction('_setNetworkCallback', false); +unexportedRuntimeFunction('tempFixedLengthArray', false); +unexportedRuntimeFunction('miniTempWebGLFloatBuffers', false); +unexportedRuntimeFunction('heapObjectForWebGLType', false); +unexportedRuntimeFunction('heapAccessShiftForWebGLHeap', false); +unexportedRuntimeFunction('GL', false); +unexportedRuntimeFunction('emscriptenWebGLGet', false); +unexportedRuntimeFunction('computeUnpackAlignedImageSize', false); +unexportedRuntimeFunction('emscriptenWebGLGetTexPixelData', false); +unexportedRuntimeFunction('emscriptenWebGLGetUniform', false); +unexportedRuntimeFunction('webglGetUniformLocation', false); +unexportedRuntimeFunction('webglPrepareUniformLocationsBeforeFirstUse', false); +unexportedRuntimeFunction('webglGetLeftBracePos', false); +unexportedRuntimeFunction('emscriptenWebGLGetVertexAttrib', false); +unexportedRuntimeFunction('writeGLArray', false); +unexportedRuntimeFunction('AL', false); +unexportedRuntimeFunction('SDL_unicode', false); +unexportedRuntimeFunction('SDL_ttfContext', false); +unexportedRuntimeFunction('SDL_audio', false); +unexportedRuntimeFunction('SDL', false); +unexportedRuntimeFunction('SDL_gfx', false); +unexportedRuntimeFunction('GLUT', false); +unexportedRuntimeFunction('EGL', false); +unexportedRuntimeFunction('GLFW_Window', false); +unexportedRuntimeFunction('GLFW', false); +unexportedRuntimeFunction('GLEW', false); +unexportedRuntimeFunction('IDBStore', false); +unexportedRuntimeFunction('runAndAbortIfError', false); +unexportedRuntimeFunction('warnOnce', false); +unexportedRuntimeFunction('stackSave', false); +unexportedRuntimeFunction('stackRestore', false); +unexportedRuntimeFunction('stackAlloc', false); +unexportedRuntimeFunction('AsciiToString', false); +unexportedRuntimeFunction('stringToAscii', false); +unexportedRuntimeFunction('UTF16ToString', false); +unexportedRuntimeFunction('stringToUTF16', false); +unexportedRuntimeFunction('lengthBytesUTF16', false); +unexportedRuntimeFunction('UTF32ToString', false); +unexportedRuntimeFunction('stringToUTF32', false); +unexportedRuntimeFunction('lengthBytesUTF32', false); +unexportedRuntimeFunction('allocateUTF8', false); +unexportedRuntimeFunction('allocateUTF8OnStack', false); +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +unexportedRuntimeSymbol('ALLOC_NORMAL', false); +unexportedRuntimeSymbol('ALLOC_STACK', false); + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = Module['_main']; + + args = args || []; + + var argc = args.length+1; + var argv = stackAlloc((argc + 1) * 4); + HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram); + for (var i = 1; i < argc; i++) { + HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); + } + HEAP32[(argv >> 2) + argc] = 0; + + try { + + var ret = entryFunction(argc, argv); + + // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as + // execution is asynchronously handed off to a pthread. + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + return ret; + } + catch (e) { + return handleException(e); + } finally { + calledMain = true; + + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + // TODO(sbc): Move writeStackCookie to native to to avoid this. + _emscripten_stack_init(); + writeStackCookie(); +} + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + ___stdio_exit(); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + EXITSTATUS = status; + + // Skip this check if the runtime is being kept alive deliberately. + // For example if `exit_with_live_runtime` is called. + if (!runtimeKeepaliveCounter) { + checkUnflushedContent(); + } + + if (keepRuntimeAlive()) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + err(msg); + } + } else { + exitRuntime(); + } + + procExit(status); +} + +function procExit(code) { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + +run(); + + + + + diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.wasm b/作业/数据结构-金健/C++/第七章作业/public/第七章作业1.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c803a81a766e629173f2f43423ea926fe712c855 GIT binary patch literal 190720 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%0ALXilP}RQbt%q% zDUwD%CDBq1rL6-K=kg+CXV5nzckh-EuSOc<3-0?wXZt?64VEFK zB&^@V2H_At3tSZ2Q|Ueq%U);_%^i?LpNtJ*6+s#!RzLH&HFN4hU(NYymi({j3euJZ zQ((YQ1AD;sQhC~-Wg9~%4zYqm4!#(;%Fwj^22rXuNijV78)Bp|JV0_4*7k}=leS1* ze=AZ4dti7J4xje|H3!<+1}<2!E--9cx_}Y}#Q5mQEig0_sKEFzMw9Wu236~cDVM1f zLoUiO_R+d#RWm;5uxWhs7sf}^aAw$cU7(h>o*sZFjSpVTDqctz@J=gk??6t)J9-7N_qCRsU8nXX7fv_95#$&Y3__cNmKx?t1-77} z!gERbi7I#1(hI3ko?cnb1a>piRqQVdi88zx)d@u;T5`x9kcqc@dzI~NBOBhxgrMOh zdsTf@McnMbc+qA=(`Kzwp-WO;bmkY1%}_ z6zT|MDcE9diaJ1So25YhR*O2YTAP*vbLvhVyfEs(9GyfR+B3mE)&hCcRJH-!j?~eP zls8Q&DFlisZ^?DQHBZ1i9pg)F1V>97opo5JMf4wq-)5ak&YE@F>OJsuuzBmW)mfW$ z>N^AIw$7j~&BUOUbZQVA)9Tnem`YlH8U=9yR8t}~hzq23L4ddiTsCNquZ_I}b%1qB z$tER|?H|ZikaLe{hUOYiEt=E0$ka#rPJv6?g=p+H6x6wXjXGaXQA3;-Ex06CznVI)M7zh8Tu4+jN48dOd26GsckrteF&^F zGpD~3*wN;)|l$JOC~ki=&@EdtQCVdQ+#o<)?*(e95c6}yHurqTyw+JjZLznM3d zsevX#iej=7RDtQ$m4Te>Y3Cyl<{dLlsGC;#16^gmi?aSyzYf*)578+8gPb3GG|2uK z)iypBr2YQsPf@xzN!7SJ{}qjbPH?_2(CAy?M~V0s7Xm5B{tOb+J0hCE2#{~o%HOU1 zfm#a#rGR@^jk6R&MeT}yxnQy7l6WZ>!~K_q+5M6B#luFHIcx-_>F9u^jMLida4Y$x zj3r?-$U~1`A^_yElyG1+T80Jq;u{2_txts%vwBvVBh{!@HL}(%$y&rh;>ff4*hoZl z5$~Dd0jgHJLYQA@Fcn=!hzOBfPF0jN0p zk>&FrItVLK_rD_|k$lbi`N?RrgM|#^4`>A93{tLn_lG8mR0cBzM1M#wkyJ8v?b-NR z4Y^{>GEXbO;D`rm%;z*LZZafp0d-0{*cD{y<$@U*>f>lNlok=$QySDxCCEq4r0ym;aLeor4WbN>6vLD~j)2M=>t9y@3rx`U-u=RP#|F0Tvu8zyyu$rO`nfPTD#s zP9Yd{RN7ZbxoIlC;oQNdJM0P3Ok+b1YRF4#0FjKc&bD~AI9k53Yim{})Z6;=)VVl* zB@`PLf`vz;iEG2Kl~d zsrqOHI<*X{z1Xt<5PE#q`6#O_1eHW~=r@TObq4;O`5 zGZe)!Uc@2nAEPsw+x`LVbkK%=kERu&ny9-d@mxlZcRI`)Nu?|^g-Yr%OHOf_29 zi{4brlqAtig6q^)#j^+pOQ}ZMc98_)EfdnQF~%t>=`@qCRP=@9Wft0vYxKoXMF)ya z0d=eoi4u*_)~5z;O;MAgR@+RQ=cb-+?ApO7tjpuZ?ghDvzpgl)vV!gW7Z~mFC_S!N zHjo}M)ehd8QxHWPYjubl)8YCZel6-n@Xev#$4pnRs6rmOl^}}tZ?{+Tn zl>?e5mSL(@H|wLeL1IaLFVvq!V9{(z8Ej~;+T4lSPN%1TlpO-Q6PT0wDda~i`GL8D zFgVGKJYF4&0|kU-523G4m`ANDqkZy=N)`cPOgwAlX4*ALu0--mpM@%Y_=Dsp0l<|4 zW|t`!O8V24O_W7T)pNE{-kij#_3sejqkTvL-We0bCJbbixbPI4rh3u1W20z35nl~N zkmTOkBH-7-LPc4+Vq8e9bVFjBMp(E>n-H7kTcL?{#`Nx;#CeW}&(6cBurd@YZ=q^g zTqU4aLOK-b?6p*t0<^w^XM4#O6b@IO#Ck!>L)Jv0_p$6?qyBKpu>31X5@|dd^-Gld^%Z zHF8mJjY4O#(pHIPl#4tfTM}EX@Dyl2ia5`vl~}-!dxc(uX&xJGyRH`E9q_VXgSmw| zJ4omX(HNt#scVCaYH*oJN6TdrOq9)2S%^}ZB@z=kNo2!>XUV>a$pi`gi8{&~8a;ch zokSG<(~>8HE401~O+EnmWdBUCDN<$?WEaMY!ap*YPJZ#a#)}cE)vg@I`;dTCzEyT! z+HC*&MztqTt+r9sFzrNvdYd)AsQ|}NCXyN08vCFP*_+}y=}f-5aG#jh)QWjB$cncu zs$` zWa*Q1z0(SX_S;;ucgEfo_B22XsZvbpARSf(8(zd+HB8h-CTb(6r@KSle)`z8P^bBZ zLH13ZX)WwfAb0Ux9lX6ZN}p1ge+9(zftX?_o4*ZFTSbJ}K;FZ6cbrxjUe0&X$>(Id zbRgaC;fj{FVO|4_AX)jCH`+L-DTn3Vo`kVcI8?8gy}V@fpTxN|z44;SUcW+qU09*U zx@bMDUpoh>^(YtX;Y&f0elSpo28sOUVmJxk9ur2-_iu`x-`7FUoz=F6p4&*fMZDks zHxO?vI(;kX_hSY9UW?U1&@h@P5N~AGg_5tcP?R@nJVAG*(1=Q9?mG3R9AS%O7vdo4y;zZ$hAx=XH^V(KicSn|eDjrpqtC!K~Hk2B$ z97G26dUkW{h4#&{qhA_5lFykTuvZ1nQk*w{t(Yf)5eoXS>VRZH1z z<_d-#t!|66&mpa~>PXhkcQ+FIaAt|b3PyImd`yCNq@LX^2gklinMfp}%|9<#B!aUq zv{tZ`-3|aq#oET(QO4O9I#B)@OkWzODSu=`>$@UT;O%R1EnJ&sJcy?61g)kc zo(TMC#u(6}!nMZM;5!l>*R8%6a+q(ya&J)xIJN(}WJE(bea$NYl;|N%bwsTZ^oI?Y z-H)*44=2LcrV9%tBh4GCv#d2^*>r*SWh{DyZYeI5pjNlaQmNkBnxvAnNElk_fz7c- z$S9(hd48<0Q_)x-k@aDhkCqJ!`*d#(cmF0?(L_w;1y`R^Bna?14D@ZQPwPe=U@VGdCvfoN4TL+vP?#1^fNZ z*iV{X?DJskr-;O|0_YoO#;k3<{*QL<`d!?>-EEN_0QFz1pqt_O@{aoz!^Xagg z21R4`%x;~ER_vxF-ZZ;)sL+Dl)Q7Q~#8lW+*hUZ^oRK{wg22W$=VK~C{GlL-KXfOE zKgH=W29>OKcn_9_%EJy}`B|;?l+w*;GCI;FBr;mw5;jGPq9ARWv5@&J$mAC`o|b#^ z3n|0f18KwTds3BMs(dDDDTgT?cnwiV{VTk<+RkQQh$}kezidV&NWWTGLVm{pmX&NO zRFg@jZmQ`<(y$~@SY~zAFbf*8>c73LLTX7*N1mx}AimOBAJ^z6-63xxlx~osBm`#< zBT?9IlF<9)RJB+udC7vzMEge7OlF?hmM zhp098rdoz2vm4kZ$^MD~oIS#*aaYJpFKf01WQAI`k&KG(oss>$pyEx4wMPpoezZFk z|Dy*g{&80-{)v}w9fbLlIJ;j4M2m{wx@ju*0GI_iv~RB>@R|}E2UP;lWIm7}>CR2(q>BL=;4V*y z7zKF{FO8P6UUGG074a1hsW9y15c?y&BY|pVcX*P|zQdi2JpLf@M1OWW(RWn50{E%T zpARJ2w+M(y4&N)~!T2~md?14{L1b>jux3xPtsYsd1^~0~tMU($oT*F34%0(a8?I+R z^j6ILfJ;UjYS=6yI(@qgm;zCa2L`4g8`Z^2b)&WMGccR`d){!!?n%sq^r}6X&&m-Z z5RBQo6tPlA*_Fz-Xj|Ltmx=D%3NxSDxZ+Me|P!6kd3MzXrLE8NX)wogrKlPDhzfV&0 zHvv#bx``SIO{%X5l0KU5o}p4_dps(AFvu45p(IErE%*EUa=$-GcLLY70l&@Dq=pZW zWy5xOC6#6MDN<>fW))^g_1+-B701W zC5m5)6DAa-Y>qL_^ZGTk@`QEU(J&lVA?%xn= z-%mJM;P-MJPxsG&35-E&i;)nuy|kwfI^m2cyG*hUJ#~%P+P;}*;0h&S6~rDNW9#o= zKBdMDxP!B6ll_C^gc8Emj05X>TUC7*9A?(;-B`P?0b?|)={p`%n{7HzuHbV_wzWZ; zeLTTGk*jvBkpq`=j~Zcw+200X7QIa8%_iKaBikI)BfBw~Q=<(3FJ8mWi%kCl1$#E7 zobr*tv6pYL!je(;i6r|Zg2uBk6gt#T1mls%ke|6_8@Xzh_Cl}~TIvRaxd{R<)yn5hUA{Z)fA_c>|$juMHv zZLU%ij~4hXt_aO;0c&)?Zh$hQfdb)V2pDD8D|>@oS`%voz0EE%9A_7Jg0nOmDBrOq z9G$F?q*ujSjmu;^6I@V~m;s6*tP6A2>BAmq%Q*kAL>1`bIHL=Vqt}ds1XfjUB2+?E zOh|pqOOSJ82_Rc>-D)Fu=R@H}0Z_y9EX)%LmIAZRZgKvZH>iT945QkTG|z#+bo z-D85sDhLYg^KfYm(-$GjxJ}0FhLZV|ao>Q-7t=7PEv%ENt7}CTxKO3!yx2yAw1VGg zn2aB~cbtSjbRW`XXfWR<$(N;>pPqGduy*j#+g5{#DZPm*(NY`qP8}W-==4>a&v%b5 z|0y7}oCt|qIi>5vB&to^1k^D#u%yYeT1><@Rd}Ak+OewFA_hv^5Gtg#J?n`@5Cz#l z$QJ&!W(7yF-H?3-RVS4K_>6yyuHy?uTUPhd#4k~U5Nu`*SQoPs3}1MF4IBG5ULDYQ z1q?Nkj*ekQhoqjZyki2cw7biY{FlvOdw@8`K#-mZQ+ZI9deSqxyik{wQ5-fkBK>Y) z>xYsLqL|fU&)`K|D+uTzn?8mJw33MJyU1UmrqSRXCfGrg0L3Wkw6MCaeU9zR$ ziDF(@8%ARem2L*Uzw`OdGZwZ=t2OWhak7% zSlXbUoE9s}{yJ#p4Ura=)0Z=$TT~R&E~Z>UR9Sw$U#xKTNYA(`Mt6KEwraE6rRpRL z4~Sq?hQ~J3z9M%da@`60@+>2RY9B{dn`Td4RRW=6#g%*j-@YvkUhK+#G3mC)O66{Q ztPh1A>qK5kwpD)n-hk29*OC&gw8$=zoBSzywKLFGD9^^&k@FX6#;&U*_JwMj+U zy)hI&WiI9j5-CHsxP%b%KGC5b=BORu$b&ALF(0!4jrkBN`du6)_G{n8owyTJHssUL|D18O#^yXd5AUFj^}NFCTaP7xa%#%|!J3vE#!^PPzyK@f9H|B0sMBgtoyM|-dr zL|~1gYbnBOih$WtA|+8wqRP-LM62o_n`>UhI`GYI3%6NnVl7XIPN}rg3q%IzDtkmA z${+`~%9Gib8WN!D9dYGP+ZFhh?l0e!$cuqzSs?x#YW|@E>)E$0&cHVo_%sWwW#27A50^_`dw<8AotJ5|jPdJf|zzm@&WTCq+2Sy4<^I%ms$$2;{RT z3VRYb7M6hE5KZ3vGL!^aF64M`+<2zGSSW;S{f0r<*2jZIgtBWNil#7mbxzJA;=n`p zt9Hl;zJx@kpsmKP&mRnjLH5oh`(whL;i;U>Mwo|_*0!i&J^K^EIshhHP9N#Axjq0< zVDG=$u!k#X8!CoMKP_?|360Ru%J7&As~6M(@R$em&whb0CAq{D8w0Fyih-Inh0^ z6_U?NM93b^IDsf2ac-mRcsk z9f_p&5L#YW(k~?3a7l=)X1)(R%4{xrLx@3eF)sD(l-HW}Z8)Ea_zC%xTgDRoLJX`2 zaUFl^f_(Df4((tf)d!Pl176^h^<sM=lh#;t-bbnqm-Pz_geGuo4@&+zxSN;74_ujY>@*J#h;C;ZkrF_ z%m8d`;McaLFVo&@Nj+Ce!95D=%;ij-$;%HmHo8=W^f$Q_ja9S1p1c4cRVBZNBUHll zw=APn`x=xoQ?zAb*tZ3%w6-GJa?UMm<~jxkg~RlfI>LKl!R1JY>8rF8Dwzd*pa33t zlmU!k%JB{WmaMUNyy*jQ;eWC<7^YtUh_xswuME?-*3ZsADm*W=(r>^_JMQuCv!Um@ zm?rXjUI|**#j%ba_PmPN0Tm7~9XwBOmlCoBz+yZ08XU<`91g{lIhBLVz@k~kfsZI9z zfov$=vgt~^v?dp^8Bg;@EYR-+M51@byyAkj{)iEc9&eV4nBSD5sfwN=ea#Ba=ax3g z5oMNv_@>w*!=oU+{Vc~f3Gl53;u~=^IB-EJ|6c_}7eW(=Z>k%N_Y7g=>oOSMOtZ-_ zGCYDtkH4F^|JQ~#M3$lE_vOVekyOR{xk9fw&o@xO%cTttd5AcNyoZN?@znu_#^|uN z6e5o`57D04QHa2e!SR;*i6Q!3+&vYDq)IT0K;&_C>qI%9d>w*hNGdqSB|@vH=MuQ` ziVw#ES|z6;J!nMgSs~ph#;MqN`g<1F`3zS#JDMS?WhlFr*$^|raDx=IU(Z4cA6Yr1 zFm3RQWH}Ya_Ld-05_rCrCdr4kPzZYGFa-O}3Re)E8Q&O0o3%CY(5pja_^oh*|HC5u zJ39BAjxXq$ycQ#c>#4{sa6MCMG$I#-kgQg4NAqT;fSdX|@i%PXDWIKebns)*X8qWZ zx3Qw~*S6EQU{sinhv53ddU7C+>dx>SZswHQ|D)a@*rd=6f=6qZwJJ4UYnW~}$<&H+ z=3|}YHD4{?Y{Pu|$1WosC893#-?7tf`FvxXbN0TMuC@2$guJv`k(qX6h2ROL!cZ%q8Qaz$Mtcu3PCE zb@R8n?D8z#XKDCua2Z3|5X_M62O>eE`)+A*!n8b6ECX1p%fdprWv>2rROZY|A@$B* zP_OxN+uEECOf4wNt90sZBxQF zpNcAJk_8%nNcsCqhsG!hM6UEDI0&+0KIDf(3=|m!42ty2?jWKwo zRokHmKP&qsB{DSEwi*hlQDP-5tdu{gujUH7t!^}FJW!Zmy8(10eb3v3wwB7AdcT(5 zQkSOf*3#Qh>&mqx4z}`ITIzC=<-^+gzxCvIPIYY|eExmc)`ox^@YcAs#aYIuy|6gq z$1kjRK;+-%!g9cz!oqUteajb?l1l%`FD&=nEiBNy!op&r_AFgkmhN*Z3(E?gXklrW z0)|_mT9*sU_z`GZX;t0saJXz$o%QW4DXBOoT2iZqqs)81>RSs|jS8m!%o5Oo=Ko7Q zR&Hr2yuTsYRc_hAUP9&OFbixzcm?%5qAVbZh?TB@V-lXhO3}kSG`r8f`&dxsV?kkr zs1X$sZ-ABLyK)02W9KrL*_6JxTJp=GTq%@>e{MiJIw=N!$R)KR0D)f-ZB&UOH{1`) zdsP(^Qp$wvt-f@!QhMnTOwPF4p4eHEzY)0s4<#)vd*)0-(!sPnYexM6k;y$|7CZJ} zU}BGZ=zw66tyANqE`>33`+1#EL=&M-zdnLSg^h=lCN50cBXKSkEqN8TDVl&90+ORqDxXSeBvbO=6-lPbjZK9- zU6OeZLf|_}GAp=g&3$`%q{PY?-QI)FIV2@*?pZ=g=CN=T;7IAEE0dD3BTq`=JZnZs zY0Z4D=;uSza9U!8VyUYYUE@8w3D-+JqlV~&T!%yTX%#ll!GL=tpxO(i(7?AFDPO(y~DGwH&0bkGbGE^uluAG0+)8)caX}6Z)<~ zZH;Qo=wrTRfQ06rrLu5NO9VjKGG{kAYI)~U=ZgJcJ^7hXmt|5u&Rz1jDsmU^p}qZR zE^rdYInsEa#aj>UldgAYP}{o)`;7qEUO9;AM{z!w9&x_pQx1!zuhrTQZy)$=vAQe? zAJg`Exstwacg)oe&7HM(j)(f+;sr#5=v!$r0A__Bw*8%PrP$)}x9Pd)uM8 zZ0{b$FvV)gDE-ZlZQ0SzB||g_xE7&+AO!v2|6&}(SB+J&9-`E?6B2|wfkx7Re>6CTUs%jAb!%2w$(*gY64W{+Q&Wz}ELnT6aV z|2o^#Pb>o~i?@_;yB3NfBB0C43i@R&)G94xF$=(sK?z5?x_-}G@LUVk!b|pSL9+Ww zM`@*>fbmc=HmSf0JoeaHqgLgWZ;crlV@;_P1CN%qxmS!?YPXgt#y5Ndxd zfNUSkY-cHPpa=I7%tOYcOJjFwCMh#mM>8o!YuP%$RA!+X1-#1+ZKnjUC@_&t@v@_l zY**1Sy^MJ&L)$8_strsKpY7YTU5n8ArVrN;pzOl5P4GD`O7?-T^PY)9lV)HQ1mP_Wt|MJ!!}9vmap zd;4Zh?$&b1qTL*{fr_VBV%HiBGie#F^sBxv=L*e^{do?@`^-AInKfqz?Sd7X;1uD` z4u+!9xOICdDI3PGnR&QFV*e5i;a6E3j$b!Qe%;Vo^evmxOPj{v3}l zN6j}@BsEC?Mo~umj-#AlS2}3PW@G)3rDXk%cq-@-Z-+e~F5$u@_g!ci_wCGu`{?n4 zy?X#SgyVFWYdOhz8157QDae(zhW5pPhAg)juofUQ!2py{ixSYZVK?$XTeKVfrXaD@ zJq^P6tYKPX%Egn7ufhh6nOeyaL?gL}SO%|x_-P0LD9v-scwb3vd$Lee(K*P4n0*tC z0w&s=ezcC~9+N>xA*PVmo&`D_RxH<(Cklgi7=)D(K47Yy?TEz?)cM&FHpQ_!@VJ@(t3z)A^FHJ*Qx!XN%mA8NYpbgu-uJmg8cJ4C?S5Oq(__ThtNqGYt5Ce4NJSJlx3shrW}qK zI~Yt^?cfWMYBZMZJNQE1W_sD|AkKei75nEm9x|J5b^E8#35>|92GG$k!rQhp4{eHA zyUzvt1tz4Z7ef-@mzM+7FE0eB5s%bpc;vYn)nBT?u<^g`VNKQd*wWN#lRRWnciRzH z<`{zIU#1oOGx{Tml=0+x{kUG-n;lj1IP&arJws+&sbI8}N%!PlKSC1cYc_x7IIWq^lOJ!+ADa8o zy?4AZ`7zCpcQ81Ma$zCbmJP+_RmN?Gf=z^)TxA5hl7;R#I^Ceg%P0?DNCL>JJ^~r# zp)<-M9rF>uhDN!B_X=Es2ikR5#{*6Vv?(CfHFSM?FPf?p%aA5K_Y|M;0~9kxyZe0P zS~`M8S38$Ei6C?w0;W*cw8&|CuCO{6SXAlX;w9pR=f|kR=)fiw1^675Cohl^bW~j z#S+eIGJZkyi*bLc4ECJn3NtK*dtxY==^5E?aWza%i5LGh+zETb&_bEQic<~Mb1$te z|Iqcx`@Jwg_Zrd+lKWCzD`QgGkC2NkS}DYcxmJdR+}E&1bl2T|?x`#l!$OWS@WRn@ zMqU-!yZWD4?`3BF7QdEi>}-HFu6yQQ6;8G?o&rgSBV8GXHbyTc)!;FJ(8c9pVafQ1 zM}e}>&f5fQe^_i!zpFAHz9lWd`@Lo94Tqjn>nknd1fkzOTV|KE;|i|QRqh-sJuk>E z@P3d;q%55qC(ub8D|bhx8=9iNh#9!dsdAXcPU2K)%jEzcmb&tG*Pc05I6VU-)$;>t z0`JGrTnhH!XBpp%C&P1*!=JnTy00N$P<-ct^iwjm_eb+AC#&t2&<^Ps#oGnigpuu+ zL%(rmI}~26ogMc2*|-wuUW zYv*vK9cnFU=Kya3T`(Q?ZBb#^*4!@X>II4@ET>f!G3blsaB0ldRC5Qy0kgtE>He7< zFSudw|ICG#AKDIf9Yz+y`MHpp7&h9HUukRMP@<_T2jk#*z+v@Ih!;GRRC9d|CNu}Q ztma<(DuA67LyLx{I#WMI0k|2S9Nb~f#U?9>7N_-7P%?^g%-Oh#W)u9~j&ms$%#-F_ z5;DeBr3W8OvjnFSp0t8ZCiu)e#~kPVgsX{H7`6&y+c{W^Bg)lW>)cxM#o^YXq`9?H zbA{35WYNxKHm+(Q&Kjf|g_CT0?h!hINw4McjCY{<{w9ExzEV74>I;5K8*=Dj3i6rI zB}|qd3LZY)A6}iE6xsC{ub7+7=GXP%|GgI<^8n0zTv{yR&7?BXNnK4=&PvVJNDuo)ryF&F5 zP*ljkAdne0H<>(#y0I38Ql$G1>G)>((!m@Gp|vOc&0$IDN8yUY(yWPU;>$%JW^nRo zO!mXrb7rwK5gL#P@Qq5X%P0&SsR|A~i~}<~qUX%YLZymoQV%9F6lA_8R#WMX9Mtrq z=BmLPM3Y?vo@vU?TJ1{NfQ}-mHP4EO>Ty>|A(nQ_=OTeSR1-`s#IDY3XtkWXoO5_M zfCLCYG9c`Wvx7d?DEx~HTrXF5+9++IhKZ@C|KJWWCj0l(7CBZIC?N{^5Juob#yeM3 zdVB-Ds!BIAO_*C&tN7tn7N`Fx`Q!Ys%)8WOPex(ZTB_@F(TPAQ^`B*wIOqUl?mW$4 zQN{JdIqb}VXY7twkqt6Dcls%);dPC26m!QkMLFUYZ&3wBo?j3L!a2ZKKcc%Mb%I`Co0;;AaD_mF#P~&?yURt zo;ujcLwTUVOqBmurT>K_gpzm_@_Qp&!W2t9^+wT=Aw~Vi6h)l6Pf&27rCeI}yU4?R*DwtZgdNnhLtd_gK; z!ZsJFF6HqwvNrmmke7vquWG@z=$gI&86v7>tv`Nx5G?GvA^jT};EreUTs*5|wus@e zZ2|7~5CL~~stC|sglB{RyYpS5r=l!`!3UaC(4a1Kh{zCj@FS+9FCL+OhzH(NK@HWAro*|CvR2LlwE4Am_ zN>CAZZFkiH+*qZ$DyDGp_yzrO#t0MXr~I4X-z2|q8UR7!qz^aq+U!fE!6ZeiQI1fR`R-fy!~-^|QnZ;N(80_p??K|f6x z8@Y2+hJ8jlN){)WLL-O#N&TiPT^JHmtDjp^SDH9jUgCHS9jxUu=MS)1yQLl~MlRwc&0?CKUi ztHfaRqylF?Qe35!exXhgXEpG5*K_R{2dC9)7(_Oe=qoDpfQbMd!yPY23g~XAZlEe| zQI(EO7lzmh!|5OR=T9Y^!i1KY+ia z=7K~@yB*UWaqB^CbYtPO2eh1HCy`rdxXFOZu7|a1z8-GYjLIWQYe0W-MH4msJ#e7Y= z*{>(G>$@>Vb<7dgf?h2YuW(4MN$;z(E;X!cD zWLkjISknAeS=`;#*com|p6`DTVW#G}0a6M}NcJEa?pBjvEaSfCKoXQ0TBW3QRFT$& zHYRE9v@u+4&afCt>!MI#{CinJlh&{zvqCD;+D=xIw4PGWOQdz#=JJlkjJ-wUm!bn) z(%K}pw2`h>*m==@Sxj5z`#mw)>VF#LMT0SOT9Hhbw+UHMZJd9SYg%Ud>K}EzA~7af zH*H>-HET>fwIm{vXCS)qI<1k=QYQa+{_wcWPJxC{TXV1vCFlD|ARNb{o9~ZNCY9`j z1;|qATrqEOBK_s`Bu>E^>Y>NmpqOSfFMLW--o9wS))*YI8CT1WO9cCAYi7;$(ZWS` z+cqB`e?^E3Nkewh?$i+KkX0fF#7NaeYn;M)*P4}*!&q%x$g6itUa5nuA&E6TBC$|Q zp3zgP_jDmkct4W-W3$D?* zq*3XuYgNB9E8~8Paj9Ij&$Q@s3WI6qFOCY)rYRS`C+Sl(_?%ECA?P_%78sef$VjX2s&5vL$?spyba~alNp+UKQ3DfIW=`qRvHR)TNhb$ zGi$AtPtYijTULwK#g_fx#Cwfi+?*b8V_noJDCJ<)xDM+Hh20Z3u@tTj=0M13ECSgo zhk?v0u*la+N5?!;BMr6`P(q-dlp@P@bW|N>Elx(gI$tpNkE6vSu90JcjRuF%9@P`8 zB@IFzSBRr10KcW5BMw>zlZ)JgpdGLw&K->k`j0&Q9~}gZ3?|auVK)g~~aK3QEmp&eY^+pBjgX9tXxJ5rfcRH_Z4p7&>8vi?SZtQg0RjTI_JbdBXP= zJbxT|O|IB_1u=|J%s$L?uNv_xv0FDnIRh~a)u@EAe0m088|Q@fZM#xqDkTe4LW@q$ zRT>Zk-VDn!8q5 z`8mTwwLTSmxtaW6ThUuhV{!6=3xRt6Y_pjzk)w zI+nmOTLOcg?xjS`YqO@C^IW$?B5rNE&_~fQAT>VM*ko2)7bXg5q5Mc@2l~Z4cg5OK zJ>~>Q-x!6!vAJXQc?mnOiGKEVZ+rQoXX8hC!;(HGjzOv6f?OcqHD72HOByYkHD46y zuQ5JQXX>ltpvV#0^Bi!|b!yDV7*bK&t!`es-ul4hR`_Ba|`jopg!ujD0A&qkarBWG3JRMxNRDHT`bBD;vLBI}f#( z!D(e7Cz@w^>uI)nl+LsiMLv~fjGO2pPTF9JRF*N{Sz_V_<~FJa}^rr=K;fxgX_7yrYtS_QxccSZUYnVBN6L+hLJ-iz2NK zd1*W>kvv6+@HGHV3k$L2xuDRV`(4kRAEf!0QH?v&YtiAP1mHAb1WQ|%8locuLXF-d z(Iu{X7n_kd`jQZo${7JIk7`6XYu3moV9o&SQ@I8h&3h~x@_jWsw$_$b;DUyHSkTA` z5<8J=W8n4^WPwa<+4#kOSv(9Eoue(BzHZ(22&LN-T=9>Q@JX)qhlojSc02QFru{+ocAXl;1byI z4^XRUvrV{;w(fcDpM1_NQJ}w-jl&dh{i&}*S!0g;BA20gI-ND!Li{+-*dI2(SBa zwavI;r5dg#W@h1PQG?C)DK%OUvqAgIIt`rNMDX7srcbdM>J_2X)2y45U`_3Jo-@yg z^Yqdl2}%XkE}1c125rdUU}KgFwJb!z6*X8YO*ube?Oh-)VX<2Bd|H+x%M^5QR%1dG z{V*@CmsMsMu3_yIlO|sljer@dDacsYf{Su34(UuR0%wn(=HRn1!)+CgHb_$}wtLtg zio!$IKJhjRxX#Ew>Fn&2jCZJi1|-C;uk8d1hroxl_d5Dge`oz1NLBL#HBYYKuIryC zJ+Wgr)Q4dBDeeL?qdo-8UGsAPd6W#XJ7_xZVPt$Lyuv4BojO?(*8?r2ae<#=%B)c! zc<-mb@)U;|aL|^KL~j6dsNbPGb|CH?AQ=wL9cSZImoZ%4qa9j0joxuO3QePZD~+)O zvmgUXDRblm;H!Nuai_pS%K6L{dHou;d*$zZoU$D(?kY;Dv=TYAkgCD}TUYx~=4k+i z6W}VS+x+oS>+hLXJuE;0-$9pUtF1A@tfS^@xc zlXXQbnvP<^=>7DW+^{+;%XnrHPD2Q>7mkee2J+8V#LCQBYlXBo2FsWDARcPCTBGXC zixsf4ogtJ1>e9~#Tc&E`)?Anfl0H^F(`wp614YY+Cg^Ubd+c(y_%$080_5ffb6U0c6mc6Hs=usdgFvbvmlIR!5lBgO_5I-{T7}!Sas2olcPuJ< z7q+HnN^p$x-+Bbv3RrzOc{LU(lsX&3OTtC+taX0K@oTwzLx+zD+WcBJCC9d{GV2M>zcALPq&H;*qgCN=$ahK`RmOwpi9;iUBH_fHDASh{g5iW4gMejW7lIF1Dsm|{ zb*xg5@#|vRB1P$CI>s@SEHGBIK6)NqTfrbden-5G(s^h_sial;mpeICGXG)O0kPa- zM;>Qcj-)ChX$N?4om;FAn=$}ed3?>F&1M*ipZ(&jJ%5#MXbE8QO7*i|NlMmoCx0ep zi~ChHZ?F=o7OWm*M$6W1={RK{1K+`-YWw5RTqSYKvjqAsssIV=o?j5RW0j3$Qln*@ zd5Ch1a0{N1e119_cgdZHqpgG3qOZ1o%2U#Hink>UYf?&?1hN7zFQ`yLbxz!-lI@DutYTW~@Gn$Tpun}JNyiqpCl*z9bKe)d z)=1;o$z@q5%Q% zM!pljEnmj90ICHZCW&hJOn)+HbVmQCt5D+fgkH!*<<%#rC|`ZtG&y2~9qZda}M-Le|xI@3EP%SP7=h z128ES>E}=d;1F|xEhfK8c09LN=gw3xFp)n95eefGW9dDQTBjce5t$jk&gc+Z2)S?s*G%irL z&eSROT?#22#(|U7rI6N*c;d}|h?E;Br9?+wH?pqa)@?746>vgZR*XYQiy{V>%aCl* z66>R54YEF{BbPb`RQg55aaNe1=kz)@JI8Eh+K3lcz|>Dh$}+aKFy+?*uZWQ;zk;+k z>_%n8=)Wwr!$4TRZ8>?OUSU;azX#x}Jx54bRm>s$CU3!3@3C7MtFsSd^M6!oxvFX|~HfvgqcEQ~_|+<1MYw09eobQ=P` z+4x1<$?{B8 z`v@x>SR^D4EZt*?QUgLW;-;Y%ng-+o{K{o#azr6UUMJ$qR!mHJux5+Rw-Xq+;Ipac z_RM(K{D1}{*KCaG7hSh4_{?gxcU2;BAzUi-4F48v7yiZZAQG)kDOiHe^G|dv^jnE* zZqxLl-UKuZ}Rl!_>XQ2R>A6P0i$M#?b`4B+UxeTu5hg~kgUeBp9GPip5x#8 z=C90SH&Eau+j=3*qnxSocJ=6Y6IB2sUJ-fF+*PF-8X#F6K`DsxAbF<4?tZprVnfgo z>6~0n5vgD9y?_IO^9?+IfX~eRyo?XVls;IewO9#T)C`jU#&rZDl*?qIQG~XDZz19a z;PjvCa%ODBeNdkr5T)TubSWp6rAKrF2Zh}|!I$x!yChonD6+*AB|oc)ur(F=A=$l$ zR3f<~+y;Y)H|u>!;0)A;dK-!^P|Axj`?BC$^WZ9OO?J?-i!cO=Fi=?LDM~~NKLmOP z)0NT4Y2)yF?2g;8cL^<7SED7YvK`944Ye$OIxNTI(F`G$5UI9&K8t#AmzB?N@4`kw zAcJsd!_`ewju7Jf2hpzb8Ni8vg4Hqu$v710d<)gaa4!BcTv6yrTAPru!$>9sNBNyn zs=zD=*PJpJw|CR886&IZd-c_W4-Rk3phuNdQ?Nca#~~wzFm8W!IM8Z^a@8&rr&iz~ zoa*h?Cgsi*ec76h^56;4ZJF*QQQ?8PDsAluLSxvxaP6{8weZeUA6X>%!tGTV(-v}F zyiLKci?zA&Qp<6lEVv5p)(ZiMW+==bWpnAM{eGCO#%?rOs$$r7s3W~7q*`_L6~yZu z`_RQ!5q$FafQIjVb$Br!i|*rCrXPX++?!pzjsJ1QU;cJ(z4jH>Wx1v8&fLPn-tGKwx`iP?EMc^$_rJ`59mfiBMc+A)G@j6dX&;+2` z)wCig9MA@Ls!Yy;#@r*@kE$DK`Dy-Nt}I1jXo_G0aCNZ}&B|=@rid3g=P!z~O!|UZ z9n2W&fn8ANopqcWwhK{q2m5W~!u91)NrmxefomGiFOZk)s`G=;el@NkS(aZx&aLd$ z1Fam6o#b5DOxZ=`90RLXHHyi**N~^GszpO(%Q=@dM4Rc$pC*36(!OJ>GI2;V-C4>ivEnlx~EvG$Lq-}Le5)o_jtZz5Y7Fl&b%f&65c%y z&JHu|6d^5*z%bq|9OHA%JMYku8Jkg802 z;oAOnJiCRL_t*t{?&wSNOTHN)DUggu+=&f1B;hCbKz(?J>bBh~@Haf#uF`uT$Gbz# zipYWzcSFkVd}u2z`JV1>v+a6q<6w~6QF zCeaAF=(;)%Je(JuBbVNj34QQ#14(k2v8XNd1IYa1dJ1TRu9>m)I(*YcC#wP~HrdRx zZGFb%j%=V4hDJN*a$6%Bi~6MNjBCC(ln`*a3_`{O0?)%Wu9mDG!UzV;ICv~Jk!{1l zqwNd4HH8;+nI07;H%&zoE-t3y+nVTBP353J8<3vt5=)=Lu3QGz;hzQ=3N89C7A-4^ z)Xb8tx=SD=RkY7obZsOuvM9%>%#c_1YwYVPrHKi*gQ7F#sDW+HpYm?^T#_StCw|^O<6!Q=snY{7HQ>Rqzk3)VaCHA8`;2um=9syKpA9l5G)M~(3?}pED_8sb zf6B(>ld>lm5P6nlXY%T$AF`V&8J|W4f45PMXA@VkmxeGyShSI`-&*6VR+KJjolWLH z0F$<_V{QO~*^oX~0V}X@oREAjxumoJs^WdPB8LTg=%lqCOn@*-F$Kx>nFdocycS#Y1oWg3xS^+(u|MSCnoQ1ozimf7lJTiyqqF8*kgeM>Soh?3 zGt}xjb_;DRUr6O?u*aWcl6jnez6AjE0F#~|ppcLN-A-Rhuac$H;y7$4yrjpAF{2k~ zYZ^k~rSDWn7-nnu*9KB%k|C^7ILQHEaqh2@iD2YNjyuVM@sOEcjOhk-|Mda}F~V3A{NEXkiHh9LBH9XKo!fkTsM=;}%{pa_o;Vgk{+m1XZb?W)sm zHm)5yYC2(1~#`=7m%l zpdO$y@*D1z^*pDdpccF^Xvur@ZVp;KBv-ZtjKd}nKh@&m5ptl4{|YdOFd=OoMPZU* zt;r@YnH{Y01U7*J6WP2>WNU;~_5o$%6bLg^iP)wIDQ?pQvUS!2m=5wyAcv=@^fkk* zp3pLiHfWaOG3m->ML9PE%&#Um(b9$(q{L@y;U-cVArg|$mEoKv$yotJ5o`>YLuEmQ zpe0Cm$7d(W)i^e2LUf3t7{G5W1}eiJr07u}rO>=QT=1;iU#L>*ASIRhC`@;*U^!(d z{-(r*Tj3n&@G{cmTE^qjr$eV>AcV3w`Li1EoXUSR{wwoilknVnTx&F2?M?#akEaup zG6og$WkQ`w!KnC2ci0TeU;SvL6L432#XhdpUY&Zayg8r0L|eoBoxB;_bXRTmhr?B0 z{mAOCHU+EJ`k~QRrv=QC;h(hbNefhGe;N$RC#=?3zlC63|@8?FoZihcN{Dm)RMS46fjW%3C%>L(jiiYmF0Kt{1T3u z&J|mI-8gSQO9@$2t@{DIhyh^VE|5A?H`gzCk@VuSu*I6?Y=aYdPI*ppA_ZB33(=*6 zcvewjItCSVik-=0aTH#YY9x;|s~V2M8$3g@aa01{kxVdB@r(SQ0%HE@b&cfES@9%? z;M*YzhuM7Auq+-O7Q*V=U}y@{mp8n^kcS+v@L)@sqOTk1IqH=e(g0nk3$6U0DIj6> zwN`$NGwh@;u&JICexFgCSF^6L_sLx=ZGXN?J&9948_fTF|NHYdRtARi##xRSzS>2eLYWB}FcX%;qz^rUyyE=( z^zTxnK!i%HU{5ETl+!Cd)IV#EjffNiw{V{9ti5db(IOe=`k!@t_nT(@mz_I^Z-ENe z1e;n=AP){KpgpOFoJ%WlXDU^qUX%fD#S?@9OAMNJlc5!XPiX^DKDhLnup9?P1&e9x^w-U4F0LQ$|c&3fI=~RQ6lx$SWir+vveGS^_u58*i zP|kqc7-LKf0u)P7b+hSfu$G1EZZ@+mTYH5N2-XM8fK)8sqC4TN<2+!Tjl`i=V__i%NU|WV7$m~FwDoae!{KIjtA1U~kIx4eZ39DeJK>u|V2e7y3OAk6X!{oj zYk|#3m8(17%)MWtRN~4D&!6v4tA85rW@`awE9IL^hmc0!K&Ffl9_q+LrgB=?;A&Ya zOgoeUwe&iZbqJd{GQ}MMPxR|@^V9pdmE26pKQ!$~Wf~$vY)}%dF}W}d z^goqNe7&O=_%FwbFArT{z0CUO{9H@J;WdL9Ow+a53}hls+XR}nn%)TL+1an_pA7@l zlAYFA8K~$W%+5ZLh2j``npjFxKxGf8n~rJmRXr83T+KGADRk6tZ`7o)Axy~_rS|bx zu^ZiS^fQ=iL$l2(#Dx9XaqFwYqsgDbJP{(bAnDUqn9YZg0)TNE+gX!6JTxFYUzG%j(+trfP#}G|OMnP6WmMtrJbMj0&hkId&aD z>s)E{(SfQUQ=UL0kZJcy!2%Vrd)b&;L66E8g5&=Dw){Ox&!LrRRP8PxK&h~3u@`nu z10Y#@;=)?dt`KX04T`Iklah_?#MKeFE;+AS4$Sdv`l`X&S$Q$XfrXR<0qH1KFkmPc z6ktM3ubItYFu0&|EGUdE18>iS0=H;(0N_O&(v8hL=xim!&JA91)lR+%F9Jn*9@#2q zBuMkAjBDQIv1W{v%QxmvG(IrvN>6R2=CE^1Z=hs0BQC9@ivjCJ8i13kJe$XfQ(GcX zHz9C&S{N*)SS-fp4#~R;T-&$yRWKAWEp9A))+}D#NtXDe1VAir08`GOC$p~HQsh)3 zYGLFQ(Ey5py5~?e1~4-XL1|?n0nZQCWz(8;)#c#Zt&-=HVyyIr8&&*eE!4q??t-6~ zdIS5Ea}?s_P@UL%FQ5Sp4uD`a08CMWUXTm?yJS}VjYCaPqwki+mHF0wrX~Tw4n1R| z86@Mzk~7v45bA>!w$@<@Cy&lmV;h9w%cKXe>!b<86OdKMJYg$S1+vN0K%59(NYIBs z7R@ffPJu}I2KcZ0OgF@=yOptck+s(0PtsHPz+fHEC+G9hW}SjEr!*Dvj*Q#%P^QB% z6M5V0T2+$XW@O|&3i`#N^M%f(9cpJ^&26%In+-0yQ#{TSC?M}5m-`*hf;VmMpUqUA zUH*I{%+^tkoBWxLLBWS%!r9qxH~=S>PG|i0>^H!cX8uA<|6z( zuUW7!zAf*)I^D^+mj4=X@4R?8nxca9h4p z;{`84#Gzt4UNVzSiwZ?KUhyuRAJ%H&^4KKu-kQU>UA46&L|Qe`&MNx4`eqY9u8(f= zB#b5|+JcMDNRPme1Nj3)vC9-J*Y#^dAu3)F&arV6E z1|>5{+PyyHten{aB6>fM0MjKRv0qzG`5LDLoEM$TCqLQ4!<1+or6p7AmF*)}xBR08OK&6RpJ`LtldleQZB!bl zZMEu{fP$I-w3bk}iEv7fT|)}Z3ve`Hys|Nxj0c(_Hp?p32Pc=i+ydbi^YaxAEK-X} zFhe5gx@7>UJC|32k&26tG$)E`mzOqu&}J>s&Gy(@{ybS+TpuJ6^x~`Bz2C2FBk>xu>fDaz1UzW8|kJ@Q2TJ^JM2Z#Ab5Ls<8yAm+%G24rW++R$TA#7-oR zX6kd~P9()f$zO1z+NHB{^HPu4`~clcx{h|{MDR8W(m9nxS^U6MhKq9O0;vcw)vc9S z^Q(iCV6B$RHs3darBY$a_pf-P%ptBA1ZlNoI3J~%~HU}Lj~|(+ry<-xN?-M@7sqktr43C1}#pl-EIx- zcJt_gA7L;So8FYl-Kb_T7g$CDH8taoj11}4(*R{$H>(1J+cjt@Vt~&^fzXl2%7Y9u ztporT8Gs6c4oZx+Z(>vKn_~q~w~-T6rG1c?LvdaMfo}3GQMeqsvW^84r&&R4neok0 zdK6Yfvo6qZ3Mdf?dO~Bk1*s{`_wLm$gK7 zyrd;^iBu6{qaq;~-L!j^uzJGcqO+o~wpaKu`nh&P1>7RVhz^Xd>$0=l)cQwRUEKpt zi9pj~jIoTYQt{E4Wm+_80$RL4Ivt|SBsNTlh3tMKfOf}jALxGW;Dy0Th=>lD4&)Ht zPBB);47InJ?VdpA(dSZLr1G#1qCC3Bj(&*p-Ex}}H5D5b2jo~y@nhZi%fp|Zg=5^* z7;qrHW5#0Jcyke43|qW3S7lX7=P$wn-O5`XWR6=$ycMotg$Eq92TFAwobEh>IqTw9 z@7C5=S^_jD9C4(UOG0-LAjY-t0(Esh*ZmpBsMvutKNd9tYO=gQfS^Hn0dXQLOON7^ zNR#nIT}4QY$B0zDwflCqYas)&)>eTATuUT@MoN?FWPeK%x|Mv|Cq6n6Y`}yjT%?bK z!AJuUIyEsJnyPS{8nslSompGBBygYNKv+BsH&Cc`r4;>|D` zn_u?)iL{$w+LR2GzZOfOA;!uVMbc$MBsn0N)u8n~XZQ_Qkg%Mu2AtAMqBGqfMzD zEh3^uUGk)ISpj2cnKCMh)1?^srS^zS6f1U?i3AGi(xA?NVdT0%9IIt6;AjzvY``rJ z7~yf2?Bwjd)~#G)sPjzZ{2AMhp~kq-Q{cQF`UbJ7z_}Zg_z&SUGguAtDUHtIhUem* z?o578jza_b!nBT)(7! z_Ok9M6DNB^szo}f!&`A67lHm%_pt_Ou*udLP@wz$GVtu~mzbsVIrB)WQK>rm&`cO} zBD-Ath5GBGeHedyJawy#DapOMyU3_PK$*tOT656r#Bq4u5c+T#^bd?c|5T0HpCsiB zCf02psTMiV=+gA2{Aa$qKJB6<#{!bJAu>JKD89Y5k(^&?&>1x}nEoDyq8p_Et~AF; z^hCH!Iy9I5VS@}(_w`FXeHAZA|3FXEulJJwj`1SQAeQmxio{seD0JGzpmjiJM7xYd z56CXF)pChWrzoH%CS46m_Sc^@&Q3Oj#iheSjza~n z-eDVaG_c#W3)UzhNDhUiWkqSaRDu0H+05zZq_qiL2HSCLmTTJd=A)>&l7_YP^HO*< z+8bp$z>^y3{WYx8FK7}P=@<1;OTVNo#0=U-8cMxL|IU@Cc6CUxtmJVD#Q2F+#sR8G zclrPcYjZGWI81CCZDK&~Z?sm$B!kWj15o77Coay`we z^X5BA{w;KL&8akm)luJISnF(*ar#G*1+);A@GZSFTxyN!JAIHZK2Z;}Zsg#8vYyl$X8} zyF&t8Dv=(pW1LL0RFHS^`y%y$gLIuaMB@DF`SiLmN;IHrv;S<12Bsh@EPvoNVR~ny z$T|?_sHofzpNHU{oTDdSuZ4-FL*S!pf-FlQeu;62ySRD}S$K^3BG`y&7<5u{|1>D2ETc2cDDQy$2Dos4O(sJB{^3EH))-k85GlMbo}p zsECv+9^PdSO_N3el+LDY<&ft)N&luCDh(4imcF;4Y;a3SAE$M$lU>#+-gEAswHPIm zFTFE9+n)G>W)tKQSH4x?Q~^$dpr7tWlpkXuVfs5Ywo}tDp)}2jyC}=WSm`u`s{O() z>dA-9$b0GC4VqDwx`%tht7||%;jl>hCW$8`{o3BfJY*!ULpxnNkLb`II%7h_=Ae)# z9cz$;VTF1}!Enk7OB1e-9HIBbMx!y{c)@LrNCarx+QdxhI7LViwHF20P|p2c?}O`L z`#3FER zL-7kZ+jaHy7WkUu8VFF8WhEXcOvw%`0dEl zdAD`~h?ZtsfX7rnqo@J$pfnDRY$SgXBU;cz_LD*6_zU*Qf>tg4?vreNf1@8}a4VMa z(QrQf0GcFU+2mo5j`Qe)TH=d*xn8MB{FlDImfkEL1bQNc@uSfLFZS?zXK1sT8&q`;g#=*=5H6*Qmd>hC^g{6 z?EtGAxw6KF;5dL7^a6&jHV+??IpQj@mI_7L$_Z}}1~7HmB<2DsH!JAMc;v{{czDh( zS}ka3&B_8ls%82&=Gm$CM>7bR4@-Bf4&Ctv)J+kp;|*$aU(^>Gt{a2t3TXdrzilZG zk{<~i*O4Ijt6-asf#L}~bJ613E$I(RlnC=w`xN=t8EVwO(@Zvx5~nZ}irX{od{6Hn zlPP^&Q_Dc4{o6t_k0k;e#X6oPzQ{!WgeaI%(pem2o_=~(~V;K1WSJD(x0?V$|wm*|d9gd@;oiULbEf;*95J6|g= zgE^#`cqy)Y;I~(HuNs#}Q>=(1QX>P-IZvQdckq%*9J`Z-R7!(_^+UrN0c=p#0vM?l zfPjn|?44SKD^(g+w9YHDA7cMOX&Io%yYU$2nKuxORp-t&lRHot$t2?CmP(H`(%)^k zW3h}&8V#vqxWBSu2#~WSqONmIOy=|*JzX@$O?$5hZ?#PV z2W2iap<5GH-5&76MJ`0Cx?GYe|Y`N&vDcl5Me7P;#3XGM8# z!422ZV$XbG6jN-$ucPKtfq(B~g!$+a=HEBi)8%9}f2Cl2M+N?|&<>_|o}&>?FBWIK zUSE(fc%?1PP_kvf8_6)wuFd5-05E6^AeYI5w_qxn@KBKx$OA&Yrz8(xu&wmY-l69W z>6V{fo@K3rgJ3JLyCcdgGJw3Zc-v9}{@7y#{OA(!#~)pd^-KR@3HUSZ5d!{9`=kWC zly*P)80|i~w0qxUv}>-5sxofO_l8m0z2Wp}_fwD2?xRb)|M=)?w4eVE#&^+sTUg)e zdx&jv_e7!Z@|)+O0-~)Q*!fOrz*FcI-quo{`1EeHMK_$AxM`?jL=wdUKx-&K0K zB6+#2fV^BTV=;NiQxMVGF0QR^)wSikQI?THoWT4u{FTehxo_Ai=A1i;a;xPKkw1~# z80pq1#)a!jTW1I^X7X4z{eHY*=7dV*rE)=AGX*%Lbz44Hp>@hsEObYDbZ4~xGMy<>;870)(_028*9kb=_+@*cglA4&Jl& zW;p^PpJ!l!VqwE(r0}b$eJ0L(`|uDVC(^rn#J63~Ow`i@{wM#n_p0GK^l_wUT}zSv-!`lHA54jWba{E^e3 z%J+>><%Ob3{qN+IIV@VC&f&v?vQL>pA7~{18W+hY2da^${c@|bbZ_KS0?ORy$4q)X zXn((4$Yn)CR*N^$z&(%vO=NI`bNGY@uHyr_Ji~|NGDp3bT)xr5PefEKXdAM&kzCY1 zQ@MN(tF)2Rs=`l=d`5zIt&_|5XapOA2LWwE@MY1cMkpZp!^zkdFeggD$h=%uGa~^h zD)=x+V`DH=k;~^;a4KV$&uDP!92cBgXWS6f`q7aA3VM|0gSeyPGR=o{Ii>kjL1X{O zFl04E*D4{a8zUHTA+H6lliUX^WECbK6z$r5cqBAbJXk4!e7v81+-h~>lQP0ky4#k$+SUY0O7*r z*#z+&cX)_SFumzD%8JZ+cjIfgo5t;V&Hs>ug!JKhpBG{s6k@Qj63P%&zpzw2p<^@+ zCWP3oHU>c)K#m^pFD`a&k;zudh9ZDSzsek!fvzWmJyVy$ZGGt)n;9yFGk%Yp0gfvB^`M^KK;{*Iey^kueIo8dIHM^<|2mpN^mQ?9 zOCfq_^%SCSP-uk|qW!C;5PkL3Q;5E>dJ56M;TMNKze_1ZpIj-0=pR>0A-Zogh3K27 zokH}fGfp9Tn4Qid*V9iS`j!F=)fA!>xQpbWYywjt4=rg(U3_mQ4L#DZk)Ki0kWb0| z>t5lsaGdEJCGxBbw3O3@mdx%Tz1C7W((77@{rpxFk;aw~m)P@gV_9O)LbFWlIa*b( zj(GLzUKruh#GY%LBZ)otpn6;~65L6O0%*e9Lob}Q3GZH?0 zPR{!1|IIK`kv@-RPR{*-l5!B2H*zV5l5#%I=5(xiHpME*-T3rE^)A{I5 z=Sf2D-{I-}&Bvzm(VfndM4`XK)A@>K8Js; zoEDhVD

    ZSvJt`MBP-%J&>@2aUn?K5=(-)2r=T9v6X8l1gNBUm4O9MINB z_sTfY2&?`x?NhMe>~A^aMa_&DFH{&hfzLEJ%jkx|*&zrc!Py~NRxxAlA9~zu9NvsM z=AFGSC_Q8=1ZO`Hj|OL7(=3Ct*fdf4dY4^DaJH~+B3U;}gR|Gw%1(T6c4*yvM}xBp zFAjsMP}id!oLzt}x~%u~4L&;iu*@PCp2akhrBXy_0gQ_kxVuTF8HDNfH=fRgzHqOeM)(CP`@3Ns?+f@h**Eee{4y zlKVB|8sUoJL@!Cy%!nkBAocs(&ODsR=uRF^9D+6yP8_0Z6$$fDRl*2d=O|lL!=E@zV)F?GYY1GHdSyo>QT^pOq zqpZ#YyYlfy8`(gg{#T4?6w>>N#B-o7Y#U+BE< zy8F&)zuZ-p2R|6R`a*3HVjt%E;I}S3FS>-U9E;8+=J`iEIrGD8rMET}7*_;T;crU( zgfQs;PDg!eBWh&FPbtP9>Uh$JP}qew z&YjY>)8x}}*z)A6gDmX$4P7AB(5CDLNvhUOlS2y>Ak;a8nm1*Sa25&QgROQ_n{5Z+ zi4mwyx&lmtty6)GbEf>+4eyWo9U%h>ALgxQopNgIMkhimehh8q&kcibm0`5b3`UYxB+ov6- zM-dDs&L03wVM&+c=_hPP$oAu8%~|}XlXW#tol>kUQ{qLJa+-wtCQDZdTO0@#aq5Pz z#{FehZ7l1l8eRpRfvUzhG|cu6+xZ7sXt0G@q@&Z6!YlnnhmMds3%6GcX37K8k|YYyLQxqa}r{43PlSK^xS&31g>(Cw+Srm~`oD)|-{k zad=#UEmscgg0cT!;}fqJ3-Y#s{dR{9s{L~Z+9 z+_=j@#C90X1JXQHxDeODQlZQnT?Z+FGb)s+vnSGp&3lxL$?HG(NbnP|w?Z&c5h1H1 z84B@@)Q81oc2wcZ~Q=P*)DMgp`UiF_A=44xx#vpl+0c8anH^ z)CovNmxSoBUY=wfWT6w;{?~G`y;{Sl30`ckRzmj%u#}O`lFdJ@BT^(bIb!5huok&s zBqU8b7Dez{_##K_n9oWP#}G;l2Nl4^>y;c0ohKbTXHgc6R0Pu%IGt9yLJ!eB#+Z{> zjD?lvbcIe;SAhI@*W}DC(+b=XA-b{CKd7h)I*Lksr|abX7?)QL)r2wn;-1h}mUuNm zNBP<0a7LF^OS5s)E`)*NTq} zRlI;|um5Ey)k4rpfqSR`p14PYSw;_uvGC3y`98k0F7D~2@7Do+Y`;Ou?5?MK>ilx2 z?0=wV=LGR8y`FmtyqsDnB0iE+56OG=kdsqy9?B`HDCWUYKEI@bml9%KCa2oGHnwRw z>lp`LK7}f6-Dz(15LsF@w9H>8jHHb}f)-700*N>IuKE`bCl0jb8cC!hpTGHM84=HOeuv=lm<6=dR^Far{8 zSHcAHzCqtVwBNb6{vo-9-j_N~0 zr4O`9$eNX-v3!+B>Q8@pEqUg?IDtly^}79QeRSnepgB?2F@a{Mfyuh}0_~pA9oBiY z(2hwEV+cPO{Pxh4ehsGd^OhLRPN0^5^EE;!<|0$U><(75oY56H><~>uT7y8=SG6K* znn$v-q*pPe64dFu&}=`|JOwdEATaL!(uv)rHGS0U%imE)4e8S-aMXOg>Zo~W=%{(u zsH5i2WsaJ=n$Q4TrF7KnuQ+Pn?d6?$WUiI-;kuf4)V!x~)aO z2fP#K00&AsCk|TY3Qn9GMGrSR{&fN`&dXTr^}PJ+9XZrHkt0XNSM%ijwIjUMJvsL% zsn>LDt*7LHrEUdM@||0OkZXhR>Jp(#9SB$s$HJ|k8L)d^#70luvv9Ol^(+)STsz`{ zrZt|1XW;}*dC$TLO04KvxcP*h1&!EA*!P<%t_uph-f#-e1vgZj3mWQ)oC^S5aW1%O zI2W9hklwV4bHTt1vz7b{f93fmiN6hZDqI$zSZm)ClgHV(a5?=#2ja*`CEmI-(%^2& zy&bgEJ+-WjE+Q?7OJFFY#~imOms67)^6V&aq=ool`T-|smC0BRymPgb(*W>%|L#vl;c8hR)I6jl@ma!|E4o_P1c3@0 zoxrhCakWs`yIN?DMptsREG^@7TNcdF)v`!46{m$`(nw$i_=xLRD`xzJ2c>U6lb>U8k_g1`6rQ;`1sa(}@;=%x7!KC#qaP?gnfONBaR ze*wY;-PD<+!yG2JaZo1d8T$)P(6ILxoS?*a$6w&I7n#V&DP4?uwJh>wE(4T+6Sxej zNfd6&Z6nOIgz1bLj^i&@Yjc3S#AO5Q^LlfJ2|d z36vA>L}0y^PJ|Ek(j%)m5k9n{6X9@?>?2uzi&8CbiH!pH3-f;lX&8a#O;M6B_A{eV~8>=py z2!}04s9@C}_R4S>ACc>21t-GY=4cYP^r82|ru&tDy%#~5Z71_07{fM~LE%MEE8dHs z)#JSg&Xr*6$Jui%uzF5eTT}cP`Vzc7cf`)Fk8n4#`0>B7?qLUfA#6Dabq%kaa(~lv z#+5Q>NL5%~m^37%()X?U?&HHMzHeCWC`May*DN$SD>2RXOE@n2~?~UKv)_^?U6AD94M36=cP^0}?FL*WY?DJTqa~ z`${J!2oImGrW!jc5jXkDY=l9_035Ol=!SMmsS;mIVR4)tn?hHX9k_$qQz{6=eruj2S}to zXea!KyzBmA-uz_^+ORg&OwD6aH% zSvHz9R&kh<%@l2>MNJkgL(4yxQmULHTzl_~@g3Ou0t7NX;0FEB_=mgQB;*>kKBITF zwU%@w44E`xrGp{efq4F?! zXVWEcl^oDmpW|*Unxz~N&$tE#2h=!E|3Bd54!E%&55k$+Ons)&oSB*F@NZ^pJmv4y zw7&DdfCF^mnVE2=H8ayrX1X)InPg^WVsgz|1x9Tp*s|A3XtNT!>)dk)vhw`%&F+lj zhG8-5kXE@Sm0P*OnuIrYeK%YlP-*UgW_OzA=HBuT?|AFG9{B55e#1C}nC-B6Lz(gZ z`|vlf>#ng1fBdI!{hLF7{mRdrLWL%0JlbrYj-j zShFj4FbE`qRVn|KCN~1}yz=Ouo86u(Itt3aG`k7{DzWd)7oNv;UVME*@H-dku%H!D zF(p1HR7j~N0Zj+d+FEn)`;PU7H+SCmkjr{R; z9Fspp!LIRuLG+IG#Y9-iB?N~a>&vmV`)xI#u1_b9+5xpS#Y+vWN@%BXh2!F z?y8`lI8k*j4mnZXlXab(xa+45yN;JZ{!bJfdWAf6ItuzpCY2L<4}P$y#nFjaqwo;>0i|oWwgJ zjXd?l$g0#0mrZix#C4xAB#>34bs>{qxWbemjuG$R&`*mO$KoKGm7z9{xCBAWj+;KI zk*qv7DVaac#81lUSPWQ3(sG@=1l^}%G5ll2Vh~9L={HJ?0iVTki=ilVQj0;i8kZJB zQLBHN76Z31k6H{glpYI07Q^!$&7nG(#X#?f!uZ~2SOx?NmVO=azxaAL zU**5x>!Lkn?UibYQb2H4Jmd@tvsHrRJUU=04@*^;fj1~PB&m_wA0IbUNv+W%`m&N=(+wa;MzJ`laN z&ru2!3Y2`+Ew&0psd>|G*6scY@mRd^a8SJe{@0VCQCXt-Kt;o%r1F7jNk)1KR4Otm zHBz!;Sz&2XS(1_bzrQi(T6^t%_Ti!4`?;UbZNoTgt~Fm{jydL-V~+XyYfGbHidrJ= zc93Dp)de?9>4PDhrG|0J(O#yacRDjo1evvV=YPiVbR3d%0~kjpWfD*^!lsm zZLX%bX?N+R$2SSy7Z+;AH_7);7HY;f$@fncYQ{Io_e%;jVnl6s6JwWwob8qs%jcJ(CGL}&$3SDB8JLN6C_*zm^hxr$yzo+oK7+7kdi0az zwxm!q`boZDp&Jl(Ir>S0UMV~N=fm$6K(v2t&QKfarH!ymR-CqoNA{CV6De|%5eaQJhgQ+a!n ztEXGE4pv73n`){pUuX=N%{1lE94%u3gnhC*0ivr59Xk8C*XDIHVRg*r^k)vSLfyj?vO#15r3GYcrmvD=G zf>~|>_~thE{ApXLSzmmz(N9d#&V-(9E11Z2H+HvFR%ohr5VGA+OSaECvJnF$GvNgp zhxJk_!3ak=7i$6jLF8IJ7{R6>R0GY&VRnq5sQm2M7;rOUfud;lInj=aljSQ~Szuz| ze3=27qt6!tM`lbDww{1+OI3NHC+QbNQvPJ48w=5@LiELgh7h6&%iY2^C)9Oj5~doN zftUR?-iXQ;ZP5w!ZMk-y9&$$$JdrK4IyO;TF<-tVMc# zVPxIjZ|EfgW+Gb&7~M++7%wuKn*g~f@fNs+$%r5~F*}hm<)})GLez=s&}Uj?JvLIv{$e6$tA|80t(#WJJ_mEU9RiF1j}0!#Kzw2`WheV$9P&06tnqRQ(cnZ} zms^61ImDyiPIV^o=wMCh$l#;$Wv1Y^(owlyOgX&K5AgTn_V+J=+j8Jf9_M=jX64~< za{|$u^H@A~Iif#$oO^|SX-DGXo%%-RKeHts1%hY}P0tRunt3cGQCE_!jMWrGRxLrZ z+6rMC{wOA;S8CcymGw9BxJ#jhO=Vk=MZcFbNo{v8Xe)>(F%>wC3(%QDhgvwBua=007w`wUi4}%=nPsCNE#Ry0P)>%-SwvIM0 z_Ia*7)2e-VtMlA=M2o`CcVu>@_OCE-UZv}b#0VecJ*+ID212X)&~~!?vd~$Io+xw@ za&bm6DofQ_QESeh6NK7uvc*J)3AN*7>!_SVaI(x0SA=V{xrQ3QgzWuSCePVlk*JMz zVnfObcL;Zov8LT>N$odZ>CKdKr<7UjC<)-CKqapg5frPkig|R| z+Y#c>r07^A3Fz|8%w%Chds8OJ=bD%{%2c?}sl_NQ6;<=HepZ$pVswLOM!znUhmtt< z#NQO6Pqb^{gRcaeG$F5`#7+}SsaZ=P(x_nmv;`1J!p)Xc!-Q=U{SarGVK636|CRkn#{vwi5uQV263oQnx5k z43$(H#({^}B)EPA<7Nzd#-A2&KRK56yIR7yVbVP#@lC5bnF=?c<)M|BjNo0SA z*xz>h+h%`D(I3=0=~p!vlV%Mm)Dh5|XP}K!#{P(z%IRs9;>_J|+W#v_CY$ydKn2nB zmcUoC$q1?#Z*3CZ-1QXwjd5DEgQ1sQ?Z>EvuR-*8Eu|<%7qeBdX!z>m3#dmm9~mS^ zI}6s%aP_vzrGOu1`$SDZeY}9}$2A{==p(Ikf3TVGSlkL87jlM84IUTKo!3NCN+0E( zs+y0&V~ORij_qR!9v^Rn$0r8jaWQzJ85edr3^gzgG)}H7)Ik(^2y?wHEq$$kE z^03{)aDbKKx#1oqxukX1r(juwUFuH0n&rkz`y?@F=s*a zX_IoUSJ!x(PiU^4P0{6Kc#by2H?jG+qX~-gse`VJ_j1#L+_z{}E6mT*PElC0G$Zsj zgd9w6tFz6g5aPl1-RS4pPAT0!m}yAS6_gw1(!OYowr#M)dSuK2Mlg`t23IH484-{mE0g6QESM7xE+3g|;TL?7;~AYr`z9Xo<+ zd|qk3KCeTBA!RoDRlZY404aAG{d0`nak5ZmR=HViQN03X$3`^^3b1Gc6h5NGah$iu zXC*^#MnYQeO$!wgPWr3a;_o`hoGS`@hvTAHs?m1WY-Oad2DS|L%(F3+g~1v6$LM49 zJsC-EHCkJv$pLdgsB``J{%GC}hrl?nC{i>t&TU8houtkv8y*x`2v1xh{w_~XrSd{6 zf0)H%ZPCvM+lTT?XJ)Hxx{_5f$-Z?fhD%JP6O2kFb+pJG{)>WI2D4q^3E zXl-)C|1_+IiER)BFsvQJ=LLpz0Ap_7X-qaTqOS{Fzs|}LI|)<5L+kWSXF&swmy^+f zVbNBb`a(-54F&TOuV^th`umS=Y>A#|v+w$<10*Hi<%qe^R+41Zu^pc165iGgA{s`R zg)I}^g3*iKNj9vkW4w%$dUvQ<9~=qD7l~zby{Z&z>}O#YsZTI4MXS?N#Z79&Zz!lu)b7?)RaoR$$_iQis*= z0%g(IC0MKvQ$DuY@Z;V(whg05Vjb&8Y$@Tb5?`@(OdDTX?4B(XY3%)xtnTBh7vMOx z+CY*SnRQQw3|lH&buNrq$6QD+!|x%QvySO79ZW+v=;_4p;9%F`GjR48zf;4QQ@&LL8CL?r-TLSZWILKE zV8H3oH3l*>j(tuFs*D4uw7LV5p^K&2$T(J(#mYx$@)2q*R^U=&7~}SfA=M~@-$buYP#9=>`LZ*(#5ORud)YJq2rVIK%5SX=OzF&j`D|aQ zMHy9NNvEA;_;T334jO3t(n16ykxJ4tn5_pb+cj1KSt1#uZ(OyONJ4B#z4vynFEbZl z;v!}Day8(rgO1k@GP~D71MFVcb7o8f#%N^s+QG=80rtk1vU%ARv4hdUQ(+HnUQxZx z3ke~FjM-5ZA7wK7mg@y^ecN0LxUP}OXuUHTRb!*arc77&36J~h@z~G^kMA_X zO@~4jhe1J&S!Ycy9uo|1)?p979}qN0x3sDgsWI#HV4(ydXHYAHrJeIaGDi$3> z)R}X>?n;xGbME4V$5zZatc>Mqi{|JmGv^>yYt1=k?kp2RAvE*xGwKz z61K2Tt<6j+d}pJEJLdnD48)R=4rZ+po-M)4%6N z8-*vk%`i-@q3OTYth9O0F|09E{g+`?V^(sO579sA47?zJ31+4BwPvMzy;yJ!-yTc>x@0y)SL9z`svg$f_1PkmQoi;nY9siaxmF~1jz^q z^-WuJXpZH}K{%bsQM&XUTWpCGE9$*1NMo%>7=&@=5wlH@ti|0W<|ZsQgVn}tXPbJR zE!j?;@kEO+>6lnU!Om1PKTJ54v6FQSiLNJiiNvO~ADHRq0sGrWiWlZPhY$q2kenPg ztp#avYK0nykVcOx1(9hS&(V%R7*L?kP*-;0vz+OF9sRAPG8ntEvzShs$-s~!Hk>zy zCC%&@rhdnQ)c9})3R~-2Fw2L`=Lrjbt!#rJvLJl*&sz5EQR^kuyIysIUWT`<( zWN5R3Zc?$v1V5m{#sm*!Ffz2WlE(0hw!lq_&RPKdDbr!(bpef*glO%Sn{IX!&2G}! z2xpe7&_cNLejucE!R+I+iF3W2MJra_tmwbuu~2RB}C@%q!PsUq7!L zFz|&1O3(uO#=7D%J*<6ojqsiv$nv>J+htLmVZI&R(X#raYW}c3rIgx#+ zE(D+kY%NPAa}w+|1b08WyL6u+h@c7!5L@~73q~V|qv)5?>!qsYXdGG$7cra5>o9i} zkHT~?Ntdwa<`nd0|~xS(m;H0~Psq4yU!K z7{klMu*GV3P8;Xbv-$=ry<46!XjmqnN`%Fqv1X<`44{!vQvTEwP4#Al*a!a65!D^T zOots-Zqk$_higUUVbx_y*2h&3caUApBJ`o25C_0e7R_tr;Sn#WWxXzs2E?(gXODW$Q@vr`G7%R!xWf zr8QigbC*~3#oI7+Pcz*D13`CXGZXyiGaUt}-b5B=e2H5SeTb&(RRfcCJRQ5;T`d06 z8}j#7`+JN1^_?Q4TCLJm|5(J?>zv}-9ZWCKRl4Kv+3F#QA}+-ELs#k41mU2a*dJ0? zsTW3QdevH9dC|UI$EkH%V1SqPn{CFL3X%4p+vIo{KuKgeDq^v3*vtg}Iel+Lyu`?%BDc5rY*RcG7LOm56p>VV5cXCp{Eqv^zFaGkA6 znxR;McB!^$?C&)h)rLpEF!i)97 z)JctKxdkm5tkK+lyBp1I?EsAkvuUkHRBtv_Yb_$veper`ugF`iG=2gKAW%`M5u;puFx!n4NKIuK86t@U^|vbEl` zE6oi?&h~T+rJWBm1#VbXfz#YytiU~8tHAwU3fwbZf!kKAz+p*q3LIkxDF~+fAQv;c zR^W#1u>#kh=Lq^lfphlW;bqN?IR);8Sb?*-hC#!c0{22Q{-(gSpz%n7ds+%yP0>_+ zi2^rN3LKVQloiIGi2_Gsil+%%WJqiAT9;SeT>RlEbo=_KrpN8;rW!f5Q}H|Y1A*bh z?%dz$r2FZyuavlb%loGlxqVHMGet`37X;bg=iu}?B|>WGbJF96mn}V?(0;KVlPz2N z!|mc4r=?*gj8!_)OesU)WHXPbLn8BDD0Ojhcca$1T12fQ`Ik$rYpKM9ttp8S)yh$$ z)>#ds(_#6JzRxqIhnsF^b3QLgx8s*YG-(7pk_+fth&qZoAYw{$$z4 z8vV63dcHNh(<^q{uC~J)t44=u5wPPRx5GRmo`%B=u2azj=mAKXl2f6b=b#Et6P~fwGPje zTBjb=!lv~)f)uT9^*)0ucGbSMWPR&kx*aCvCfSvnNY*-8cVCiG0OJuS1&z*b)_ta4 zy<3@dvUsHQJ33kEcj{zAHz8<$WBm@gS|oGyxXR~!bx%bKKLz-r#Wwe5hk;+5X8p!gX7S;M} z{imO}PnPAa%^YIPT*)eK5G*J8hy$Sba#pu&=Z^nIjF}gzTe%x0UqpRfJhI?5tx?1k-xUVTj*UH`dS$5zv zjF5X7?(2)uXXIXkdqpw2LGC`>pDjk8lY0a1mBr}ua&N-@g<^E0+?#Q)Dn?(FyC3(L ziqV(l-irICVsx|I+i>4fjBb^CJMPuR=r*}~KbMKVQjBhwdkOA4iqTi)UW)r`#pq7C zm*HMhjJ_`SD%^KreUp0)?zP3}n{sc!eK&fF+?#Rt6{By--H-d*IQ&ioda7uh)x?VL zBsC#>G;5!W(!-5MRbTfKiN}395hgrH^ES**TV+KXoY!}FMBgnkO{AKtaJz7Eq#fb~ zr)|F?6Me53Z8Tr%4&Mi=zP-$CIN!)>Q_GqO@tH7*zy7K?1gTTU`2L_8e{I^ATE}-& z)pujs7e2uE_G-!xrhVZIe1BMtyCv-lui*Qms_zqNU$_U~N2)15mG*_7@O`xE`)t}5 z4#W4y)s&Yc6rsHE9KH`$eV3+v;X-^Ls`@TV`@)y_K3w%(k@kgC@%>5FSBsaEdV+WH z-CXt6g6qT=ZpQbgRbS0eCBE=CzK>LWHN%$p!twY%TJ_zU_N5KryQS*8E$vII!1rfW z-|cB%+6lgoRegKYbf)Ft`}3;rs&ri162ARa-_>bfS{J^LSAEx{eQ9s_{-WyJm-eLv z;`__0?~*iDv`KuQsQNBVeD^nDX=}GD{m)ce=o@RSML~2r!c+%o&_w-w5aJX!XO75B z72U~1S0=VjO(rr;n>G5SGH1`Lv40)q*INBue2TtN>STq1vUbbHqqT0HJnk=0C%#z< z|1CLZ+ArBA=G~=E&I;8s03K{^wE+t2@T8;WqI)#mW>{#we`I;}m7;Hz7>#L8TYI|Q zrgNSBr|y(*kA`?=qQ>*_X^)TO=65sh{2 z&U}YCgwj_2$WsfTGl%91qM&HVY6!Za=)y3%2uxKXeRT&PA~VB9$=sfn$Y-M86tRVi z;?eJlc8;m4s*`gdish`E%+6vlh<;xTvlB@<8~wUSS=9e0FVQnF0EVM&Mdf8doWVXH zJ%xnM8QnNCQTX}Z^Wsfaj;QgtDdq8sRE%f^<9<4Xl&r7uzQeqq`ffGZ2Hw3Jcj^6X z%DV=sjVYvRJouf@;~-pNh`GYa@@v6EXzBx7ALM6Y&~K!)=t$LkoL7w#Q!Nc22(a3vjO z<>y147wMYbmx-R?48d8*I`XMi)jOcQU)cqQ$T?d>D$EBJZIXbT^$=*9%rty6g=eBa zN&obt1?|d;{wziEFZvp$Ye?6sIJ}Rvf(|18rIuEE11xgZH>eAEl~pWdmE2`AOWDu| z8DWFyC#C37EyeKjLWb0HZQ*<;>FG46?d(L6obFI{p>9FT6w9{NM6Kn%q6|+;lvNyJ z1=WZ807U=q)LG%oMSq}=B=8@_G`Z+cbbisZB@O?qf1%c-TNB_Z7lR?Q-nJ-sHu_G{ zjik1f!ovvYD#7@()8*uth2>qURE!^P%bf}=oL$2}r=%UAb9|JRF*K;$gud~sV)Wr~ zq?~lG*@dkon z6Blzc9h7xFsMWoVO(UvTSzG2*rrL~#si0zO-JtpsJJKjU9Jg`o$J)XJjQSEwYajvA zgEoaL=ATQHw=#&wy@$Hm%4H{l$j$(zAi7jIu^8la87OqN>WbOyTv!OAW!M^m@MNNx zF^*P+F^;;<6I)Afs|nbfOGAf6F!S^VQp@S`9H&#+zJFR=HasrKk(}}`bHWUSi4)2g zCVESdk(D!R=%A_TSPE;nOz0RsmOw@+#Ywor)FnX{E+z&IpBmdcRRoX!l@d`%YT~(- zffW5}EBd6`qWfZZa>k2MP7#%vj|IRuzvnQD;;vQsXh8x}Q zl%s%d11>ede6{e>j&`dML|}p*m;DeB67*)K9OzC12#={PIO`9TcPHyQS?;NDn%j1( z?TMH!EGOAZo|s+5>3KS=L{fuh%F$qzXYci$YZe5p6Ab9VUrb(#xCePPuHCV2Ltsv5skx=GW5hz;@{!AVd^ca^40f-(60_k! z0cvVBor+QSBXMWMnoFj_#ZVY9c~o*?gHMPn7Yc8zhZ*-roaJO@`n*H%$j%af=+Hy{ zpuQ{>$59-A3y)9ZRbnqc@QBNt*!~XQu@+3=|wy*zt{;cF~-nM-9wHU2mN=Ee{F^TB1s@F$b+4TyfTfovrF$SUjgm*r41x zvs3hs1)RwnM{{WaK2Ycb8KSI$j|;49=+!w5Tt^%iC~pPQrgPF&%@vLm)9jf1Z50E? zcFTMgUA)SQr{Qh8-?FeG25FZww=Fm`aZ$&Wf~_W`poRF;D`1=!02UCRG}{YmfDMUM)h>Z$G>|{;%{kg<8u}hYN zXpZF|%!^^U?8NwA!fwWErWLvhy(^?Pq?=n^d4^^O7t~juo^f|_!5lE1@oS3hz7cjd z(UZ653PBdO@(iXUSURw8*}gbwWXSCO2AA>?VMtu5uG;Ejo2eg21%~w*yOZA)83-Z-*=mS2M`vGU#=j#G?sF z_zHPgZi4fP&aDkzvNi36>{!vDeET&d9yFyu7sh?sza~tP+|0>ZYxT)mGn<2%)tgc} z^&uRgyN<#~_l2O!8gP!ARs}QhNZ%rtXZ@ydc{Ayffa#3re0WO0Fm0Qa=7qEno8)Fy zI5|PxRKhEjXLNcZU+egR7X{(O%Lf51ap?5zRNzYUIhD`_K z!8Ir{$aE{D_s_9N@9fT?QtW{U#U2aTO-=7?;Y`S0t?3e7#ksJyn84Rv6_Y@O(ZI5j zJ%+|KL`e@4u%Oh2D4<2C516nFC??dAF2i#1zT6ZjT&+R~j&@j6 zg)a}m)u-8zGV2zvkUyL_1j!{47QU!Pw_&%9?&&6kQhlSNba^+}F^t5yc3Mdb{Thu; zdMnOMy})r)ga|mC>ebu>Z~EqB5>2n*y=!vo$QEtyFXf$!?}7Y zBNp07s7x+yJdd<%QFXLbzKyx5N$s`rbH7gxc|fZ|8h}t|D{VKD?2?=-B5} zax~z+ouJseI@hg=M@{zPAt;kv%h}~3Eq9GPeN#d6gYIx$Rff12ZUhC>O|cusT`Q_& z!@AL-t@H>qj5K9D?yJ5Zh8yykCM=PDFDpg12B1*}C*N4xkQ+N;+#vjG+$b2GR_HXx z25K6U52T;Qe&oA-jwVxEU;&Ud2{i%wwYU3?1o?Cm@aL9E|25vHFTxe`ev|P&;z+!2 z1U25*rfB#+AM?G^)`%8%*GYz+JMy$-^(8b)D;**jY*}8Y)Tr8gMa+(Rg-h(No;qgt zocOztuuGGvv=uRE-lYeFpe&Y~K~Un8Bz66hWq_if3{2M%DkNXSrdq1)*>s9)SK3jh zR_)tWwV<@CDiRv0#r&&v-U#wi4~Y+hL3_6aa2dS-fNW{&@0kXcgw@*&g9CzeaT%<5Clw0Si%Q|McuA7TL=$ccO!J))}8JD=KHEgjdhUR9G4O0G{ZO^O%V zykF(DJ59=+Z=a}Ld#*{vdA7{z2;e`k*(n`|oN46sslGg&yLvD9z$va(EhkqQHn?_! zY~78rw#Uj`qFZ3{kX{WsPOoTraeBp%cgu@Unf$EdM%v5EqgTXQMN3MnKw?RpvcWSz zYowd=*HSR}z#gl5Rwrbdtg$J5g8Iy$a@>?Q`b->Coj7!QIx3!|YHhzwe?%1Z)^JU% zRgf;5+^`f_BJ+|&OpPFsYzJ~gBCnXRzf&V}CRa107t2*sBiw5u?y49dUFZgV7oD%< zI&`wGlS#fGmP`sI+ca`I+pm-MK|%o;%Aurrai8ndJ@?i0>DAs%>K3DCabBX& z#;JI=%2zz^)%54q>#9F*N&0iAzV5z1hi}r|xpm?gRmC^H6SuQPls&1}@J(wi-j$Eqcz>eG$XY0rZblp{LAWKtmv{UyjjoWwMi5ft+?`y^!E1lH63L$P`&pj z%R8_d`_QjcuTz(f&N#1`U)mDSFIniibOwZeEDqg5+GB!3s3*1-dyWa*K_OUSLiKoM zGh1oZvws6Ky=l_7vL@6TWSb4Hth%2I8(6^ky2SRQ^&jXPvTJAEl}E^!O!QktgCpjz&Q#VFqNi9huomZcopS?DZrak<2XU@;&VHPqan7f3 z{?IwMsj&R-f_B!&fUt^_5Nk<7ti{W;uINvmSbV3v{ntP&Jmd&}Qzh1tUN`)z^!Ne5~U*z8ew$QcpxYxB_T-rgE9% zm*qG==A5f=ZgD(t2hJZkXCF?k#1bEF#CgACoy|C}abKUnd5`0wZ8(4LoI7y-%sH1_ zm#O^9IWNb#-8om_yx(PU6V69mx@&M=>b|bW`6Cy06HbrA7M!g77dl&UvdTryXL0_* zIeV|qRIYH&i*erPQdov_v2(7(xyf>Kl>|kqm1O)4d20B3SyDBZTh%=8tA_7XP2crY z4IXlYKd)9z{|Z$NAM5y=?^ZR>)mIH3Xk=iw-Sg8%+{=FF_;NGuwch;%?gzbl8}6sP zdk5|v-o4~A@XAvz?&Y{wdiM(4ecpW&?ycUv2KSPuUHJ95Z}RRby%qO1 z?|v3{@9$mQ-W64RF2=poe_w`sg?F#Sz1q81kBwYWEV_Xgbk-u)o%ZO-kg3`$k2 z%-R)XtEsXTNtG?PD*L;yGQLw~+g4Czc*qgHD``wiZcvT!t*$Zg-D+%meU0J48NOh* zyku;+1LxJ|^zHwK6rRRf1g^nzRf6YA!?U*pdh|1VSF67PJn@hte0PH9D#Md+b)3a_ z!}G88c;Z2$zkynM#?{ht+!s5y!;}zp6eV~KrfZgoI5&X|N0rf&SDvrWg%F_vu;@$= ztw~H4z-_SDYl;1!>#8e%tB+2QutEq$=b=4diE!L((KizPV%y5ZK?snirYBWw0w^|* zn#{La>@CFJ?lb>;eRP6^6+$RFkDAQ4TlA-h{s&VzDlgQ>CPY{vfMWBg$$ZJxqT3E) zFW+EV4-2pAa3@Hp5Q@&DCi7(${bD-!tBXeVUNJ_xPnzGJy|HFXI&5^U zmNWYmP}rOT5aIorl2VJqT;DLvbr!~g-%u0$)2ZO*{kcKC_Z;8<`jB?o9NKk|Y)x#q z#Zc-r+Hp3z&D3sOn7}LfXuc`s(N{~h$1!?TbD~(Ib}~=q784nD?ax7$MD*V1+sXQA zRmD2dEj8(zK`YNt8TXc=`5_aZ8*C7VGF7no@LiDDMrddbYfn zw7uWmV5!gF+0D+Ac&#ycvo*z5Hfq^1=#Z1f@H|*%s)evx%j!tL;9l#dL`Bh%KV1EV zw<|mh3+oeC8|gC9dnu_~yzLooy_MaDDy$Y**kF-{=W+5=?^?RcgrL8%#Y z8dawyYcn)7Wd#cCZ**Q`YtAuI+uQd_odF2C>zy!AvhLRwE$jNp(WDUpOJqhP)CiMxC4VlB1RuA) zH2RBJ?i(ddAYkos%|%O+SmUdOMl_OmH`;UD)9jj;LM4m7rY2ds!iyD1a(k)MmBwab zu>w-}uEv$4<6dn+%h(H}YG)oc^G7E7D|B^42;WCDqKLLTA=x%SVxXdBbkXw^j>`X= z%EB~`wT7W&|5s*MVe*vT9xg&=iOt7BB?__B3Q zV(#SXUg4jeNIW~Dhw@YEO>AIqaAEmJbi0XFJ0$QgWKCRs7jNMwuM^5Wb8me=@(*l(4r;f zR*)QElEBvTq{M;is*oy%DSHg67ao5izWUqh))Wd*k1lSDKIsv=#6LgP#?|B6QDa4e zM|m>F&MeeoK0ab8hPZsNDOOvE8rTYXE!ZjBRWWe^y*hKLrJQjyZC+4E*BWj<#C2Z9 zVK{nyTV=kx^skcX$dD5TeVxIE5a1$@wobWNwx&mR@_`+62+4uHH?{Sm-{={fd- zQL?vpQ8xtB>0`bljg}h*CJiK_G-*y9nn?ewr^V-et>k8M#~JNj=z!s1eL~U=SRyO! zhV`^0^rgKbxkc*BZP87_LhUijtv}J?Cg}bz$^gPYzEkaOZzYs6@3gmE2` z3G!>OgC+G6-InH*JKCg*aHc?O^i_Sw;Uzkfe_mR`T5)QwNRud`I~;<%;9$6Ha3{2W(eyTw^%e`_2qss<8kN5 zl3`nO^yTK%%T3MUKW8)NXZ|x`5S1SWA>hrNJ9lUOBdOQFuUA9k3IaURsU`0>qW+ zihsd7dX5WABtkk|8KUjE_%vq3seSZEBU;=0bl&mbZnHr)#@T$B)fCYMnqZ(c$Ju-& zzpHG%FhD|hvOQKMjp6f)fwI6TDb;OkK(Ef9$qr?GlH`_Pc4u2hTie3dB=qv54|N`H zsL>kTlLg&ms9_oYc2`lbAMR{PM=@M-ffroA%{l@0yKFcIYs=@EIcP(V${{uwwK#Iuir|ecL8m zt?uwdB!&<;i2f?MQd#_`ByH2&qUXK1sbs=)D2S+MQ!&mliv+Vh>NM@vyPzWn?M<;X z4U5U%>gGFw(wk=60w(9wfuq@}qWou)>CB-jmUHUir8*EY6fLB8k(*r;mt>#-KJ_?R z3v5f4T~L+QohB57cV&|viB-zNJ^HndbYfll0_3yx`rI4oCgquB%$$R2;It=ps$KqZ*_>ts^@5laH>- z**y<-KbC!`cV+=({GIjktm>ZCX?M`Y{u~bFVzaDzX1O&E3zkfaRYIo8T>eG);sNVO zveA>0sA2S5J?zpRYrgR`385b%oc2%cagKgd8Q|trnaP(U5sH&3b7Eu0t zF7MJ0cVv=1CLGrpQy0R)9tmk%vlH=QYf_c8EZFd*6$Xy9OvvgO%K@b2M0B*mG-(Ti zkhZmkv@r>Fv6>@2C5418l#wtuC<%4uSPcmaB4LYl$q9W9P>J2hjSQ}X`=c#7!zu_b ztT4XClrvPz8sOX7GV9G&O{G^&PHqs79bf2wxD$J^}$yH;P>XWhr zABoZ7BpQV29Av?e((4>4T}PFvJ>1G1l;iB3Dk9=M^(J!PqK1`&BxZoSNPH!6d0+is&?G$K=MCU zAS`izl``H`VmBQNAH%7t*nTeGkpZb2-~dTZxBnwfkQgRrJT4a&V~NuwoQObi5DcAA((`jxJl?MURC={jnX^tu zzF@$x!x;~_Q#h_=($cb9iB+&mT+>tOlWZl{S$VHm()!NI2T`Z)P8YO< zcw^}?5nJOFeZR#RE+BKTQNQJG0?E1&U+6}B)qd-CPM(#PV?w}E)6P(h>{4BqMs^({ za`mz!60f^#B>ZSLkxy~g1-a8*7qotnT~|!&YS$Ihx-bZ>TWe??6V!KIF+tUTc@pYV zOwin*1XV9qL(qZ&ySZ^r9<3@UBRd{7Fe)O+=s=3c;AOndbMS% zQs0L$h|jw!ZE{tb)gT_`q8w@iFcM9Qie-N*Oer=QWXN9AjX4ZtKTuzl#hT!T*bYx6 z3@)x4qXK+41}-^=OFoTD&f_8p1UiY0;6n+URJ*aSwbDa)1?T=2BJ!%-KIPzsHjPOhV>hrvtHG@?f22Az&mX##3TB{^j6XPnau4`JcUq2k_oq$tXKMQp}tSc(5Gp6CU>E5@Pmyd>-)4z<36po;QBO`j>@$@E#^XQ zSkpJ_(-2&7pC<0MZq1pbvToGo%yZIy5oTG}t+fUfu2<5WkQ+~Gbjc8jk!NKy!_npK zjK(XvalP^|iw~k}+x>*ted@D90`lKv>k55H=6DBr8z+&;(97(v8sFz9+u=);idi1F z{Vck%9cH|-J^FLgBpd7!DqNj$Cb2$_bES=lcBCX?1ko4Ti7K;>Ta+h9W$iZR+JPYY zA`7e3Q_F&~dob9jsq%Sktnw$%xOir^gDf!jZiSLnkJ@$*cllbiyumxzEs| zJ`f1hK@&THT3;MC6>`MTc9%3E$8c_gc5>l7$i*G4xXyV<)j2Ln5tMumLTGe$9J($K z!fO8-E)p=+4d)2cy*#Zl;rpFl13yHad1AxjM{-3H)o^5X1P?3tzb8|Qz+79DL4ZL7V&e-p@NKngK}0}A56Bl zBQ-LCdB93n#e`w_nG89IrmrU%HC1&Hcb3I*V!g6MVoZhM3RUJR z0FEdby>oCwGvK$NL3Snzw0DH|`G(8{-ZE4|wn77mZb$A}MJUCw!RujC=bC`4l3^h{ z#TcO?LRwN~W1D?tbphM<&$fLb@+j+C3i~L|gQPlb#xFEyojbct@FzN+EbhsPA2XT= z9)p6*8U-3XI7uWK*=e=3q0znuti@H^o;A6c{g_oz=|R(4Nj|!xUFx{lPsiSf{lH7? z*JLz?NVF+o9#m5gA(2r*o1obg05-Cz{p)RlYi5kQ zTr=ZDA0$V!MP&OkaR~^SJHze{nT0v`Kuu8B@u&%+C#wmzq?!SNLM>0SUeSvfdbvcb zAVP|D(6gEQJA ze6Y@lIXEM=-BnyLG_r+pNj0+iVc!8?_OXQs)iChr(1YyU$@Dk2(G49Dgok7@|EW4C zXKya&Za%Jj(PH@f0d${o({be`H%9afH-=ok;ZeA`oOgjZ$|d?id&-9f-gI-h*?gl- z?V-x*(N6i4TW&5FT$mrWhofr35E*Ynp>T7#)rI;|yRE7yXKpNKgpe2*6*JuOOmA<% zWj>u7oILLwWfb&u&6z)S-ol>O_AKfN7S3I;aQ^&x-924rmS@kKK5cea z`K)=}^&S{^l@ z_$p-ZHef-|na3X6wP-pC&6qb=g%0LU!%MJmb})Ok@}Ds~fDB4%`Uiz#0F{GLuN`+H ze}QSURUi<2<7sa?_E`VcHG08}|LB_9Q=WTh`PFk@T~;1lXD%qunYL)goP~4BRca_) z(9^xJOO+CwHEs5SE}_;HP&X=9aPApF_Zh0tVA>hMxrgxvOw;q+X~C#zeM)`Bb{@~druxe z?zkDJ!X_urJF{!bj7i6jpYpaDlO|0%Vg6}TC%tR-J7=7F)YM5+Pd;_(F$vYDoO<-s zNs}g@fsZ^VO&TNvamAF$XOP6<7AojH8azR870;C*J4VRz)3e004QSs5>;bY9K-Th^ z?bGgu5c`nkzQBIK{=f*}0AM6=AaD@yPrxgHR{~|A1JLgvh}g;VVBip76!0qG)xc=r zP~bJdVF2qe==uWcGYDP>s2=n?jWovb91m<~;fg@t4(I&{U^D^W2*lx+<2QltuTO>7 zwBNrPj69i%PLw_|yK1F(d!%TwXUz!Y!f`#-0`>)V@ne>1R# zup0sWA}VGg&kArHa6E7VFbS9p#PoX$Zqe_pKpB_<=yy8we;d!Y1D+3$fiY%GpNim^ zG9AVmKYscLr*%*5>7F*DhcEDx(iV@5A?`#m2EP@!Pvm(LFfg5S2c&auDxDsmPTUS& z?+{qf)7>>~&KV2O+65ZMOE(dJ(71zVZE?4z;vV4(?lK-c*E|(@2=%951`rK%&+gnA z<4~8*pcp8f*{O6y!v^Wh+Y@~5NTo9fK5;s`#Ain;ofw}FT1kW8L3r?F-0uLE!NUT5 zJB9au0Zzfa1XvE73B>Wz{2#|l^M6dY36B2r&e~0ZO+Jyn(um`Fnx8decGoUBMsfRz zE4ibe`1hSWPX&BhN5@^J_*^n^3}Fg1))m0fYOwrn;+y2w>A-t{!Q|F^@%uO6eLxxL z0Aiex_jI>2<{HAZD&clH>BhK42wcgwe+T{#Fqmwcir@QzX+SL78s$NovplwwhvcSy zi^xOeI0Kjtq|0$8@3H(y%ik`(p9REujJI;2*u(|FPi1)@X~$*h_htD2e&UOCS!VEl zDDWEKFklQY7MKal0vhI{!thf*>q$E<&kuX958i#5xRz~6T6yzHKxJ9)JqpZ4yD#Wk02YHlgC z`gmO9)Yd*E8aizFKKt&s|A+%d9(d3{z2cSSj?RN!fZh4;UG^_~Xv&js$u&25dSrv3 z4^sBgxApO@4>h5$1tT0;}!Qw?>KqVX_a@r$J~=n zJ+<X6O?J&5Gk=T1fu~ zg1H|lx5*zWW`kCJZk6_z_{ZUrCnQgPRB;g4AC3yvkH2Yu`*eeL^PpkXPU;e{U!N`&N+xS=GZ^UaHF8M0fh<_57CNqOp_nE(G|2Uj` zO2LhPFu&7!gI4#Mzx=NbKPtx^f5N26n~aEYq<=gykk&%|E8#8CESa3vh1E+m(uK=>mrmaa91I)+i~?Q-pl zwzPIqkyAi>-UGZB_%}e~n0P!Ak30Um^8df&{UPB00sje{ z5B%fzzncQvG%)?g?;jLMQQ&`je=rSNoB>P+Wc%m>&H_FF$o4V=m=tZX= zHg^6gGp5Wv*_1O>H1Tf9YG&*W^Aa z<(7U`2K3$X_ipKE>F~TJKZULLkHacG{Z2s9ynyFNfW`X2ZzbO@*dUpTXm$L z!t9Q23ZwMPfZURqv0G`z?p>u5hY?Tcr*!tF{uO8AAwlp3o;L!E0dMa<(k%;k{aMqd zclAu-yKLQe5H{ke--%?Vc&h-#`y%iq;LE^Gz|Fudz^%Y);5OhZ!0o^tfY0ak(|gXF z-!(-B_1Mxr&OX_?0W#Jc$ZN?<^Hm4&)GrGNZ#_@oo1Xgh;}%X|1%%VrfIERTz}JDh zfNub60iWAZ)0x_yeooJn>C?wEl`!WF)IQXqxT;XX)=k;Cb3kJIu7IBibhblR&N zPTwR?;dD1}56}mE3-~s$4p}1MnT- zyTJE=jlh6BXEe@pua@GkUz(mVU->+bp1W|)e66*xObKgqKeg#r!=&biw)!wi z|4iK9=lKAjdiepc3HTwP-(viK#Pi2;0}lcZ0S^QEl@E2i^b_3j-wgZ|cm#M9*aG|v zcntVC&<{Kg`~rw+M>(c`po?N?R{WS5$vpSe89iOyS~oM;)N{2(95Z!ll1laK_zB79 zxTUD={(7{d@g|=7W%P$~=%+S)vHzZ?eZl)H%(K4Czr?LFKLPv-_%-kwU@Pz>@LS+_ zz*E4}!0&H!!i#tEnO{Ls?4r(h5LGsXMLG^{r7a4w)k(L6>NEptH)<>t4!N~ zKLCFO{scS={2BNQ@EnjX2Me=&-OYOmb!VwmOBdH2pVM{sS@5(v;;Em?xz@Y&{jJ`e zF6VmxP2pD_=E}Jpx61if;CbM0zz*Q=zze`mK#A9v)74j_a_(t;shrjN>H#00RZTg@ z`S0m+TdK|%1zZ?+vtMmCL zdMuY;0pPcEEcQz99|njH!+Gul><^3p4gf?4g&&FgK;R(YpMX~YuLR1#06M&c z20BP#t@0&@y1+$cE%Vf`QCXMB&zE(=Yq70@V<(`p9$b&_OKgZ*aA%c6I_ignF;fj98cwWT0}jF_A6b^*Ao}_@wLZi4=}Y4|jBYm&fs6dA@r9jxSZP zXc%L3w1i?h&LwZraWqf;(l{>h-}HUL5e~=GJ&y0;`QC;&z8C=$b7BpS2_1)#w{YCp z0LL--#lM?8j{oLyd>_w$2mVhL&!gvbEm%NrXNyLY25?0DwN}P_%;($V^GMTXCExU} zUw(q4%~YT7`*}_S&S;dcQ#-6YPwgVzQ%P5Lhq=I+z%<}IK);iKc|aq-)A+78kjm#~J>6qcEa<9B(>q<*#1_m=7pD(PK8CUmQNp zLpa1`R$ltW-xMbfr}Px=1O6%ci|8)8Fo-U`})8*28 zx(s?(dcsM+Q-Ij5cj>je($N)0`rxkgSA~&1Y`IR^A^rE z70>#!XOAL`l)veV7EL>2#yR81v)y9B2WQNgDnr;*HnYr|q;zFp7y)cQrat^p#GO5D z!GhWd3jbE%jevf$d3J%*S-=N?4+1lQnZPVyHlW`&A8ros>2Py-p9jnbYVeh!y~I}zN4!`VPO?QY%|06jo$+Vl(O%xRdo%6ACq#c6*C_d?>I1Dp$-+H*{G z=MZ^IpPo$^{Z{eJ@?1o?^DON6@w4ZBfPDsC-Q8?uQrgQ1qcru~;=}((HT>bTyXJnN z=Yu{1VH9Tr;gmLcCzYr8%6qHQs`Ne^gd21H?-ciG4P*5;tm;f$L%nMV&k=9pPd@P) z;Lw`U0U!7BgVvSn*W@1dSF*U#FXH37fYHbCCxsUzs`&}8V$GMmf6-cZ{nB_fqL;!5 aFVSn9gnH_y`cD6ZmwxGQd+XNv`~MGnGQ<7= literal 0 HcmV?d00001 diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.html b/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.html new file mode 100644 index 0000000..3c8b2a2 --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.html @@ -0,0 +1,1296 @@ + + + + + + Emscripten-Generated Code + + + + + image/svg+xml + + +

    +
    Downloading...
    + + + Resize canvas + Lock/hide mouse pointer     + + + + +
    + +
    + + +
    + +
    + + + + + + + + diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.js b/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.js new file mode 100644 index 0000000..d4715eb --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.js @@ -0,0 +1,5442 @@ + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// See https://caniuse.com/mdn-javascript_builtins_object_assign + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +// Normally we don't log exceptions but instead let them bubble out the top +// level where the embedding environment (e.g. the browser) can handle +// them. +// However under v8 and node we sometimes exit the process direcly in which case +// its up to use us to log the exception before exiting. +// If we fix https://github.com/emscripten-core/emscripten/issues/15080 +// this may no longer be needed under node. +function logExceptionOnExit(e) { + if (e instanceof ExitStatus) return; + let toLog = e; + if (e && typeof e == 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exiting due to exception: ' + toLog); +} + +var fs; +var nodePath; +var requireNodeFS; + +if (ENVIRONMENT_IS_NODE) { + if (!(typeof process == 'object' && typeof require == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +requireNodeFS = () => { + // Use nodePath as the indicator for these not being initialized, + // since in some environments a global fs may have already been + // created. + if (!nodePath) { + fs = require('fs'); + nodePath = require('path'); + } +}; + +read_ = function shell_read(filename, binary) { + requireNodeFS(); + filename = nodePath['normalize'](filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror) => { + requireNodeFS(); + filename = nodePath['normalize'](filename); + fs.readFile(filename, function(err, data) { + if (err) onerror(err); + else onload(data.buffer); + }); +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + // Without this older versions of node (< v15) will log unhandled rejections + // but return 0, which is not normally the desired behaviour. This is + // not be needed with node v15 and about because it is now the default + // behaviour: + // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode + process['on']('unhandledRejection', function(reason) { throw reason; }); + + quit_ = (status, toThrow) => { + if (keepRuntimeAlive()) { + process['exitCode'] = status; + throw toThrow; + } + logExceptionOnExit(toThrow); + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + let data; + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = function readAsync(f, onload, onerror) { + setTimeout(() => onload(readBinary(f)), 0); + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason we must call `quit` - the only way to + // set the exit code - but quit also halts immediately, so we need to be + // careful of whether the runtime is alive or not, which is why this code + // path looks different than node. It also has the downside that it will + // halt the entire program when no code remains to run, which means this + // is not friendly for bundling this code into a larger codebase, and for + // that reason the "shell" environment is mainly useful for testing whole + // programs by themselves, basically. + if (runtimeKeepaliveCounter) { + throw toThrow; + } + logExceptionOnExit(toThrow); + quit(status); + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js + + + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); + + + + +var STACK_ALIGN = 16; +var POINTER_SIZE = 4; + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length - 1] === '*') { + return POINTER_SIZE; + } else if (type[0] === 'i') { + const bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function == "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +function updateTableMap(offset, count) { + for (var i = offset; i < offset + count; i++) { + var item = getWasmTableEntry(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } +} + +/** + * Add a function to the table. + * 'sig' parameter is required if the function being added is a JS function. + * @param {string=} sig + */ +function addFunction(func, sig) { + assert(typeof func != 'undefined'); + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + updateTableMap(0, wasmTable.length); + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + setWasmTableEntry(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig != 'undefined', 'Missing signature argument to addFunction: ' + func); + var wrapped = convertJsFunctionToWasm(func, sig); + setWasmTableEntry(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(getWasmTableEntry(index)); + freeTableIndexes.push(index); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +function legacyModuleProp(prop, newName) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get: function() { + abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); + } +} + +function unexportedMessage(sym, isFSSybol) { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; + if (isFSSybol) { + msg += '. Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you'; + } + return msg; +} + +function unexportedRuntimeSymbol(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get: function() { + abort(unexportedMessage(sym, isFSSybol)); + } + }); + } +} + +function unexportedRuntimeFunction(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Module[sym] = () => abort(unexportedMessage(sym, isFSSybol)); + } +} + +// end include: runtime_debug.js +var tempRet0 = 0; +var setTempRet0 = (value) => { tempRet0 = value; }; +var getTempRet0 = () => tempRet0; + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + 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 Number(HEAPF64[((ptr)>>3)]); + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. +function _free() { + // Show a helpful error since we used to include free by default in the past. + abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); +} + +// include: runtime_legacy.js + + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +/** + * allocate(): This function is no longer used by emscripten but is kept around to avoid + * breaking external users. + * You should normally not use allocate(), and instead allocate + * memory using _malloc()/stackAlloc(), initialize it with + * setValue(), and so forth. + * @param {(Uint8Array|Array)} slab: An array of data. + * @param {number=} allocator : How to allocate memory, see ALLOC_* + */ +function allocate(slab, allocator) { + var ret; + assert(typeof allocator == 'number', 'allocate no longer takes a type argument') + assert(typeof slab != 'number', 'allocate no longer takes a number as arg0') + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (!slab.subarray && !slab.slice) { + slab = new Uint8Array(slab); + } + HEAPU8.set(slab, ret); + return ret; +} + +// end include: runtime_legacy.js +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + ; + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition + // will always evaluate to true. The loop is then terminated on the first null char. + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) break; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; +} + +// end include: runtime_strings_extra.js +// Memory management + +var HEAP, +/** @type {!ArrayBuffer} */ + buffer, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY'); + +assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it. +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); +assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // The stack grows downwards + HEAP32[((max + 4)>>2)] = 0x2135467; + HEAP32[((max + 8)>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + var cookie1 = HEAPU32[((max + 4)>>2)]; + var cookie2 = HEAPU32[((max + 8)>>2)]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + + +if (!Module["noFSInit"] && !FS.init.initialized) + FS.init(); +FS.ignorePermissions = false; + +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// 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 +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + { + if (Module['onAbort']) { + Module['onAbort'](what); + } + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// include: URIUtils.js + + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} + +// end include: URIUtils.js +/** @param {boolean=} fixedasm */ +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +var wasmBinaryFile; + wasmBinaryFile = '第七章作业2.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, try to to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(wasmBinaryFile); + }); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateGlobalBufferAndViews(wasmMemory.buffer); + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(function (instance) { + return instance; + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); + } + abort(reason); + }); + } + + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch == 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, info); + + return result.then( + receiveInstantiationResult, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiationResult); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiationResult); + } + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func == 'number') { + if (callback.arg === undefined) { + getWasmTableEntry(func)(); + } else { + getWasmTableEntry(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + + function withStackSave(f) { + var stack = stackSave(); + var ret = f(); + stackRestore(stack); + return ret; + } + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + var wasmTableMirror = []; + function getWasmTableEntry(funcPtr) { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); + return func; + } + + function handleException(e) { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + quit_(1, e); + } + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + + function setWasmTableEntry(idx, func) { + wasmTable.set(idx, func); + wasmTableMirror[idx] = func; + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + function ___assert_fail(condition, filename, line, func) { + abort('Assertion failed: ' + UTF8ToString(condition) + ', at: ' + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + } + + function ___cxa_allocate_exception(size) { + // Thrown object is prepended by exception metadata block + return _malloc(size + 16) + 16; + } + + /** @constructor */ + function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 16; + + this.set_type = function(type) { + HEAP32[(((this.ptr)+(4))>>2)] = type; + }; + + this.get_type = function() { + return HEAP32[(((this.ptr)+(4))>>2)]; + }; + + this.set_destructor = function(destructor) { + HEAP32[(((this.ptr)+(8))>>2)] = destructor; + }; + + this.get_destructor = function() { + return HEAP32[(((this.ptr)+(8))>>2)]; + }; + + this.set_refcount = function(refcount) { + HEAP32[((this.ptr)>>2)] = refcount; + }; + + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + HEAP8[(((this.ptr)+(12))>>0)] = caught; + }; + + this.get_caught = function () { + return HEAP8[(((this.ptr)+(12))>>0)] != 0; + }; + + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(((this.ptr)+(13))>>0)] = rethrown; + }; + + this.get_rethrown = function () { + return HEAP8[(((this.ptr)+(13))>>0)] != 0; + }; + + // Initialize native structure fields. Should be called once after allocated. + this.init = function(type, destructor) { + this.set_type(type); + this.set_destructor(destructor); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + } + + this.add_ref = function() { + var value = HEAP32[((this.ptr)>>2)]; + HEAP32[((this.ptr)>>2)] = value + 1; + }; + + // Returns true if last reference released. + this.release_ref = function() { + var prev = HEAP32[((this.ptr)>>2)]; + HEAP32[((this.ptr)>>2)] = prev - 1; + assert(prev > 0); + return prev === 1; + }; + } + + var exceptionLast = 0; + + var uncaughtExceptionCount = 0; + function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s NO_DISABLE_EXCEPTION_CATCHING or -s EXCEPTION_CATCHING_ALLOWED=[..] to catch."; + } + + function _abort() { + abort('native code called abort()'); + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + function _emscripten_get_heap_max() { + return HEAPU8.length; + } + + function abortOnCannotGrowMemory(requestedSize) { + abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + abortOnCannotGrowMemory(requestedSize); + } + + var ENV = {}; + + function getExecutableName() { + return thisProgram || './this.program'; + } + function getEnvStrings() { + if (!getEnvStrings.strings) { + // Default values. + // Browser language detection #8751 + var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; + var env = { + 'USER': 'web_user', + 'LOGNAME': 'web_user', + 'PATH': '/', + 'PWD': '/', + 'HOME': '/home/web_user', + 'LANG': lang, + '_': getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + // x is a key in ENV; if ENV[x] is undefined, that means it was + // explicitly set to be so. We allow user code to do that to + // force variables with default values to remain unset. + if (ENV[x] === undefined) delete env[x]; + else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(x + '=' + env[x]); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + } + + var PATH = {splitPath:function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function(path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function(path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function(path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function(path) { + return PATH.splitPath(path)[3]; + },join:function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function(l, r) { + return PATH.normalize(l + '/' + r); + }}; + + function getRandomDevice() { + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + return function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + return function() { abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; + } + + var PATH_FS = {resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function(from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY = {ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function(stream) { + stream.tty.ops.flush(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + function zeroMemory(address, size) { + HEAPU8.fill(0, address, address + size); + } + + function alignMemory(size, alignment) { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + } + function mmapAlloc(size) { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + } + var MEMFS = {ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, address, length, position, prot, flags) { + if (address !== 0) { + // We don't currently support location hints for the address of the mapping + throw new FS.ErrnoError(28); + } + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + /** @param {boolean=} noRunDep */ + function asyncLoad(url, onload, onerror, noRunDep) { + var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; + readAsync(url, function(arrayBuffer) { + assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, function(event) { + if (onerror) { + onerror(); + } else { + throw 'Loading data file "' + url + '" failed.'; + } + }); + if (dep) addRunDependency(dep); + } + + var ERRNO_MESSAGES = {0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; + + var ERRNO_CODES = {}; + var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path, opts = {}) => { + path = PATH_FS.resolve(FS.cwd(), path); + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter((p) => !!p), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:(node) => { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:(parentid, name) => { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:(parent, name) => { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:(parent, name, mode, rdev) => { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:(node) => { + FS.hashRemoveNode(node); + },isRoot:(node) => { + return node === node.parent; + },isMountpoint:(node) => { + return !!node.mounted; + },isFile:(mode) => { + return (mode & 61440) === 32768; + },isDir:(mode) => { + return (mode & 61440) === 16384; + },isLink:(mode) => { + return (mode & 61440) === 40960; + },isChrdev:(mode) => { + return (mode & 61440) === 8192; + },isBlkdev:(mode) => { + return (mode & 61440) === 24576; + },isFIFO:(mode) => { + return (mode & 61440) === 4096; + },isSocket:(mode) => { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:(str) => { + var flags = FS.flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:(flag) => { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:(node, perms) => { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:(dir) => { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:(dir, name) => { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:(dir, name, isdir) => { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:(node, flags) => { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:(fd_start = 0, fd_end = FS.MAX_OPEN_FDS) => { + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:(fd) => FS.streams[fd],createStream:(stream, fd_start, fd_end) => { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function(){}; + FS.FSStream.prototype = { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }; + } + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:(fd) => { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:(stream) => { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:() => { + throw new FS.ErrnoError(70); + }},major:(dev) => ((dev) >> 8),minor:(dev) => ((dev) & 0xff),makedev:(ma, mi) => ((ma) << 8 | (mi)),registerDevice:(dev, ops) => { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:(dev) => FS.devices[dev],getMounts:(mount) => { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:(populate, callback) => { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:(type, opts, mountpoint) => { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:(mountpoint) => { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:(parent, name) => { + return parent.node_ops.lookup(parent, name); + },mknod:(path, mode, dev) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:(path, mode) => { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:(path, mode) => { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:(path, mode) => { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:(path, mode, dev) => { + if (typeof dev == 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:(oldpath, newpath) => { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:(old_path, new_path) => { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existant directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + },rmdir:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + },readdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + },readlink:(path) => { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:(path, dontFollow) => { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:(path) => { + return FS.stat(path, true); + },chmod:(path, mode, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:(path, mode) => { + FS.chmod(path, mode, true); + },fchmod:(fd, mode) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:(path, uid, gid, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:(path, uid, gid) => { + FS.chown(path, uid, gid, true); + },fchown:(fd, uid, gid) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:(path, len) => { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:(fd, len) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:(path, atime, mtime) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:(path, flags, mode, fd_start, fd_end) => { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + },close:(stream) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:(stream) => { + return stream.fd === null; + },llseek:(stream, offset, whence) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:(stream, buffer, offset, length, position) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:(stream, buffer, offset, length, position, canOwn) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + },allocate:(stream, offset, length) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:(stream, address, length, position, prot, flags) => { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, address, length, position, prot, flags); + },msync:(stream, buffer, offset, length, mmapFlags) => { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:(stream) => 0,ioctl:(stream, cmd, arg) => { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:(path, opts = {}) => { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:(path, data, opts = {}) => { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:() => FS.currentPath,chdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:() => { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:() => { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device = getRandomDevice(); + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:() => { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: () => { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: (parent, name) => { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:() => { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:() => { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + + // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack + // now ensures it shows what we want. + if (this.stack) { + // Define the stack property for Node.js 4, which otherwise errors on the next line. + Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + this.stack = demangleAll(this.stack); + } + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:() => { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:(input, output, error) => { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:() => { + FS.init.initialized = false; + // Call musl-internal function to close all stdio streams, so nothing is + // left in internal buffers. + ___stdio_exit(); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:(canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },findObject:(path, dontResolveLastLink) => { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + return null; + } + },analyzePath:(path, dontResolveLastLink) => { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createPath:(parent, path, canRead, canWrite) => { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:(parent, name, properties, canRead, canWrite) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:(parent, name, data, canRead, canWrite, canOwn) => { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:(parent, name, input, output) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: (stream) => { + stream.seekable = false; + }, + close: (stream) => { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: (stream, buffer, offset, length, pos /* ignored */) => { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: (stream, buffer, offset, length, pos) => { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },forceLoadFile:(obj) => { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return 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 (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(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + },createLazyFile:(parent, name, url, canRead, canWrite) => { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (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. + 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(/** @type{Array} */(xhr.response || [])); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }; + var lazyArray = this; + lazyArray.setDataGetter((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]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + if (Browser.handledByPreloadPlugin(byteArray, fullname, finish, () => { + if (onerror) onerror(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, (byteArray) => processData(byteArray), onerror); + } else { + processData(url); + } + },indexedDB:() => { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:() => { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths, onload, onerror) => { + onload = onload || (() => {}); + onerror = onerror || (() => {}); + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = () => { + out('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = () => { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach((path) => { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = () => { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:(paths, onload, onerror) => { + onload = onload || (() => {}); + onerror = onerror || (() => {}); + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = () => { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach((path) => { + var getRequest = files.get(path); + getRequest.onsuccess = () => { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },absolutePath:() => { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + },createFolder:() => { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + },createLink:() => { + abort('FS.createLink has been removed; use FS.symlink instead'); + },joinPath:() => { + abort('FS.joinPath has been removed; use PATH.join instead'); + },mmapAlloc:() => { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + },standardizePath:() => { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }}; + var SYSCALLS = {DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { + if (path[0] === '/') { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(8); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(4))>>2)] = 0; + HEAP32[(((buf)+(8))>>2)] = stat.ino; + HEAP32[(((buf)+(12))>>2)] = stat.mode; + HEAP32[(((buf)+(16))>>2)] = stat.nlink; + HEAP32[(((buf)+(20))>>2)] = stat.uid; + HEAP32[(((buf)+(24))>>2)] = stat.gid; + HEAP32[(((buf)+(28))>>2)] = stat.rdev; + HEAP32[(((buf)+(32))>>2)] = 0; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); + HEAP32[(((buf)+(48))>>2)] = 4096; + HEAP32[(((buf)+(52))>>2)] = stat.blocks; + HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)] = 0; + HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)] = 0; + HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(76))>>2)] = 0; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },doMkdir:function(path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function(path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -28; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function(path, buf, bufsize) { + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function(path, amode) { + if (amode & ~7) { + // need a valid mode + return -28; + } + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + },doDup:function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:undefined,get:function() { + assert(SYSCALLS.varargs != undefined); + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + },get64:function(low, high) { + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + }}; + function _environ_get(__environ, environ_buf) { + var bufSize = 0; + getEnvStrings().forEach(function(string, i) { + var ptr = environ_buf + bufSize; + HEAP32[(((__environ)+(i * 4))>>2)] = ptr; + writeAsciiToMemory(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } + + function _environ_sizes_get(penviron_count, penviron_buf_size) { + var strings = getEnvStrings(); + HEAP32[((penviron_count)>>2)] = strings.length; + var bufSize = 0; + strings.forEach(function(string) { + bufSize += string.length + 1; + }); + HEAP32[((penviron_buf_size)>>2)] = bufSize; + return 0; + } + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + try { + + + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 0x100000000; // 2^32 + // use an unsigned operator on low and shift high by 32-bits + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + + var DOUBLE_LIMIT = 0x20000000000000; // 2^53 + // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + ; + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + return e.errno; + } + } + + function _setTempRet0(val) { + setTempRet0(val); + } + + function __isLeapYear(year) { + return year%4 === 0 && (year%100 !== 0 || year%400 === 0); + } + + function __arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { + // no-op + } + return sum; + } + + var __MONTH_DAYS_LEAP = [31,29,31,30,31,30,31,31,30,31,30,31]; + + var __MONTH_DAYS_REGULAR = [31,28,31,30,31,30,31,31,30,31,30,31]; + function __addDays(date, days) { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = __isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; + + if (days > daysInCurrentMonth-newDate.getDate()) { + // we spill over to next month + days -= (daysInCurrentMonth-newDate.getDate()+1); + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth+1) + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear()+1); + } + } else { + // we stay in current month + newDate.setDate(newDate.getDate()+days); + return newDate; + } + } + + return newDate; + } + function _strftime(s, maxsize, format, tm) { + // 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 + + var tm_zone = HEAP32[(((tm)+(40))>>2)]; + + var date = { + tm_sec: HEAP32[((tm)>>2)], + tm_min: HEAP32[(((tm)+(4))>>2)], + tm_hour: HEAP32[(((tm)+(8))>>2)], + tm_mday: HEAP32[(((tm)+(12))>>2)], + tm_mon: HEAP32[(((tm)+(16))>>2)], + tm_year: HEAP32[(((tm)+(20))>>2)], + tm_wday: HEAP32[(((tm)+(24))>>2)], + tm_yday: HEAP32[(((tm)+(28))>>2)], + tm_isdst: HEAP32[(((tm)+(32))>>2)], + tm_gmtoff: HEAP32[(((tm)+(36))>>2)], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' + }; + + var pattern = UTF8ToString(format); + + // expand format + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 + '%D': '%m/%d/%y', // Equivalent to %m / %d / %y + '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d + '%h': '%b', // Equivalent to %b + '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation + '%R': '%H:%M', // Replaced by the time in 24-hour notation + '%T': '%H:%M:%S', // Replaced by the time + '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation + '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation + // Modified Conversion Specifiers + '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. + '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. + '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. + '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. + '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. + '%EY': '%Y', // Replaced by the full alternative year representation. + '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. + '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. + '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. + '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. + '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. + '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. + '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. + '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). + '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. + '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. + '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. + '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. + '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); + } + + var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : (value || ''); + while (str.length < digits) { + str = character[0]+str; + } + return str; + } + + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : (value > 0 ? 1 : 0); + } + + var compare; + if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { + compare = sgn(date1.getDate()-date2.getDate()); + } + } + return compare; + } + + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: // Sunday + return new Date(janFourth.getFullYear()-1, 11, 29); + case 1: // Monday + return janFourth; + case 2: // Tuesday + return new Date(janFourth.getFullYear(), 0, 3); + case 3: // Wednesday + return new Date(janFourth.getFullYear(), 0, 2); + case 4: // Thursday + return new Date(janFourth.getFullYear(), 0, 1); + case 5: // Friday + return new Date(janFourth.getFullYear()-1, 11, 31); + case 6: // Saturday + return new Date(janFourth.getFullYear()-1, 11, 30); + } + } + + function getWeekBasedYear(date) { + var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + // this date is after the start of the first week of this year + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear()+1; + } else { + return thisDate.getFullYear(); + } + } else { + return thisDate.getFullYear()-1; + } + } + + var EXPANSION_RULES_2 = { + '%a': function(date) { + return WEEKDAYS[date.tm_wday].substring(0,3); + }, + '%A': function(date) { + return WEEKDAYS[date.tm_wday]; + }, + '%b': function(date) { + return MONTHS[date.tm_mon].substring(0,3); + }, + '%B': function(date) { + return MONTHS[date.tm_mon]; + }, + '%C': function(date) { + var year = date.tm_year+1900; + return leadingNulls((year/100)|0,2); + }, + '%d': function(date) { + return leadingNulls(date.tm_mday, 2); + }, + '%e': function(date) { + return leadingSomething(date.tm_mday, 2, ' '); + }, + '%g': function(date) { + // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. + // In this system, weeks begin on a Monday and week 1 of the year is the week that includes + // January 4th, which is also the week that includes the first Thursday of the year, and + // is also the first week that contains at least four days in the year. + // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of + // the last week of the preceding year; thus, for Saturday 2nd January 1999, + // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, + // or 31st is a Monday, it and any following days are part of week 1 of the following year. + // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. + + return getWeekBasedYear(date).toString().substring(2); + }, + '%G': function(date) { + return getWeekBasedYear(date); + }, + '%H': function(date) { + return leadingNulls(date.tm_hour, 2); + }, + '%I': function(date) { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': function(date) { + // Day of the year (001-366) + return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); + }, + '%m': function(date) { + return leadingNulls(date.tm_mon+1, 2); + }, + '%M': function(date) { + return leadingNulls(date.tm_min, 2); + }, + '%n': function() { + return '\n'; + }, + '%p': function(date) { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + '%S': function(date) { + return leadingNulls(date.tm_sec, 2); + }, + '%t': function() { + return '\t'; + }, + '%u': function(date) { + return date.tm_wday || 7; + }, + '%U': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Sunday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year+1900, 0, 1); + var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Sunday? + if (compareByDay(firstSunday, endDate) < 0) { + // calculate difference in days between first Sunday and endDate + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); + var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + + return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; + }, + '%V': function(date) { + // Replaced by the week number of the year (Monday as the first day of the week) + // as a decimal number [01,53]. If the week containing 1 January has four + // or more days in the new year, then it is considered week 1. + // Otherwise, it is the last week of the previous year, and the next week is week 1. + // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] + var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); + var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + if (compareByDay(endDate, firstWeekStartThisYear) < 0) { + // if given date is before this years first week, then it belongs to the 53rd week of last year + return '53'; + } + + if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { + // if given date is after next years first week, then it belongs to the 01th week of next year + return '01'; + } + + // given date is in between CW 01..53 of this calendar year + var daysDifference; + if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { + // first CW of this year starts last year + daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() + } else { + // first CW of this year starts this year + daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); + } + return leadingNulls(Math.ceil(daysDifference/7), 2); + }, + '%w': function(date) { + return date.tm_wday; + }, + '%W': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Monday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year, 0, 1); + var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Monday? + if (compareByDay(firstMonday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); + var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; + }, + '%y': function(date) { + // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] + return (date.tm_year+1900).toString().substring(2); + }, + '%Y': function(date) { + // Replaced by the year as a decimal number (for example, 1997). [ tm_year] + return date.tm_year+1900; + }, + '%z': function(date) { + // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). + // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + // convert from minutes into hhmm format (which means 60 minutes = 100 units) + off = (off / 60)*100 + (off % 60); + return (ahead ? '+' : '-') + String("0000" + off).slice(-4); + }, + '%Z': function(date) { + return date.tm_zone; + }, + '%%': function() { + return '%'; + } + }; + + // Replace %% with a pair of NULLs (which cannot occur in a C string), then + // re-inject them after processing. + pattern = pattern.replace(/%%/g, '\0\0') + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); + } + } + pattern = pattern.replace(/\0\0/g, '%') + + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + + writeArrayToMemory(bytes, s); + return bytes.length-1; + } + function _strftime_l(s, maxsize, format, tm) { + return _strftime(s, maxsize, format, tm); // no locale support yet + } + + var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.staticInit();; +ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + };; +var ASSERTIONS = true; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var asmLibraryArg = { + "__assert_fail": ___assert_fail, + "__cxa_allocate_exception": ___cxa_allocate_exception, + "__cxa_throw": ___cxa_throw, + "abort": _abort, + "emscripten_memcpy_big": _emscripten_memcpy_big, + "emscripten_resize_heap": _emscripten_resize_heap, + "environ_get": _environ_get, + "environ_sizes_get": _environ_sizes_get, + "fd_close": _fd_close, + "fd_read": _fd_read, + "fd_seek": _fd_seek, + "fd_write": _fd_write, + "setTempRet0": _setTempRet0, + "strftime_l": _strftime_l +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); + +/** @type {function(...*):?} */ +var _main = Module["_main"] = createExportWrapper("main"); + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); + +/** @type {function(...*):?} */ +var ___stdio_exit = Module["___stdio_exit"] = createExportWrapper("__stdio_exit"); + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = createExportWrapper("malloc"); + +/** @type {function(...*):?} */ +var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { + return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { + return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function() { + return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { + return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); + +/** @type {function(...*):?} */ +var dynCall_viijii = Module["dynCall_viijii"] = createExportWrapper("dynCall_viijii"); + +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); + +/** @type {function(...*):?} */ +var dynCall_iiiiij = Module["dynCall_iiiiij"] = createExportWrapper("dynCall_iiiiij"); + +/** @type {function(...*):?} */ +var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = createExportWrapper("dynCall_iiiiijj"); + +/** @type {function(...*):?} */ +var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = createExportWrapper("dynCall_iiiiiijj"); + + + + + +// === Auto-generated postamble setup entry stuff === + +unexportedRuntimeFunction('intArrayFromString', false); +unexportedRuntimeFunction('intArrayToString', false); +unexportedRuntimeFunction('ccall', false); +unexportedRuntimeFunction('cwrap', false); +unexportedRuntimeFunction('setValue', false); +unexportedRuntimeFunction('getValue', false); +unexportedRuntimeFunction('allocate', false); +unexportedRuntimeFunction('UTF8ArrayToString', false); +unexportedRuntimeFunction('UTF8ToString', false); +unexportedRuntimeFunction('stringToUTF8Array', false); +unexportedRuntimeFunction('stringToUTF8', false); +unexportedRuntimeFunction('lengthBytesUTF8', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('addOnPreRun', false); +unexportedRuntimeFunction('addOnInit', false); +unexportedRuntimeFunction('addOnPreMain', false); +unexportedRuntimeFunction('addOnExit', false); +unexportedRuntimeFunction('addOnPostRun', false); +unexportedRuntimeFunction('writeStringToMemory', false); +unexportedRuntimeFunction('writeArrayToMemory', false); +unexportedRuntimeFunction('writeAsciiToMemory', false); +unexportedRuntimeFunction('addRunDependency', true); +unexportedRuntimeFunction('removeRunDependency', true); +unexportedRuntimeFunction('FS_createFolder', false); +unexportedRuntimeFunction('FS_createPath', true); +unexportedRuntimeFunction('FS_createDataFile', true); +unexportedRuntimeFunction('FS_createPreloadedFile', true); +unexportedRuntimeFunction('FS_createLazyFile', true); +unexportedRuntimeFunction('FS_createLink', false); +unexportedRuntimeFunction('FS_createDevice', true); +unexportedRuntimeFunction('FS_unlink', true); +unexportedRuntimeFunction('getLEB', false); +unexportedRuntimeFunction('getFunctionTables', false); +unexportedRuntimeFunction('alignFunctionTables', false); +unexportedRuntimeFunction('registerFunctions', false); +unexportedRuntimeFunction('addFunction', false); +unexportedRuntimeFunction('removeFunction', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('prettyPrint', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('getCompilerSetting', false); +unexportedRuntimeFunction('print', false); +unexportedRuntimeFunction('printErr', false); +unexportedRuntimeFunction('getTempRet0', false); +unexportedRuntimeFunction('setTempRet0', false); +unexportedRuntimeFunction('callMain', false); +unexportedRuntimeFunction('abort', false); +unexportedRuntimeFunction('keepRuntimeAlive', false); +unexportedRuntimeFunction('zeroMemory', false); +unexportedRuntimeFunction('stringToNewUTF8', false); +unexportedRuntimeFunction('abortOnCannotGrowMemory', false); +unexportedRuntimeFunction('emscripten_realloc_buffer', false); +unexportedRuntimeFunction('ENV', false); +unexportedRuntimeFunction('withStackSave', false); +unexportedRuntimeFunction('ERRNO_CODES', false); +unexportedRuntimeFunction('ERRNO_MESSAGES', false); +unexportedRuntimeFunction('setErrNo', false); +unexportedRuntimeFunction('inetPton4', false); +unexportedRuntimeFunction('inetNtop4', false); +unexportedRuntimeFunction('inetPton6', false); +unexportedRuntimeFunction('inetNtop6', false); +unexportedRuntimeFunction('readSockaddr', false); +unexportedRuntimeFunction('writeSockaddr', false); +unexportedRuntimeFunction('DNS', false); +unexportedRuntimeFunction('getHostByName', false); +unexportedRuntimeFunction('Protocols', false); +unexportedRuntimeFunction('Sockets', false); +unexportedRuntimeFunction('getRandomDevice', false); +unexportedRuntimeFunction('traverseStack', false); +unexportedRuntimeFunction('convertFrameToPC', false); +unexportedRuntimeFunction('UNWIND_CACHE', false); +unexportedRuntimeFunction('saveInUnwindCache', false); +unexportedRuntimeFunction('convertPCtoSourceLocation', false); +unexportedRuntimeFunction('readAsmConstArgsArray', false); +unexportedRuntimeFunction('readAsmConstArgs', false); +unexportedRuntimeFunction('mainThreadEM_ASM', false); +unexportedRuntimeFunction('jstoi_q', false); +unexportedRuntimeFunction('jstoi_s', false); +unexportedRuntimeFunction('getExecutableName', false); +unexportedRuntimeFunction('listenOnce', false); +unexportedRuntimeFunction('autoResumeAudioContext', false); +unexportedRuntimeFunction('dynCallLegacy', false); +unexportedRuntimeFunction('getDynCaller', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('callRuntimeCallbacks', false); +unexportedRuntimeFunction('wasmTableMirror', false); +unexportedRuntimeFunction('setWasmTableEntry', false); +unexportedRuntimeFunction('getWasmTableEntry', false); +unexportedRuntimeFunction('handleException', false); +unexportedRuntimeFunction('runtimeKeepalivePush', false); +unexportedRuntimeFunction('runtimeKeepalivePop', false); +unexportedRuntimeFunction('callUserCallback', false); +unexportedRuntimeFunction('maybeExit', false); +unexportedRuntimeFunction('safeSetTimeout', false); +unexportedRuntimeFunction('asmjsMangle', false); +unexportedRuntimeFunction('asyncLoad', false); +unexportedRuntimeFunction('alignMemory', false); +unexportedRuntimeFunction('mmapAlloc', false); +unexportedRuntimeFunction('reallyNegative', false); +unexportedRuntimeFunction('unSign', false); +unexportedRuntimeFunction('reSign', false); +unexportedRuntimeFunction('formatString', false); +unexportedRuntimeFunction('PATH', false); +unexportedRuntimeFunction('PATH_FS', false); +unexportedRuntimeFunction('SYSCALLS', false); +unexportedRuntimeFunction('getSocketFromFD', false); +unexportedRuntimeFunction('getSocketAddress', false); +unexportedRuntimeFunction('JSEvents', false); +unexportedRuntimeFunction('registerKeyEventCallback', false); +unexportedRuntimeFunction('specialHTMLTargets', false); +unexportedRuntimeFunction('maybeCStringToJsString', false); +unexportedRuntimeFunction('findEventTarget', false); +unexportedRuntimeFunction('findCanvasEventTarget', false); +unexportedRuntimeFunction('getBoundingClientRect', false); +unexportedRuntimeFunction('fillMouseEventData', false); +unexportedRuntimeFunction('registerMouseEventCallback', false); +unexportedRuntimeFunction('registerWheelEventCallback', false); +unexportedRuntimeFunction('registerUiEventCallback', false); +unexportedRuntimeFunction('registerFocusEventCallback', false); +unexportedRuntimeFunction('fillDeviceOrientationEventData', false); +unexportedRuntimeFunction('registerDeviceOrientationEventCallback', false); +unexportedRuntimeFunction('fillDeviceMotionEventData', false); +unexportedRuntimeFunction('registerDeviceMotionEventCallback', false); +unexportedRuntimeFunction('screenOrientation', false); +unexportedRuntimeFunction('fillOrientationChangeEventData', false); +unexportedRuntimeFunction('registerOrientationChangeEventCallback', false); +unexportedRuntimeFunction('fillFullscreenChangeEventData', false); +unexportedRuntimeFunction('registerFullscreenChangeEventCallback', false); +unexportedRuntimeFunction('registerRestoreOldStyle', false); +unexportedRuntimeFunction('hideEverythingExceptGivenElement', false); +unexportedRuntimeFunction('restoreHiddenElements', false); +unexportedRuntimeFunction('setLetterbox', false); +unexportedRuntimeFunction('currentFullscreenStrategy', false); +unexportedRuntimeFunction('restoreOldWindowedStyle', false); +unexportedRuntimeFunction('softFullscreenResizeWebGLRenderTarget', false); +unexportedRuntimeFunction('doRequestFullscreen', false); +unexportedRuntimeFunction('fillPointerlockChangeEventData', false); +unexportedRuntimeFunction('registerPointerlockChangeEventCallback', false); +unexportedRuntimeFunction('registerPointerlockErrorEventCallback', false); +unexportedRuntimeFunction('requestPointerLock', false); +unexportedRuntimeFunction('fillVisibilityChangeEventData', false); +unexportedRuntimeFunction('registerVisibilityChangeEventCallback', false); +unexportedRuntimeFunction('registerTouchEventCallback', false); +unexportedRuntimeFunction('fillGamepadEventData', false); +unexportedRuntimeFunction('registerGamepadEventCallback', false); +unexportedRuntimeFunction('registerBeforeUnloadEventCallback', false); +unexportedRuntimeFunction('fillBatteryEventData', false); +unexportedRuntimeFunction('battery', false); +unexportedRuntimeFunction('registerBatteryEventCallback', false); +unexportedRuntimeFunction('setCanvasElementSize', false); +unexportedRuntimeFunction('getCanvasElementSize', false); +unexportedRuntimeFunction('demangle', false); +unexportedRuntimeFunction('demangleAll', false); +unexportedRuntimeFunction('jsStackTrace', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('getEnvStrings', false); +unexportedRuntimeFunction('checkWasiClock', false); +unexportedRuntimeFunction('writeI53ToI64', false); +unexportedRuntimeFunction('writeI53ToI64Clamped', false); +unexportedRuntimeFunction('writeI53ToI64Signaling', false); +unexportedRuntimeFunction('writeI53ToU64Clamped', false); +unexportedRuntimeFunction('writeI53ToU64Signaling', false); +unexportedRuntimeFunction('readI53FromI64', false); +unexportedRuntimeFunction('readI53FromU64', false); +unexportedRuntimeFunction('convertI32PairToI53', false); +unexportedRuntimeFunction('convertU32PairToI53', false); +unexportedRuntimeFunction('setImmediateWrapped', false); +unexportedRuntimeFunction('clearImmediateWrapped', false); +unexportedRuntimeFunction('polyfillSetImmediate', false); +unexportedRuntimeFunction('uncaughtExceptionCount', false); +unexportedRuntimeFunction('exceptionLast', false); +unexportedRuntimeFunction('exceptionCaught', false); +unexportedRuntimeFunction('ExceptionInfo', false); +unexportedRuntimeFunction('CatchInfo', false); +unexportedRuntimeFunction('exception_addRef', false); +unexportedRuntimeFunction('exception_decRef', false); +unexportedRuntimeFunction('Browser', false); +unexportedRuntimeFunction('funcWrappers', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('setMainLoop', false); +unexportedRuntimeFunction('wget', false); +unexportedRuntimeFunction('FS', false); +unexportedRuntimeFunction('MEMFS', false); +unexportedRuntimeFunction('TTY', false); +unexportedRuntimeFunction('PIPEFS', false); +unexportedRuntimeFunction('SOCKFS', false); +unexportedRuntimeFunction('_setNetworkCallback', false); +unexportedRuntimeFunction('tempFixedLengthArray', false); +unexportedRuntimeFunction('miniTempWebGLFloatBuffers', false); +unexportedRuntimeFunction('heapObjectForWebGLType', false); +unexportedRuntimeFunction('heapAccessShiftForWebGLHeap', false); +unexportedRuntimeFunction('GL', false); +unexportedRuntimeFunction('emscriptenWebGLGet', false); +unexportedRuntimeFunction('computeUnpackAlignedImageSize', false); +unexportedRuntimeFunction('emscriptenWebGLGetTexPixelData', false); +unexportedRuntimeFunction('emscriptenWebGLGetUniform', false); +unexportedRuntimeFunction('webglGetUniformLocation', false); +unexportedRuntimeFunction('webglPrepareUniformLocationsBeforeFirstUse', false); +unexportedRuntimeFunction('webglGetLeftBracePos', false); +unexportedRuntimeFunction('emscriptenWebGLGetVertexAttrib', false); +unexportedRuntimeFunction('writeGLArray', false); +unexportedRuntimeFunction('AL', false); +unexportedRuntimeFunction('SDL_unicode', false); +unexportedRuntimeFunction('SDL_ttfContext', false); +unexportedRuntimeFunction('SDL_audio', false); +unexportedRuntimeFunction('SDL', false); +unexportedRuntimeFunction('SDL_gfx', false); +unexportedRuntimeFunction('GLUT', false); +unexportedRuntimeFunction('EGL', false); +unexportedRuntimeFunction('GLFW_Window', false); +unexportedRuntimeFunction('GLFW', false); +unexportedRuntimeFunction('GLEW', false); +unexportedRuntimeFunction('IDBStore', false); +unexportedRuntimeFunction('runAndAbortIfError', false); +unexportedRuntimeFunction('warnOnce', false); +unexportedRuntimeFunction('stackSave', false); +unexportedRuntimeFunction('stackRestore', false); +unexportedRuntimeFunction('stackAlloc', false); +unexportedRuntimeFunction('AsciiToString', false); +unexportedRuntimeFunction('stringToAscii', false); +unexportedRuntimeFunction('UTF16ToString', false); +unexportedRuntimeFunction('stringToUTF16', false); +unexportedRuntimeFunction('lengthBytesUTF16', false); +unexportedRuntimeFunction('UTF32ToString', false); +unexportedRuntimeFunction('stringToUTF32', false); +unexportedRuntimeFunction('lengthBytesUTF32', false); +unexportedRuntimeFunction('allocateUTF8', false); +unexportedRuntimeFunction('allocateUTF8OnStack', false); +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +unexportedRuntimeSymbol('ALLOC_NORMAL', false); +unexportedRuntimeSymbol('ALLOC_STACK', false); + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = Module['_main']; + + args = args || []; + + var argc = args.length+1; + var argv = stackAlloc((argc + 1) * 4); + HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram); + for (var i = 1; i < argc; i++) { + HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); + } + HEAP32[(argv >> 2) + argc] = 0; + + try { + + var ret = entryFunction(argc, argv); + + // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as + // execution is asynchronously handed off to a pthread. + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + return ret; + } + catch (e) { + return handleException(e); + } finally { + calledMain = true; + + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + // TODO(sbc): Move writeStackCookie to native to to avoid this. + _emscripten_stack_init(); + writeStackCookie(); +} + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + ___stdio_exit(); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + EXITSTATUS = status; + + // Skip this check if the runtime is being kept alive deliberately. + // For example if `exit_with_live_runtime` is called. + if (!runtimeKeepaliveCounter) { + checkUnflushedContent(); + } + + if (keepRuntimeAlive()) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + err(msg); + } + } else { + exitRuntime(); + } + + procExit(status); +} + +function procExit(code) { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + +run(); + + + + + diff --git a/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.wasm b/作业/数据结构-金健/C++/第七章作业/public/第七章作业2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..65a07a8b498cd17c8bee97c9273dafaa54f60b07 GIT binary patch literal 212569 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⪙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 literal 0 HcmV?d00001 diff --git a/作业/数据结构-金健/C++/第七章作业/temp_in.txt b/作业/数据结构-金健/C++/第七章作业/temp_in.txt new file mode 100644 index 0000000..674bfbb --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/temp_in.txt @@ -0,0 +1 @@ + 41 40 19 8 5 5 17 32 39 32 98 95 68 56 60 59 67 94 77 98 \ No newline at end of file diff --git a/作业/数据结构-金健/C++/第七章作业/第七章作业1.cpp b/作业/数据结构-金健/C++/第七章作业/第七章作业1.cpp new file mode 100644 index 0000000..04a8c6b --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/第七章作业1.cpp @@ -0,0 +1,128 @@ +// +// Created by 423A35C7 on 2023-12-14. +// +// 20:30 +// 22:20 + +#include +#include +#include +#include +#include +#include + +template +class BiSortNode { + std::unique_ptr left_child; + std::unique_ptr right_child; + T data; + std::function compare_function_; + +public: + // 好像这里没法使用initializer_list,initializer_list是对于多个相同值的初始化,而不是一个东西的初始化参数列表 + template + explicit BiSortNode(Args... args, std::function _compare) : data(args...) { + this->compare_function_(_compare); + } + + template + explicit BiSortNode(Args... args) : data(args...) { + this->compare_function_ = [](T&a, T&b) { return a < b; }; + } + + void insert(T new_data) { + if (new_data < this->data) { + if (this->left_child == nullptr) { + this->left_child = std::make_unique(new_data); + } + else { + this->left_child->insert(new_data); + } + } + else { + if (this->right_child == nullptr) { + this->right_child = std::make_unique(new_data); + } + else { + this->right_child->insert(new_data); + } + } + } + + void preorder_traversal(std::vector&output) { + output.push_back(this->data); + if (this->left_child != nullptr) this->left_child->preorder_traversal(output); + if (this->right_child != nullptr) this->right_child->preorder_traversal(output); + } + + void mirror_preorder_traversal(std::vector&output) { + output.push_back(this->data); + if (this->right_child != nullptr) this->right_child->mirror_preorder_traversal(output); + if (this->left_child != nullptr) this->left_child->mirror_preorder_traversal(output); + } + + void postorder_traversal(std::vector&output) { + if (this->left_child != nullptr) this->left_child->postorder_traversal(output); + if (this->right_child != nullptr) this->right_child->postorder_traversal(output); + output.push_back(this->data); + } + + void mirror_postorder_traversal(std::vector&output) { + if (this->right_child != nullptr) this->right_child->mirror_postorder_traversal(output); + if (this->left_child != nullptr) this->left_child->mirror_postorder_traversal(output); + output.push_back(this->data); + } +}; + +int main() { + std::vector origin_vector; + int temp; + while (std::cin >> temp) { + origin_vector.push_back(temp); + } + auto generator = origin_vector.cbegin(); + BiSortNode bi_sort_node{*generator++}; + while (generator != origin_vector.cend()) { + bi_sort_node.insert(*generator++); + } + + std::vector preorder_traversal_result; + bi_sort_node.preorder_traversal(preorder_traversal_result); + std::vector mirror_result; + bi_sort_node.mirror_preorder_traversal(mirror_result); + + std::ofstream outfile; + outfile.open("temp_out.txt", std::ios::out); + + if (origin_vector == preorder_traversal_result || origin_vector == mirror_result) { + std::cout << "Yes" << std::endl; + std::vector post_result; + bi_sort_node.postorder_traversal(post_result); + for (const auto&i: post_result) { + std::cout << i << " "; + } + std::cout << std::endl; + std::vector mirror_post_result; + bi_sort_node.mirror_postorder_traversal(mirror_post_result); + for (const auto&i: mirror_post_result) { + outfile << i << " "; + } + outfile << std::endl; + } + else { + std::cout << "No" << std::endl; + } + + outfile.close(); + return 0; +} + +// 输入: +// 41 40 19 8 5 5 17 32 39 32 98 95 68 56 60 59 67 94 77 98 + +// 输出: +// Yes +// 5 5 17 8 32 39 32 19 40 59 67 60 56 77 94 68 95 98 98 41 + +// temp_out.txt 文件输出: +// 98 77 94 67 59 60 56 68 95 98 32 39 32 17 5 5 8 19 40 41 diff --git a/作业/数据结构-金健/C++/第七章作业/第七章作业2.cpp b/作业/数据结构-金健/C++/第七章作业/第七章作业2.cpp new file mode 100644 index 0000000..3f055b2 --- /dev/null +++ b/作业/数据结构-金健/C++/第七章作业/第七章作业2.cpp @@ -0,0 +1,167 @@ +// +// Created by 423A35C7 on 2023-12-15. +// +// 09:19 +// 20:06 + +#include +#include +#include +#include +#include +#include + +template +class BiSortNode { +public: + using NodePtr = std::unique_ptr; + // 好像这里没法使用initializer_list,initializer_list是对于多个相同值的初始化,而不是一个东西的初始化参数列表 + template + explicit BiSortNode(Args... args, std::function _compare) : data(args...) { + this->compare_function_(_compare); + } + + template + explicit BiSortNode(Args... args) : data(args...) { + this->compare_function_ = [](T&a, T&b) { return a < b; }; + } + + void update_depth_and_balance_factor() { + const int left_depth = this->left_child ? this->left_child->depth + 1 : 0; + const int right_depth = this->right_child ? this->right_child->depth + 1 : 0; + this->balance_factor = left_depth - right_depth; + this->depth = std::max(left_depth, right_depth); + } + + // 这里的左旋指的是LL型需要进行的旋转,名称不一定对 + // 这部分用注释不好解释,建议最好搜一下网上的图解,理解了之后再看这部分代码 + static void left_rotate(NodePtr&unbalanced) { + NodePtr pivot = std::move(unbalanced->left_child); + unbalanced->left_child = std::move(pivot->right_child); + pivot->right_child = std::move(unbalanced); + unbalanced = std::move(pivot); + unbalanced->update_depth_and_balance_factor(); + unbalanced->right_child->update_depth_and_balance_factor(); + } + + // 这里的右旋指的是RR型需要进行的旋转,名称不一定对 + // 这部分用注释不好解释,建议最好搜一下网上的图解,理解了之后再看这部分代码 + static void right_rotate(NodePtr&unbalanced) { + NodePtr pivot = std::move(unbalanced->right_child); + unbalanced->right_child = std::move(pivot->left_child); + pivot->left_child = std::move(unbalanced); + unbalanced = std::move(pivot); + unbalanced->update_depth_and_balance_factor(); + unbalanced->left_child->update_depth_and_balance_factor(); + } + + static void insert(NodePtr¤t_node, T new_data) { + // int balance_diff = 0; + if (new_data < current_node->data) { + // 如果新的节点比当前节点小就找它的左子树 + if (current_node->left_child == nullptr) { + current_node->left_child = std::make_unique(new_data); + } + else { + current_node->insert(current_node->left_child, new_data); + } + } + else { + // 否则找右子树 + if (current_node->right_child == nullptr) { + current_node->right_child = std::make_unique(new_data); + } + else { + current_node->insert(current_node->right_child, new_data); + } + } + current_node->update_depth_and_balance_factor(); + if (current_node->balance_factor > 1) { + // 左子树比右子树高 + assert(current_node->left_child->balance_factor != 0); // 此时左子树的平衡因子不应为0 + if (current_node->left_child->balance_factor < 0) // 符合LR型 + current_node->right_rotate(current_node->left_child); // 先进行右旋(逆时针),转化为LL + current_node->left_rotate(current_node); // 左旋(顺时针) + } + else if (current_node->balance_factor < -1) { + // 右子树比左子树高 + assert(current_node->right_child->balance_factor != 0); // 此时右子树的平衡因子不应为0 + if (current_node->right_child->balance_factor > 0) // 符合RL型 + current_node->left_rotate(current_node->right_child); // 先进行左旋(顺时针),转化为RR型 + current_node->right_rotate(current_node); // 右旋(逆时针) + } + // current_node->balance_factor += balance_diff; + current_node->update_depth_and_balance_factor(); + // return balance_diff; + } + + void inorder_traversal(std::vector&output) { + if (this->left_child != nullptr) this->left_child->inorder_traversal(output); + output.push_back(this->data); + if (this->right_child != nullptr) this->right_child->inorder_traversal(output); + } + + void preorder_traversal(std::vector&output) { + output.push_back(this->data); + if (this->left_child != nullptr) this->left_child->preorder_traversal(output); + if (this->right_child != nullptr) this->right_child->preorder_traversal(output); + } + + void postorder_traversal(std::vector&output) { + if (this->left_child != nullptr) this->left_child->postorder_traversal(output); + if (this->right_child != nullptr) this->right_child->postorder_traversal(output); + output.push_back(this->data); + } + + void traverse_and_output(std::ostream&out, std::function&)> traverse_function) { + std::vector traverse_result; + traverse_function(traverse_result); + for (auto const&i: traverse_result) + std::cout << i << " "; + std::cout << std::endl; + } + +private: + NodePtr left_child; + NodePtr right_child; + int balance_factor = 0; // 平衡因子 + int depth = 0; // 树的深度(高度) + T data; + std::function compare_function_; +}; + + +int main() { + std::vector origin_vector; + int temp; + while (std::cin >> temp) { + origin_vector.push_back(temp); + } + auto generator = origin_vector.cbegin(); + BiSortNode::NodePtr bi_sort_node{new BiSortNode(*generator++)}; + while (generator != origin_vector.cend()) { + bi_sort_node->insert(bi_sort_node, *generator++); + } + std::vector traversal_result; + bi_sort_node->inorder_traversal(traversal_result); + std::cout << "为了便于验证,以下依次输出平衡二叉树的前序、中序、后序遍历结果:" << std::endl; + bi_sort_node->traverse_and_output(std::cout, [&bi_sort_node](std::vector&output) { + bi_sort_node->preorder_traversal(output); + }); + bi_sort_node->traverse_and_output(std::cout, [&bi_sort_node](std::vector&output) { + bi_sort_node->inorder_traversal(output); + }); + bi_sort_node->traverse_and_output(std::cout, [&bi_sort_node](std::vector&output) { + bi_sort_node->postorder_traversal(output); + }); + return 0; +} + +// 输入: +// 98 77 94 67 59 60 56 68 95 98 32 39 32 17 5 5 8 19 40 41 + +// 输出: +// 为了便于验证,以下依次输出平衡二叉树的前序、中序、后序遍历结果: +// 67 39 17 5 5 8 32 19 32 59 41 40 56 60 94 77 68 98 95 98 +// 5 5 8 17 19 32 32 39 40 41 56 59 60 67 68 77 94 95 98 98 +// 5 8 5 19 32 32 17 40 56 41 60 59 39 68 77 95 98 98 94 67