UNPKG

@ar-js-org/artoolkitplus-ts

Version:

Typescript ARToolKitPlus port thanks to Emscripten

1,085 lines (927 loc) 5.58 MB
var TrackerSingleMarker = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(TrackerSingleMarker) { TrackerSingleMarker = TrackerSingleMarker || {}; // The Module object: Our interface to the outside world. We import // and export values on it. There are various ways Module can be used: // 1. Not defined. We create it here // 2. A function parameter, function(Module) { ..generated code.. } // 3. pre-run appended it, var Module = {}; ..generated code.. // 4. External script tag defines var Module. // We need to check if Module already exists (e.g. case 3 above). // Substitution will be replaced with actual code on later stage of the build, // this way Closure Compiler will not mangle it (e.g. case 4. above). // Note that if you want to run closure, and also to use Module // after the generated code, you will need to define var Module = {}; // before the code. Then that object will be used in the code, and you // can continue to use Module afterwards as well. var Module = typeof TrackerSingleMarker != 'undefined' ? TrackerSingleMarker : {}; // See https://caniuse.com/mdn-javascript_builtins_object_assign // See https://caniuse.com/mdn-javascript_builtins_bigint64array // Set up the promise that indicates the Module is initialized var readyPromiseResolve, readyPromiseReject; Module['ready'] = new Promise(function(resolve, reject) { readyPromiseResolve = resolve; readyPromiseReject = reject; }); ["_main","___getTypeName","__embind_initialize_bindings","_fflush","onRuntimeInitialized"].forEach((prop) => { if (!Object.getOwnPropertyDescriptor(Module['ready'], prop)) { Object.defineProperty(Module['ready'], prop, { get: () => abort('You are getting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'), set: () => abort('You are setting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'), }); } }); // --pre-jses are emitted after the Module integration code, so that they can // refer to Module (if they choose; they can also define Module) // {{PRE_JSES}} // Sometimes an existing Module object exists with properties // meant to overwrite the default module functionality. Here // we collect those properties and reapply _after_ we configure // the current environment's defaults to avoid having to be so // defensive during initialization. var moduleOverrides = Object.assign({}, Module); var arguments_ = []; var thisProgram = './this.program'; var quit_ = (status, toThrow) => { throw toThrow; }; // Determine the runtime environment we are in. You can customize this by // setting the ENVIRONMENT setting at compile time (see settings.js). // Attempt to auto-detect the environment var ENVIRONMENT_IS_WEB = typeof window == 'object'; var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; // N.b. Electron.js environment is simultaneously a NODE-environment, but // also a web environment. var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; if (Module['ENVIRONMENT']) { throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); } // `/` should be present at the end if `scriptDirectory` is not empty var scriptDirectory = ''; function locateFile(path) { if (Module['locateFile']) { return Module['locateFile'](path, scriptDirectory); } return scriptDirectory + path; } // Hooks that are implemented differently in different runtime environments. var read_, readAsync, readBinary, setWindowTitle; // Normally we don't log exceptions but instead let them bubble out the top // level where the embedding environment (e.g. the browser) can handle // them. // However under v8 and node we sometimes exit the process direcly in which case // its up to use us to log the exception before exiting. // If we fix https://github.com/emscripten-core/emscripten/issues/15080 // this may no longer be needed under node. function logExceptionOnExit(e) { if (e instanceof ExitStatus) return; let toLog = e; if (e && typeof e == 'object' && e.stack) { toLog = [e, e.stack]; } err('exiting due to exception: ' + toLog); } if (ENVIRONMENT_IS_NODE) { if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); if (ENVIRONMENT_IS_WORKER) { scriptDirectory = require('path').dirname(scriptDirectory) + '/'; } else { scriptDirectory = __dirname + '/'; } // include: node_shell_read.js // These modules will usually be used on Node.js. Load them eagerly to avoid // the complexity of lazy-loading. However, for now we must guard on require() // actually existing: if the JS is put in a .mjs file (ES6 module) and run on // node, then we'll detect node as the environment and get here, but require() // does not exist (since ES6 modules should use |import|). If the code actually // uses the node filesystem then it will crash, of course, but in the case of // code that never uses it we don't want to crash here, so the guarding if lets // such code work properly. See discussion in // https://github.com/emscripten-core/emscripten/pull/17851 var fs, nodePath; if (typeof require === 'function') { fs = require('fs'); nodePath = require('path'); } read_ = (filename, binary) => { var ret = tryParseAsDataURI(filename); if (ret) { return binary ? ret : ret.toString(); } filename = nodePath['normalize'](filename); return fs.readFileSync(filename, binary ? undefined : 'utf8'); }; readBinary = (filename) => { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert(ret.buffer); return ret; }; readAsync = (filename, onload, onerror) => { var ret = tryParseAsDataURI(filename); if (ret) { onload(ret); } filename = nodePath['normalize'](filename); fs.readFile(filename, function(err, data) { if (err) onerror(err); else onload(data.buffer); }); }; // end include: node_shell_read.js if (process['argv'].length > 1) { thisProgram = process['argv'][1].replace(/\\/g, '/'); } arguments_ = process['argv'].slice(2); // MODULARIZE will export the module in the proper place outside, we don't need to export here process['on']('uncaughtException', function(ex) { // suppress ExitStatus exceptions from showing an error if (!(ex instanceof ExitStatus)) { throw ex; } }); // Without this older versions of node (< v15) will log unhandled rejections // but return 0, which is not normally the desired behaviour. This is // not be needed with node v15 and about because it is now the default // behaviour: // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode process['on']('unhandledRejection', function(reason) { throw reason; }); quit_ = (status, toThrow) => { if (keepRuntimeAlive()) { process['exitCode'] = status; throw toThrow; } logExceptionOnExit(toThrow); process['exit'](status); }; Module['inspect'] = function () { return '[Emscripten Module object]'; }; } else if (ENVIRONMENT_IS_SHELL) { if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); if (typeof read != 'undefined') { read_ = function shell_read(f) { const data = tryParseAsDataURI(f); if (data) { return intArrayToString(data); } return read(f); }; } readBinary = function readBinary(f) { let data; data = tryParseAsDataURI(f); if (data) { return data; } if (typeof readbuffer == 'function') { return new Uint8Array(readbuffer(f)); } data = read(f, 'binary'); assert(typeof data == 'object'); return data; }; readAsync = function readAsync(f, onload, onerror) { setTimeout(() => onload(readBinary(f)), 0); }; if (typeof scriptArgs != 'undefined') { arguments_ = scriptArgs; } else if (typeof arguments != 'undefined') { arguments_ = arguments; } if (typeof quit == 'function') { quit_ = (status, toThrow) => { logExceptionOnExit(toThrow); quit(status); }; } if (typeof print != 'undefined') { // Prefer to use print/printErr where they exist, as they usually work better. if (typeof console == 'undefined') console = /** @type{!Console} */({}); console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); } } else // Note that this includes Node.js workers when relevant (pthreads is enabled). // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and // ENVIRONMENT_IS_NODE. if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled scriptDirectory = self.location.href; } else if (typeof document != 'undefined' && document.currentScript) { // web scriptDirectory = document.currentScript.src; } // When MODULARIZE, this JS may be executed later, after document.currentScript // is gone, so we saved it, and we use it here instead of any other info. if (_scriptDir) { scriptDirectory = _scriptDir; } // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. // otherwise, slice off the final part of the url to find the script directory. // if scriptDirectory does not contain a slash, lastIndexOf will return -1, // and scriptDirectory will correctly be replaced with an empty string. // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), // they are removed because they could contain a slash. if (scriptDirectory.indexOf('blob:') !== 0) { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); } else { scriptDirectory = ''; } if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); // Differentiate the Web Worker from the Node Worker case, as reading must // be done differently. { // include: web_or_worker_shell_read.js read_ = (url) => { try { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); return xhr.responseText; } catch (err) { var data = tryParseAsDataURI(url); if (data) { return intArrayToString(data); } throw err; } } if (ENVIRONMENT_IS_WORKER) { readBinary = (url) => { try { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.responseType = 'arraybuffer'; xhr.send(null); return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); } catch (err) { var data = tryParseAsDataURI(url); if (data) { return data; } throw err; } }; } readAsync = (url, onload, onerror) => { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = () => { if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 onload(xhr.response); return; } var data = tryParseAsDataURI(url); if (data) { onload(data.buffer); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); } // end include: web_or_worker_shell_read.js } setWindowTitle = (title) => document.title = title; } else { throw new Error('environment detection error'); } var out = Module['print'] || console.log.bind(console); var err = Module['printErr'] || console.warn.bind(console); // Merge back in the overrides Object.assign(Module, moduleOverrides); // Free the object hierarchy contained in the overrides, this lets the GC // reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. moduleOverrides = null; checkIncomingModuleAPI(); // Emit code to handle expected values on the Module object. This applies Module.x // to the proper local x. This has two benefits: first, we only emit it if it is // expected to arrive, and second, by using a local everywhere else that can be // minified. if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message // Assertions on removed incoming Module JS APIs. assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); legacyModuleProp('read', 'read_'); legacyModuleProp('readAsync', 'readAsync'); legacyModuleProp('readBinary', 'readBinary'); legacyModuleProp('setWindowTitle', 'setWindowTitle'); var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable."); 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; } if (type[0] === 'i') { const bits = Number(type.substr(1)); assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); return bits / 8; } return 0; } } } // include: runtime_debug.js function legacyModuleProp(prop, newName) { if (!Object.getOwnPropertyDescriptor(Module, prop)) { Object.defineProperty(Module, prop, { configurable: true, get: function() { abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); } }); } } function ignoredModuleProp(prop) { if (Object.getOwnPropertyDescriptor(Module, prop)) { abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); } } // 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 missingLibrarySymbol(sym) { if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { Object.defineProperty(globalThis, sym, { configurable: true, get: function() { // 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; } 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; } }); } } function unexportedRuntimeSymbol(sym) { if (!Object.getOwnPropertyDescriptor(Module, sym)) { Object.defineProperty(Module, sym, { configurable: true, get: function() { var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; if (isExportedByForceFilesystem(sym)) { msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; } abort(msg); } }); } } // end include: runtime_debug.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 wasmBinary; if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); if (typeof WebAssembly != 'object') { abort('no native wasm support detected'); } // Wasm globals var wasmMemory; //======================================== // Runtime essentials //======================================== // whether we are quitting the application. no code should run after this. // set in exit() and abort() var ABORT = false; // set by exit() and abort(). Passed to 'onExit' handler. // NOTE: This is also used as the process return code code in shell environments // but only when noExitRuntime is false. var EXITSTATUS; /** @type {function(*, string=)} */ function assert(condition, text) { if (!condition) { abort('Assertion failed' + (text ? ': ' + text : '')); } } // We used to include malloc/free by default in the past. Show a helpful error in // builds with assertions. // include: runtime_strings.js // runtime_strings.js: String 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 '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} */ 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)); } 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} */ 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. * * @param {string} str - The Javascript string to copy. * @param {ArrayBufferView|Array<number>} heap - The array to copy to. Each * index in this array is assumed * to be one 8-byte element. * @param {number} outIdx - The starting offset in the array to begin the copying. * @param {number} 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. * @return {number} The number of bytes written, EXCLUDING the null terminator. */ function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { // 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; } /** * 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. * * @return {number} 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. * * @param {string} str - JavaScript string to operator on * @return {number} Length, in bytes, of the UTF8 encoded string. */ 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 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; } // end include: runtime_strings.js // Memory management var HEAP, /** @type {!ArrayBuffer} */ buffer, /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; function updateGlobalBufferAndViews(buf) { buffer = buf; Module['HEAP8'] = HEAP8 = new Int8Array(buf); Module['HEAP16'] = HEAP16 = new Int16Array(buf); Module['HEAP32'] = HEAP32 = new Int32Array(buf); Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); } var STACK_SIZE = 5242880; if (Module['STACK_SIZE']) assert(STACK_SIZE === Module['STACK_SIZE'], 'the stack size can no longer be determined at runtime') var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 268435456;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY'); assert(INITIAL_MEMORY >= STACK_SIZE, 'INITIAL_MEMORY should be larger than STACK_SIZE, was ' + INITIAL_MEMORY + '! (STACK_SIZE=' + STACK_SIZE + ')'); // check for full engine support (use string 'subarray' to avoid closure compiler confusion) assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, 'JS engine does not provide full typed array support'); // If memory is defined in wasm, the user can't provide it. assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); assert(INITIAL_MEMORY == 268435456, '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 the (separate) address-zero check // below. 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. HEAPU32[((max)>>2)] = 0x2135467; HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; // Also test the global address 0 for integrity. HEAPU32[0] = 0x63736d65; /* 'emsc' */ } 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 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)!'); } } // end include: runtime_stack_check.js // include: runtime_assertions.js // Endianness check (function() { var h16 = new Int16Array(1); var h8 = new Int8Array(h16.buffer); h16[0] = 0x6373; if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; })(); // end include: runtime_assertions.js var __ATPRERUN__ = []; // functions called before the runtime is initialized var __ATINIT__ = []; // functions called during startup var __ATEXIT__ = []; // functions called during shutdown 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__); } function initRuntime() { assert(!runtimeInitialized); runtimeInitialized = true; checkStackCookie(); if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); FS.ignorePermissions = false; TTY.init(); callRuntimeCallbacks(__ATINIT__); } function postRun() { checkStackCookie(); if (Module['postRun']) { if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; while (Module['postRun'].length) { addOnPostRun(Module['postRun'].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } function addOnInit(cb) { __ATINIT__.unshift(cb); } function addOnExit(cb) { } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } // include: runtime_math.js // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); // end include: runtime_math.js // A counter of dependencies for calling run(). If we need to // do asynchronous work before running, increment this and // decrement it. Incrementing must happen in a place like // Module.preRun (used by emcc to add file preloading). // Note that you can add dependencies in preRun, even though // it happens right before run - run will be postponed until // the dependencies are met. var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled var runDependencyTracking = {}; function getUniqueRunDependency(id) { var orig = id; while (1) { if (!runDependencyTracking[id]) return id; id = orig + Math.random(); } } function addRunDependency(id) { runDependencies++; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } if (id) { assert(!runDependencyTracking[id]); runDependencyTracking[id] = 1; if (runDependencyWatcher === null && typeof setInterval != 'undefined') { // Check for missing dependencies every few seconds runDependencyWatcher = setInterval(function() { if (ABORT) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; return; } var shown = false; for (var dep in runDependencyTracking) { if (!shown) { shown = true; err('still waiting on run dependencies:'); } err('dependency: ' + dep); } if (shown) { err('(end of list)'); } }, 10000); } } else { err('warning: run dependency added without ID'); } } function removeRunDependency(id) { runDependencies--; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } if (id) { assert(runDependencyTracking[id]); delete runDependencyTracking[id]; } else { err('warning: run dependency removed without ID'); } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); // can add another dependenciesFulfilled } } } /** @param {string|number=} what */ function abort(what) { if (Module['onAbort']) { Module['onAbort'](what); } what = 'Aborted(' + what + ')'; // TODO(sbc): Should we remove printing and leave it up to whoever // catches the exception? err(what); ABORT = true; EXITSTATUS = 1; // Use a wasm runtime error, because a JS error might be seen as a foreign // exception, which means we'd run destructors on it. We need the error to // simply make the program stop. // FIXME This approach does not work in Wasm EH because it currently does not assume // all RuntimeErrors are from traps; it decides whether a RuntimeError is from // a trap or not based on a hidden field within the object. So at the moment // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that // allows this in the wasm spec. // Suppress closure compiler warning here. Closure compiler's builtin extern // defintion for WebAssembly.RuntimeError claims it takes no arguments even // though it can. // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); readyPromiseReject(e); // Throw the error whether or not MODULARIZE is set because abort is used // in code paths apart from instantiation where an exception is expected // to be thrown when abort is called. throw e; } // {{MEM_INITIALIZER}} // include: memoryprofiler.js // end include: memoryprofiler.js // include: URIUtils.js // Prefix of data URIs emitted by SINGLE_FILE and related options. var dataURIPrefix = 'data:application/octet-stream;base64,'; // Indicates whether filename is a base64 data URI. function isDataURI(filename) { // Prefix of data URIs emitted by SINGLE_FILE and related options. return filename.startsWith(dataURIPrefix); } // Indicates whether filename is delivered via file protocol (as opposed to http/https) function isFileURI(filename) { return filename.startsWith('file://'); } // end include: URIUtils.js /** @param {boolean=} fixedasm */ function createExportWrapper(name, fixedasm) { return function() { var displayName = name; var asm = fixedasm; if (!fixedasm) { asm = Module['asm']; } assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); if (!asm[name]) { assert(asm[name], 'exported native function `' + displayName + '` not found'); } return asm[name].apply(null, arguments); }; } var wasmBinaryFile; wasmBinaryFile = 'data:application/octet-stream;base64,AGFzbQEAAAAB2IaAgABpYAF/AX9gAn9/AX9gAn9/AGADf39/AX9gAX8AYAN/f38AYAABf2AEf39/fwF/YAZ/f39/f38Bf2AFf39/f38Bf2AEf39/fwBgAABgBn9/f39/fwBgCH9/f39/f39/AX9gBX9/f39/AGAHf39/f39/fwF/YAd/f39/f39/AGACf30AYAJ/fABgAXwBfGAFf39/fX8BfWADf35/AX5gBX9+fn5+AGABfQF9YAABfmAIf39/f39/f38AYAZ/f319f38Bf2AEf39/fwF9YAF/AX1gBX9/f39+AX9gB39/f39/f38BfWACf38BfGABfwF8YAR/f319AX9gBX9/fn9/AGAEf39/fwF+YAZ/f39/fn8Bf2AKf39/f39/f39/fwBgB39/f39/fn4Bf2ADf39/AXxgBn9/f399fwF9YAJ/fwF9YAF8AX9gAXwBfmACfHwBfGAEf35+fwBgAX8BfmACf34Bf2AKf39/f39/f39/fwF/YAZ/f39/fn4Bf2AFf319f38AYAl/f39/f39/f38Bf2AGf39/f398AGAEf399fQBgA3x8fwF8YAF8AX1gAX4Bf2ACfH8BfGAGf3x/f39/AX9gAn5/AX9gBH9/f34BfmAEfn5+fgF/YAN/fn8Bf2ADf39/AX5gA39/fwF9YAx/f39/f39/f39/f38Bf2AFf39/f3wBf2AGf39/f3x/AX9gB39/f39+fn8Bf2ALf39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AGANf39/f39/f39/f39/fwBgC39/f39/f39/f31/AX9gBH9/f30Bf2AHf39/f31/fwF/YAR/f39+AX9gA35/fwBgBX99fX1/AX9gCH99fX1/f39/AX9gCn98fHx8fHx8fHwAYAR/fHx8AGAJf39/f39/f39/AGANf39/f39/f39/f3x8fwBgBn9/f319fwF/YAN/f30AYAJ8fwF/YAJ9fwF/YAJ/fAF8YAJ+fwF8YAN8fn4BfGABfABgA35/fwF/YAJ/fgBgAn5+AX9gA39+fgBgAn9/AX5gA39/fgBgAn5+AXxgAn5+AX1gBH9/fn8BfmAGf39/fn9/AGAGf39/f39+AX9gCH9/f39/f35+AX9gBX9/f35+AGAEf35/fwF/AqmJgIAAKwNlbnYYX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uAAADZW52C19fY3hhX3Rocm93AAUDZW52BGV4aXQABANlbnYRX2VtdmFsX25ld19vYmplY3QABgNlbnYTX2VtdmFsX3NldF9wcm9wZXJ0eQAFA2Vudg1fZW12YWxfZGVjcmVmAAQDZW52EF9lbXZhbF9uZXdfYXJyYXkABgNlbnYWX2VtYmluZF9yZWdpc3Rlcl9jbGFzcwBHA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2VudW0ACgNlbnYbX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlAAUDZW52Il9lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IADANlbnYfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbgAZA2Vudg1fZW12YWxfaW5jcmVmAAQDZW52EV9lbXZhbF90YWtlX3ZhbHVlAAEDZW52El9lbXZhbF9uZXdfY3N0cmluZwAAA2VudhdfZW12YWxfY2FsbF92b2lkX21ldGhvZAAKA2VudhhfZW12YWxfZ2V0X21ldGhvZF9jYWxsZXIAAQNlbnYTX2VtdmFsX2dldF9wcm9wZXJ0eQABA2VudglfZW12YWxfYXMAJwNlbnYWX2VtdmFsX3J1bl9kZXN0cnVjdG9ycwAEA2Vudg1fX2Fzc2VydF9mYWlsAAoDZW52FV9lbWJpbmRfcmVnaXN0ZXJfdm9pZAACA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2Jvb2wADgNlbnYYX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyAA4DZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZmxvYXQABQNlbnYbX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAIDZW52HF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcABQNlbnYWX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAACA2VudhxfZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3AAUDZW52FWVtc2NyaXB0ZW5fbWVtY3B5X2JpZwAFA2VudhBfX3N5c2NhbGxfb3BlbmF0AAcDZW52EV9fc3lzY2FsbF9mY250bDY0AAMDZW52D19fc3lzY2FsbF9pb2N0bAADFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfd3JpdGUA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CQADAQkAAAEAAAADAQkIEAgdJAkIHSRCQwMCEAAxRAkDAAICAgINAwAICAgMCAwIDAkNDAwMDAwMDgwMDAwODQMACAgAAAAAAAgMCAwIDAkNDAwMDAwMDgwMDAwODwwDAgEKDwwDAQkECgAGBgACAgICAAICAAACAgICAAICAAYGAAICAAQCAgACAgAAAgICAgACAgEEAwEABAMAAAAPBEUAAAMDACUFAAMBAAABAQMFBQAAAAAPBAMBAgMAAAICAgAAAgIAAAICAgAAAgIAAwABAAMBAAABAAABAgIPRQAAAyUFAAEDAQAAAQEDBQAPBAMEAAICAAIAAQECAAcAAgIBAgAAAgIAAAICAgAAAgIAAwABAAMBAAABAiYBJUYAAgIAAQADBggmASVGAAAAAgIAAQADCAoDBgEKAwEDDAIDDAIAAQEBBAsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgsCCwILAgEDBAICAAQCBAAFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEGAQQGAAEBAAECAAAEAAAABAQAAAUEAgIAAQELBgYAAQABBAMCBAQAAQEEBgQDBwcHAQYDAQYDAQcDCQcAAAQBAwEDAQcDCQQNDQkAAAkAAQAEDQgHDQgJCQAHAAAJBwAEDQ0NDQkAAAkJAAQNDQkAAAkABA0NDQ0JAAAJCQAEDQ0JAAAJAAEBAAQABAAAAAACAgICAQACAgEBAgALBAALBAEACwQACwQACwQACwQABAAEAAQABAAEAAQABAAEAgABBAQEBAAABAAABAQABAAEBAQEBAQEBAQEAQEAAAEAAAAFAgICBAAAAQAAAQAAAAAAAAIDAAIFBQAAAgICAgICAgAABQAKAQEFBQMAAQEDBQAKAQEFBQMAAQEDBAEBAwEBAwUBAwECAgUBBQUDAQAAAAAAAQEFAQUFAwEAAAAAAAEBAQAABAUAAgMAAAIAAAADAAAADgAAAAABAAAAAAAAAAACAgQEAQIAAQUAAwEFBQcCAgADAAADAAEHAAIEAAEAAAADCgAKAQUKBQADAQMCAAIABAICAgMAAAAAAAAAAAABBAABBAEEAAQEAAMAAAEAASMGBhgYGBgjBgYYGCkfBQEBAAABAAAAAAEAAAAEAAAFAQQEAAsAAAQEAQECBAABAAEAAxkDAAQQAwMFBQMBAwkFAgMFAxkDAAQQAwMFBQMBAwUCAwMBAQEAAAQCCwAGBAsGBgsABAQEBAQEBAQDAwADAwcKCgoKAQoDAwEBDgoODA4ODgwMDAAABAAABAAABAAAAAAABAAABAQABgQABgsGBgYHAwAAAwACAQAAAAMBAQABAwMAAQUAAwAFAgAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAQEAAQEBAAAAAgUBAA8AAwADAQEBAQEBAQABAAEAAAECAQEBAAMAAAEAAAABAwEDAQEDAAAAAQEEBAEBAQEBAwEAAQEBAQEBAQEAAQEBAAEAAQIBAAIBAAAKAg8EAAAFAAIEAAAFAgoFCgEBBQUDAQEKBQoBAQUFAwEBAQEBAQEBAwEBAQEBAAcBAQMBBAgBAQEBAgECAgQEAwIEAQAHAAABAQICBAcCBAAAAAAEBwEDAgECAQACAQMCAQIBAQEBAQEBAwEDAwECAgEBCQEDAQABAQEBAQICBAUKBQoBAQUFAwEBAAIAAAMDBwcJAA8JBwkJBwAAAAEAAwABAQEDAQEBAAcBAAEFBAkHBwcJDwkHBwkJBwEBAAAAAQEDAQIAAgkHBwEJAwgBAQEBAwEBAAADAAEAAQACAQIBAgEACQkCAAIKAgQHBwIEBwIEBwIECQIEDwICBAIJAgQHAgQHAgQJAgQJAgMABAcCBAMBAAEBAQEBAQMBAQAEBwAAAAEDAwMCAAQBAgQBAQIEAQECBAEBAgQBAgQBAwEBAwMBBwIAAQIEAwMBAwMBAwIDAgEELy8AAAECAgQDAgIEAwICBAECAgQHAgIEAQIEAwIBBAEBAgAECQkCBAQBAgQHBwcCBAcCBAMCBAkJAgQBCAgCBAECBAECBAECBAMAAQMCAgQBAQEBAQIEAQEBAgQBAgQBAgIEAQMBAwICAgAEAgQDAwIEAQEHAwMBAgQBBwEBBwIEAwICBAMCAgQBAwMCBAEBAQEBAQAAAAECAQEBAQICBAECBAMCAgQAAQECBAECBAEDDwEBAgIEAwIEAQEIAwADBwMBAQABAAEAAAEBAwEDAQMDAwEDAQEBAQgBAgQBAgQIAQECAgQDBwMDAgQHAgQDAQEBAgICBAECBAMCBAEDAQECBAMCBAMDAQECAgAEAwMBAgIEAwMCBAEBAgACBAIDAQIFAgQFAAECAAEAAwECAAABBQoFCgEBBQUDAQEDAgQEBmNkZSZmCRAPMzBnaASHgICAAAFwAcQFxAUFh4CAgAABAYAggIACBpiAgIAABH8BQYCAwAILfwFBAAt/AUEAC38BQQALB9qDgIAAGAZtZW1vcnkCABFfX3dhc21fY2FsbF9jdG9ycwArGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAZtYWxsb2MA2wcEZnJlZQDcBw1fX2dldFR5cGVOYW1lAMQGG19lbWJpbmRfaW5pdGlhbGl6ZV9iaW5kaW5ncwDFBhBfX2Vycm5vX2xvY2F0aW9uAOgGBmZmbHVzaADjBhVlbXNjcmlwdGVuX3N0YWNrX2luaXQAmBQZZW1zY3JpcHRlbl9zdGFja19nZXRfZnJlZQCZFBllbXNjcmlwdGVuX3N0YWNrX2dldF9iYXNlAJoUGGVtc2NyaXB0ZW5fc3RhY2tfZ2V0X2VuZACbFAlzdGFja1NhdmUAlBQMc3RhY2tSZXN0b3JlAJUUCnN0YWNrQWxsb2MAlhQcZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudACXFA5fX2N4YV9kZW1hbmdsZQCcFBVfX2N4YV9pc19wb2ludGVyX3R5cGUAgBQMZHluQ2FsbF9qaWppAMQaDmR5bkNhbGxfdmlpamlpAMUaDmR5bkNhbGxfaWlpaWlqAMYaD2R5bkNhbGxfaWlpaWlqagDHGhBkeW5DYWxsX2lpaWlpaWpqAMgaCYSLgIAAAQBBAQvDBYoUODo77AHuAe8B8gGJAnFyfdYBedgB2gHkAWpr5QHmAYoC/gH9AfgB+QH6AYsCjAKNAo4CjwKQApECkgKTApQClQKWApcCmALzAfQB9gH7AfwBmQKIAoIChgKDAoUChAKaAocCmwLqAvIC9QL9AqECtwKcAtoCqwKsArMC2wLfAuAC4QLiAuMC5ALeAuUC5gLnAowDjQPRAo8DkgOWA5sDnQPMBNkE6ATzBPgE/wSEBYkFjwWVBZwFogWoBa0FjASVBJ0EpASsBL0EgRTHBuoG6wbsBu4GpQemB7wHvQfXB+IG/weACIIIgwiECIYIhwiICIkIkAiSCJQIlQiWCJgImgiZCJsIwQjDCMIIxAjPCNAI0gjTCNQI1QjWCNcI2AjdCN8I4QjiCOMI5QjnCOYI6Aj7CP0I/Aj+CKsJsAnHCbwJvwnCCcQJtAm4CbkJ/Qf+B80IzgjICcoJywnMCaQKpQqyCskKywrMCs0KzwrQCtUK1grXCtgK2QraCtsK3QrfCuAK4wrkCuUK5wroCu8K3Ae9DekP8Q/kEOcQ6xDuEPEQ9BD2EPgQ+hD8EP4QgBGCEYQR1A/cD+0PhBCFEIYQhxCIEIkQihCLEIwQjRDhDpgQmRCcEJ8QoBCjEKQQphDPENAQ0xDVENcQ2RDdENEQ0hDUENYQ2BDaEN4QigvsD/MP9A/1D/YP9w/4D/oP+w/9D/4P/w+AEIEQjhCPEJAQkRCSEJMQlBCVEKcQqBCqEKwQrRCuEK8QsRCyELMQtBC1ELYQtxC4ELkQuhC7EL0QvxDAEMEQwhDEEMUQxhDHEMgQyRDKEMsQzBCJC4sLjAuNC5ALkQuSC5MLlAuZC4gRmgunC7ALswu2C7kLvAu/C8QLxwvKC4kR0QvbC+AL4gvkC+YL6AvqC+4L8AvyC4oR/wuHDI0MjwyRDJMMnAyeDIsRogyrDK8MsQyzDLUMuwy9DIwRjhHGDMcMyAzJDMsMzQzQDOIQ6RDvEP0QgRH1EPkQjxGREd8M4AzhDOcM6QzrDO4M5RDsEPIQ/xCDEfcQ+xCTEZIR+wyVEZQRgQ2WEYgNiw2MDY0Njg2PDZANkQ2SDZcRkw2UDZUNlg2XDZgNmQ2aDZsNmBGcDZ8NoA2hDaQNpQ2mDacNqA2ZEakNqg2rDawNrQ2uDa8NsA2xDZoRvA3UDZsR+w2NDpwRuQ7FDp0Rxg7TDp4R2w7cDt0OnxHeDt8O4A6UE5UT3BPVE90T4BPeE98T5hPhE+kT4hPqE/8T/BPtE+MT/hP7E+4T5BP9E/gT8RPlE/MThRSGFIgUiRSCFIMUjhSPFJEUkhTcFd0V3hXfFeAV4hXjFZ8Y5BXlFecV6BXwFfEV8hX0FfUVmhaeFqAWohajF