From 671c45c12ef7cc38753e817e2aaa7b43c3fc5454 Mon Sep 17 00:00:00 2001 From: Hongchan Choi Date: Thu, 2 Nov 2023 10:59:23 -0700 Subject: [PATCH 1/3] initial commit --- src/_data/build_info.json | 2 +- .../design-pattern/wasm-supersaw/Makefile | 1 + .../design-pattern/wasm-supersaw/README.md | 11 + .../wasm-supersaw/synth.wasm.js | 4161 ++++++++--------- 4 files changed, 1892 insertions(+), 2283 deletions(-) create mode 100644 src/audio-worklet/design-pattern/wasm-supersaw/README.md diff --git a/src/_data/build_info.json b/src/_data/build_info.json index 7ec0ba294..4052b8cb7 100644 --- a/src/_data/build_info.json +++ b/src/_data/build_info.json @@ -1 +1 @@ -{"version":"3.1.0","revision":"fce9086","lastUpdated":"2023-07-10","copyrightYear":2023} \ No newline at end of file +{"version":"3.1.0","revision":"6b3e732","lastUpdated":"2023-10-13","copyrightYear":2023} \ No newline at end of file diff --git a/src/audio-worklet/design-pattern/wasm-supersaw/Makefile b/src/audio-worklet/design-pattern/wasm-supersaw/Makefile index fa391784f..8052e6ef4 100755 --- a/src/audio-worklet/design-pattern/wasm-supersaw/Makefile +++ b/src/audio-worklet/design-pattern/wasm-supersaw/Makefile @@ -24,6 +24,7 @@ build: $(DEPS) -s SINGLE_FILE=1 \ -s WASM=1 \ -s WASM_ASYNC_COMPILATION=0 \ + -s EXPORTED_FUNCTIONS="['_malloc']" \ -o ./synth.wasm.js \ ./synth_src/synth_bind.cc $(DEPS) diff --git a/src/audio-worklet/design-pattern/wasm-supersaw/README.md b/src/audio-worklet/design-pattern/wasm-supersaw/README.md new file mode 100644 index 000000000..3952bbcfa --- /dev/null +++ b/src/audio-worklet/design-pattern/wasm-supersaw/README.md @@ -0,0 +1,11 @@ +# How to use wasm-supersaw example + +Unlike other AudioWorklet examples in this repository, this examples needs +an additional step to build and compile. Follow the steps below: + +1. Install Emscripten in your development setup. Follow the instruction: + https://emscripten.org/docs/getting_started/downloads.html + +2. Run `emcc -v` to confirm the Emscripten installation and its version. + +3. \ No newline at end of file diff --git a/src/audio-worklet/design-pattern/wasm-supersaw/synth.wasm.js b/src/audio-worklet/design-pattern/wasm-supersaw/synth.wasm.js index 885e0f455..4840563a6 100644 --- a/src/audio-worklet/design-pattern/wasm-supersaw/synth.wasm.js +++ b/src/audio-worklet/design-pattern/wasm-supersaw/synth.wasm.js @@ -1,5 +1,4 @@ - - +// include: shell.js // 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 @@ -15,8 +14,6 @@ // 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) @@ -58,57 +55,38 @@ function locateFile(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); -} + readBinary; 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) { - const data = tryParseAsDataURI(f); - if (data) { - return intArrayToString(data); - } - return read(f); - }; + read_ = read; } - readBinary = function readBinary(f) { - let data; - data = tryParseAsDataURI(f); - if (data) { - return data; - } + readBinary = (f) => { if (typeof readbuffer == 'function') { return new Uint8Array(readbuffer(f)); } - data = read(f, 'binary'); + let data = read(f, 'binary'); assert(typeof data == 'object'); return data; }; - readAsync = function readAsync(f, onload, onerror) { - setTimeout(() => onload(readBinary(f)), 0); + readAsync = (f, onload, onerror) => { + setTimeout(() => onload(readBinary(f))); }; + if (typeof clearTimeout == 'undefined') { + globalThis.clearTimeout = (id) => {}; + } + + if (typeof setTimeout == 'undefined') { + // spidermonkey lacks setTimeout but we use it above in readAsync. + globalThis.setTimeout = (f) => (typeof f == 'function') ? f() : abort(); + } + if (typeof scriptArgs != 'undefined') { arguments_ = scriptArgs; } else if (typeof arguments != 'undefined') { @@ -117,8 +95,26 @@ if (ENVIRONMENT_IS_SHELL) { if (typeof quit == 'function') { quit_ = (status, toThrow) => { - logExceptionOnExit(toThrow); - quit(status); + // 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. To increase + // consistency with node (and the web) we schedule the actual quit call + // using a setTimeout to give the current stack and any exception handlers + // a chance to run. This enables features such as addOnPostRun (which + // expected to be able to run code after main returns). + setTimeout(() => { + if (!(toThrow instanceof ExitStatus)) { + let toLog = toThrow; + if (toThrow && typeof toThrow == 'object' && toThrow.stack) { + toLog = [toThrow, toThrow.stack]; + } + err(`exiting due to exception: ${toLog}`); + } + quit(status); + }); + throw toThrow; }; } @@ -139,7 +135,7 @@ if (ENVIRONMENT_IS_SHELL) { } var out = Module['print'] || console.log.bind(console); -var err = Module['printErr'] || console.warn.bind(console); +var err = Module['printErr'] || console.error.bind(console); // Merge back in the overrides Object.assign(Module, moduleOverrides); @@ -168,8 +164,9 @@ assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackage 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['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('asm', 'wasmExports'); legacyModuleProp('read', 'read_'); legacyModuleProp('readAsync', 'readAsync'); legacyModuleProp('readBinary', 'readBinary'); @@ -177,8 +174,12 @@ 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 FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; -function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); } assert(!ENVIRONMENT_IS_WEB, "web environment detected but not enabled at build time. Add 'web' to `-sENVIRONMENT` to enable."); @@ -187,297 +188,95 @@ assert(!ENVIRONMENT_IS_WORKER, "worker environment detected but not enabled at b assert(!ENVIRONMENT_IS_NODE, "node environment detected but not enabled at build time. Add 'node' to `-sENVIRONMENT` to enable."); +// end include: shell.js +// include: preamble.js +// === 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 STACK_ALIGN = 16; -var POINTER_SIZE = 4; - -function getNativeTypeSize(type) { - switch (type) { - case 'i1': case 'i8': case 'u8': return 1; - case 'i16': case 'u16': return 2; - case 'i32': case 'u32': return 4; - case 'i64': case 'u64': 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 - - -// This gives correct answers for everything less than 2^{14} = 16384 -// I hope nobody is contemplating functions with 16384 arguments... -function uleb128Encode(n) { - assert(n < 16384); - if (n < 128) { - return [n]; - } - return [(n % 128) | 128, n >> 7]; -} - -// Converts a signature like 'vii' into a description of the wasm types, like -// { parameters: ['i32', 'i32'], results: [] }. -function sigToWasmTypes(sig) { - var typeNames = { - 'i': 'i32', - 'j': 'i64', - 'f': 'f32', - 'd': 'f64', - 'p': 'i32', - }; - var type = { - parameters: [], - results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] - }; - for (var i = 1; i < sig.length; ++i) { - assert(sig[i] in typeNames, 'invalid signature char: ' + sig[i]); - type.parameters.push(typeNames[sig[i]]); - } - return type; -} - -// 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") { - return new WebAssembly.Function(sigToWasmTypes(sig), func); - } - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'p': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection = typeSection.concat(uleb128Encode(sigParam.length)); - for (var i = 0; i < sigParam.length; ++i) { - assert(sigParam[i] in typeCodes, 'invalid signature char: ' + sigParam[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 section code and overall length of the type section into the - // section header - typeSection = [0x01 /* Type section code */].concat( - uleb128Encode(typeSection.length), - typeSection - ); - - // 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; -} +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); -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); - } - } +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); } -/** - * 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. +// include: base64Utils.js +// include: polyfill/atob.js +// Copied from https://github.com/strophe/strophejs/blob/e06d027/src/polyfills.js#L149 - var ret = getEmptyTableSlot(); +// This code was written by Tyler Akins and has been placed in the +// public domain. It would be nice if you left this header intact. +// Base64 code from Tyler Akins -- http://rumkin.com - // 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); +if (typeof atob == 'undefined') { + if (typeof global != 'undefined' && typeof globalThis == 'undefined') { + globalThis = global; } - functionsInTableMap.set(func, ret); - - return ret; -} + /** + * Decodes a base64 string. + * @param {string} input The string to decode. + */ + globalThis.atob = function(input) { + var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; -function removeFunction(index) { - functionsInTableMap.delete(getWasmTableEntry(index)); - freeTableIndexes.push(index); -} + var output = ''; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + // remove all characters that are not A-Z, a-z, 0-9, +, /, or = + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + do { + enc1 = keyStr.indexOf(input.charAt(i++)); + enc2 = keyStr.indexOf(input.charAt(i++)); + enc3 = keyStr.indexOf(input.charAt(i++)); + enc4 = keyStr.indexOf(input.charAt(i++)); -// end include: runtime_functions.js -// include: runtime_debug.js + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + output = output + String.fromCharCode(chr1); -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)'); + if (enc3 !== 64) { + output = output + String.fromCharCode(chr2); } - }); - } -} - -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 (-sFORCE_FILESYSTEM) 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)); + if (enc4 !== 64) { + output = output + String.fromCharCode(chr3); } - }); - } + } while (i < input.length); + return output; + }; } +// end include: polyfill/atob.js +// Converts a string of base64 into a byte array (Uint8Array). +function intArrayFromBase64(s) { -function unexportedRuntimeFunction(sym, isFSSybol) { - if (!Object.getOwnPropertyDescriptor(Module, sym)) { - Module[sym] = () => abort(unexportedMessage(sym, isFSSybol)); + var decoded = atob(s); + var bytes = new Uint8Array(decoded.length); + for (var i = 0 ; i < decoded.length ; ++i) { + bytes[i] = decoded.charCodeAt(i); } + return bytes; } -// 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 filename is a base64 data URI, parses and returns data (Buffer on node, +// Uint8Array otherwise). If filename is not a base64 data URI, returns undefined. +function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } -if (typeof WebAssembly != 'object') { - abort('no native wasm support detected'); + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); } - +// end include: base64Utils.js // Wasm globals var wasmMemory; @@ -502,507 +301,12 @@ function assert(condition, 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. -// 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. - -var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; - -// 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. -/** - * heapOrArray is either a regular array, or a JavaScript typed array view. - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(heapOrArray, 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 (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.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 = heapOrArray[idx++]; - if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } - var u2 = heapOrArray[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) | (heapOrArray[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} */ @@ -1020,72 +324,66 @@ var HEAP, /** @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); +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); } -var TOTAL_STACK = 5242880; -if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') -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. +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); -assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_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); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } // The stack grow downwards towards _emscripten_stack_get_end. // We write cookies to the final two words in the stack and detect if they are // ever overwritten. - HEAP32[((max)>>2)] = 0x2135467; - HEAP32[(((max)+(4))>>2)] = 0x89BACDFE; + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; // Also test the global address 0 for integrity. - HEAPU32[0] = 0x63736d65; /* 'emsc' */ + HEAPU32[((0)>>2)] = 1668509029; } function checkStackCookie() { if (ABORT) return; var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } var cookie1 = HEAPU32[((max)>>2)]; var cookie2 = HEAPU32[(((max)+(4))>>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)); + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); } // Also test the global address 0 for integrity. - if (HEAPU32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + if (HEAPU32[((0)>>2)] != 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); @@ -1102,19 +400,13 @@ var __ATPOSTRUN__ = []; // functions called after the main() is called var runtimeInitialized = false; -function keepRuntimeAlive() { - return noExitRuntime; -} - function preRun() { - if (Module['preRun']) { if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; while (Module['preRun'].length) { addOnPreRun(Module['preRun'].shift()); } } - callRuntimeCallbacks(__ATPRERUN__); } @@ -1157,8 +449,6 @@ function addOnPostRun(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 @@ -1171,7 +461,6 @@ assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_ 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 @@ -1205,7 +494,7 @@ function addRunDependency(id) { runDependencyTracking[id] = 1; if (runDependencyWatcher === null && typeof setInterval != 'undefined') { // Check for missing dependencies every few seconds - runDependencyWatcher = setInterval(function() { + runDependencyWatcher = setInterval(() => { if (ABORT) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; @@ -1217,7 +506,7 @@ function addRunDependency(id) { shown = true; err('still waiting on run dependencies:'); } - err('dependency: ' + dep); + err(`dependency: ${dep}`); } if (shown) { err('(end of list)'); @@ -1257,10 +546,8 @@ function removeRunDependency(id) { /** @param {string|number=} what */ function abort(what) { - { - if (Module['onAbort']) { - Module['onAbort'](what); - } + if (Module['onAbort']) { + Module['onAbort'](what); } what = 'Aborted(' + what + ')'; @@ -1293,133 +580,85 @@ function abort(what) { throw e; } -// {{MEM_INITIALIZER}} - // include: memoryprofiler.js - - // end include: memoryprofiler.js // show errors on likely calls to FS when it was not included var FS = { - error: function() { + error() { abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM'); }, - init: function() { FS.error() }, - createDataFile: function() { FS.error() }, - createPreloadedFile: function() { FS.error() }, - createLazyFile: function() { FS.error() }, - open: function() { FS.error() }, - mkdev: function() { FS.error() }, - registerDevice: function() { FS.error() }, - analyzePath: function() { FS.error() }, - loadFilesFromDB: function() { FS.error() }, - - ErrnoError: function ErrnoError() { FS.error() }, + init() { FS.error() }, + createDataFile() { FS.error() }, + createPreloadedFile() { FS.error() }, + createLazyFile() { FS.error() }, + open() { FS.error() }, + mkdev() { FS.error() }, + registerDevice() { FS.error() }, + analyzePath() { FS.error() }, + + ErrnoError() { FS.error() }, }; Module['FS_createDataFile'] = FS.createDataFile; Module['FS_createPreloadedFile'] = FS.createPreloadedFile; // 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://'); -} +/** + * Indicates whether filename is a base64 data URI. + * @noinline + */ +var isDataURI = (filename) => filename.startsWith(dataURIPrefix); +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); // end include: URIUtils.js -/** @param {boolean=} fixedasm */ -function createExportWrapper(name, fixedasm) { +function createExportWrapper(name) { return function() { - var displayName = name; - var asm = fixedasm; - if (!fixedasm) { - asm = Module['asm']; - } - assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); - if (!asm[name]) { - assert(asm[name], 'exported native function `' + displayName + '` not found'); - } - return asm[name].apply(null, arguments); + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + return f.apply(null, arguments); }; } +// include: runtime_exceptions.js +// end include: runtime_exceptions.js var wasmBinaryFile; - wasmBinaryFile = 'data:application/octet-stream;base64,AGFzbQEAAAAB7IGAgAAkYAF/AX9gAX8AYAABf2ACf38Bf2ACf38AYAN/f38Bf2ADf39/AGAAAGAEf39/fwBgBX9/f39/AGAGf39/f39/AGACf30AYAF9AX1gAXwBfGADf319AX1gAn99AX1gAX8BfGAEf39/fwF/YAN/fX0AYAF/AX1gDX9/f39/f39/f39/f38AYAh/f39/f39/fwBgAAF8YAN/f30AYAR/fX9/AGAFf39/fX0AYAJ9fQF8YAJ/fAF8YAJ8fAF8YAF+AX9gA3x+fgF8YAJ9fQF9YAJ8fwF9YAN/fn8BfmAFf39/fn4AYAd/f39/f39/AAKOhICAABIDZW52Fl9lbWJpbmRfcmVnaXN0ZXJfY2xhc3MAFANlbnYYX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uAAADZW52C19fY3hhX3Rocm93AAYDZW52Il9lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IACgNlbnYNX19hc3NlcnRfZmFpbAAIA2Vudh9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uABUDZW52FV9lbWJpbmRfcmVnaXN0ZXJfdm9pZAAEA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2Jvb2wACQNlbnYYX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyAAkDZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZmxvYXQABgNlbnYbX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAQDZW52HF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcABgNlbnYWX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAAEA2VudhxfZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3AAYDZW52FWVtc2NyaXB0ZW5fbWVtY3B5X2JpZwAGA2VudhZlbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwAAADZW52BWFib3J0AAcDZW52F19lbWJpbmRfcmVnaXN0ZXJfYmlnaW50ACMD7IKAgADqAgcHBwACAgECAgICAgICAAEEBAQHAAICAQICAgIAAQYEAAAFBQUAAAsBBAEGAwMDBQQEAwUDAAAADQQAAwQEAAUDAwAABAAACQQAAAAAAAADAAQEFgsABQYAAxEEAAAGAAEDBQADAAEIBAQBAQAG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ACAAowsQACABmiABIAAbEJoCIAGiCxUBAX8jAEEQayIBIAA5AwggASsDCAsQACAARAAAAAAAAABwEJkCCxAAIABEAAAAAAAAABAQmQILBQAgAJkLmQkDBn8Dfgl8IwBBEGsiAiQAIAG9IghCNIinIgNB/w9xIgRBwndqIQUCQAJAAkAgAL0iCUI0iKciBkGBcGpBgnBJDQBBACEHIAVB/35LDQELAkAgCEIBhiIKQn98Qv////////9vVA0ARAAAAAAAAPA/IQsgCUKAgICAgICA+D9RDQIgClANAgJAAkAgCUIBhiIJQoCAgICAgIBwVg0AIApCgYCAgICAgHBUDQELIAAgAaAhCwwDCyAJQoCAgICAgIDw/wBRDQJEAAAAAAAAAAAgASABoiAJQv/////////v/wBWIAhCf1VzGyELDAILAkAgCUIBhkJ/fEL/////////b1QNACAAIACiIQsCQCAJQn9VDQAgC5ogCyAIEJ8CQQFGGyELCyAIQn9VDQIgAkQAAAAAAADwPyALozkDCCACKwMIIQsMAgtBACEHAkAgCUJ/VQ0AAkAgCBCfAiIHDQAgABCYAiELDAMLIAZB/w9xIQYgCUL///////////8AgyEJIAdBAUZBEnQhBwsCQCAFQf9+Sw0ARAAAAAAAAPA/IQsgCUKAgICAgICA+D9RDQICQCAEQb0HSw0AIAEgAZogCUKAgICAgICA+D9WG0QAAAAAAADwP6AhCwwDCwJAIANBgBBJIAlCgYCAgICAgPg/VEYNAEEAEJsCIQsMAwtBABCcAiELDAILIAYNACAARAAAAAAAADBDor1C////////////AINCgICAgICAgOB8fCEJCwJAIAhCgICAQIO/IgwgCSAJQoCAgICw1dqMQHwiCEKAgICAgICAeIN9IglCgICAgAh8QoCAgIBwg78iCyAIQi2Ip0H/AHFBBXQiBUHQLWorAwAiDaJEAAAAAAAA8L+gIgAgAEEAKwOYLSIOoiIPoiIQIAhCNIentyIRQQArA4gtoiAFQeAtaisDAKAiEiAAIA0gCb8gC6GiIhOgIgCgIgugIg0gECALIA2hoCATIA8gDiAAoiIOoKIgEUEAKwOQLaIgBUHoLWorAwCgIAAgEiALoaCgoKAgACAAIA6iIguiIAsgCyAAQQArA8gtokEAKwPALaCiIABBACsDuC2iQQArA7AtoKCiIABBACsDqC2iQQArA6AtoKCioCIPoCILvUKAgIBAg78iDqIiAL0iCUI0iKdB/w9xIgVBt3hqQT9JDQACQCAFQcgHSw0AIABEAAAAAAAA8D+gIgCaIAAgBxshCwwCCyAFQYkISSEGQQAhBSAGDQACQCAJQn9VDQAgBxCcAiELDAILIAcQmwIhCwwBCyABIAyhIA6iIA8gDSALoaAgCyAOoaAgAaKgIABBACsDmByiQQArA6AcIgGgIgsgAaEiAUEAKwOwHKIgAUEAKwOoHKIgAKCgoCIAIACiIgEgAaIgAEEAKwPQHKJBACsDyBygoiABIABBACsDwByiQQArA7gcoKIgC70iCadBBHRB8A9xIgZBiB1qKwMAIACgoKAhACAGQZAdaikDACAJIAetfEIthnwhCAJAIAUNACAAIAggCRCgAiELDAELIAi/IgEgAKIgAaAhCwsgAkEQaiQAIAsLVQICfwF+QQAhAQJAIABCNIinQf8PcSICQf8HSQ0AQQIhASACQbMISw0AQQAhAUIBQbMIIAJrrYYiA0J/fCAAg0IAUg0AQQJBASADIACDUBshAQsgAQuKAgIBfwR8IwBBEGsiAyQAAkACQCACQoCAgIAIg0IAUg0AIAFCgICAgICAgPhAfL8iBCAAoiAEoEQAAAAAAAAAf6IhAAwBCwJAIAFCgICAgICAgPA/fCICvyIEIACiIgUgBKAiABCdAkQAAAAAAADwP2NFDQAgA0KAgICAgICACDcDCCADIAMrAwhEAAAAAAAAEACiOQMIIAJCgICAgICAgICAf4O/IABEAAAAAAAA8L9EAAAAAAAA8D8gAEQAAAAAAAAAAGMbIgagIgcgBSAEIAChoCAAIAYgB6GgoKAgBqEiACAARAAAAAAAAAAAYRshAAsgAEQAAAAAAAAQAKIhAAsgA0EQaiQAIAALDAAgACAAkyIAIACVCxAAIAGMIAEgABsQowIgAZQLFQEBfyMAQRBrIgEgADgCDCABKgIMCwwAIABDAAAAcBCiAgsMACAAQwAAABAQogILpAMDBH8BfQF8IAG8IgIQpwIhAwJAAkACQAJAAkAgALwiBEGAgICEeGpBgICAiHhJDQBBACEFIAMNAQwDCyADRQ0BC0MAAIA/IQYgBEGAgID8A0YNAiACQQF0IgNFDQICQAJAIARBAXQiBEGAgIB4Sw0AIANBgYCAeEkNAQsgACABkg8LIARBgICA+AdGDQJDAAAAACABIAGUIARB////9wdLIAJBf0pzGw8LAkAgBBCnAkUNACAAIACUIQYCQCAEQX9KDQAgBowgBiACEKgCQQFGGyEGCyACQX9KDQJDAACAPyAGlRCpAg8LQQAhBQJAIARBf0oNAAJAIAIQqAIiAw0AIAAQoQIPCyAEQf////8HcSEEIANBAUZBEHQhBQsgBEH///8DSw0AIABDAAAAS5S8Qf////8HcUGAgICkf2ohBAsCQCAEEKoCIAG7oiIHvUKAgICAgIDg//8Ag0KBgICAgIDAr8AAVA0AAkAgB0Rx1dH///9fQGRFDQAgBRCkAg8LIAdEAAAAAADAYsBlRQ0AIAUQpQIPCyAHIAUQqwIhBgsgBgsTACAAQQF0QYCAgAhqQYGAgAhJC00BAn9BACEBAkAgAEEXdkH/AXEiAkH/AEkNAEECIQEgAkGWAUsNAEEAIQFBAUGWASACa3QiAkF/aiAAcQ0AQQFBAiACIABxGyEBCyABCxUBAX8jAEEQayIBIAA4AgwgASoCDAuFAQIBfwJ8QQArA5hSIAAgAEGAgLSGfGoiAUGAgIB8cWu+uyABQQ92QfABcSIAQZjQAGorAwCiRAAAAAAAAPC/oCICokEAKwOgUqAgAiACoiIDIAOiokEAKwOoUiACokEAKwOwUqAgA6JBACsDuFIgAqIgAEGg0ABqKwMAIAFBF3W3oKCgoAtkAgJ8AX5BACsD2E8gAEEAKwPQTyICIACgIgMgAqGhIgCiQQArA+BPoCAAIACiokEAKwPoTyAAokQAAAAAAADwP6CgIAO9IgQgAa18Qi+GIASnQR9xQQN0QdDNAGopAwB8v6K2CyQBAn8CQCAAEK0CQQFqIgEQrwIiAg0AQQAPCyACIAAgARCVAgtyAQN/IAAhAQJAAkAgAEEDcUUNACAAIQEDQCABLQAARQ0CIAFBAWoiAUEDcQ0ACwsDQCABIgJBBGohASACKAIAIgNBf3MgA0H//ft3anFBgIGChHhxRQ0ACwNAIAIiAUEBaiECIAEtAAANAAsLIAEgAGsLBgBBkNsAC4kvAQt/IwBBEGsiASQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB9AFLDQACQEEAKAKUWyICQRAgAEELakF4cSAAQQtJGyIDQQN2IgR2IgBBA3FFDQACQAJAIABBf3NBAXEgBGoiBUEDdCIEQbzbAGoiACAEQcTbAGooAgAiBCgCCCIDRw0AQQAgAkF+IAV3cTYClFsMAQsgAyAANgIMIAAgAzYCCAsgBEEIaiEAIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIANBACgCnFsiBk0NAQJAIABFDQACQAJAIAAgBHRBAiAEdCIAQQAgAGtycSIAQQAgAGtxQX9qIgAgAEEMdkEQcSIAdiIEQQV2QQhxIgUgAHIgBCAFdiIAQQJ2QQRxIgRyIAAgBHYiAEEBdkECcSIEciAAIAR2IgBBAXZBAXEiBHIgACAEdmoiBEEDdCIAQbzbAGoiBSAAQcTbAGooAgAiACgCCCIHRw0AQQAgAkF+IAR3cSICNgKUWwwBCyAHIAU2AgwgBSAHNgIICyAAIANBA3I2AgQgACADaiIHIARBA3QiBCADayIFQQFyNgIEIAAgBGogBTYCAAJAIAZFDQAgBkF4cUG82wBqIQNBACgCqFshBAJAAkAgAkEBIAZBA3Z0IghxDQBBACACIAhyNgKUWyADIQgMAQsgAygCCCEICyADIAQ2AgggCCAENgIMIAQgAzYCDCAEIAg2AggLIABBCGohAEEAIAc2AqhbQQAgBTYCnFsMDAtBACgCmFsiCUUNASAJQQAgCWtxQX9qIgAgAEEMdkEQcSIAdiIEQQV2QQhxIgUgAHIgBCAFdiIAQQJ2QQRxIgRyIAAgBHYiAEEBdkECcSIEciAAIAR2IgBBAXZBAXEiBHIgACAEdmpBAnRBxN0AaigCACIHKAIEQXhxIANrIQQgByEFAkADQAJAIAUoAhAiAA0AIAVBFGooAgAiAEUNAgsgACgCBEF4cSADayIFIAQgBSAESSIFGyEEIAAgByAFGyEHIAAhBQwACwALIAcoAhghCgJAIAcoAgwiCCAHRg0AIAcoAggiAEEAKAKkW0kaIAAgCDYCDCAIIAA2AggMCwsCQCAHQRRqIgUoAgAiAA0AIAcoAhAiAEUNAyAHQRBqIQULA0AgBSELIAAiCEEUaiIFKAIAIgANACAIQRBqIQUgCCgCECIADQALIAtBADYCAAwKC0F/IQMgAEG/f0sNACAAQQtqIgBBeHEhA0EAKAKYWyIGRQ0AQQAhCwJAIANBgAJJDQBBHyELIANB////B0sNACAAQQh2IgAgAEGA/j9qQRB2QQhxIgB0IgQgBEGA4B9qQRB2QQRxIgR0IgUgBUGAgA9qQRB2QQJxIgV0QQ92IAAgBHIgBXJrIgBBAXQgAyAAQRVqdkEBcXJBHGohCwtBACADayEEAkACQAJAAkAgC0ECdEHE3QBqKAIAIgUNAEEAIQBBACEIDAELQQAhACADQQBBGSALQQF2ayALQR9GG3QhB0EAIQgDQAJAIAUoAgRBeHEgA2siAiAETw0AIAIhBCAFIQggAg0AQQAhBCAFIQggBSEADAMLIAAgBUEUaigCACICIAIgBSAHQR12QQRxakEQaigCACIFRhsgACACGyEAIAdBAXQhByAFDQALCwJAIAAgCHINAEEAIQhBAiALdCIAQQAgAGtyIAZxIgBFDQMgAEEAIABrcUF/aiIAIABBDHZBEHEiAHYiBUEFdkEIcSIHIAByIAUgB3YiAEECdkEEcSIFciAAIAV2IgBBAXZBAnEiBXIgACAFdiIAQQF2QQFxIgVyIAAgBXZqQQJ0QcTdAGooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIANrIgIgBEkhBwJAIAAoAhAiBQ0AIABBFGooAgAhBQsgAiAEIAcbIQQgACAIIAcbIQggBSEAIAUNAAsLIAhFDQAgBEEAKAKcWyADa08NACAIKAIYIQsCQCAIKAIMIgcgCEYNACAIKAIIIgBBACgCpFtJGiAAIAc2AgwgByAANgIIDAkLAkAgCEEUaiIFKAIAIgANACAIKAIQIgBFDQMgCEEQaiEFCwNAIAUhAiAAIgdBFGoiBSgCACIADQAgB0EQaiEFIAcoAhAiAA0ACyACQQA2AgAMCAsCQEEAKAKcWyIAIANJDQBBACgCqFshBAJAAkAgACADayIFQRBJDQBBACAFNgKcW0EAIAQgA2oiBzYCqFsgByAFQQFyNgIEIAQgAGogBTYCACAEIANBA3I2AgQMAQtBAEEANgKoW0EAQQA2ApxbIAQgAEEDcjYCBCAEIABqIgAgACgCBEEBcjYCBAsgBEEIaiEADAoLAkBBACgCoFsiByADTQ0AQQAgByADayIENgKgW0EAQQAoAqxbIgAgA2oiBTYCrFsgBSAEQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMCgsCQAJAQQAoAuxeRQ0AQQAoAvReIQQMAQtBAEJ/NwL4XkEAQoCggICAgAQ3AvBeQQAgAUEMakFwcUHYqtWqBXM2AuxeQQBBADYCgF9BAEEANgLQXkGAICEEC0EAIQAgBCADQS9qIgZqIgJBACAEayILcSIIIANNDQlBACEAAkBBACgCzF4iBEUNAEEAKALEXiIFIAhqIgkgBU0NCiAJIARLDQoLQQAtANBeQQRxDQQCQAJAAkBBACgCrFsiBEUNAEHU3gAhAANAAkAgACgCACIFIARLDQAgBSAAKAIEaiAESw0DCyAAKAIIIgANAAsLQQAQsgIiB0F/Rg0FIAghAgJAQQAoAvBeIgBBf2oiBCAHcUUNACAIIAdrIAQgB2pBACAAa3FqIQILIAIgA00NBSACQf7///8HSw0FAkBBACgCzF4iAEUNAEEAKALEXiIEIAJqIgUgBE0NBiAFIABLDQYLIAIQsgIiACAHRw0BDAcLIAIgB2sgC3EiAkH+////B0sNBCACELICIgcgACgCACAAKAIEakYNAyAHIQALAkAgAEF/Rg0AIANBMGogAk0NAAJAIAYgAmtBACgC9F4iBGpBACAEa3EiBEH+////B00NACAAIQcMBwsCQCAEELICQX9GDQAgBCACaiECIAAhBwwHC0EAIAJrELICGgwECyAAIQcgAEF/Rw0FDAMLQQAhCAwHC0EAIQcMBQsgB0F/Rw0CC0EAQQAoAtBeQQRyNgLQXgsgCEH+////B0sNASAIELICIQdBABCyAiEAIAdBf0YNASAAQX9GDQEgByAATw0BIAAgB2siAiADQShqTQ0BC0EAQQAoAsReIAJqIgA2AsReAkAgAEEAKALIXk0NAEEAIAA2AsheCwJAAkACQAJAQQAoAqxbIgRFDQBB1N4AIQADQCAHIAAoAgAiBSAAKAIEIghqRg0CIAAoAggiAA0ADAMLAAsCQAJAQQAoAqRbIgBFDQAgByAATw0BC0EAIAc2AqRbC0EAIQBBACACNgLYXkEAIAc2AtReQQBBfzYCtFtBAEEAKALsXjYCuFtBAEEANgLgXgNAIABBA3QiBEHE2wBqIARBvNsAaiIFNgIAIARByNsAaiAFNgIAIABBAWoiAEEgRw0AC0EAIAJBWGoiAEF4IAdrQQdxQQAgB0EIakEHcRsiBGsiBTYCoFtBACAHIARqIgQ2AqxbIAQgBUEBcjYCBCAHIABqQSg2AgRBAEEAKAL8XjYCsFsMAgsgAC0ADEEIcQ0AIAQgBUkNACAEIAdPDQAgACAIIAJqNgIEQQAgBEF4IARrQQdxQQAgBEEIakEHcRsiAGoiBTYCrFtBAEEAKAKgWyACaiIHIABrIgA2AqBbIAUgAEEBcjYCBCAEIAdqQSg2AgRBAEEAKAL8XjYCsFsMAQsCQCAHQQAoAqRbIghPDQBBACAHNgKkWyAHIQgLIAcgAmohBUHU3gAhAAJAAkACQAJAAkACQAJAA0AgACgCACAFRg0BIAAoAggiAA0ADAILAAsgAC0ADEEIcUUNAQtB1N4AIQADQAJAIAAoAgAiBSAESw0AIAUgACgCBGoiBSAESw0DCyAAKAIIIQAMAAsACyAAIAc2AgAgACAAKAIEIAJqNgIEIAdBeCAHa0EHcUEAIAdBCGpBB3EbaiILIANBA3I2AgQgBUF4IAVrQQdxQQAgBUEIakEHcRtqIgIgCyADaiIDayEAAkAgAiAERw0AQQAgAzYCrFtBAEEAKAKgWyAAaiIANgKgWyADIABBAXI2AgQMAwsCQCACQQAoAqhbRw0AQQAgAzYCqFtBAEEAKAKcWyAAaiIANgKcWyADIABBAXI2AgQgAyAAaiAANgIADAMLAkAgAigCBCIEQQNxQQFHDQAgBEF4cSEGAkACQCAEQf8BSw0AIAIoAggiBSAEQQN2IghBA3RBvNsAaiIHRhoCQCACKAIMIgQgBUcNAEEAQQAoApRbQX4gCHdxNgKUWwwCCyAEIAdGGiAFIAQ2AgwgBCAFNgIIDAELIAIoAhghCQJAAkAgAigCDCIHIAJGDQAgAigCCCIEIAhJGiAEIAc2AgwgByAENgIIDAELAkAgAkEUaiIEKAIAIgUNACACQRBqIgQoAgAiBQ0AQQAhBwwBCwNAIAQhCCAFIgdBFGoiBCgCACIFDQAgB0EQaiEEIAcoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAIgAigCHCIFQQJ0QcTdAGoiBCgCAEcNACAEIAc2AgAgBw0BQQBBACgCmFtBfiAFd3E2AphbDAILIAlBEEEUIAkoAhAgAkYbaiAHNgIAIAdFDQELIAcgCTYCGAJAIAIoAhAiBEUNACAHIAQ2AhAgBCAHNgIYCyACKAIUIgRFDQAgB0EUaiAENgIAIAQgBzYCGAsgBiAAaiEAIAIgBmoiAigCBCEECyACIARBfnE2AgQgAyAAQQFyNgIEIAMgAGogADYCAAJAIABB/wFLDQAgAEF4cUG82wBqIQQCQAJAQQAoApRbIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYClFsgBCEADAELIAQoAgghAAsgBCADNgIIIAAgAzYCDCADIAQ2AgwgAyAANgIIDAMLQR8hBAJAIABB////B0sNACAAQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgcgB0GAgA9qQRB2QQJxIgd0QQ92IAQgBXIgB3JrIgRBAXQgACAEQRVqdkEBcXJBHGohBAsgAyAENgIcIANCADcCECAEQQJ0QcTdAGohBQJAAkBBACgCmFsiB0EBIAR0IghxDQBBACAHIAhyNgKYWyAFIAM2AgAgAyAFNgIYDAELIABBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhBwNAIAciBSgCBEF4cSAARg0DIARBHXYhByAEQQF0IQQgBSAHQQRxakEQaiIIKAIAIgcNAAsgCCADNgIAIAMgBTYCGAsgAyADNgIMIAMgAzYCCAwCC0EAIAJBWGoiAEF4IAdrQQdxQQAgB0EIakEHcRsiCGsiCzYCoFtBACAHIAhqIgg2AqxbIAggC0EBcjYCBCAHIABqQSg2AgRBAEEAKAL8XjYCsFsgBCAFQScgBWtBB3FBACAFQVlqQQdxG2pBUWoiACAAIARBEGpJGyIIQRs2AgQgCEEQakEAKQLcXjcCACAIQQApAtReNwIIQQAgCEEIajYC3F5BACACNgLYXkEAIAc2AtReQQBBADYC4F4gCEEYaiEAA0AgAEEHNgIEIABBCGohByAAQQRqIQAgByAFSQ0ACyAIIARGDQMgCCAIKAIEQX5xNgIEIAQgCCAEayIHQQFyNgIEIAggBzYCAAJAIAdB/wFLDQAgB0F4cUG82wBqIQACQAJAQQAoApRbIgVBASAHQQN2dCIHcQ0AQQAgBSAHcjYClFsgACEFDAELIAAoAgghBQsgACAENgIIIAUgBDYCDCAEIAA2AgwgBCAFNgIIDAQLQR8hAAJAIAdB////B0sNACAHQQh2IgAgAEGA/j9qQRB2QQhxIgB0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAAgBXIgCHJrIgBBAXQgByAAQRVqdkEBcXJBHGohAAsgBCAANgIcIARCADcCECAAQQJ0QcTdAGohBQJAAkBBACgCmFsiCEEBIAB0IgJxDQBBACAIIAJyNgKYWyAFIAQ2AgAgBCAFNgIYDAELIAdBAEEZIABBAXZrIABBH0YbdCEAIAUoAgAhCANAIAgiBSgCBEF4cSAHRg0EIABBHXYhCCAAQQF0IQAgBSAIQQRxakEQaiICKAIAIggNAAsgAiAENgIAIAQgBTYCGAsgBCAENgIMIAQgBDYCCAwDCyAFKAIIIgAgAzYCDCAFIAM2AgggA0EANgIYIAMgBTYCDCADIAA2AggLIAtBCGohAAwFCyAFKAIIIgAgBDYCDCAFIAQ2AgggBEEANgIYIAQgBTYCDCAEIAA2AggLQQAoAqBbIgAgA00NAEEAIAAgA2siBDYCoFtBAEEAKAKsWyIAIANqIgU2AqxbIAUgBEEBcjYCBCAAIANBA3I2AgQgAEEIaiEADAMLEK4CQTA2AgBBACEADAILAkAgC0UNAAJAAkAgCCAIKAIcIgVBAnRBxN0AaiIAKAIARw0AIAAgBzYCACAHDQFBACAGQX4gBXdxIgY2AphbDAILIAtBEEEUIAsoAhAgCEYbaiAHNgIAIAdFDQELIAcgCzYCGAJAIAgoAhAiAEUNACAHIAA2AhAgACAHNgIYCyAIQRRqKAIAIgBFDQAgB0EUaiAANgIAIAAgBzYCGAsCQAJAIARBD0sNACAIIAQgA2oiAEEDcjYCBCAIIABqIgAgACgCBEEBcjYCBAwBCyAIIANBA3I2AgQgCCADaiIHIARBAXI2AgQgByAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbzbAGohAAJAAkBBACgClFsiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKUWyAAIQQMAQsgACgCCCEECyAAIAc2AgggBCAHNgIMIAcgADYCDCAHIAQ2AggMAQtBHyEAAkAgBEH///8HSw0AIARBCHYiACAAQYD+P2pBEHZBCHEiAHQiBSAFQYDgH2pBEHZBBHEiBXQiAyADQYCAD2pBEHZBAnEiA3RBD3YgACAFciADcmsiAEEBdCAEIABBFWp2QQFxckEcaiEACyAHIAA2AhwgB0IANwIQIABBAnRBxN0AaiEFAkACQAJAIAZBASAAdCIDcQ0AQQAgBiADcjYCmFsgBSAHNgIAIAcgBTYCGAwBCyAEQQBBGSAAQQF2ayAAQR9GG3QhACAFKAIAIQMDQCADIgUoAgRBeHEgBEYNAiAAQR12IQMgAEEBdCEAIAUgA0EEcWpBEGoiAigCACIDDQALIAIgBzYCACAHIAU2AhgLIAcgBzYCDCAHIAc2AggMAQsgBSgCCCIAIAc2AgwgBSAHNgIIIAdBADYCGCAHIAU2AgwgByAANgIICyAIQQhqIQAMAQsCQCAKRQ0AAkACQCAHIAcoAhwiBUECdEHE3QBqIgAoAgBHDQAgACAINgIAIAgNAUEAIAlBfiAFd3E2AphbDAILIApBEEEUIAooAhAgB0YbaiAINgIAIAhFDQELIAggCjYCGAJAIAcoAhAiAEUNACAIIAA2AhAgACAINgIYCyAHQRRqKAIAIgBFDQAgCEEUaiAANgIAIAAgCDYCGAsCQAJAIARBD0sNACAHIAQgA2oiAEEDcjYCBCAHIABqIgAgACgCBEEBcjYCBAwBCyAHIANBA3I2AgQgByADaiIFIARBAXI2AgQgBSAEaiAENgIAAkAgBkUNACAGQXhxQbzbAGohA0EAKAKoWyEAAkACQEEBIAZBA3Z0IgggAnENAEEAIAggAnI2ApRbIAMhCAwBCyADKAIIIQgLIAMgADYCCCAIIAA2AgwgACADNgIMIAAgCDYCCAtBACAFNgKoW0EAIAQ2ApxbCyAHQQhqIQALIAFBEGokACAAC+4MAQd/AkAgAEUNACAAQXhqIgEgAEF8aigCACICQXhxIgBqIQMCQCACQQFxDQAgAkEDcUUNASABIAEoAgAiAmsiAUEAKAKkWyIESQ0BIAIgAGohAAJAIAFBACgCqFtGDQACQCACQf8BSw0AIAEoAggiBCACQQN2IgVBA3RBvNsAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoApRbQX4gBXdxNgKUWwwDCyACIAZGGiAEIAI2AgwgAiAENgIIDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiACIAY2AgwgBiACNgIIDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QcTdAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCmFtBfiAEd3E2AphbDAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNAEEAIAA2ApxbIAMgAkF+cTYCBCABIABBAXI2AgQgASAAaiAANgIADwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKsW0cNAEEAIAE2AqxbQQBBACgCoFsgAGoiADYCoFsgASAAQQFyNgIEIAFBACgCqFtHDQNBAEEANgKcW0EAQQA2AqhbDwsCQCADQQAoAqhbRw0AQQAgATYCqFtBAEEAKAKcWyAAaiIANgKcWyABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBvNsAaiIGRhoCQCADKAIMIgIgBEcNAEEAQQAoApRbQX4gBXdxNgKUWwwCCyACIAZGGiAEIAI2AgwgAiAENgIIDAELIAMoAhghBwJAAkAgAygCDCIGIANGDQAgAygCCCICQQAoAqRbSRogAiAGNgIMIAYgAjYCCAwBCwJAIANBFGoiAigCACIEDQAgA0EQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0AAkACQCADIAMoAhwiBEECdEHE3QBqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAphbQX4gBHdxNgKYWwwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAEEBcjYCBCABIABqIAA2AgAgAUEAKAKoW0cNAUEAIAA2ApxbDwsgAyACQX5xNgIEIAEgAEEBcjYCBCABIABqIAA2AgALAkAgAEH/AUsNACAAQXhxQbzbAGohAgJAAkBBACgClFsiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKUWyACIQAMAQsgAigCCCEACyACIAE2AgggACABNgIMIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEHE3QBqIQQCQAJAAkACQEEAKAKYWyIGQQEgAnQiA3ENAEEAIAYgA3I2AphbIAQgATYCACABIAQ2AhgMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGA0AgBiIEKAIEQXhxIABGDQIgAkEddiEGIAJBAXQhAiAEIAZBBHFqQRBqIgMoAgAiBg0ACyADIAE2AgAgASAENgIYCyABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAK0W0F/aiIBQX8gARs2ArRbCwsHAD8AQRB0C1IBAn9BACgCgFsiASAAQQNqQXxxIgJqIQACQAJAIAJFDQAgACABTQ0BCwJAIAAQsQJNDQAgABAPRQ0BC0EAIAA2AoBbIAEPCxCuAkEwNgIAQX8LMwEBfyAAQQEgABshAQJAA0AgARCvAiIADQECQBC+AiIARQ0AIAARBwAMAQsLEBAACyAACwcAIAAQswILBwAgABCwAgsHACAAELUCCxAAIABByNgAQQhqNgIAIAALPAECfyABEK0CIgJBDWoQswIiA0EANgIIIAMgAjYCBCADIAI2AgAgACADELkCIAEgAkEBahCVAjYCACAACwcAIABBDGoLIAAgABC3AiIAQbjZAEEIajYCACAAQQRqIAEQuAIaIAALBABBAQsFABAQAAsHACAAKAIACwkAQYTfABC9AgsLAEGkD0EAELwCAAtZAQJ/IAEtAAAhAgJAIAAtAAAiA0UNACADIAJB/wFxRw0AA0AgAS0AASECIAAtAAEiA0UNASABQQFqIQEgAEEBaiEAIAMgAkH/AXFGDQALCyADIAJB/wFxawsHACAAEOwCCwIACwIACwoAIAAQwQIQtQILCgAgABDBAhC1AgsKACAAEMECELUCCwoAIAAQwQIQtQILCwAgACABQQAQyQILMAACQCACDQAgACgCBCABKAIERg8LAkAgACABRw0AQQEPCyAAEMoCIAEQygIQwAJFCwcAIAAoAgQLsAEBAn8jAEHAAGsiAyQAQQEhBAJAIAAgAUEAEMkCDQBBACEEIAFFDQBBACEEIAFB5NIAQZTTAEEAEMwCIgFFDQAgA0EIakEEckEAQTQQlwIaIANBATYCOCADQX82AhQgAyAANgIQIAMgATYCCCABIANBCGogAigCAEEBIAEoAgAoAhwRCAACQCADKAIgIgRBAUcNACACIAMoAhg2AgALIARBAUYhBAsgA0HAAGokACAEC8wCAQN/IwBBwABrIgQkACAAKAIAIgVBfGooAgAhBiAFQXhqKAIAIQUgBEEgakIANwMAIARBKGpCADcDACAEQTBqQgA3AwAgBEE3akIANwAAIARCADcDGCAEIAM2AhQgBCABNgIQIAQgADYCDCAEIAI2AgggACAFaiEAQQAhAwJAAkAgBiACQQAQyQJFDQAgBEEBNgI4IAYgBEEIaiAAIABBAUEAIAYoAgAoAhQRCgAgAEEAIAQoAiBBAUYbIQMMAQsgBiAEQQhqIABBAUEAIAYoAgAoAhgRCQACQAJAIAQoAiwOAgABAgsgBCgCHEEAIAQoAihBAUYbQQAgBCgCJEEBRhtBACAEKAIwQQFGGyEDDAELAkAgBCgCIEEBRg0AIAQoAjANASAEKAIkQQFHDQEgBCgCKEEBRw0BCyAEKAIYIQMLIARBwABqJAAgAwtgAQF/AkAgASgCECIEDQAgAUEBNgIkIAEgAzYCGCABIAI2AhAPCwJAAkAgBCACRw0AIAEoAhhBAkcNASABIAM2AhgPCyABQQE6ADYgAUECNgIYIAEgASgCJEEBajYCJAsLHwACQCAAIAEoAghBABDJAkUNACABIAEgAiADEM0CCws4AAJAIAAgASgCCEEAEMkCRQ0AIAEgASACIAMQzQIPCyAAKAIIIgAgASACIAMgACgCACgCHBEIAAtPAQJ/QQEhAwJAAkAgAC0ACEEYcQ0AQQAhAyABRQ0BIAFB5NIAQcTTAEEAEMwCIgRFDQEgBC0ACEEYcUEARyEDCyAAIAEgAxDJAiEDCyADC6QEAQR/IwBBwABrIgMkAAJAAkAgAUHQ1QBBABDJAkUNACACQQA2AgBBASEEDAELAkAgACABIAEQ0AJFDQBBASEEIAIoAgAiAUUNASACIAEoAgA2AgAMAQsCQCABRQ0AQQAhBCABQeTSAEH00wBBABDMAiIBRQ0BAkAgAigCACIFRQ0AIAIgBSgCADYCAAsgASgCCCIFIAAoAggiBkF/c3FBB3ENASAFQX9zIAZxQeAAcQ0BQQEhBCAAKAIMIAEoAgxBABDJAg0BAkAgACgCDEHE1QBBABDJAkUNACABKAIMIgFFDQIgAUHk0gBBqNQAQQAQzAJFIQQMAgsgACgCDCIFRQ0AQQAhBAJAIAVB5NIAQfTTAEEAEMwCIgZFDQAgAC0ACEEBcUUNAiAGIAEoAgwQ0gIhBAwCC0EAIQQCQCAFQeTSAEHk1ABBABDMAiIGRQ0AIAAtAAhBAXFFDQIgBiABKAIMENMCIQQMAgtBACEEIAVB5NIAQZTTAEEAEMwCIgBFDQEgASgCDCIBRQ0BQQAhBCABQeTSAEGU0wBBABDMAiIBRQ0BIANBCGpBBHJBAEE0EJcCGiADQQE2AjggA0F/NgIUIAMgADYCECADIAE2AgggASADQQhqIAIoAgBBASABKAIAKAIcEQgAAkAgAygCICIBQQFHDQAgAigCAEUNACACIAMoAhg2AgALIAFBAUYhBAwBC0EAIQQLIANBwABqJAAgBAuvAQECfwJAA0ACQCABDQBBAA8LQQAhAiABQeTSAEH00wBBABDMAiIBRQ0BIAEoAgggACgCCEF/c3ENAQJAIAAoAgwgASgCDEEAEMkCRQ0AQQEPCyAALQAIQQFxRQ0BIAAoAgwiA0UNAQJAIANB5NIAQfTTAEEAEMwCIgBFDQAgASgCDCEBDAELC0EAIQIgA0Hk0gBB5NQAQQAQzAIiAEUNACAAIAEoAgwQ0wIhAgsgAgtdAQF/QQAhAgJAIAFFDQAgAUHk0gBB5NQAQQAQzAIiAUUNACABKAIIIAAoAghBf3NxDQBBACECIAAoAgwgASgCDEEAEMkCRQ0AIAAoAhAgASgCEEEAEMkCIQILIAILnwEAIAFBAToANQJAIAEoAgQgA0cNACABQQE6ADQCQAJAIAEoAhAiAw0AIAFBATYCJCABIAQ2AhggASACNgIQIARBAUcNAiABKAIwQQFGDQEMAgsCQCADIAJHDQACQCABKAIYIgNBAkcNACABIAQ2AhggBCEDCyABKAIwQQFHDQIgA0EBRg0BDAILIAEgASgCJEEBajYCJAsgAUEBOgA2CwsgAAJAIAEoAgQgAkcNACABKAIcQQFGDQAgASADNgIcCwuCAgACQCAAIAEoAgggBBDJAkUNACABIAEgAiADENUCDwsCQAJAIAAgASgCACAEEMkCRQ0AAkACQCABKAIQIAJGDQAgASgCFCACRw0BCyADQQFHDQIgAUEBNgIgDwsgASADNgIgAkAgASgCLEEERg0AIAFBADsBNCAAKAIIIgAgASACIAJBASAEIAAoAgAoAhQRCgACQCABLQA1RQ0AIAFBAzYCLCABLQA0RQ0BDAMLIAFBBDYCLAsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQEgASgCGEECRw0BIAFBAToANg8LIAAoAggiACABIAIgAyAEIAAoAgAoAhgRCQALC5sBAAJAIAAgASgCCCAEEMkCRQ0AIAEgASACIAMQ1QIPCwJAIAAgASgCACAEEMkCRQ0AAkACQCABKAIQIAJGDQAgASgCFCACRw0BCyADQQFHDQEgAUEBNgIgDwsgASACNgIUIAEgAzYCICABIAEoAihBAWo2AigCQCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsgAUEENgIsCws+AAJAIAAgASgCCCAFEMkCRQ0AIAEgASACIAMgBBDUAg8LIAAoAggiACABIAIgAyAEIAUgACgCACgCFBEKAAshAAJAIAAgASgCCCAFEMkCRQ0AIAEgASACIAMgBBDUAgsLHgACQCAADQBBAA8LIABB5NIAQfTTAEEAEMwCQQBHCwQAIAALDQAgABDbAhogABC1AgsFAEHTCAsVACAAELcCIgBBoNgAQQhqNgIAIAALDQAgABDbAhogABC1AgsFAEGmCgsVACAAEN4CIgBBtNgAQQhqNgIAIAALDQAgABDbAhogABC1AgsFAEH+CAscACAAQbjZAEEIajYCACAAQQRqEOUCGiAAENsCCysBAX8CQCAAELsCRQ0AIAAoAgAQ5gIiAUEIahDnAkF/Sg0AIAEQtQILIAALBwAgAEF0agsVAQF/IAAgACgCAEF/aiIBNgIAIAELDQAgABDkAhogABC1AgsKACAAQQRqEOoCCwcAIAAoAgALDQAgABDkAhogABC1AgsEACAACwQAIwALBgAgACQACxIBAn8jACAAa0FwcSIBJAAgAQsVAEGg38ACJAJBlN8AQQ9qQXBxJAELBwAjACMBawsEACMCCwQAIwELAgALAgALDQBBiN8AEPQCQYzfAAsJAEGI3wAQ9QILBABBAQsCAAu5AgEDfwJAIAANAEEAIQECQEEAKAKQX0UNAEEAKAKQXxD6AiEBCwJAQQAoApBfRQ0AQQAoApBfEPoCIAFyIQELAkAQ9gIoAgAiAEUNAANAQQAhAgJAIAAoAkxBAEgNACAAEPgCIQILAkAgACgCFCAAKAIcRg0AIAAQ+gIgAXIhAQsCQCACRQ0AIAAQ+QILIAAoAjgiAA0ACwsQ9wIgAQ8LQQAhAgJAIAAoAkxBAEgNACAAEPgCIQILAkACQAJAIAAoAhQgACgCHEYNACAAQQBBACAAKAIkEQUAGiAAKAIUDQBBfyEBIAINAQwCCwJAIAAoAgQiASAAKAIIIgNGDQAgACABIANrrEEBIAAoAigRIQAaC0EAIQEgAEEANgIcIABCADcDECAAQgA3AgQgAkUNAQsgABD5AgsgAQscACAAIAEgAiADpyADQiCIpyAEpyAEQiCIpxARCwuP04CAAAIAQYAIC7RSdW5zaWduZWQgc2hvcnQAdW5zaWduZWQgaW50AGZsb2F0AHVpbnQ2NF90AHZlY3RvcgBTeW50aGVzaXplcgByZW5kZXIAdW5zaWduZWQgY2hhcgBzdGQ6OmV4Y2VwdGlvbgBub3RlT24AYm9vbABlbXNjcmlwdGVuOjp2YWwAYmFkX2FycmF5X25ld19sZW5ndGgALi9zeW50aF9zcmMvVW5pdEdlbmVyYXRvci5oAHVuc2lnbmVkIGxvbmcAc3RkOjp3c3RyaW5nAHN0ZDo6c3RyaW5nAHN0ZDo6dTE2c3RyaW5nAHN0ZDo6dTMyc3RyaW5nAG5vdGVPZmYAc2V0U2FtcGxlUmF0ZQBTeW50aGVzaXplckJhc2UAZG91YmxlAHZvaWQAc3RkOjpiYWRfYWxsb2MAZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgBzYW1wbGVSYXRlID4gMABQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQAxMVN5bnRoZXNpemVyAIgrAADCBwAAUDExU3ludGhlc2l6ZXIAAAwsAADYBwAAAAAAANAHAABQSzExU3ludGhlc2l6ZXIADCwAAPgHAAABAAAA0AcAAGlpAHYAdmkA6AcAACQrAABpaWkAAAAAANAHAAASAAAAEwAAAAAAAACQCAAAFAAAABUAAAAWAAAAMTFTaW1wbGVWb2ljZQA5Vm9pY2VCYXNlADEzVW5pdEdlbmVyYXRvcgAAAACIKwAAaQgAALArAABeCAAAfAgAALArAABQCAAAhAgAAAAAAACECAAAFwAAABgAAAAZAAAAAAAAAHwIAAAaAAAAGwAAAAAAAADgCAAAHAAAAB0AAAAxMkJpcXVhZEZpbHRlcgAAsCsAANAIAAB8CAAAAAAAAAwJAAAeAAAAHwAAADEyRW52ZWxvcGVBRFNSAACwKwAA/AgAAHwIAAAAAAAAaAkAACAAAAAhAAAAIgAAADIxU2F3dG9vdGhPc2NpbGxhdG9yRFBXADE4U2F3dG9vdGhPc2NpbGxhdG9yAAAAALArAABECQAAfAgAALArAAAsCQAAXAkAAAAAAABcCQAAIwAAACQAAAAlAAAAAAAAALQJAAAmAAAAJwAAADIyRGlmZmVyZW50aWF0ZWRQYXJhYm9sYQAAAACIKwAAmAkAAMQqAADoBwAA9CoAAHZpaWkAMThTeW50aGVzaXplcldyYXBwZXIAAACwKwAAzQkAANAHAABQMThTeW50aGVzaXplcldyYXBwZXIAAAAMLAAA8AkAAAAAAADkCQAAUEsxOFN5bnRoZXNpemVyV3JhcHBlcgAADCwAABgKAAABAAAA5AkAAAgKAAAkKwAAAAAAAOQJAAAoAAAAKQAAAAAAAAAAAAAAxCoAAAgKAABIKwAAJCsAAHZpaWlpAAAAAAAAALQKAAArAAAALAAAAC0AAAAxNVBvd2VyT2ZUd29UYWJsZQAxMUxvb2t1cFRhYmxlAIgrAACeCgAAsCsAAIwKAACsCgAAAAAAAKwKAAAuAAAALwAAABkAAABOU3QzX18yMTJiYXNpY19zdHJpbmdJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQAAiCsAANQKAABOU3QzX18yMTJiYXNpY19zdHJpbmdJaE5TXzExY2hhcl90cmFpdHNJaEVFTlNfOWFsbG9jYXRvckloRUVFRQAAiCsAABwLAABOU3QzX18yMTJiYXNpY19zdHJpbmdJd05TXzExY2hhcl90cmFpdHNJd0VFTlNfOWFsbG9jYXRvckl3RUVFRQAAiCsAAGQLAABOU3QzX18yMTJiYXNpY19zdHJpbmdJRHNOU18xMWNoYXJfdHJhaXRzSURzRUVOU185YWxsb2NhdG9ySURzRUVFRQAAAIgrAACsCwAATlN0M19fMjEyYmFzaWNfc3RyaW5nSURpTlNfMTFjaGFyX3RyYWl0c0lEaUVFTlNfOWFsbG9jYXRvcklEaUVFRUUAAACIKwAA+AsAAE4xMGVtc2NyaXB0ZW4zdmFsRQAAiCsAAEQMAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0ljRUUAAIgrAABgDAAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJYUVFAACIKwAAiAwAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWhFRQAAiCsAALAMAABOMTBlbXNjcmlwdGVuMTFt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'; + wasmBinaryFile = 'data:application/octet-stream;base64,AGFzbQEAAAAB1gIzYAF/AX9gAX8AYAJ/fwF/YAABf2ADf39/AX9gAn9/AGADf39/AGAAAGAEf39/fwBgBX9/f39/AGAGf39/f39/AGACf30AYAR/f39/AX9gAX0BfWABfAF8YAN/fX0BfWADf35/AX5gAn99AX1gAX8BfGAFf39/f38Bf2ADf319AGABfgF/YAF/AX1gBH9+fn8AYAZ/fH9/f38Bf2ACfn8Bf2ANf39/f39/f39/f39/fwBgCX9/f39/f39/fwBgA39/fQBgBH99f38AYAV/f399fQBgAn19AXxgAAF8YAJ/fAF8YAJ8fAF8YAF8AX9gAn5/AXxgA3x8fwF8YAN8fn4BfGABfABgAn19AX1gAnx/AX1gAnx/AXxgAn5+AXxgB39/f39/f38Bf2ADfn9/AX9gAXwBfmAEf39+fwF+YAV/f39+fgBgB39/f39/f38AYAR/fn9/AX8C0wQUA2VudhZfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzABoDZW52Il9lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IACgNlbnYNX19hc3NlcnRfZmFpbAAIA2Vudh9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uABsDZW52C19fY3hhX3Rocm93AAYDZW52FV9lbWJpbmRfcmVnaXN0ZXJfdm9pZAAFA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2Jvb2wACANlbnYYX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyAAkDZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZmxvYXQABgNlbnYbX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAUDZW52HF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcABgNlbnYWX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAAFA2VudhxfZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3AAYDZW52FGVtc2NyaXB0ZW5fbWVtY3B5X2pzAAYDZW52FmVtc2NyaXB0ZW5fcmVzaXplX2hlYXAAAANlbnYFYWJvcnQABxZ3YXNpX3NuYXBzaG90X3ByZXZpZXcxCGZkX2Nsb3NlAAAWd2FzaV9zbmFwc2hvdF9wcmV2aWV3MQhmZF93cml0ZQAMA2VudhdfZW1iaW5k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AQF/IABBACABEIsDIgIgAGsgASACGwsEAEEqCwUAEI0DCwYAQcTeBAsXAEEAQazeBDYCpN8EQQAQjgM2AtzeBAujAgEBf0EBIQMCQAJAIABFDQAgAUH/AE0NAQJAAkAQjwMoAmAoAgANACABQYB/cUGAvwNGDQMQ5AJBGTYCAAwBCwJAIAFB/w9LDQAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIPCwJAAkAgAUGAsANJDQAgAUGAQHFBgMADRw0BCyAAIAFBP3FBgAFyOgACIAAgAUEMdkHgAXI6AAAgACABQQZ2QT9xQYABcjoAAUEDDwsCQCABQYCAfGpB//8/Sw0AIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LEOQCQRk2AgALQX8hAwsgAw8LIAAgAToAAEEBCxUAAkAgAA0AQQAPCyAAIAFBABCRAwuPAQIBfgF/AkAgAL0iAkI0iKdB/w9xIgNB/w9GDQACQCADDQACQAJAIABEAAAAAAAAAABiDQBBACEDDAELIABEAAAAAAAA8EOiIAEQkwMhACABKAIAQUBqIQMLIAEgAzYCACAADwsgASADQYJ4ajYCACACQv////////+HgH+DQoCAgICAgIDwP4S/IQALIAALUwEBfgJAAkAgA0HAAHFFDQAgASADQUBqrYYhAkIAIQEMAQsgA0UNACABQcAAIANrrYggAiADrSIEhoQhAiABIASGIQELIAAgATcDACAAIAI3AwgLUwEBfgJAAkAgA0HAAHFFDQAgAiADQUBqrYghAUIAIQIMAQsgA0UNACACQcAAIANrrYYgASADrSIEiIQhASACIASIIQILIAAgATcDACAAIAI3AwgL5AMCAn8CfiMAQSBrIgIkAAJAAkAgAUL///////////8AgyIEQoCAgICAgMD/Q3wgBEKAgICAgIDAgLx/fFoNACAAQjyIIAFCBIaEIQQCQCAAQv//////////D4MiAEKBgICAgICAgAhUDQAgBEKBgICAgICAgMAAfCEFDAILIARCgICAgICAgIDAAHwhBSAAQoCAgICAgICACFINASAFIARCAYN8IQUMAQsCQCAAUCAEQoCAgICAgMD//wBUIARCgICAgICAwP//AFEbDQAg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CyAAQSAgFSAOIBNBgMAAcxCfAyAVIA4gFSAOShshDgwJCyAXIBZBAEhxDQpBPSEYIAAgBysDQCAVIBYgEyAOIAURGAAiDkEATg0IDAsLIAcgBykDQDwAN0EBIRYgCiEPIAshGyAZIRMMBQsgDi0AASEQIA5BAWohDgwACwALIA0hGCAADQggDEUNA0EBIQ4CQANAIAQgDkECdGooAgAiEEUNASADIA5BA3RqIBAgAiAGEJsDQQEhGCAOQQFqIg5BCkcNAAwKCwALQQEhGCAOQQpPDQgDQCAEIA5BAnRqKAIADQFBASEYIA5BAWoiDkEKRg0JDAALAAtBHCEYDAYLIAshGwsgFiAbIA9rIgEgFiABShsiFCASQf////8Hc0oNA0E9IRggFSASIBRqIhEgFSARShsiDiAQSg0EIABBICAOIBEgExCfAyAAIBogEhCZAyAAQTAgDiARIBNBgIAEcxCfAyAAQTAgFCABQQAQnwMgACAPIAEQmQMgAEEgIA4gESATQYDAAHMQnwMgBygCTCEBDAELCwtBACEYDAILQT0hGAsQ5AIgGDYCAEF/IRgLIAdB0ABqJAAgGAsZAAJAIAAtAABBIHENACABIAIgABCIAxoLC3QBA39BACEBAkAgACgCACwAABCKAw0AQQAPCwNAIAAoAgAhAkF/IQMCQCABQcyZs+YASw0AQX8gAiwAAEFQaiIDIAFBCmwiAWogAyABQf////8Hc0obIQMLIAAgAkEBajYCACADIQEgAiwAARCKAw0ACyADC7YEAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBd2oOEgABAgUDBAYHCAkKCwwNDg8QERILIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcD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IQILIAILnwEAIAFBAToANQJAIAEoAgQgA0cNACABQQE6ADQCQAJAIAEoAhAiAw0AIAFBATYCJCABIAQ2AhggASACNgIQIARBAUcNAiABKAIwQQFGDQEMAgsCQCADIAJHDQACQCABKAIYIgNBAkcNACABIAQ2AhggBCEDCyABKAIwQQFHDQIgA0EBRg0BDAILIAEgASgCJEEBajYCJAsgAUEBOgA2CwsgAAJAIAEoAgQgAkcNACABKAIcQQFGDQAgASADNgIcCwuCAgACQCAAIAEoAgggBBC5A0UNACABIAEgAiADEMUDDwsCQAJAIAAgASgCACAEELkDRQ0AAkACQCABKAIQIAJGDQAgASgCFCACRw0BCyADQQFHDQIgAUEBNgIgDwsgASADNgIgAkAgASgCLEEERg0AIAFBADsBNCAAKAIIIgAgASACIAJBASAEIAAoAgAoAhQRCgACQCABLQA1RQ0AIAFBAzYCLCABLQA0RQ0BDAMLIAFBBDYCLAsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQEgASgCGEECRw0BIAFBAToANg8LIAAoAggiACABIAIgAyAEIAAoAgAoAhgRCQALC5sBAAJAIAAgASgCCCAEELkDRQ0AIAEgASACIAMQxQMPCwJAIAAgASgCACAEELkDRQ0AAkACQCABKAIQIAJGDQAgASgCFCACRw0BCyADQQFHDQEgAUEBNgIgDwsgASACNgIUIAEgAzYCICABIAEoAihBAWo2AigCQCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsgAUEENgIsCws+AAJAIAAgASgCCCAFELkDRQ0AIAEgASACIAMgBBDEAw8LIAAoAggiACABIAIgAyAEIAUgACgCACgCFBEKAAshAAJAIAAgASgCCCAFELkDRQ0AIAEgASACIAMgBBDEAwsLHgACQCAADQBBAA8LIABB5NAEQfTRBEEAELwDQQBHCwQAIAALDQAgABDLAxogABDvAgsGAEHwgAQLFQAgABD1AiIAQaDWBEEIajYCACAACw0AIAAQywMaIAAQ7wILBgBBy4IECxUAIAAQzgMiAEG01gRBCGo2AgAgAAsNACAAEMsDGiAAEO8CCwYAQZ+BBAscACAAQbjXBEEIajYCACAAQQRqENUDGiAAEMsDCysBAX8CQCAAEPkCRQ0AIAAoAgAQ1gMiAUEIahDXA0F/Sg0AIAEQ7wILIAALBwAgAEF0agsVAQF/IAAgACgCAEF/aiIBNgIAIAELDQAgABDUAxogABDvAgsKACAAQQRqENoDCwcAIAAoAgALDQAgABDUAxogABDvAgsEACAACwYAIAAkAQsEACMBCxIAQYCABCQDQQBBD2pBcHEkAgsHACMAIwJrCwQAIwMLBAAjAgvDAgEDfwJAIAANAEEAIQECQEEAKAKI3gRFDQBBACgCiN4EEOMDIQELAkBBACgC4NkERQ0AQQAoAuDZBBDjAyABciEBCwJAEIMDKAIAIgBFDQADQEEAIQICQCAAKAJMQQBIDQAgABCFAyECCwJAIAAoAhQgACgCHEYNACAAEOMDIAFyIQELAkAgAkUNACAAEIYDCyAAKAI4IgANAAsLEIQDIAEPCwJAAkAgACgCTEEATg0AQQEhAgwBCyAAEIUDRSECCwJAAkACQCAAKAIUIAAoAhxGDQAgAEEAQQAgACgCJBEEABogACgCFA0AQX8hASACRQ0BDAILAkAgACgCBCIBIAAoAggiA0YNACAAIAEgA2usQQEgACgCKBEQABoLQQAhASAAQQA2AhwgAEIANwMQIABCADcCBCACDQELIAAQhgMLIAELBAAjAAsGACAAJAALEgECfyMAIABrQXBxIgEkACABCwQAIwALDQAgASACIAMgABEQAAslAQF+IAAgASACrSADrUIghoQgBBDoAyEFIAVCIIinEN0DIAWnCxwAIAAgASACIAOnIANCIIinIASnIARCIIinEBILEwAgACABpyABQiCIpyACIAMQEwsL8VkCAEGAgAQLtFgtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHVuc2lnbmVkIHNob3J0AHVuc2lnbmVkIGludABmbG9hdAB1aW50NjRfdAB2ZWN0b3IAU3ludGhlc2l6ZXIAcmVuZGVyAHVuc2lnbmVkIGNoYXIAc3RkOjpleGNlcHRpb24AbmFuAG5vdGVPbgBib29sAGVtc2NyaXB0ZW46OnZhbABiYWRfYXJyYXlfbmV3X2xlbmd0aAAuL3N5bnRoX3NyYy9Vbml0R2VuZXJhdG9yLmgAdW5zaWduZWQgbG9uZwBzdGQ6OndzdHJpbmcAc3RkOjpzdHJpbmcAc3RkOjp1MTZzdHJpbmcAc3RkOjp1MzJzdHJpbmcAaW5mAG5vdGVPZmYAc2V0U2FtcGxlUmF0ZQBTeW50aGVzaXplckJhc2UAZG91YmxlAHZvaWQAc3RkOjpiYWRfYWxsb2MATkFOAElORgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDY0X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgBzYW1wbGVSYXRlID4gMAAuAChudWxsKQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQBsaWJjKythYmk6IAAxMVN5bnRoZXNpemVyAAAAAIgqAQBHBAEAUDExU3ludGhlc2l6ZXIAAAwrAQBgBAEAAAAAAFgEAQBQSzExU3ludGhlc2l6ZXIADCsBAIAEAQABAAAAWAQBAGlpAHYAdmkAcAQBACQqAQBpaWkAAAAAAFgEAQATAAAAFAAAAAAAAABQBQEAFQAAABYAAAAXAAAAeAtkP+AtcD9fKXs/AACAP3icgj83Gog/HcmNP1OWoT0Zc9c9U5YhPm6joT5TliE+GXPXPUuroT0xMVNpbXBsZVZvaWNlADlWb2ljZUJhc2UAMTNVbml0R2VuZXJhdG9yAAAAAIgqAQApBQEAsCoBAB4FAQA8BQEAsCoBABAFAQBEBQEAAAAAAEQFAQAYAAAAGQAAABoAAAAAAAAAPAUBABsAAAAcAAAAAAAAAKAFAQAdAAAAHgAAADEyQmlxdWFkRmlsdGVyAACwKgEAkAUBADwFAQAAAAAAzAUBAB8AAAAgAAAAMTJFbnZlbG9wZUFEU1IAALAqAQC8BQEAPAUBAAAAAAAoBgEAIQAAACIAAAAjAAAAMjFTYXd0b290aE9zY2lsbGF0b3JEUFcAMThTYXd0b290aE9zY2lsbGF0b3IAAAAAsCoBAAQGAQA8BQEAsCoBAOwFAQAcBgEAAAAAABwGAQAkAAAAJQAAACYAAAAAAAAAdAYBACcAAAAoAAAAMjJEaWZmZXJlbnRpYXRlZFBhcmFib2xhAAAAAIgqAQBYBgEAxCkBAHAEAQD0KQEAdmlpaQAxOFN5bnRoZXNpemVyV3JhcHBlcgAAALAqAQCNBgEAWAQBAFAxOFN5bnRoZXNpemVyV3JhcHBlcgAAAAwrAQCwBgEAAAAAAKQGAQBQSzE4U3ludGhlc2l6ZXJXcmFwcGVyAAAMKwEA2AYBAAEAAACkBgEAyAYBACQqAQAAAAAApAYBACkAAAAqAAAAAAAAAAAAAADEKQEAyAYBAEgqAQAkKgEAdmlpaWkAAAAAAAAAdAcBACwAAAAtAAAALgAAADE1UG93ZXJPZlR3b1RhYmxlADExTG9va3VwVGFibGUAiCoBAF4HAQCwKgEATAcBAGwHAQAAAAAAbAcBAC8AAAAwAAAAGgAAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAACIKgEAlAcBAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0loTlNfMTFjaGFyX3RyYWl0c0loRUVOU185YWxsb2NhdG9ySWhFRUVFAACIKgEA3AcBAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAACIKgEAJAgBAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0lEc05TXzExY2hhcl90cmFpdHNJRHNFRU5TXzlhbGxvY2F0b3JJRHNFRUVFAAAAiCoBAGwIAQBOU3QzX18yMTJiYXNpY19zdHJpbmdJRGlOU18xMWNoYXJfdHJhaXRzSURpRUVOU185YWxsb2NhdG9ySURpRUVFRQAAAIgqAQC4CAEATjEwZW1zY3JpcHRlbjN2YWxFAACIKgEABAkBAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWNFRQAAiCoBACAJAQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lhRUUAAIgqAQBICQEATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJaEVFAACIKgEAcAkBAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SXNFRQAAiCoBAJgJAQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0l0RUUAAIgqAQDACQEATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJaUVFAACIKgEA6AkBAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWpFRQAAiCoBABAKAQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lsRUUAAIgqAQA4CgEATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJbUVFAACIKgEAYAoBAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SXhFRQAAiCoBAIgKAQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0l5RUUAAIgqAQCwCgEATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZkVFAACIKgEA2AoBAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWRFRQAAiCoBAAALAQD+gitlRxVnQAAAAAAAADhDAAD6/kIudr86O568mvcMvb39/////98/PFRVVVVVxT+RKxfPVVWlPxfQpGcREYE/AAAAAAAAyELvOfr+Qi7mPyTEgv+9v84/tfQM1whrrD/MUEbSq7KDP4Q6Tpvg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'; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile); } -function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - var binary = tryParseAsDataURI(file); - if (binary) { - return binary; - } - if (readBinary) { - return readBinary(file); - } else { - throw "sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"; - } +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); } - catch (err) { - abort(err); + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; } + if (readBinary) { + return readBinary(file); + } + throw "sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"; } -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' - ) { - 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); - }); - } - } +function getBinaryPromise(binaryFile) { - // Otherwise, getBinary should be able to get it synchronously - return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); } function instantiateSync(file, info) { - var instance; var module; - var binary; - try { - binary = getBinary(file); - module = new WebAssembly.Module(binary); - instance = new WebAssembly.Instance(module, info); - } catch (e) { - var str = e.toString(); - err('failed to compile wasm module: ' + str); - if (str.includes('imported Memory') || - str.includes('memory import')) { - err('Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).'); - } - throw e; - } + var binary = getBinarySync(file); + module = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); return [instance, module]; } @@ -1428,50 +667,54 @@ function instantiateSync(file, info) { function createWasm() { // prepare imports var info = { - 'env': asmLibraryArg, - 'wasi_snapshot_preview1': asmLibraryArg, + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, }; // 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; + wasmExports = instance.exports; - Module['asm'] = exports; + - wasmMemory = Module['asm']['memory']; + wasmMemory = wasmExports['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); + updateMemoryViews(); - wasmTable = Module['asm']['__indirect_function_table']; + wasmTable = wasmExports['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); - addOnInit(Module['asm']['__wasm_call_ctors']); + addOnInit(wasmExports['__wasm_call_ctors']); removeRunDependency('wasm-instantiate'); - + return wasmExports; } - // we can't run yet (except in a pthread, where we have a custom sync instantiator) + // wait for the pthread pool (if any) addRunDependency('wasm-instantiate'); // Prefer streaming instantiation if available. // 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. - // Also pthreads and wasm workers initialize the wasm instance through this path. + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. if (Module['instantiateWasm']) { + try { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; + return Module['instantiateWasm'](info, receiveInstance); } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; } } @@ -1479,130 +722,158 @@ function createWasm() { // 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, we can remove this if/else. - receiveInstance(result[0]); - return Module['asm']; // exports were assigned here + return receiveInstance(result[0]); } // Globals used by JS i64 conversions (see makeSetValue) var tempDouble; var tempI64; -// === Body === - -var ASM_CONSTS = { - -}; +// include: runtime_debug.js +function legacyModuleProp(prop, newName, incomming=true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incomming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : ''; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); + } + }); + } +} +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} +function missingGlobal(sym, msg) { + if (typeof globalThis !== 'undefined') { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg); + return undefined; + } + }); + } +} +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); - 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; +function missingLibrarySymbol(sym) { + if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; } - var func = callback.func; - if (typeof func == 'number') { - if (callback.arg === undefined) { - // Run the wasm function ptr with signature 'v'. If no function - // with such signature was exported, this call does not need - // to be emitted (and would confuse Closure) - getWasmTableEntry(func)(); - } else { - // If any function with signature 'vi' was exported, run - // the callback with that signature. - getWasmTableEntry(func)(callback.arg); - } - } else { - func(callback.arg === undefined ? null : callback.arg); + msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='" + librarySymbol + "')"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; } + warnOnce(msg); + return undefined; } - } + }); + } + // Any symbol that is not included from the JS libary is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} - function withStackSave(f) { - var stack = stackSave(); - var ret = f(); - stackRestore(stack); - return ret; - } - function demangle(func) { - warnOnce('warning: build with -sDEMANGLE_SUPPORT to link in libcxxabi demangling'); - return func; - } +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} - 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 + ']'); - }); +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(text) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn.apply(console, arguments); +} +// end include: runtime_debug.js +// === Body === + +// end include: preamble.js + + /** @constructor */ + function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; } + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + /** * @param {number} ptr * @param {string} type */ function getValue(ptr, type = 'i8') { - if (type.endsWith('*')) 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; - } - - 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(); - } + if (type.endsWith('*')) type = '*'; + 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': abort('to do getValue(i64) use WASM_BIGINT'); + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var noExitRuntime = Module['noExitRuntime'] || true; + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; /** @@ -1611,41 +882,104 @@ var ASM_CONSTS = { * @param {string} type */ function setValue(ptr, value, type = 'i8') { - if (type.endsWith('*')) 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); + if (type.endsWith('*')) type = '*'; + 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': abort('to do setValue(i64) use WASM_BIGINT'); + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var warnOnce = (text) => { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); } - } - - function setWasmTableEntry(idx, func) { - wasmTable.set(idx, func); - // With ABORT_ON_WASM_EXCEPTIONS wasmTable.get is overriden to return wrapped - // functions so we need to call it here to retrieve the potential wrapper correctly - // instead of just storing 'func' directly into wasmTableMirror - wasmTableMirror[idx] = wasmTable.get(idx); - } - - 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 + 24) + 24; - } + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' 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. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, 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 (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + 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 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[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. + * + * @param {number} ptr + * @param {number=} 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 + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == 'number'); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + }; + var ___assert_fail = (condition, filename, line, func) => { + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + }; /** @constructor */ function ExceptionInfo(excPtr) { @@ -1668,25 +1002,21 @@ var ASM_CONSTS = { return HEAPU32[(((this.ptr)+(8))>>2)]; }; - this.set_refcount = function(refcount) { - HEAP32[((this.ptr)>>2)] = refcount; - }; - - this.set_caught = function (caught) { + this.set_caught = function(caught) { caught = caught ? 1 : 0; HEAP8[(((this.ptr)+(12))>>0)] = caught; }; - this.get_caught = function () { + this.get_caught = function() { return HEAP8[(((this.ptr)+(12))>>0)] != 0; }; - this.set_rethrown = function (rethrown) { + this.set_rethrown = function(rethrown) { rethrown = rethrown ? 1 : 0; HEAP8[(((this.ptr)+(13))>>0)] = rethrown; }; - this.get_rethrown = function () { + this.get_rethrown = function() { return HEAP8[(((this.ptr)+(13))>>0)] != 0; }; @@ -1695,24 +1025,8 @@ var ASM_CONSTS = { this.set_adjusted_ptr(0); 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; - }; - this.set_adjusted_ptr = function(adjustedPtr) { HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; }; @@ -1741,109 +1055,52 @@ var ASM_CONSTS = { var exceptionLast = 0; var uncaughtExceptionCount = 0; - function ___cxa_throw(ptr, type, destructor) { + var ___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 -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch."; - } + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + }; - function __embind_register_bigint(primitiveType, name, size, minRange, maxRange) {} + var __embind_register_bigint = (primitiveType, name, size, minRange, maxRange) => {}; - function getShiftFromSize(size) { - switch (size) { - case 1: return 0; - case 2: return 1; - case 4: return 2; - case 8: return 3; - default: - throw new TypeError('Unknown type size: ' + size); - } - } - - function embind_init_charCodes() { + var embind_init_charCodes = () => { var codes = new Array(256); for (var i = 0; i < 256; ++i) { codes[i] = String.fromCharCode(i); } embind_charCodes = codes; - } - var embind_charCodes = undefined; - function readLatin1String(ptr) { + }; + var embind_charCodes; + var readLatin1String = (ptr) => { var ret = ""; var c = ptr; while (HEAPU8[c]) { ret += embind_charCodes[HEAPU8[c++]]; } return ret; - } + }; - var awaitingDependencies = {}; + var awaitingDependencies = { + }; - var registeredTypes = {}; + var registeredTypes = { + }; - var typeDependencies = {}; + var typeDependencies = { + }; - var char_0 = 48; + var BindingError; + var throwBindingError = (message) => { throw new BindingError(message); }; - var char_9 = 57; - function makeLegalFunctionName(name) { - if (undefined === name) { - return '_unknown'; - } - name = name.replace(/[^a-zA-Z0-9_]/g, '$'); - var f = name.charCodeAt(0); - if (f >= char_0 && f <= char_9) { - return '_' + name; - } - return name; - } - function createNamedFunction(name, body) { - name = makeLegalFunctionName(name); - /*jshint evil:true*/ - return new Function( - "body", - "return function " + name + "() {\n" + - " \"use strict\";" + - " return body.apply(this, arguments);\n" + - "};\n" - )(body); - } - function extendError(baseErrorType, errorName) { - var errorClass = createNamedFunction(errorName, function(message) { - this.name = errorName; - this.message = message; - var stack = (new Error(message)).stack; - if (stack !== undefined) { - this.stack = this.toString() + '\n' + - stack.replace(/^Error(:[^\n]*)?\n/, ''); - } - }); - errorClass.prototype = Object.create(baseErrorType.prototype); - errorClass.prototype.constructor = errorClass; - errorClass.prototype.toString = function() { - if (this.message === undefined) { - return this.name; - } else { - return this.name + ': ' + this.message; - } - }; - return errorClass; - } - var BindingError = undefined; - function throwBindingError(message) { - throw new BindingError(message); - } - var InternalError = undefined; - function throwInternalError(message) { - throw new InternalError(message); - } - function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + var InternalError; + var throwInternalError = (message) => { throw new InternalError(message); }; + var whenDependentTypesAreResolved = (myTypes, dependentTypes, getTypeConverters) => { myTypes.forEach(function(type) { typeDependencies[type] = dependentTypes; }); @@ -1881,23 +1138,19 @@ var ASM_CONSTS = { if (0 === unregisteredTypes.length) { onComplete(typeConverters); } - } + }; /** @param {Object=} options */ - function registerType(rawType, registeredInstance, options = {}) { - if (!('argPackAdvance' in registeredInstance)) { - throw new TypeError('registerType registeredInstance requires argPackAdvance'); - } - + function sharedRegisterType(rawType, registeredInstance, options = {}) { var name = registeredInstance.name; if (!rawType) { - throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); + throwBindingError(`type "${name}" must have a positive integer typeid pointer`); } if (registeredTypes.hasOwnProperty(rawType)) { - if (options.ignoreDuplicateRegistrations) { - return; - } else { - throwBindingError("Cannot register type '" + name + "' twice"); - } + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError(`Cannot register type '${name}' twice`); + } } registeredTypes[rawType] = registeredInstance; @@ -1909,12 +1162,20 @@ var ASM_CONSTS = { callbacks.forEach((cb) => cb()); } } - function __embind_register_bool(rawType, name, size, trueValue, falseValue) { - var shift = getShiftFromSize(size); + /** @param {Object=} options */ + function registerType(rawType, registeredInstance, options = {}) { + if (!('argPackAdvance' in registeredInstance)) { + throw new TypeError('registerType registeredInstance requires argPackAdvance'); + } + return sharedRegisterType(rawType, registeredInstance, options); + } + var GenericWireTypeSize = 8; + /** @suppress {globalThis} */ + var __embind_register_bool = (rawType, name, trueValue, falseValue) => { name = readLatin1String(name); registerType(rawType, { - name: name, + name, 'fromWireType': function(wt) { // ambiguous emscripten ABI: sometimes return values are // true or false, and sometimes integers (0 or 1) @@ -1923,90 +1184,55 @@ var ASM_CONSTS = { 'toWireType': function(destructors, o) { return o ? trueValue : falseValue; }, - 'argPackAdvance': 8, + 'argPackAdvance': GenericWireTypeSize, 'readValueFromPointer': function(pointer) { - // TODO: if heap is fixed (like in asm.js) this could be executed outside - var heap; - if (size === 1) { - heap = HEAP8; - } else if (size === 2) { - heap = HEAP16; - } else if (size === 4) { - heap = HEAP32; - } else { - throw new TypeError("Unknown boolean type size: " + name); - } - return this['fromWireType'](heap[pointer >> shift]); + return this['fromWireType'](HEAPU8[pointer]); }, destructorFunction: null, // This type does not need a destructor }); - } + }; - function ClassHandle_isAliasOf(other) { - if (!(this instanceof ClassHandle)) { - return false; - } - if (!(other instanceof ClassHandle)) { - return false; - } - var leftClass = this.$$.ptrType.registeredClass; - var left = this.$$.ptr; - var rightClass = other.$$.ptrType.registeredClass; - var right = other.$$.ptr; - while (leftClass.baseClass) { - left = leftClass.upcast(left); - leftClass = leftClass.baseClass; - } - - while (rightClass.baseClass) { - right = rightClass.upcast(right); - rightClass = rightClass.baseClass; - } - - return leftClass === rightClass && left === right; - } - - function shallowCopyInternalPointer(o) { + var shallowCopyInternalPointer = (o) => { return { - count: o.count, - deleteScheduled: o.deleteScheduled, - preservePointerOnDelete: o.preservePointerOnDelete, - ptr: o.ptr, - ptrType: o.ptrType, - smartPtr: o.smartPtr, - smartPtrType: o.smartPtrType, + count: o.count, + deleteScheduled: o.deleteScheduled, + preservePointerOnDelete: o.preservePointerOnDelete, + ptr: o.ptr, + ptrType: o.ptrType, + smartPtr: o.smartPtr, + smartPtrType: o.smartPtrType, }; - } + }; - function throwInstanceAlreadyDeleted(obj) { + var throwInstanceAlreadyDeleted = (obj) => { function getInstanceTypeName(handle) { return handle.$$.ptrType.registeredClass.name; } throwBindingError(getInstanceTypeName(obj) + ' instance already deleted'); - } + }; var finalizationRegistry = false; - function detachFinalizer(handle) {} + var detachFinalizer = (handle) => {}; - function runDestructor($$) { + var runDestructor = ($$) => { if ($$.smartPtr) { - $$.smartPtrType.rawDestructor($$.smartPtr); + $$.smartPtrType.rawDestructor($$.smartPtr); } else { - $$.ptrType.registeredClass.rawDestructor($$.ptr); + $$.ptrType.registeredClass.rawDestructor($$.ptr); } - } - function releaseClassHandle($$) { + }; + var releaseClassHandle = ($$) => { $$.count.value -= 1; var toDelete = 0 === $$.count.value; if (toDelete) { runDestructor($$); } - } + }; - function downcastPointer(ptr, ptrClass, desiredClass) { + var downcastPointer = (ptr, ptrClass, desiredClass) => { if (ptrClass === desiredClass) { return ptr; } @@ -2016,52 +1242,54 @@ var ASM_CONSTS = { var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); if (rv === null) { - return null; + return null; } return desiredClass.downcast(rv); - } + }; - var registeredPointers = {}; + var registeredPointers = { + }; - function getInheritedInstanceCount() { - return Object.keys(registeredInstances).length; - } + var getInheritedInstanceCount = () => Object.keys(registeredInstances).length; - function getLiveInheritedInstances() { + var getLiveInheritedInstances = () => { var rv = []; for (var k in registeredInstances) { - if (registeredInstances.hasOwnProperty(k)) { - rv.push(registeredInstances[k]); - } + if (registeredInstances.hasOwnProperty(k)) { + rv.push(registeredInstances[k]); + } } return rv; - } + }; var deletionQueue = []; - function flushPendingDeletes() { + var flushPendingDeletes = () => { while (deletionQueue.length) { var obj = deletionQueue.pop(); obj.$$.deleteScheduled = false; obj['delete'](); } - } + }; + + var delayFunction; + - var delayFunction = undefined; - function setDelayFunction(fn) { + var setDelayFunction = (fn) => { delayFunction = fn; if (deletionQueue.length && delayFunction) { delayFunction(flushPendingDeletes); } - } - function init_embind() { + }; + var init_embind = () => { Module['getInheritedInstanceCount'] = getInheritedInstanceCount; Module['getLiveInheritedInstances'] = getLiveInheritedInstances; Module['flushPendingDeletes'] = flushPendingDeletes; Module['setDelayFunction'] = setDelayFunction; - } - var registeredInstances = {}; + }; + var registeredInstances = { + }; - function getBasestPointer(class_, ptr) { + var getBasestPointer = (class_, ptr) => { if (ptr === undefined) { throwBindingError('ptr should not be undefined'); } @@ -2070,13 +1298,14 @@ var ASM_CONSTS = { class_ = class_.baseClass; } return ptr; - } - function getInheritedInstance(class_, ptr) { + }; + var getInheritedInstance = (class_, ptr) => { ptr = getBasestPointer(class_, ptr); return registeredInstances[ptr]; - } + }; + - function makeClassHandle(prototype, record) { + var makeClassHandle = (prototype, record) => { if (!record.ptrType || !record.ptr) { throwInternalError('makeClassHandle requires ptr and ptrType'); } @@ -2091,7 +1320,8 @@ var ASM_CONSTS = { value: record, }, })); - } + }; + /** @suppress {globalThis} */ function RegisteredPointer_fromWireType(ptr) { // ptr is a raw pointer (or a raw smartpointer) @@ -2129,7 +1359,7 @@ var ASM_CONSTS = { } else { return makeClassHandle(this.registeredClass.instancePrototype, { ptrType: this, - ptr: ptr, + ptr, }); } } @@ -2151,7 +1381,7 @@ var ASM_CONSTS = { this.registeredClass, toType.registeredClass); if (dp === null) { - return makeDefaultHandle.call(this); + return makeDefaultHandle.call(this); } if (this.isSmartPointer) { return makeClassHandle(toType.registeredClass.instancePrototype, { @@ -2167,18 +1397,18 @@ var ASM_CONSTS = { }); } } - function attachFinalizer(handle) { + var attachFinalizer = (handle) => { if ('undefined' === typeof FinalizationRegistry) { - attachFinalizer = (handle) => handle; - return handle; + attachFinalizer = (handle) => handle; + return handle; } // If the running environment has a FinalizationRegistry (see // https://github.com/tc39/proposal-weakrefs), then attach finalizers // for class handles. We check for the presence of FinalizationRegistry // at run-time, not build-time. finalizationRegistry = new FinalizationRegistry((info) => { - console.warn(info.leakWarning.stack.replace(/^Error: /, '')); - releaseClassHandle(info.$$); + console.warn(info.leakWarning.stack.replace(/^Error: /, '')); + releaseClassHandle(info.$$); }); attachFinalizer = (handle) => { var $$ = handle.$$; @@ -2191,12 +1421,12 @@ var ASM_CONSTS = { // This is more useful than the empty stacktrace of `FinalizationRegistry` // callback. var cls = $$.ptrType.registeredClass; - info.leakWarning = new Error("Embind found a leaked C++ instance " + cls.name + " <0x" + $$.ptr.toString(16) + ">.\n" + + info.leakWarning = new Error(`Embind found a leaked C++ instance ${cls.name} <${ptrToString($$.ptr)}>.\n` + "We'll free it automatically in this case, but this functionality is not reliable across various environments.\n" + "Make sure to invoke .delete() manually once you're done with the instance instead.\n" + "Originally allocated"); // `.stack` will add "at ..." after this sentence if ('captureStackTrace' in Error) { - Error.captureStackTrace(info.leakWarning, RegisteredPointer_fromWireType); + Error.captureStackTrace(info.leakWarning, RegisteredPointer_fromWireType); } finalizationRegistry.register(handle, info, handle); } @@ -2204,82 +1434,115 @@ var ASM_CONSTS = { }; detachFinalizer = (handle) => finalizationRegistry.unregister(handle); return attachFinalizer(handle); - } - function ClassHandle_clone() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } + }; - if (this.$$.preservePointerOnDelete) { - this.$$.count.value += 1; - return this; - } else { - var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { - $$: { - value: shallowCopyInternalPointer(this.$$), + + + var init_ClassHandle = () => { + Object.assign(ClassHandle.prototype, { + "isAliasOf"(other) { + if (!(this instanceof ClassHandle)) { + return false; + } + if (!(other instanceof ClassHandle)) { + return false; } - })); - clone.$$.count.value += 1; - clone.$$.deleteScheduled = false; - return clone; - } - } + var leftClass = this.$$.ptrType.registeredClass; + var left = this.$$.ptr; + other.$$ = /** @type {Object} */ (other.$$); + var rightClass = other.$$.ptrType.registeredClass; + var right = other.$$.ptr; - function ClassHandle_delete() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } + while (leftClass.baseClass) { + left = leftClass.upcast(left); + leftClass = leftClass.baseClass; + } - if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { - throwBindingError('Object already scheduled for deletion'); - } + while (rightClass.baseClass) { + right = rightClass.upcast(right); + rightClass = rightClass.baseClass; + } + + return leftClass === rightClass && left === right; + }, - detachFinalizer(this); - releaseClassHandle(this.$$); + "clone"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } - if (!this.$$.preservePointerOnDelete) { - this.$$.smartPtr = undefined; - this.$$.ptr = undefined; - } - } + if (this.$$.preservePointerOnDelete) { + this.$$.count.value += 1; + return this; + } else { + var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { + $$: { + value: shallowCopyInternalPointer(this.$$), + } + })); - function ClassHandle_isDeleted() { - return !this.$$.ptr; - } + clone.$$.count.value += 1; + clone.$$.deleteScheduled = false; + return clone; + } + }, - function ClassHandle_deleteLater() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } - if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { - throwBindingError('Object already scheduled for deletion'); - } - deletionQueue.push(this); - if (deletionQueue.length === 1 && delayFunction) { - delayFunction(flushPendingDeletes); - } - this.$$.deleteScheduled = true; - return this; - } - function init_ClassHandle() { - ClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf; - ClassHandle.prototype['clone'] = ClassHandle_clone; - ClassHandle.prototype['delete'] = ClassHandle_delete; - ClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted; - ClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater; - } + "delete"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError('Object already scheduled for deletion'); + } + + detachFinalizer(this); + releaseClassHandle(this.$$); + + if (!this.$$.preservePointerOnDelete) { + this.$$.smartPtr = undefined; + this.$$.ptr = undefined; + } + }, + + "isDeleted"() { + return !this.$$.ptr; + }, + + "deleteLater"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError('Object already scheduled for deletion'); + } + deletionQueue.push(this); + if (deletionQueue.length === 1 && delayFunction) { + delayFunction(flushPendingDeletes); + } + this.$$.deleteScheduled = true; + return this; + }, + }); + }; + /** @constructor */ function ClassHandle() { } - function ensureOverloadTable(proto, methodName, humanName) { + var createNamedFunction = (name, body) => Object.defineProperty(body, 'name', { + value: name + }); + + + var ensureOverloadTable = (proto, methodName, humanName) => { if (undefined === proto[methodName].overloadTable) { var prevFunc = proto[methodName]; // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. proto[methodName] = function() { // TODO This check can be removed in -O3 level "unsafe" optimizations. if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { - throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); + throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${arguments.length}) - expects one of (${proto[methodName].overloadTable})!`); } return proto[methodName].overloadTable[arguments.length].apply(this, arguments); }; @@ -2287,19 +1550,20 @@ var ASM_CONSTS = { proto[methodName].overloadTable = []; proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; } - } + }; + /** @param {number=} numArguments */ - function exposePublicSymbol(name, value, numArguments) { + var exposePublicSymbol = (name, value, numArguments) => { if (Module.hasOwnProperty(name)) { if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { - throwBindingError("Cannot register public name '" + name + "' twice"); + throwBindingError(`Cannot register public name '${name}' twice`); } // We are exposing a function with the same name as an existing function. Create an overload table and a function selector // that routes between the two. ensureOverloadTable(Module, name, name); if (Module.hasOwnProperty(numArguments)) { - throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); + throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`); } // Add the new function into the overload table. Module[name].overloadTable[numArguments] = value; @@ -2310,7 +1574,23 @@ var ASM_CONSTS = { Module[name].numArguments = numArguments; } } - } + }; + + var char_0 = 48; + + var char_9 = 57; + var makeLegalFunctionName = (name) => { + if (undefined === name) { + return '_unknown'; + } + name = name.replace(/[^a-zA-Z0-9_]/g, '$'); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return `_${name}`; + } + return name; + }; + /** @constructor */ function RegisteredClass(name, @@ -2332,40 +1612,44 @@ var ASM_CONSTS = { this.pureVirtualFunctions = []; } - function upcastPointer(ptr, ptrClass, desiredClass) { + + var upcastPointer = (ptr, ptrClass, desiredClass) => { while (ptrClass !== desiredClass) { if (!ptrClass.upcast) { - throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name); + throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`); } ptr = ptrClass.upcast(ptr); ptrClass = ptrClass.baseClass; } return ptr; - } + }; + /** @suppress {globalThis} */ function constNoSmartPtrRawPointerToWireType(destructors, handle) { if (handle === null) { if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); + throwBindingError(`null is not a valid ${this.name}`); } return 0; } if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); } if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); } var handleClass = handle.$$.ptrType.registeredClass; var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); return ptr; } + + /** @suppress {globalThis} */ function genericPointerToWireType(destructors, handle) { var ptr; if (handle === null) { if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); + throwBindingError(`null is not a valid ${this.name}`); } if (this.isSmartPointer) { @@ -2380,13 +1664,13 @@ var ASM_CONSTS = { } if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); } if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); } if (!this.isConst && handle.$$.ptrType.isConst) { - throwBindingError('Cannot convert argument of type ' + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + ' to parameter type ' + this.name); + throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`); } var handleClass = handle.$$.ptrType.registeredClass; ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); @@ -2405,7 +1689,7 @@ var ASM_CONSTS = { if (handle.$$.smartPtrType === this) { ptr = handle.$$.smartPtr; } else { - throwBindingError('Cannot convert argument of type ' + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + ' to parameter type ' + this.name); + throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`); } break; @@ -2420,9 +1704,7 @@ var ASM_CONSTS = { var clonedHandle = handle['clone'](); ptr = this.rawShare( ptr, - Emval.toHandle(function() { - clonedHandle['delete'](); - }) + Emval.toHandle(() => clonedHandle['delete']()) ); if (destructors !== null) { destructors.push(this.rawDestructor, ptr); @@ -2437,58 +1719,60 @@ var ASM_CONSTS = { return ptr; } + + /** @suppress {globalThis} */ function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { if (handle === null) { if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); + throwBindingError(`null is not a valid ${this.name}`); } return 0; } if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); } if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); } if (handle.$$.ptrType.isConst) { - throwBindingError('Cannot convert argument of type ' + handle.$$.ptrType.name + ' to parameter type ' + this.name); + throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`); } var handleClass = handle.$$.ptrType.registeredClass; var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); return ptr; } - function simpleReadValueFromPointer(pointer) { - return this['fromWireType'](HEAPU32[pointer >> 2]); - } - function RegisteredPointer_getPointee(ptr) { - if (this.rawGetPointee) { - ptr = this.rawGetPointee(ptr); - } - return ptr; + /** @suppress {globalThis} */ + function readPointer(pointer) { + return this['fromWireType'](HEAPU32[((pointer)>>2)]); } - function RegisteredPointer_destructor(ptr) { - if (this.rawDestructor) { - this.rawDestructor(ptr); - } - } - function RegisteredPointer_deleteObject(handle) { - if (handle !== null) { - handle['delete'](); - } - } - function init_RegisteredPointer() { - RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee; - RegisteredPointer.prototype.destructor = RegisteredPointer_destructor; - RegisteredPointer.prototype['argPackAdvance'] = 8; - RegisteredPointer.prototype['readValueFromPointer'] = simpleReadValueFromPointer; - RegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject; - RegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType; - } + var init_RegisteredPointer = () => { + Object.assign(RegisteredPointer.prototype, { + getPointee(ptr) { + if (this.rawGetPointee) { + ptr = this.rawGetPointee(ptr); + } + return ptr; + }, + destructor(ptr) { + if (this.rawDestructor) { + this.rawDestructor(ptr); + } + }, + 'argPackAdvance': GenericWireTypeSize, + 'readValueFromPointer': readPointer, + 'deleteObject'(handle) { + if (handle !== null) { + handle['delete'](); + } + }, + 'fromWireType': RegisteredPointer_fromWireType, + }); + }; /** @constructor @param {*=} pointeeType, @param {*=} sharingPolicy, @@ -2544,7 +1828,7 @@ var ASM_CONSTS = { } /** @param {number=} numArguments */ - function replacePublicSymbol(name, value, numArguments) { + var replacePublicSymbol = (name, value, numArguments) => { if (!Module.hasOwnProperty(name)) { throwInternalError('Replacing nonexistant public symbol'); } @@ -2556,40 +1840,59 @@ var ASM_CONSTS = { Module[name] = value; Module[name].argCount = numArguments; } - } + }; + - function dynCallLegacy(sig, ptr, args) { - assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + + var dynCallLegacy = (sig, ptr, args) => { + assert(('dynCall_' + sig) in Module, `bad function pointer type - dynCall function not found for sig '${sig}'`); if (args && args.length) { // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. assert(args.length === sig.substring(1).replace(/j/g, '--').length); } else { assert(sig.length == 1); } - var f = Module["dynCall_" + sig]; + var f = Module['dynCall_' + sig]; return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr); - } + }; + + var wasmTableMirror = []; + + var wasmTable; + var 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; + }; + /** @param {Object=} args */ - function dynCall(sig, ptr, args) { + var dynCall = (sig, ptr, args) => { // Without WASM_BIGINT support we cannot directly call function with i64 as // part of thier signature, so we rely the dynCall functions generated by // wasm-emscripten-finalize if (sig.includes('j')) { return dynCallLegacy(sig, ptr, args); } - assert(getWasmTableEntry(ptr), 'missing table entry in dynCall: ' + ptr); - return getWasmTableEntry(ptr).apply(null, args) - } - function getDynCaller(sig, ptr) { - assert(sig.includes('j'), 'getDynCaller should only be called with i64 sigs') + assert(getWasmTableEntry(ptr), `missing table entry in dynCall: ${ptr}`); + var rtn = getWasmTableEntry(ptr).apply(null, args); + return rtn; + }; + var getDynCaller = (sig, ptr) => { + assert(sig.includes('j') || sig.includes('p'), 'getDynCaller should only be called with i64 sigs') var argCache = []; return function() { argCache.length = 0; Object.assign(argCache, arguments); return dynCall(sig, ptr, argCache); }; - } - function embind__requireFunction(signature, rawFunction) { + }; + + + var embind__requireFunction = (signature, rawFunction) => { signature = readLatin1String(signature); function makeDynCaller() { @@ -2601,20 +1904,47 @@ var ASM_CONSTS = { var fp = makeDynCaller(); if (typeof fp != "function") { - throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); + throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`); } return fp; - } + }; + + + + var extendError = (baseErrorType, errorName) => { + var errorClass = createNamedFunction(errorName, function(message) { + this.name = errorName; + this.message = message; + + var stack = (new Error(message)).stack; + if (stack !== undefined) { + this.stack = this.toString() + '\n' + + stack.replace(/^Error(:[^\n]*)?\n/, ''); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function() { + if (this.message === undefined) { + return this.name; + } else { + return `${this.name}: ${this.message}`; + } + }; + + return errorClass; + }; + var UnboundTypeError; + - var UnboundTypeError = undefined; - function getTypeName(type) { + var getTypeName = (type) => { var ptr = ___getTypeName(type); var rv = readLatin1String(ptr); _free(ptr); return rv; - } - function throwUnboundTypeError(message, types) { + }; + var throwUnboundTypeError = (message, types) => { var unboundTypes = []; var seen = {}; function visit(type) { @@ -2633,21 +1963,22 @@ var ASM_CONSTS = { } types.forEach(visit); - throw new UnboundTypeError(message + ': ' + unboundTypes.map(getTypeName).join([', '])); - } - function __embind_register_class(rawType, - rawPointerType, - rawConstPointerType, - baseClassRawType, - getActualTypeSignature, - getActualType, - upcastSignature, - upcast, - downcastSignature, - downcast, - name, - destructorSignature, - rawDestructor) { + throw new UnboundTypeError(`${message}: ` + unboundTypes.map(getTypeName).join([', '])); + }; + + var __embind_register_class = (rawType, + rawPointerType, + rawConstPointerType, + baseClassRawType, + getActualTypeSignature, + getActualType, + upcastSignature, + upcast, + downcastSignature, + downcast, + name, + destructorSignature, + rawDestructor) => { name = readLatin1String(name); getActualType = embind__requireFunction(getActualTypeSignature, getActualType); if (upcast) { @@ -2661,7 +1992,7 @@ var ASM_CONSTS = { exposePublicSymbol(legalFunctionName, function() { // this code cannot run if baseClassRawType is zero - throwUnboundTypeError('Cannot construct ' + name + ' due to unbound types', [baseClassRawType]); + throwUnboundTypeError(`Cannot construct ${name} due to unbound types`, [baseClassRawType]); }); whenDependentTypesAreResolved( @@ -2679,7 +2010,7 @@ var ASM_CONSTS = { basePrototype = ClassHandle.prototype; } - var constructor = createNamedFunction(legalFunctionName, function() { + var constructor = createNamedFunction(name, function() { if (Object.getPrototypeOf(this) !== instancePrototype) { throw new BindingError("Use 'new' to construct " + name); } @@ -2688,7 +2019,7 @@ var ASM_CONSTS = { } var body = registeredClass.constructor_body[arguments.length]; if (undefined === body) { - throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!"); + throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`); } return body.apply(this, arguments); }); @@ -2708,6 +2039,15 @@ var ASM_CONSTS = { upcast, downcast); + if (registeredClass.baseClass) { + // Keep track of class hierarchy. Used to allow sub-classes to inherit class functions. + if (registeredClass.baseClass.__derivedClasses === undefined) { + registeredClass.baseClass.__derivedClasses = []; + } + + registeredClass.baseClass.__derivedClasses.push(registeredClass); + } + var referenceConverter = new RegisteredPointer(name, registeredClass, true, @@ -2736,64 +2076,36 @@ var ASM_CONSTS = { return [referenceConverter, pointerConverter, constPointerConverter]; } ); - } + }; - function heap32VectorToArray(count, firstElement) { + var heap32VectorToArray = (count, firstElement) => { var array = []; for (var i = 0; i < count; i++) { - array.push(HEAP32[(firstElement >> 2) + i]); + // TODO(https://github.com/emscripten-core/emscripten/issues/17310): + // Find a way to hoist the `>> 2` or `>> 3` out of this loop. + array.push(HEAPU32[(((firstElement)+(i * 4))>>2)]); } return array; - } + }; + - function runDestructors(destructors) { + var runDestructors = (destructors) => { while (destructors.length) { var ptr = destructors.pop(); var del = destructors.pop(); del(ptr); } - } - function __embind_register_class_constructor( - rawClassType, - argCount, - rawArgTypesAddr, - invokerSignature, - invoker, - rawConstructor - ) { - assert(argCount > 0); - var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); - invoker = embind__requireFunction(invokerSignature, invoker); - var args = [rawConstructor]; - var destructors = []; + }; - whenDependentTypesAreResolved([], [rawClassType], function(classType) { - classType = classType[0]; - var humanName = 'constructor ' + classType.name; - if (undefined === classType.registeredClass.constructor_body) { - classType.registeredClass.constructor_body = []; - } - if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) { - throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount-1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!"); - } - classType.registeredClass.constructor_body[argCount - 1] = () => { - throwUnboundTypeError('Cannot construct ' + classType.name + ' due to unbound types', rawArgTypes); - }; - whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { - // Insert empty slot for context type (argTypes[1]). - argTypes.splice(1, 0, null); - classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(humanName, argTypes, null, invoker, rawConstructor); - return []; - }); - return []; - }); - } - - function new_(constructor, argumentList) { + + + + + function newFunc(constructor, argumentList) { if (!(constructor instanceof Function)) { - throw new TypeError('new_ called with constructor type ' + typeof(constructor) + " which is not a function"); + throw new TypeError(`new_ called with constructor type ${typeof(constructor)} which is not a function`); } /* * Previously, the following line was just: @@ -2812,7 +2124,7 @@ var ASM_CONSTS = { var r = constructor.apply(obj, argumentList); return (r instanceof Object) ? r : obj; } - function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc, /** boolean= */ isAsync) { // humanName: a human-readable string name for the function to be generated. // argTypes: An array that contains the embind type objects for all types in the function signature. // argTypes[0] is the type object for the function return value. @@ -2821,12 +2133,15 @@ var ASM_CONSTS = { // classType: The embind type object for the class to be bound, or null if this is not a method of a class. // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. + // isAsync: Optional. If true, returns an async function. Async bindings are only supported with JSPI. var argCount = argTypes.length; if (argCount < 2) { throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); } + assert(!isAsync, 'Async bindings are only supported with JSPI.'); + var isClassMethodFunc = (argTypes[1] !== null && classType !== null); // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. @@ -2855,11 +2170,11 @@ var ASM_CONSTS = { argsListWired += (i!==0?", ":"")+"arg"+i+"Wired"; } - var invokerFnBody = - "return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n" + - "if (arguments.length !== "+(argCount - 2)+") {\n" + - "throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount - 2)+" args!');\n" + - "}\n"; + var invokerFnBody = ` + return function (${argsList}) { + if (arguments.length !== ${argCount - 2}) { + throwBindingError('function ${humanName} called with ' + arguments.length + ' arguments, expected ${argCount - 2}'); + }`; if (needsDestructorStack) { invokerFnBody += "var destructors = [];\n"; @@ -2884,7 +2199,7 @@ var ASM_CONSTS = { } invokerFnBody += - (returns?"var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n"; + (returns || isAsync ? "var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n"; if (needsDestructorStack) { invokerFnBody += "runDestructors(destructors);\n"; @@ -2909,24 +2224,80 @@ var ASM_CONSTS = { args1.push(invokerFnBody); - var invokerFunction = new_(Function, args1).apply(null, args2); - return invokerFunction; + var invokerFn = newFunc(Function, args1).apply(null, args2); + return createNamedFunction(humanName, invokerFn); } - function __embind_register_class_function(rawClassType, - methodName, - argCount, - rawArgTypesAddr, // [ReturnType, ThisType, Args...] - invokerSignature, - rawInvoker, - context, - isPureVirtual) { + var __embind_register_class_constructor = ( + rawClassType, + argCount, + rawArgTypesAddr, + invokerSignature, + invoker, + rawConstructor + ) => { + assert(argCount > 0); + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + invoker = embind__requireFunction(invokerSignature, invoker); + var args = [rawConstructor]; + var destructors = []; + + whenDependentTypesAreResolved([], [rawClassType], function(classType) { + classType = classType[0]; + var humanName = `constructor ${classType.name}`; + + if (undefined === classType.registeredClass.constructor_body) { + classType.registeredClass.constructor_body = []; + } + if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) { + throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`); + } + classType.registeredClass.constructor_body[argCount - 1] = () => { + throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`, rawArgTypes); + }; + + whenDependentTypesAreResolved([], rawArgTypes, (argTypes) => { + // Insert empty slot for context type (argTypes[1]). + argTypes.splice(1, 0, null); + classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(humanName, argTypes, null, invoker, rawConstructor); + return []; + }); + return []; + }); + }; + + + + + + + + var getFunctionName = (signature) => { + signature = signature.trim(); + const argsIndex = signature.indexOf("("); + if (argsIndex !== -1) { + assert(signature[signature.length - 1] == ")", "Parentheses for argument names should match."); + return signature.substr(0, argsIndex); + } else { + return signature; + } + }; + var __embind_register_class_function = (rawClassType, + methodName, + argCount, + rawArgTypesAddr, // [ReturnType, ThisType, Args...] + invokerSignature, + rawInvoker, + context, + isPureVirtual, + isAsync) => { var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); methodName = readLatin1String(methodName); + methodName = getFunctionName(methodName); rawInvoker = embind__requireFunction(invokerSignature, rawInvoker); whenDependentTypesAreResolved([], [rawClassType], function(classType) { classType = classType[0]; - var humanName = classType.name + '.' + methodName; + var humanName = `${classType.name}.${methodName}`; if (methodName.startsWith("@@")) { methodName = Symbol[methodName.substring(2)]; @@ -2937,7 +2308,7 @@ var ASM_CONSTS = { } function unboundTypesHandler() { - throwUnboundTypeError('Cannot call ' + humanName + ' due to unbound types', rawArgTypes); + throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes); } var proto = classType.registeredClass.instancePrototype; @@ -2956,7 +2327,7 @@ var ASM_CONSTS = { } whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { - var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context); + var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context, isAsync); // Replace the initial unbound-handler-stub function with the appropriate member function, now that all types // are resolved. If multiple overloads are registered for this function, the function goes into an overload table. @@ -2972,83 +2343,114 @@ var ASM_CONSTS = { }); return []; }); - } + }; - var emval_free_list = []; - - var emval_handle_array = [{},{value:undefined},{value:null},{value:true},{value:false}]; - function __emval_decref(handle) { - if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { - emval_handle_array[handle] = undefined; - emval_free_list.push(handle); - } + function handleAllocatorInit() { + Object.assign(HandleAllocator.prototype, /** @lends {HandleAllocator.prototype} */ { + get(id) { + assert(this.allocated[id] !== undefined, `invalid handle: ${id}`); + return this.allocated[id]; + }, + has(id) { + return this.allocated[id] !== undefined; + }, + allocate(handle) { + var id = this.freelist.pop() || this.allocated.length; + this.allocated[id] = handle; + return id; + }, + free(id) { + assert(this.allocated[id] !== undefined); + // Set the slot to `undefined` rather than using `delete` here since + // apparently arrays with holes in them can be less efficient. + this.allocated[id] = undefined; + this.freelist.push(id); + } + }); + } + /** @constructor */ + function HandleAllocator() { + // Reserve slot 0 so that 0 is always an invalid handle + this.allocated = [undefined]; + this.freelist = []; } + var emval_handles = new HandleAllocator();; + var __emval_decref = (handle) => { + if (handle >= emval_handles.reserved && 0 === --emval_handles.get(handle).refcount) { + emval_handles.free(handle); + } + }; + + - function count_emval_handles() { + var count_emval_handles = () => { var count = 0; - for (var i = 5; i < emval_handle_array.length; ++i) { - if (emval_handle_array[i] !== undefined) { + for (var i = emval_handles.reserved; i < emval_handles.allocated.length; ++i) { + if (emval_handles.allocated[i] !== undefined) { ++count; } } return count; - } + }; - function get_first_emval() { - for (var i = 5; i < emval_handle_array.length; ++i) { - if (emval_handle_array[i] !== undefined) { - return emval_handle_array[i]; - } - } - return null; - } - function init_emval() { + var init_emval = () => { + // reserve some special values. These never get de-allocated. + // The HandleAllocator takes care of reserving zero. + emval_handles.allocated.push( + {value: undefined}, + {value: null}, + {value: true}, + {value: false}, + ); + emval_handles.reserved = emval_handles.allocated.length Module['count_emval_handles'] = count_emval_handles; - Module['get_first_emval'] = get_first_emval; - } - var Emval = {toValue:(handle) => { + }; + var Emval = { + toValue:(handle) => { if (!handle) { throwBindingError('Cannot use deleted val. handle = ' + handle); } - return emval_handle_array[handle].value; - },toHandle:(value) => { + return emval_handles.get(handle).value; + }, + toHandle:(value) => { switch (value) { case undefined: return 1; case null: return 2; case true: return 3; case false: return 4; default:{ - var handle = emval_free_list.length ? - emval_free_list.pop() : - emval_handle_array.length; - - emval_handle_array[handle] = {refcount: 1, value: value}; - return handle; + return emval_handles.allocate({refcount: 1, value: value}); } } - }}; - function __embind_register_emval(rawType, name) { + }, + }; + + + + /** @suppress {globalThis} */ + function simpleReadValueFromPointer(pointer) { + return this['fromWireType'](HEAP32[((pointer)>>2)]); + } + var __embind_register_emval = (rawType, name) => { name = readLatin1String(name); registerType(rawType, { - name: name, - 'fromWireType': function(handle) { + name, + 'fromWireType': (handle) => { var rv = Emval.toValue(handle); __emval_decref(handle); return rv; }, - 'toWireType': function(destructors, value) { - return Emval.toHandle(value); - }, - 'argPackAdvance': 8, + 'toWireType': (destructors, value) => Emval.toHandle(value), + 'argPackAdvance': GenericWireTypeSize, 'readValueFromPointer': simpleReadValueFromPointer, destructorFunction: null, // This type does not need a destructor // TODO: do we need a deleteObject here? write a test where // emval is passed into JS via an interface }); - } + }; - function _embind_repr(v) { + var embindRepr = (v) => { if (v === null) { return 'null'; } @@ -3058,107 +2460,111 @@ var ASM_CONSTS = { } else { return '' + v; } - } + }; - function floatReadValueFromPointer(name, shift) { - switch (shift) { - case 2: return function(pointer) { - return this['fromWireType'](HEAPF32[pointer >> 2]); + var floatReadValueFromPointer = (name, width) => { + switch (width) { + case 4: return function(pointer) { + return this['fromWireType'](HEAPF32[((pointer)>>2)]); }; - case 3: return function(pointer) { - return this['fromWireType'](HEAPF64[pointer >> 3]); + case 8: return function(pointer) { + return this['fromWireType'](HEAPF64[((pointer)>>3)]); }; default: - throw new TypeError("Unknown float type: " + name); + throw new TypeError(`invalid float width (${width}): ${name}`); } - } - function __embind_register_float(rawType, name, size) { - var shift = getShiftFromSize(size); + }; + + + var __embind_register_float = (rawType, name, size) => { name = readLatin1String(name); registerType(rawType, { - name: name, - 'fromWireType': function(value) { - return value; - }, - 'toWireType': function(destructors, value) { - if (typeof value != "number" && typeof value != "boolean") { - throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); - } - // The VM will perform JS to Wasm value conversion, according to the spec: - // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue - return value; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': floatReadValueFromPointer(name, shift), - destructorFunction: null, // This type does not need a destructor + name, + 'fromWireType': (value) => value, + 'toWireType': (destructors, value) => { + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert ${embindRepr(value)} to ${this.name}`); + } + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + }, + 'argPackAdvance': GenericWireTypeSize, + 'readValueFromPointer': floatReadValueFromPointer(name, size), + destructorFunction: null, // This type does not need a destructor }); - } + }; - function integerReadValueFromPointer(name, shift, signed) { + + var integerReadValueFromPointer = (name, width, signed) => { // integers are quite common, so generate very specialized functions - switch (shift) { - case 0: return signed ? - function readS8FromPointer(pointer) { return HEAP8[pointer]; } : - function readU8FromPointer(pointer) { return HEAPU8[pointer]; }; + switch (width) { case 1: return signed ? - function readS16FromPointer(pointer) { return HEAP16[pointer >> 1]; } : - function readU16FromPointer(pointer) { return HEAPU16[pointer >> 1]; }; + (pointer) => HEAP8[((pointer)>>0)] : + (pointer) => HEAPU8[((pointer)>>0)]; case 2: return signed ? - function readS32FromPointer(pointer) { return HEAP32[pointer >> 2]; } : - function readU32FromPointer(pointer) { return HEAPU32[pointer >> 2]; }; + (pointer) => HEAP16[((pointer)>>1)] : + (pointer) => HEAPU16[((pointer)>>1)] + case 4: return signed ? + (pointer) => HEAP32[((pointer)>>2)] : + (pointer) => HEAPU32[((pointer)>>2)] default: - throw new TypeError("Unknown integer type: " + name); + throw new TypeError(`invalid integer width (${width}): ${name}`); } - } - function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { + }; + + + /** @suppress {globalThis} */ + var __embind_register_integer = (primitiveType, name, size, minRange, maxRange) => { name = readLatin1String(name); - if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32. - maxRange = 4294967295; + // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come + // out as 'i32 -1'. Always treat those as max u32. + if (maxRange === -1) { + maxRange = 4294967295; } - var shift = getShiftFromSize(size); - var fromWireType = (value) => value; if (minRange === 0) { - var bitshift = 32 - 8*size; - fromWireType = (value) => (value << bitshift) >>> bitshift; + var bitshift = 32 - 8*size; + fromWireType = (value) => (value << bitshift) >>> bitshift; } var isUnsignedType = (name.includes('unsigned')); var checkAssertions = (value, toTypeName) => { - if (typeof value != "number" && typeof value != "boolean") { - throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + toTypeName); - } - if (value < minRange || value > maxRange) { - throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ', ' + maxRange + ']!'); - } + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${toTypeName}`); + } + if (value < minRange || value > maxRange) { + throw new TypeError(`Passing a number "${embindRepr(value)}" from JS side to C/C++ side to an argument of type "${name}", which is outside the valid range [${minRange}, ${maxRange}]!`); + } } var toWireType; if (isUnsignedType) { - toWireType = function(destructors, value) { - checkAssertions(value, this.name); - return value >>> 0; - } + toWireType = function(destructors, value) { + checkAssertions(value, this.name); + return value >>> 0; + } } else { - toWireType = function(destructors, value) { - checkAssertions(value, this.name); - // The VM will perform JS to Wasm value conversion, according to the spec: - // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue - return value; - } + toWireType = function(destructors, value) { + checkAssertions(value, this.name); + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + } } registerType(primitiveType, { - name: name, - 'fromWireType': fromWireType, - 'toWireType': toWireType, - 'argPackAdvance': 8, - 'readValueFromPointer': integerReadValueFromPointer(name, shift, minRange !== 0), - destructorFunction: null, // This type does not need a destructor + name, + 'fromWireType': fromWireType, + 'toWireType': toWireType, + 'argPackAdvance': GenericWireTypeSize, + 'readValueFromPointer': integerReadValueFromPointer(name, size, minRange !== 0), + destructorFunction: null, // This type does not need a destructor }); - } + }; - function __embind_register_memory_view(rawType, dataTypeIndex, name) { + + var __embind_register_memory_view = (rawType, dataTypeIndex, name) => { var typeMapping = [ Int8Array, Uint8Array, @@ -3173,117 +2579,325 @@ var ASM_CONSTS = { var TA = typeMapping[dataTypeIndex]; function decodeMemoryView(handle) { - handle = handle >> 2; - var heap = HEAPU32; - var size = heap[handle]; // in elements - var data = heap[handle + 1]; // byte offset into emscripten heap - return new TA(buffer, data, size); + var size = HEAPU32[((handle)>>2)]; + var data = HEAPU32[(((handle)+(4))>>2)]; + return new TA(HEAP8.buffer, data, size); } name = readLatin1String(name); registerType(rawType, { - name: name, + name, 'fromWireType': decodeMemoryView, - 'argPackAdvance': 8, + 'argPackAdvance': GenericWireTypeSize, 'readValueFromPointer': decodeMemoryView, }, { ignoreDuplicateRegistrations: true, }); - } + }; - function __embind_register_std_string(rawType, name) { + + + + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string'); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + 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 ' + ptrToString(u) + ' 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; + }; + var 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); + }; + + var 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 c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + + + + var __embind_register_std_string = (rawType, name) => { name = readLatin1String(name); var stdStringIsUTF8 //process only std::string bindings with UTF8 support, in contrast to e.g. std::basic_string = (name === "std::string"); registerType(rawType, { - name: name, - 'fromWireType': function(value) { - var length = HEAPU32[value >> 2]; - - var str; - if (stdStringIsUTF8) { - var decodeStartPtr = value + 4; - // Looping here to support possible embedded '0' bytes - for (var i = 0; i <= length; ++i) { - var currentBytePtr = value + 4 + i; - if (i == length || HEAPU8[currentBytePtr] == 0) { - var maxRead = currentBytePtr - decodeStartPtr; - var stringSegment = UTF8ToString(decodeStartPtr, maxRead); - if (str === undefined) { - str = stringSegment; - } else { - str += String.fromCharCode(0); - str += stringSegment; - } - decodeStartPtr = currentBytePtr + 1; - } - } - } else { - var a = new Array(length); - for (var i = 0; i < length; ++i) { - a[i] = String.fromCharCode(HEAPU8[value + 4 + i]); - } - str = a.join(''); + name, + // For some method names we use string keys here since they are part of + // the public/external API and/or used by the runtime-generated code. + 'fromWireType'(value) { + var length = HEAPU32[((value)>>2)]; + var payload = value + 4; + + var str; + if (stdStringIsUTF8) { + var decodeStartPtr = payload; + // Looping here to support possible embedded '0' bytes + for (var i = 0; i <= length; ++i) { + var currentBytePtr = payload + i; + if (i == length || HEAPU8[currentBytePtr] == 0) { + var maxRead = currentBytePtr - decodeStartPtr; + var stringSegment = UTF8ToString(decodeStartPtr, maxRead); + if (str === undefined) { + str = stringSegment; + } else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + 1; } + } + } else { + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAPU8[payload + i]); + } + str = a.join(''); + } - _free(value); + _free(value); - return str; - }, - 'toWireType': function(destructors, value) { - if (value instanceof ArrayBuffer) { - value = new Uint8Array(value); - } + return str; + }, + 'toWireType'(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } - var getLength; - var valueIsOfTypeString = (typeof value == 'string'); + var length; + var valueIsOfTypeString = (typeof value == 'string'); - if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { - throwBindingError('Cannot pass non-string to std::string'); - } - if (stdStringIsUTF8 && valueIsOfTypeString) { - getLength = () => lengthBytesUTF8(value); - } else { - getLength = () => value.length; - } + if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { + throwBindingError('Cannot pass non-string to std::string'); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + length = lengthBytesUTF8(value); + } else { + length = value.length; + } - // assumes 4-byte alignment - var length = getLength(); - var ptr = _malloc(4 + length + 1); - HEAPU32[ptr >> 2] = length; - if (stdStringIsUTF8 && valueIsOfTypeString) { - stringToUTF8(value, ptr + 4, length + 1); - } else { - if (valueIsOfTypeString) { - for (var i = 0; i < length; ++i) { - var charCode = value.charCodeAt(i); - if (charCode > 255) { - _free(ptr); - throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); - } - HEAPU8[ptr + 4 + i] = charCode; - } - } else { - for (var i = 0; i < length; ++i) { - HEAPU8[ptr + 4 + i] = value[i]; - } - } + // assumes 4-byte alignment + var base = _malloc(4 + length + 1); + var ptr = base + 4; + HEAPU32[((base)>>2)] = length; + if (stdStringIsUTF8 && valueIsOfTypeString) { + stringToUTF8(value, ptr, length + 1); + } else { + if (valueIsOfTypeString) { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(ptr); + throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); + } + HEAPU8[ptr + i] = charCode; } - - if (destructors !== null) { - destructors.push(_free, ptr); + } else { + for (var i = 0; i < length; ++i) { + HEAPU8[ptr + i] = value[i]; } - return ptr; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': simpleReadValueFromPointer, - destructorFunction: function(ptr) { _free(ptr); }, + } + } + + if (destructors !== null) { + destructors.push(_free, base); + } + return base; + }, + 'argPackAdvance': GenericWireTypeSize, + 'readValueFromPointer': readPointer, + destructorFunction(ptr) { + _free(ptr); + }, }); - } + }; - function __embind_register_std_wstring(rawType, charSize, name) { + + + + var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined;; + var 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)); + + // Fallback: decode without UTF16Decoder + 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; + }; + + var 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; + }; + + var lengthBytesUTF16 = (str) => { + return str.length*2; + }; + + var 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; + }; + + var 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; + }; + + var 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; + }; + var __embind_register_std_wstring = (rawType, charSize, name) => { name = readLatin1String(name); var decodeString, encodeString, getHeap, lengthBytesUTF, shift; if (charSize === 2) { @@ -3300,10 +2914,10 @@ var ASM_CONSTS = { shift = 2; } registerType(rawType, { - name: name, - 'fromWireType': function(value) { + name, + 'fromWireType': (value) => { // Code mostly taken from _embind_register_std_string fromWireType - var length = HEAPU32[value >> 2]; + var length = HEAPU32[((value)>>2)]; var HEAP = getHeap(); var str; @@ -3328,9 +2942,9 @@ var ASM_CONSTS = { return str; }, - 'toWireType': function(destructors, value) { + 'toWireType': (destructors, value) => { if (!(typeof value == 'string')) { - throwBindingError('Cannot pass non-string to C++ string type ' + name); + throwBindingError(`Cannot pass non-string to C++ string type ${name}`); } // assumes 4-byte alignment @@ -3345,565 +2959,572 @@ var ASM_CONSTS = { } return ptr; }, - 'argPackAdvance': 8, + 'argPackAdvance': GenericWireTypeSize, 'readValueFromPointer': simpleReadValueFromPointer, - destructorFunction: function(ptr) { _free(ptr); }, + destructorFunction(ptr) { + _free(ptr); + } }); - } + }; - function __embind_register_void(rawType, name) { + + var __embind_register_void = (rawType, name) => { name = readLatin1String(name); registerType(rawType, { - isVoid: true, // void return values can be optimized out sometimes - name: name, - 'argPackAdvance': 0, - 'fromWireType': function() { - return undefined; - }, - 'toWireType': function(destructors, o) { - // TODO: assert if anything else is given? - return undefined; - }, + isVoid: true, // void return values can be optimized out sometimes + name, + 'argPackAdvance': 0, + 'fromWireType': () => undefined, + // TODO: assert if anything else is given? + 'toWireType': (destructors, o) => undefined, }); - } + }; - function _abort() { + var _abort = () => { abort('native code called abort()'); - } + }; - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } + var _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); - function getHeapMax() { - return HEAPU8.length; - } + var getHeapMax = () => + HEAPU8.length; - function abortOnCannotGrowMemory(requestedSize) { - abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0'); - } - function _emscripten_resize_heap(requestedSize) { + var abortOnCannotGrowMemory = (requestedSize) => { + abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`); + }; + var _emscripten_resize_heap = (requestedSize) => { var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; abortOnCannotGrowMemory(requestedSize); - } + }; + + var SYSCALLS = { + varargs:undefined, + get() { + assert(SYSCALLS.varargs != undefined); + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }, + getp() { return SYSCALLS.get() }, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + var _fd_close = (fd) => { + abort('fd_close called without SYSCALLS_REQUIRE_FILESYSTEM'); + }; + + + var convertI32PairToI53Checked = (lo, hi) => { + assert(lo == (lo >>> 0) || lo == (lo|0)); // lo should either be a i32 or a u32 + assert(hi === (hi|0)); // hi should be a i32 + return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; + }; + function _fd_seek(fd,offset_low, offset_high,whence,newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high);; + + + return 70; + ; + } + + var printCharBuffers = [null,[],[]]; + + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + assert(buffer); + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + + var flush_NO_FILESYSTEM = () => { + // flush anything remaining in the buffers during shutdown + _fflush(0); + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }; + + + var _fd_write = (fd, iov, iovcnt, pnum) => { + // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr+j]); + } + num += len; + } + HEAPU32[((pnum)>>2)] = num; + return 0; + }; embind_init_charCodes(); -BindingError = Module['BindingError'] = extendError(Error, 'BindingError');; -InternalError = Module['InternalError'] = extendError(Error, 'InternalError');; +BindingError = Module['BindingError'] = class BindingError extends Error { constructor(message) { super(message); this.name = 'BindingError'; }}; +InternalError = Module['InternalError'] = class InternalError extends Error { constructor(message) { super(message); this.name = 'InternalError'; }}; init_ClassHandle(); init_embind();; init_RegisteredPointer(); UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');; +handleAllocatorInit(); init_emval();; -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(''); -} - - -// Copied from https://github.com/strophe/strophejs/blob/e06d027/src/polyfills.js#L149 - -// This code was written by Tyler Akins and has been placed in the -// public domain. It would be nice if you left this header intact. -// Base64 code from Tyler Akins -- http://rumkin.com - -/** - * Decodes a base64 string. - * @param {string} input The string to decode. - */ -var decodeBase64 = typeof atob == 'function' ? atob : function (input) { - var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - var output = ''; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - // remove all characters that are not A-Z, a-z, 0-9, +, /, or = - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); - do { - enc1 = keyStr.indexOf(input.charAt(i++)); - enc2 = keyStr.indexOf(input.charAt(i++)); - enc3 = keyStr.indexOf(input.charAt(i++)); - enc4 = keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 !== 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 !== 64) { - output = output + String.fromCharCode(chr3); - } - } while (i < input.length); - return output; -}; - -// Converts a string of base64 into a byte array. -// Throws error on invalid input. -function intArrayFromBase64(s) { - - try { - var decoded = decodeBase64(s); - var bytes = new Uint8Array(decoded.length); - for (var i = 0 ; i < decoded.length ; ++i) { - bytes[i] = decoded.charCodeAt(i); - } - return bytes; - } catch (_) { - throw new Error('Converting base64 string to bytes failed.'); - } -} - -// If filename is a base64 data URI, parses and returns data (Buffer on node, -// Uint8Array otherwise). If filename is not a base64 data URI, returns undefined. -function tryParseAsDataURI(filename) { - if (!isDataURI(filename)) { - return; - } - - return intArrayFromBase64(filename.slice(dataURIPrefix.length)); -} - - function checkIncomingModuleAPI() { ignoredModuleProp('fetchSettings'); } -var asmLibraryArg = { - "__assert_fail": ___assert_fail, - "__cxa_allocate_exception": ___cxa_allocate_exception, - "__cxa_throw": ___cxa_throw, - "_embind_register_bigint": __embind_register_bigint, - "_embind_register_bool": __embind_register_bool, - "_embind_register_class": __embind_register_class, - "_embind_register_class_constructor": __embind_register_class_constructor, - "_embind_register_class_function": __embind_register_class_function, - "_embind_register_emval": __embind_register_emval, - "_embind_register_float": __embind_register_float, - "_embind_register_integer": __embind_register_integer, - "_embind_register_memory_view": __embind_register_memory_view, - "_embind_register_std_string": __embind_register_std_string, - "_embind_register_std_wstring": __embind_register_std_wstring, - "_embind_register_void": __embind_register_void, - "abort": _abort, - "emscripten_memcpy_big": _emscripten_memcpy_big, - "emscripten_resize_heap": _emscripten_resize_heap +var wasmImports = { + /** @export */ + __assert_fail: ___assert_fail, + /** @export */ + __cxa_throw: ___cxa_throw, + /** @export */ + _embind_register_bigint: __embind_register_bigint, + /** @export */ + _embind_register_bool: __embind_register_bool, + /** @export */ + _embind_register_class: __embind_register_class, + /** @export */ + _embind_register_class_constructor: __embind_register_class_constructor, + /** @export */ + _embind_register_class_function: __embind_register_class_function, + /** @export */ + _embind_register_emval: __embind_register_emval, + /** @export */ + _embind_register_float: __embind_register_float, + /** @export */ + _embind_register_integer: __embind_register_integer, + /** @export */ + _embind_register_memory_view: __embind_register_memory_view, + /** @export */ + _embind_register_std_string: __embind_register_std_string, + /** @export */ + _embind_register_std_wstring: __embind_register_std_wstring, + /** @export */ + _embind_register_void: __embind_register_void, + /** @export */ + abort: _abort, + /** @export */ + emscripten_memcpy_js: _emscripten_memcpy_js, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write }; -var asm = createWasm(); -/** @type {function(...*):?} */ -var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors", asm); - -/** @type {function(...*):?} */ -var ___getTypeName = Module["___getTypeName"] = createExportWrapper("__getTypeName", asm); - -/** @type {function(...*):?} */ -var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = createExportWrapper("__embind_register_native_and_builtin_types", asm); - -/** @type {function(...*):?} */ -var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location", asm); - -/** @type {function(...*):?} */ -var _fflush = Module["_fflush"] = createExportWrapper("fflush", asm); - -/** @type {function(...*):?} */ -var _malloc = Module["_malloc"] = createExportWrapper("malloc", asm); - -/** @type {function(...*):?} */ -var _free = Module["_free"] = createExportWrapper("free", asm); - -/** @type {function(...*):?} */ -var _emscripten_stack_init = Module["_emscripten_stack_init"] = asm["emscripten_stack_init"] - -/** @type {function(...*):?} */ -var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = asm["emscripten_stack_get_free"] - -/** @type {function(...*):?} */ -var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = asm["emscripten_stack_get_base"] - -/** @type {function(...*):?} */ -var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = asm["emscripten_stack_get_end"] - -/** @type {function(...*):?} */ -var stackSave = Module["stackSave"] = createExportWrapper("stackSave", asm); - -/** @type {function(...*):?} */ -var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore", asm); - -/** @type {function(...*):?} */ -var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc", asm); - -/** @type {function(...*):?} */ -var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = createExportWrapper("__cxa_is_pointer_type", asm); - - - - - +var wasmExports = createWasm(); +var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors'); +var ___getTypeName = createExportWrapper('__getTypeName'); +var __embind_initialize_bindings = Module['__embind_initialize_bindings'] = createExportWrapper('_embind_initialize_bindings'); +var ___errno_location = createExportWrapper('__errno_location'); +var _fflush = Module['_fflush'] = createExportWrapper('fflush'); +var _malloc = Module['_malloc'] = createExportWrapper('malloc'); +var _free = createExportWrapper('free'); +var _emscripten_stack_init = wasmExports["emscripten_stack_init"] +var _emscripten_stack_get_free = wasmExports["emscripten_stack_get_free"] +var _emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"] +var _emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"] +var stackSave = createExportWrapper('stackSave'); +var stackRestore = createExportWrapper('stackRestore'); +var stackAlloc = createExportWrapper('stackAlloc'); +var _emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"] +var ___cxa_is_pointer_type = createExportWrapper('__cxa_is_pointer_type'); +var dynCall_jiji = Module['dynCall_jiji'] = createExportWrapper('dynCall_jiji'); + + +// include: postamble.js // === Auto-generated postamble setup entry stuff === -unexportedRuntimeFunction('ccall', false); -unexportedRuntimeFunction('cwrap', false); -unexportedRuntimeFunction('allocate', false); -unexportedRuntimeFunction('UTF8ArrayToString', false); -unexportedRuntimeFunction('UTF8ToString', false); -unexportedRuntimeFunction('stringToUTF8Array', false); -unexportedRuntimeFunction('stringToUTF8', false); -unexportedRuntimeFunction('lengthBytesUTF8', false); -unexportedRuntimeFunction('addOnPreRun', false); -unexportedRuntimeFunction('addOnInit', false); -unexportedRuntimeFunction('addOnPreMain', false); -unexportedRuntimeFunction('addOnExit', false); -unexportedRuntimeFunction('addOnPostRun', 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('prettyPrint', 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('wasmMemory', 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); -unexportedRuntimeFunction('ExitStatus', false); -unexportedRuntimeFunction('intArrayFromString', false); -unexportedRuntimeFunction('intArrayToString', false); -unexportedRuntimeFunction('writeStringToMemory', false); -unexportedRuntimeFunction('writeArrayToMemory', false); -unexportedRuntimeFunction('writeAsciiToMemory', false); -Module["writeStackCookie"] = writeStackCookie; -Module["checkStackCookie"] = checkStackCookie; -unexportedRuntimeFunction('intArrayFromBase64', false); -unexportedRuntimeFunction('tryParseAsDataURI', false); -unexportedRuntimeFunction('ptrToString', false); -unexportedRuntimeFunction('zeroMemory', false); -unexportedRuntimeFunction('stringToNewUTF8', false); -unexportedRuntimeFunction('getHeapMax', false); -unexportedRuntimeFunction('abortOnCannotGrowMemory', false); -unexportedRuntimeFunction('emscripten_realloc_buffer', false); -unexportedRuntimeFunction('ENV', 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('UNWIND_CACHE', 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('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('writeI53ToI64', false); -unexportedRuntimeFunction('writeI53ToI64Clamped', false); -unexportedRuntimeFunction('writeI53ToI64Signaling', false); -unexportedRuntimeFunction('writeI53ToU64Clamped', false); -unexportedRuntimeFunction('writeI53ToU64Signaling', false); -unexportedRuntimeFunction('readI53FromI64', false); -unexportedRuntimeFunction('readI53FromU64', false); -unexportedRuntimeFunction('convertI32PairToI53', false); -unexportedRuntimeFunction('convertI32PairToI53Checked', false); -unexportedRuntimeFunction('convertU32PairToI53', false); -unexportedRuntimeFunction('reallyNegative', false); -unexportedRuntimeFunction('unSign', false); -unexportedRuntimeFunction('strLen', false); -unexportedRuntimeFunction('reSign', false); -unexportedRuntimeFunction('formatString', false); -unexportedRuntimeFunction('setValue', false); -unexportedRuntimeFunction('getValue', 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('JSEvents_requestFullscreen', false); -unexportedRuntimeFunction('JSEvents_resizeCanvasForFullscreen', 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('flush_NO_FILESYSTEM', false); -unexportedRuntimeFunction('dlopenMissingError', false); -unexportedRuntimeFunction('setImmediateWrapped', false); -unexportedRuntimeFunction('clearImmediateWrapped', false); -unexportedRuntimeFunction('polyfillSetImmediate', false); -unexportedRuntimeFunction('uncaughtExceptionCount', false); -unexportedRuntimeFunction('exceptionLast', false); -unexportedRuntimeFunction('exceptionCaught', false); -unexportedRuntimeFunction('ExceptionInfo', false); -unexportedRuntimeFunction('exception_addRef', false); -unexportedRuntimeFunction('exception_decRef', false); -unexportedRuntimeFunction('Browser', 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('InternalError', false); -unexportedRuntimeFunction('BindingError', false); -unexportedRuntimeFunction('UnboundTypeError', false); -unexportedRuntimeFunction('PureVirtualError', false); -unexportedRuntimeFunction('init_embind', false); -unexportedRuntimeFunction('throwInternalError', false); -unexportedRuntimeFunction('throwBindingError', false); -unexportedRuntimeFunction('throwUnboundTypeError', false); -unexportedRuntimeFunction('ensureOverloadTable', false); -unexportedRuntimeFunction('exposePublicSymbol', false); -unexportedRuntimeFunction('replacePublicSymbol', false); -unexportedRuntimeFunction('extendError', false); -unexportedRuntimeFunction('createNamedFunction', false); -unexportedRuntimeFunction('registeredInstances', false); -unexportedRuntimeFunction('getBasestPointer', false); -unexportedRuntimeFunction('registerInheritedInstance', false); -unexportedRuntimeFunction('unregisterInheritedInstance', false); -unexportedRuntimeFunction('getInheritedInstance', false); -unexportedRuntimeFunction('getInheritedInstanceCount', false); -unexportedRuntimeFunction('getLiveInheritedInstances', false); -unexportedRuntimeFunction('registeredTypes', false); -unexportedRuntimeFunction('awaitingDependencies', false); -unexportedRuntimeFunction('typeDependencies', false); -unexportedRuntimeFunction('registeredPointers', false); -unexportedRuntimeFunction('registerType', false); -unexportedRuntimeFunction('whenDependentTypesAreResolved', false); -unexportedRuntimeFunction('embind_charCodes', false); -unexportedRuntimeFunction('embind_init_charCodes', false); -unexportedRuntimeFunction('readLatin1String', false); -unexportedRuntimeFunction('getTypeName', false); -unexportedRuntimeFunction('heap32VectorToArray', false); -unexportedRuntimeFunction('requireRegisteredType', false); -unexportedRuntimeFunction('getShiftFromSize', false); -unexportedRuntimeFunction('integerReadValueFromPointer', false); -unexportedRuntimeFunction('enumReadValueFromPointer', false); -unexportedRuntimeFunction('floatReadValueFromPointer', false); -unexportedRuntimeFunction('simpleReadValueFromPointer', false); -unexportedRuntimeFunction('runDestructors', false); -unexportedRuntimeFunction('new_', false); -unexportedRuntimeFunction('craftInvokerFunction', false); -unexportedRuntimeFunction('embind__requireFunction', false); -unexportedRuntimeFunction('tupleRegistrations', false); -unexportedRuntimeFunction('structRegistrations', false); -unexportedRuntimeFunction('genericPointerToWireType', false); -unexportedRuntimeFunction('constNoSmartPtrRawPointerToWireType', false); -unexportedRuntimeFunction('nonConstNoSmartPtrRawPointerToWireType', false); -unexportedRuntimeFunction('init_RegisteredPointer', false); -unexportedRuntimeFunction('RegisteredPointer', false); -unexportedRuntimeFunction('RegisteredPointer_getPointee', false); -unexportedRuntimeFunction('RegisteredPointer_destructor', false); -unexportedRuntimeFunction('RegisteredPointer_deleteObject', false); -unexportedRuntimeFunction('RegisteredPointer_fromWireType', false); -unexportedRuntimeFunction('runDestructor', false); -unexportedRuntimeFunction('releaseClassHandle', false); -unexportedRuntimeFunction('finalizationRegistry', false); -unexportedRuntimeFunction('detachFinalizer_deps', false); -unexportedRuntimeFunction('detachFinalizer', false); -unexportedRuntimeFunction('attachFinalizer', false); -unexportedRuntimeFunction('makeClassHandle', false); -unexportedRuntimeFunction('init_ClassHandle', false); -unexportedRuntimeFunction('ClassHandle', false); -unexportedRuntimeFunction('ClassHandle_isAliasOf', false); -unexportedRuntimeFunction('throwInstanceAlreadyDeleted', false); -unexportedRuntimeFunction('ClassHandle_clone', false); -unexportedRuntimeFunction('ClassHandle_delete', false); -unexportedRuntimeFunction('deletionQueue', false); -unexportedRuntimeFunction('ClassHandle_isDeleted', false); -unexportedRuntimeFunction('ClassHandle_deleteLater', false); -unexportedRuntimeFunction('flushPendingDeletes', false); -unexportedRuntimeFunction('delayFunction', false); -unexportedRuntimeFunction('setDelayFunction', false); -unexportedRuntimeFunction('RegisteredClass', false); -unexportedRuntimeFunction('shallowCopyInternalPointer', false); -unexportedRuntimeFunction('downcastPointer', false); -unexportedRuntimeFunction('upcastPointer', false); -unexportedRuntimeFunction('validateThis', false); -unexportedRuntimeFunction('char_0', false); -unexportedRuntimeFunction('char_9', false); -unexportedRuntimeFunction('makeLegalFunctionName', false); -unexportedRuntimeFunction('emval_handle_array', false); -unexportedRuntimeFunction('emval_free_list', false); -unexportedRuntimeFunction('emval_symbols', false); -unexportedRuntimeFunction('init_emval', false); -unexportedRuntimeFunction('count_emval_handles', false); -unexportedRuntimeFunction('get_first_emval', false); -unexportedRuntimeFunction('getStringOrSymbol', false); -unexportedRuntimeFunction('Emval', false); -unexportedRuntimeFunction('emval_newers', false); -unexportedRuntimeFunction('craftEmvalAllocator', false); -unexportedRuntimeFunction('emval_get_global', false); -unexportedRuntimeFunction('emval_methodCallers', false); -unexportedRuntimeFunction('emval_registeredMethods', false); -unexportedRuntimeSymbol('ALLOC_NORMAL', false); -unexportedRuntimeSymbol('ALLOC_STACK', false); +var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertU32PairToI53', + 'zeroMemory', + 'exitJS', + 'growMemory', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'setErrNo', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'getHostByName', + 'initRandomFill', + 'randomFill', + 'getCallstack', + 'emscriptenLog', + 'convertPCtoSourceLocation', + 'readEmAsmArgs', + 'jstoi_q', + 'jstoi_s', + 'getExecutableName', + 'listenOnce', + 'autoResumeAudioContext', + 'handleException', + 'keepRuntimeAlive', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'asmjsMangle', + 'asyncLoad', + 'alignMemory', + 'mmapAlloc', + 'getNativeTypeSize', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'getCFunc', + 'ccall', + 'cwrap', + 'uleb128Encode', + 'sigToWasmTypes', + 'generateFuncType', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'reallyNegative', + 'unSign', + 'strLen', + 'reSign', + 'formatString', + 'intArrayFromString', + 'intArrayToString', + 'AsciiToString', + 'stringToAscii', + 'stringToNewUTF8', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'battery', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'demangle', + 'demangleAll', + 'jsStackTrace', + 'stackTrace', + 'getEnvStrings', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'createDyncallWrapper', + 'safeSetTimeout', + 'setImmediateWrapped', + 'clearImmediateWrapped', + 'polyfillSetImmediate', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'findMatchingCatch', + 'setMainLoop', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_stdin_getChar', + 'FS_createDataFile', + 'FS_unlink', + 'FS_mkdirTree', + '_setNetworkCallback', + 'heapObjectForWebGLType', + 'heapAccessShiftForWebGLHeap', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + '__glGenObject', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'SDL_unicode', + 'SDL_ttfContext', + 'SDL_audio', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', + 'getFunctionArgsName', + 'requireRegisteredType', + 'registerInheritedInstance', + 'unregisterInheritedInstance', + 'enumReadValueFromPointer', + 'validateThis', + 'getStringOrSymbol', + 'emval_get_global', + 'emval_returnValue', + 'emval_lookupTypes', + 'emval_addMethodCaller', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + +var unexportedSymbols = [ + 'run', + 'addOnPreRun', + 'addOnInit', + 'addOnPreMain', + 'addOnExit', + 'addOnPostRun', + 'addRunDependency', + 'removeRunDependency', + 'FS_createFolder', + 'FS_createPath', + 'FS_createLazyFile', + 'FS_createLink', + 'FS_createDevice', + 'FS_readFile', + 'out', + 'err', + 'callMain', + 'abort', + 'wasmMemory', + 'wasmExports', + 'stackAlloc', + 'stackSave', + 'stackRestore', + 'getTempRet0', + 'setTempRet0', + 'writeStackCookie', + 'checkStackCookie', + 'intArrayFromBase64', + 'tryParseAsDataURI', + 'convertI32PairToI53Checked', + 'ptrToString', + 'getHeapMax', + 'abortOnCannotGrowMemory', + 'ENV', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'ERRNO_CODES', + 'ERRNO_MESSAGES', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'UNWIND_CACHE', + 'readEmAsmArgsArray', + 'dynCallLegacy', + 'getDynCaller', + 'dynCall', + 'handleAllocatorInit', + 'HandleAllocator', + 'wasmTable', + 'noExitRuntime', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'UTF16Decoder', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'JSEvents', + 'specialHTMLTargets', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'ExitStatus', + 'flush_NO_FILESYSTEM', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'ExceptionInfo', + 'Browser', + 'wget', + 'SYSCALLS', + 'preloadPlugins', + 'FS_stdin_getChar_buffer', + 'FS', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'emscripten_webgl_power_preferences', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'InternalError', + 'BindingError', + 'throwInternalError', + 'throwBindingError', + 'registeredTypes', + 'awaitingDependencies', + 'typeDependencies', + 'tupleRegistrations', + 'structRegistrations', + 'sharedRegisterType', + 'whenDependentTypesAreResolved', + 'embind_charCodes', + 'embind_init_charCodes', + 'readLatin1String', + 'getTypeName', + 'getFunctionName', + 'heap32VectorToArray', + 'UnboundTypeError', + 'PureVirtualError', + 'GenericWireTypeSize', + 'init_embind', + 'throwUnboundTypeError', + 'ensureOverloadTable', + 'exposePublicSymbol', + 'replacePublicSymbol', + 'extendError', + 'createNamedFunction', + 'embindRepr', + 'registeredInstances', + 'getBasestPointer', + 'getInheritedInstance', + 'getInheritedInstanceCount', + 'getLiveInheritedInstances', + 'registeredPointers', + 'registerType', + 'integerReadValueFromPointer', + 'floatReadValueFromPointer', + 'simpleReadValueFromPointer', + 'readPointer', + 'runDestructors', + 'newFunc', + 'craftInvokerFunction', + 'embind__requireFunction', + 'genericPointerToWireType', + 'constNoSmartPtrRawPointerToWireType', + 'nonConstNoSmartPtrRawPointerToWireType', + 'init_RegisteredPointer', + 'RegisteredPointer', + 'RegisteredPointer_fromWireType', + 'runDestructor', + 'releaseClassHandle', + 'finalizationRegistry', + 'detachFinalizer_deps', + 'detachFinalizer', + 'attachFinalizer', + 'makeClassHandle', + 'init_ClassHandle', + 'ClassHandle', + 'throwInstanceAlreadyDeleted', + 'deletionQueue', + 'flushPendingDeletes', + 'delayFunction', + 'setDelayFunction', + 'RegisteredClass', + 'shallowCopyInternalPointer', + 'downcastPointer', + 'upcastPointer', + 'char_0', + 'char_9', + 'makeLegalFunctionName', + 'emval_handles', + 'emval_symbols', + 'init_emval', + 'count_emval_handles', + 'Emval', + 'emval_methodCallers', + 'reflectConstruct', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); -var calledRun; -/** - * @constructor - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -} -var calledMain = false; +var calledRun; dependenciesFulfilled = function runCaller() { // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) @@ -3920,9 +3541,7 @@ function stackCheckInit() { writeStackCookie(); } -/** @type {function(Array=)} */ -function run(args) { - args = args || arguments_; +function run() { if (runDependencies > 0) { return; @@ -3969,7 +3588,6 @@ function run(args) { } checkStackCookie(); } -Module['run'] = run; function checkUnflushedContent() { // Compiler settings do not allow exiting the runtime, so flushing @@ -3990,40 +3608,16 @@ function checkUnflushedContent() { has = true; } try { // it doesn't matter if it fails - _fflush(0); + flush_NO_FILESYSTEM(); } 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.'); + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)'); } } -/** @param {boolean|number=} implicit */ -function exit(status, implicit) { - EXITSTATUS = status; - - checkUnflushedContent(); - - // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down - if (keepRuntimeAlive() && !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); - } - - 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) { @@ -4034,9 +3628,8 @@ if (Module['preInit']) { run(); - - - +// end include: postamble.js +// include: /Users/hongchan/a/web-audio-samples/src/audio-worklet/design-pattern/lib/em-es6-module.js /** * Copyright 2018 Google LLC * @@ -4053,7 +3646,11 @@ run(); * the License. */ +/* global Module */ + // EXPORT_ES6 option does not work as described at // https://github.com/kripken/emscripten/issues/6284, so we have to // manually add this by '--post-js' setting when the Emscripten compilation. export default Module; + +// end include: /Users/hongchan/a/web-audio-samples/src/audio-worklet/design-pattern/lib/em-es6-module.js From 7201485e40031b3ac5406ae8dc5790939e590eb4 Mon Sep 17 00:00:00 2001 From: Hongchan Choi Date: Thu, 2 Nov 2023 11:05:35 -0700 Subject: [PATCH 2/3] initial commit --- .../design-pattern/wasm-supersaw/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/audio-worklet/design-pattern/wasm-supersaw/README.md b/src/audio-worklet/design-pattern/wasm-supersaw/README.md index 3952bbcfa..e1071a02a 100644 --- a/src/audio-worklet/design-pattern/wasm-supersaw/README.md +++ b/src/audio-worklet/design-pattern/wasm-supersaw/README.md @@ -4,8 +4,13 @@ Unlike other AudioWorklet examples in this repository, this examples needs an additional step to build and compile. Follow the steps below: 1. Install Emscripten in your development setup. Follow the instruction: - https://emscripten.org/docs/getting_started/downloads.html + https://emscripten.org/docs/getting_started/downloads.html -2. Run `emcc -v` to confirm the Emscripten installation and its version. +2. Run `emcc -v` to confirm the Emscripten installation and its version. This + example needs 3.1.48 or later to work correctly. (See + [this issue](https://github.com/GoogleChromeLabs/web-audio-samples/issues/348) + for details) -3. \ No newline at end of file +3. In the terminal, run `make` to build the WASM file. + +4. Serve `index.html` file in the directoy. From 878423c7887aeb09baadf420304801d0fed8d648 Mon Sep 17 00:00:00 2001 From: Hongchan Choi Date: Thu, 2 Nov 2023 13:30:46 -0700 Subject: [PATCH 3/3] update build info --- src/_data/build_info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_data/build_info.json b/src/_data/build_info.json index 4052b8cb7..7052a0704 100644 --- a/src/_data/build_info.json +++ b/src/_data/build_info.json @@ -1 +1 @@ -{"version":"3.1.0","revision":"6b3e732","lastUpdated":"2023-10-13","copyrightYear":2023} \ No newline at end of file +{"version":"3.1.0","revision":"7201485","lastUpdated":"2023-11-02","copyrightYear":2023} \ No newline at end of file